diff options
Diffstat (limited to 'devtools/client/shared/source-map-loader/utils/index.js')
-rw-r--r-- | devtools/client/shared/source-map-loader/utils/index.js | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/devtools/client/shared/source-map-loader/utils/index.js b/devtools/client/shared/source-map-loader/utils/index.js new file mode 100644 index 0000000000..1bcfcfac7d --- /dev/null +++ b/devtools/client/shared/source-map-loader/utils/index.js @@ -0,0 +1,103 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */ + +"use strict"; + +const md5 = require("resource://devtools/client/shared/vendor/md5.js"); + +function originalToGeneratedId(sourceId) { + if (isGeneratedId(sourceId)) { + return sourceId; + } + + const lastIndex = sourceId.lastIndexOf("/originalSource"); + + return lastIndex !== -1 ? sourceId.slice(0, lastIndex) : ""; +} + +const getMd5 = memoize(url => md5(url)); + +function generatedToOriginalId(generatedId, url) { + return `${generatedId}/originalSource-${getMd5(url)}`; +} + +function isOriginalId(id) { + return id.includes("/originalSource"); +} + +function isGeneratedId(id) { + return !isOriginalId(id); +} + +/** + * Trims the query part or reference identifier of a URL string, if necessary. + */ +function trimUrlQuery(url) { + const length = url.length; + + for (let i = 0; i < length; ++i) { + if (url[i] === "?" || url[i] === "&" || url[i] === "#") { + return url.slice(0, i); + } + } + + return url; +} + +// Map suffix to content type. +const contentMap = { + js: "text/javascript", + jsm: "text/javascript", + mjs: "text/javascript", + ts: "text/typescript", + tsx: "text/typescript-jsx", + jsx: "text/jsx", + vue: "text/vue", + coffee: "text/coffeescript", + elm: "text/elm", + cljc: "text/x-clojure", + cljs: "text/x-clojurescript", +}; + +/** + * Returns the content type for the specified URL. If no specific + * content type can be determined, "text/plain" is returned. + * + * @return String + * The content type. + */ +function getContentType(url) { + url = trimUrlQuery(url); + const dot = url.lastIndexOf("."); + if (dot >= 0) { + const name = url.substring(dot + 1); + if (name in contentMap) { + return contentMap[name]; + } + } + return "text/plain"; +} + +function memoize(func) { + const map = new Map(); + + return arg => { + if (map.has(arg)) { + return map.get(arg); + } + + const result = func(arg); + map.set(arg, result); + return result; + }; +} + +module.exports = { + originalToGeneratedId, + generatedToOriginalId, + isOriginalId, + isGeneratedId, + getContentType, + contentMapForTesting: contentMap, +}; |