pax_global_header00006660000000000000000000000064136355116700014521gustar00rootroot0000000000000052 comment=eeed61bac2e498ea5239c8162101b021f568b959 source-map-resolve-0.6.0/000077500000000000000000000000001363551167000152545ustar00rootroot00000000000000source-map-resolve-0.6.0/.gitignore000066400000000000000000000000151363551167000172400ustar00rootroot00000000000000node_modules source-map-resolve-0.6.0/.jshintrc000066400000000000000000000015001363551167000170750ustar00rootroot00000000000000{ "bitwise": true, "camelcase": true, "curly": false, "eqeqeq": true, "es3": true, "forin": true, "immed": false, "indent": false, "latedef": "nofunc", "newcap": false, "noarg": true, "noempty": true, "nonew": false, "plusplus": false, "quotmark": false, "undef": true, "unused": "vars", "strict": false, "trailing": true, "maxparams": 5, "maxdepth": false, "maxstatements": false, "maxcomplexity": false, "maxlen": 100, "asi": true, "expr": true, "globalstrict": true, "smarttabs": true, "sub": true, "node": true, "globals": { "describe": false, "it": false, "before": false, "beforeEach": false, "after": false, "afterEach": false, "define": false, "window": false, "atob": true, "JSON": false, "TextDecoder": true } } source-map-resolve-0.6.0/.travis.yml000066400000000000000000000000461363551167000173650ustar00rootroot00000000000000language: node_js node_js: - "node" source-map-resolve-0.6.0/LICENSE000066400000000000000000000021741363551167000162650ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014, 2015, 2016, 2017, 2018, 2019, 2020 Simon Lydell Copyright (c) 2019 ZHAO Jinxiang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. source-map-resolve-0.6.0/changelog.md000066400000000000000000000101111363551167000175170ustar00rootroot00000000000000### Version 0.6.0 (2020-03-21) ### - Removed: The browser version. Only Node.js is now supported. - Improved: Three old, weird, tiny dependencies were inlined, which should decrease install size. ### Version 0.5.3 (2019-12-28) ### - Fixed: base64 encoded source maps now correctly decodes as utf-8. Previously, non-ASCII characters could end up garbled. Thanks to ZHAO Jinxiang (@xiaoxiangmoe)! (Note: This fix does not work in old evironments not supporting both `TextDecoder` and `Uint8Array`.) - Improved: Reduced size of the npm package. ### Version 0.5.2 (2018-05-10) ### - Improved: Updated the version range of `atob` to disallow depending on `2.0.3` which as a [security vulnerability](https://snyk.io/test/npm/atob/2.0.3?severity=high&severity=medium&severity=low). ### Version 0.5.1 (2017-10-21) ### - Fixed: URLs are now decoded before being passed to `read` in Node.js. This allows reading files with spaces, for example. - Fixed: Missing or empty `sources` fields (such as `sources: []`) in source maps are now handled. Previously, such source maps would cause crashes or callbacks never bing called. Now, an empty result is produced: ```js sourcesResolved: [], sourcesContent: [] ``` ### Version 0.5.0 (2016-02-28) ### - Improved: Errors now have a `sourceMapData` property that contain as much as possible of the intended result of the function up until the error occurred. - Changed: `resolveSources` and `resolve`, as well as their `*Sync` alternatives, no longer fail when one single source fails to be fetched. Instead, the `sourcesContent` array in the result object will contain error objects for all failed sources, and strings otherwise. (Backwards-incompatible change.) ### Version 0.4.0 (2015-08-29) ### - Removed: The `ignoreSourceRoot` option of `resolveSources`. It has been replaced with `sourceRoot: false`. (Backwards-incompatible change.) - Added: The `sourceRoot` option of `resolveSources`. It not only allows to ignore the source root, it also lets you replace it. - Added: The `parseMapToJSON` method. - Added: The `resolve` method now accepts `null, mapUrl, ...` as arguments, in addition to the existing signature, which will read `mapUrl` instead of looking for a sourceMappingURL in the code. ### Version 0.3.1 (2014-08-16) ### - Improved: Updated the source-map-url dependency to 0.3.0. ### Version 0.3.0 (2014-07-02) ### - Removed: Argument checking. It’s not worth it. (Possibly backwards-incompatible change.) - Added: The `sourceRoot` property of source maps may now be ignored, which can be useful when resolving sources outside of the browser. - Added: It is now possible to resolve only the URLs of sources, without reading them. ### Version 0.2.0 (2014-06-22) ### - Changed: The result of `resolveSources` is now an object, not an array. The old result array is available in the `sourcesContent` property. (Backwards-incompatible change.) - Changed: `sources` has been renamed to `sourcesContent` in the result object of `resolve`. (Backwards-incompatible change.) - Added: `resolveSources` now also returns all sources fully resolved, in the `sourcesResolved` property. - Added: The result object of `resolve` now contains the `sourcesResolved` property from `resolveSources`. ### Version 0.1.4 (2014-06-16) ### - Fixed: `sourcesContent` was mis-typed as `sourceContents`, which meant that the `sourcesContent` property of source maps never was used when resolving sources. ### Version 0.1.3 (2014-05-06) ### - Only documentation and meta-data changes. ### Version 0.1.2 (2014-03-23) ### - Improved: Source maps starting with `)]}'` are now parsed correctly. The spec allows source maps to start with that character sequence to prevent XSSI attacks. ### Version 0.1.1 (2014-03-06) ### - Improved: Make sourceRoot resolving more sensible. A source root such as `/scripts/subdir` is now treated as `/scripts/subdir/` — that is, as a directory called “subdir”, not a file called “subdir”. Pointing to a file as source root does not makes sense. ### Version 0.1.0 (2014-03-03) ### - Initial release. source-map-resolve-0.6.0/index.js000066400000000000000000000230261363551167000167240ustar00rootroot00000000000000var atob = require("atob") var urlLib = require("url") var pathLib = require("path") var decodeUriComponentLib = require("decode-uri-component") function resolveUrl(/* ...urls */) { return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { return urlLib.resolve(resolved, nextUrl) }) } function convertWindowsPath(aPath) { return pathLib.sep === "\\" ? aPath.replace(/\\/g, "/").replace(/^[a-z]:\/?/i, "/") : aPath } function customDecodeUriComponent(string) { // `decodeUriComponentLib` turns `+` into ` `, but that's not wanted. return decodeUriComponentLib(string.replace(/\+/g, "%2B")) } function callbackAsync(callback, error, result) { setImmediate(function() { callback(error, result) }) } function parseMapToJSON(string, data) { try { return JSON.parse(string.replace(/^\)\]\}'/, "")) } catch (error) { error.sourceMapData = data throw error } } function readSync(read, url, data) { var readUrl = customDecodeUriComponent(url) try { return String(read(readUrl)) } catch (error) { error.sourceMapData = data throw error } } var innerRegex = /[#@] sourceMappingURL=([^\s'"]*)/ var sourceMappingURLRegex = RegExp( "(?:" + "/\\*" + "(?:\\s*\r?\n(?://)?)?" + "(?:" + innerRegex.source + ")" + "\\s*" + "\\*/" + "|" + "//(?:" + innerRegex.source + ")" + ")" + "\\s*" ) function getSourceMappingUrl(code) { var match = code.match(sourceMappingURLRegex) return match ? match[1] || match[2] || "" : null } function resolveSourceMap(code, codeUrl, read, callback) { var mapData try { mapData = resolveSourceMapHelper(code, codeUrl) } catch (error) { return callbackAsync(callback, error) } if (!mapData || mapData.map) { return callbackAsync(callback, null, mapData) } var readUrl = customDecodeUriComponent(mapData.url) read(readUrl, function(error, result) { if (error) { error.sourceMapData = mapData return callback(error) } mapData.map = String(result) try { mapData.map = parseMapToJSON(mapData.map, mapData) } catch (error) { return callback(error) } callback(null, mapData) }) } function resolveSourceMapSync(code, codeUrl, read) { var mapData = resolveSourceMapHelper(code, codeUrl) if (!mapData || mapData.map) { return mapData } mapData.map = readSync(read, mapData.url, mapData) mapData.map = parseMapToJSON(mapData.map, mapData) return mapData } var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/ /** * The media type for JSON text is application/json. * * {@link https://tools.ietf.org/html/rfc8259#section-11 | IANA Considerations } * * `text/json` is non-standard media type */ var jsonMimeTypeRegex = /^(?:application|text)\/json$/ /** * JSON text exchanged between systems that are not part of a closed ecosystem * MUST be encoded using UTF-8. * * {@link https://tools.ietf.org/html/rfc8259#section-8.1 | Character Encoding} */ var jsonCharacterEncoding = "utf-8" function base64ToBuf(b64) { var binStr = atob(b64) var len = binStr.length var arr = new Uint8Array(len) for (var i = 0; i < len; i++) { arr[i] = binStr.charCodeAt(i) } return arr } function decodeBase64String(b64) { if (typeof TextDecoder === "undefined" || typeof Uint8Array === "undefined") { return atob(b64) } var buf = base64ToBuf(b64); // Note: `decoder.decode` method will throw a `DOMException` with the // `"EncodingError"` value when an coding error is found. var decoder = new TextDecoder(jsonCharacterEncoding, {fatal: true}) return decoder.decode(buf); } function resolveSourceMapHelper(code, codeUrl) { codeUrl = convertWindowsPath(codeUrl) var url = getSourceMappingUrl(code) if (!url) { return null } var dataUri = url.match(dataUriRegex) if (dataUri) { var mimeType = dataUri[1] || "text/plain" var lastParameter = dataUri[2] || "" var encoded = dataUri[3] || "" var data = { sourceMappingURL: url, url: null, sourcesRelativeTo: codeUrl, map: encoded } if (!jsonMimeTypeRegex.test(mimeType)) { var error = new Error("Unuseful data uri mime type: " + mimeType) error.sourceMapData = data throw error } try { data.map = parseMapToJSON( lastParameter === ";base64" ? decodeBase64String(encoded) : decodeURIComponent(encoded), data ) } catch (error) { error.sourceMapData = data throw error } return data } var mapUrl = resolveUrl(codeUrl, url) return { sourceMappingURL: url, url: mapUrl, sourcesRelativeTo: mapUrl, map: null } } function resolveSources(map, mapUrl, read, options, callback) { if (typeof options === "function") { callback = options options = {} } var pending = map.sources ? map.sources.length : 0 var result = { sourcesResolved: [], sourcesContent: [] } if (pending === 0) { callbackAsync(callback, null, result) return } var done = function() { pending-- if (pending === 0) { callback(null, result) } } resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { result.sourcesResolved[index] = fullUrl if (typeof sourceContent === "string") { result.sourcesContent[index] = sourceContent callbackAsync(done, null) } else { var readUrl = customDecodeUriComponent(fullUrl) read(readUrl, function(error, source) { result.sourcesContent[index] = error ? error : String(source) done() }) } }) } function resolveSourcesSync(map, mapUrl, read, options) { var result = { sourcesResolved: [], sourcesContent: [] } if (!map.sources || map.sources.length === 0) { return result } resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { result.sourcesResolved[index] = fullUrl if (read !== null) { if (typeof sourceContent === "string") { result.sourcesContent[index] = sourceContent } else { var readUrl = customDecodeUriComponent(fullUrl) try { result.sourcesContent[index] = String(read(readUrl)) } catch (error) { result.sourcesContent[index] = error } } } }) return result } var endingSlash = /\/?$/ function resolveSourcesHelper(map, mapUrl, options, fn) { options = options || {} mapUrl = convertWindowsPath(mapUrl) var fullUrl var sourceContent var sourceRoot for (var index = 0, len = map.sources.length; index < len; index++) { sourceRoot = null if (typeof options.sourceRoot === "string") { sourceRoot = options.sourceRoot } else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) { sourceRoot = map.sourceRoot } // If the sourceRoot is the empty string, it is equivalent to not setting // the property at all. if (sourceRoot === null || sourceRoot === '') { fullUrl = resolveUrl(mapUrl, map.sources[index]) } else { // Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes // `/scripts/subdir/`, not `/scripts/`. Pointing to a file as source root // does not make sense. fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index]) } sourceContent = (map.sourcesContent || [])[index] fn(fullUrl, sourceContent, index) } } function resolve(code, codeUrl, read, options, callback) { if (typeof options === "function") { callback = options options = {} } if (code === null) { var mapUrl = codeUrl var data = { sourceMappingURL: null, url: mapUrl, sourcesRelativeTo: mapUrl, map: null } var readUrl = customDecodeUriComponent(mapUrl) read(readUrl, function(error, result) { if (error) { error.sourceMapData = data return callback(error) } data.map = String(result) try { data.map = parseMapToJSON(data.map, data) } catch (error) { return callback(error) } _resolveSources(data) }) } else { resolveSourceMap(code, codeUrl, read, function(error, mapData) { if (error) { return callback(error) } if (!mapData) { return callback(null, null) } _resolveSources(mapData) }) } function _resolveSources(mapData) { resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) { if (error) { return callback(error) } mapData.sourcesResolved = result.sourcesResolved mapData.sourcesContent = result.sourcesContent callback(null, mapData) }) } } function resolveSync(code, codeUrl, read, options) { var mapData if (code === null) { var mapUrl = codeUrl mapData = { sourceMappingURL: null, url: mapUrl, sourcesRelativeTo: mapUrl, map: null } mapData.map = readSync(read, mapUrl, mapData) mapData.map = parseMapToJSON(mapData.map, mapData) } else { mapData = resolveSourceMapSync(code, codeUrl, read) if (!mapData) { return null } } var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options) mapData.sourcesResolved = result.sourcesResolved mapData.sourcesContent = result.sourcesContent return mapData } module.exports = { resolveSourceMap: resolveSourceMap, resolveSourceMapSync: resolveSourceMapSync, resolveSources: resolveSources, resolveSourcesSync: resolveSourcesSync, resolve: resolve, resolveSync: resolveSync, parseMapToJSON: parseMapToJSON } source-map-resolve-0.6.0/package-lock.json000066400000000000000000000465511363551167000205030ustar00rootroot00000000000000{ "name": "source-map-resolve", "version": "0.6.0", "lockfileVersion": 1, "requires": true, "dependencies": { "Base64": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/Base64/-/Base64-1.1.0.tgz", "integrity": "sha512-qeacf8dvGpf+XAT27ESHMh7z84uRzj/ua2pQdJg483m3bEXv/kVFtDnMgvf70BQGqzbZhR9t6BmASzKvqfJf3Q==", "dev": true }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", "dev": true, "requires": { "exit": "0.1.2", "glob": "^7.1.1" } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { "date-now": "^0.1.4" } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", "dev": true, "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", "is-regex": "^1.0.4", "object-is": "^1.0.1", "object-keys": "^1.1.1", "regexp.prototype.flags": "^1.2.0" } }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "defined": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, "dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { "domelementtype": "^2.0.1", "entities": "^2.0.0" }, "dependencies": { "domelementtype": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", "dev": true }, "entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true } } }, "domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", "dev": true }, "domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", "dev": true, "requires": { "domelementtype": "1" } }, "domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { "dom-serializer": "0", "domelementtype": "1" } }, "entities": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", "dev": true }, "es-abstract": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0.tgz", "integrity": "sha512-yYkE07YF+6SIBmg1MsJ9dlub5L48Ek7X0qz+c/CPCHS9EBXfESorzng4cJQjJW5/pB6vDF41u7F8vUhLVDqIug==", "dev": true, "requires": { "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.1.5", "is-regex": "^1.0.5", "object-inspect": "^1.7.0", "object-keys": "^1.1.1", "object.assign": "^4.1.0", "string.prototype.trimleft": "^2.1.1", "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { "is-callable": "^1.1.3" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-symbols": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", "dev": true }, "htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", "dev": true, "requires": { "domelementtype": "1", "domhandler": "2.3", "domutils": "1.5", "entities": "1.0", "readable-stream": "1.1" } }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "is-arguments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", "dev": true }, "is-callable": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", "dev": true }, "is-date-object": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", "dev": true }, "is-regex": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { "has": "^1.0.3" } }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", "dev": true, "requires": { "has-symbols": "^1.0.1" } }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "jshint": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.10.3.tgz", "integrity": "sha512-d8AoXcNNYzmm7cdmulQ3dQApbrPYArtVBO6n4xOICe4QsXGNHCAKDcFORzqP52LhK61KX0VhY39yYzCsNq+bxQ==", "dev": true, "requires": { "cli": "~1.0.0", "console-browserify": "1.1.x", "exit": "0.1.x", "htmlparser2": "3.8.x", "lodash": "~4.17.11", "minimatch": "~3.0.2", "shelljs": "0.3.x", "strip-json-comments": "1.0.x" } }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "object-inspect": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, "object-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "regexp.prototype.flags": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1" } }, "resolve": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.14.1.tgz", "integrity": "sha512-fn5Wobh4cxbLzuHaE+nphztHy43/b++4M6SsGFC2gB8uYwf0C8LcarfCz1un7UTW8OFQg9iNjZ4xpcFVGebDPg==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "resumer": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", "dev": true, "requires": { "through": "~2.3.4" } }, "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, "shelljs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", "dev": true }, "simple-asyncify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/simple-asyncify/-/simple-asyncify-1.0.0.tgz", "integrity": "sha1-M+1SWXvkIPcr/krOHYWwqdNu7v0=", "dev": true }, "string.prototype.trim": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz", "integrity": "sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.0-next.1", "function-bind": "^1.1.1" } }, "string.prototype.trimleft": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "string.prototype.trimright": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", "dev": true, "requires": { "define-properties": "^1.1.3", "function-bind": "^1.1.1" } }, "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, "strip-json-comments": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", "dev": true }, "tape": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/tape/-/tape-4.12.1.tgz", "integrity": "sha512-xoK2ariLmdGxqyXhhxfIZlr0czNB8hNJeVQmHN4D7ZyBn30GUoa4q2oM4cX8jNhnj1mtILXn1ugbfxc0tTDKtA==", "dev": true, "requires": { "deep-equal": "~1.1.1", "defined": "~1.0.0", "for-each": "~0.3.3", "function-bind": "~1.1.1", "glob": "~7.1.6", "has": "~1.0.3", "inherits": "~2.0.4", "is-regex": "~1.0.5", "minimist": "~1.2.0", "object-inspect": "~1.7.0", "resolve": "~1.14.1", "resumer": "~0.0.0", "string.prototype.trim": "~1.2.1", "through": "~2.3.8" } }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true } } } source-map-resolve-0.6.0/package.json000066400000000000000000000015511363551167000175440ustar00rootroot00000000000000{ "name": "source-map-resolve", "version": "0.6.0", "author": "Simon Lydell", "license": "MIT", "description": "Resolve the source map and/or sources for a generated file.", "keywords": [ "source map", "sourcemap", "source", "map", "sourceMappingURL", "resolve", "resolver", "locate", "locator", "find", "finder" ], "repository": "lydell/source-map-resolve", "files": [ "index.js" ], "scripts": { "lint": "jshint index.js test/", "unit": "node test/index.js && node test/read.js && node test/windows.js", "test": "npm run lint && npm run unit" }, "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0" }, "devDependencies": { "Base64": "1.1.0", "jshint": "2.10.3", "setimmediate": "1.0.5", "simple-asyncify": "1.0.0", "tape": "4.12.1" } } source-map-resolve-0.6.0/readme.md000066400000000000000000000173131363551167000170400ustar00rootroot00000000000000Overview [![Build Status](https://travis-ci.org/lydell/source-map-resolve.svg?branch=master)](https://travis-ci.org/lydell/source-map-resolve) ======== Resolve the source map and/or sources for a generated file. ```js var sourceMapResolve = require("source-map-resolve") var sourceMap = require("source-map") var code = [ "!function(){...}();", "/*# sourceMappingURL=foo.js.map */" ].join("\n") sourceMapResolve.resolveSourceMap(code, "/js/foo.js", fs.readFile, function(error, result) { if (error) { return notifyFailure(error) } result // { // map: {file: "foo.js", mappings: "...", sources: ["/coffee/foo.coffee"], names: []}, // url: "/js/foo.js.map", // sourcesRelativeTo: "/js/foo.js.map", // sourceMappingURL: "foo.js.map" // } sourceMapResolve.resolveSources(result.map, result.sourcesRelativeTo, fs.readFile, function(error, result) { if (error) { return notifyFailure(error) } result // { // sourcesResolved: ["/coffee/foo.coffee"], // sourcesContent: [""] // } }) }) sourceMapResolve.resolve(code, "/js/foo.js", fs.readFile, function(error, result) { if (error) { return notifyFailure(error) } result // { // map: {file: "foo.js", mappings: "...", sources: ["/coffee/foo.coffee"], names: []}, // url: "/js/foo.js.map", // sourcesRelativeTo: "/js/foo.js.map", // sourceMappingURL: "foo.js.map", // sourcesResolved: ["/coffee/foo.coffee"], // sourcesContent: [""] // } result.map.sourcesContent = result.sourcesContent var map = new sourceMap.sourceMapConsumer(result.map) map.sourceContentFor("/coffee/foo.coffee") // "" }) ``` Installation ============ `npm install source-map-resolve` Usage ===== ### `sourceMapResolve.resolveSourceMap(code, codeUrl, read, callback)` ### - `code` is a string of code that may or may not contain a sourceMappingURL comment. Such a comment is used to resolve the source map. - `codeUrl` is the url to the file containing `code`. If the sourceMappingURL is relative, it is resolved against `codeUrl`. - `read(url, callback)` is a function that reads `url` and responds using `callback(error, content)`. In Node.js you might want to use `fs.readFile`, while in the browser you might want to use an asynchronus `XMLHttpRequest`. - `callback(error, result)` is a function that is invoked with either an error or `null` and the result. The result is an object with the following properties: - `map`: The source map for `code`, as an object (not a string). - `url`: The url to the source map. If the source map came from a data uri, this property is `null`, since then there is no url to it. - `sourcesRelativeTo`: The url that the sources of the source map are relative to. Since the sources are relative to the source map, and the url to the source map is provided as the `url` property, this property might seem superfluos. However, remember that the `url` property can be `null` if the source map came from a data uri. If so, the sources are relative to the file containing the data uri—`codeUrl`. This property will be identical to the `url` property or `codeUrl`, whichever is appropriate. This way you can conveniently resolve the sources without having to think about where the source map came from. - `sourceMappingURL`: The url of the sourceMappingURL comment in `code`. If `code` contains no sourceMappingURL, the result is `null`. ### `sourceMapResolve.resolveSources(map, mapUrl, read, [options], callback)` ### - `map` is a source map, as an object (not a string). - `mapUrl` is the url to the file containing `map`. Relative sources in the source map, if any, are resolved against `mapUrl`. - `read(url, callback)` is a function that reads `url` and responds using `callback(error, content)`. In Node.js you might want to use `fs.readFile`, while in the browser you might want to use an asynchronus `XMLHttpRequest`. - `options` is an optional object with any of the following properties: - `sourceRoot`: Override the `sourceRoot` property of the source map, which might only be relevant when resolving sources in the browser. This lets you bypass it when using the module outside of a browser, if needed. Pass a string to replace the `sourceRoot` property with, or `false` to ignore it. Defaults to `undefined`. - `callback(error, result)` is a function that is invoked with either an error or `null` and the result. The result is an object with the following properties: - `sourcesResolved`: The same as `map.sources`, except all the sources are fully resolved. - `sourcesContent`: An array with the contents of all sources in `map.sources`, in the same order as `map.sources`. If getting the contents of a source fails, an error object is put into the array instead. ### `sourceMapResolve.resolve(code, codeUrl, read, [options], callback)` ### The arguments are identical to `sourceMapResolve.resolveSourceMap`, except that you may also provide the same `options` as in `sourceMapResolve.resolveSources`. This is a convenience method that first resolves the source map and then its sources. You could also do this by first calling `sourceMapResolve.resolveSourceMap` and then `sourceMapResolve.resolveSources`. The result is identical to `sourceMapResolve.resolveSourceMap`, with the properties from `sourceMapResolve.resolveSources` merged into it. There is one extra feature available, though. If `code` is `null`, `codeUrl` is treated as a url to the source map instead of to `code`, and will be read. This is handy if you _sometimes_ get the source map url from the `SourceMap: ` header (see the [Notes] section). In this case, the `sourceMappingURL` property of the result is `null`. [Notes]: #notes ### `sourceMapResolve.*Sync()` ### There are also sync versions of the three previous functions. They are identical to the async versions, except: - They expect a sync reading function. In Node.js you might want to use `fs.readFileSync`, while in the browser you might want to use a synchronus `XMLHttpRequest`. - They throw errors and return the result instead of using a callback. `sourceMapResolve.resolveSourcesSync` also accepts `null` as the `read` parameter. The result is the same as when passing a function as the `read parameter`, except that the `sourcesContent` property of the result will be an empty array. In other words, the sources aren’t read. You only get the `sourcesResolved` property. (This only supported in the synchronus version, since there is no point doing it asynchronusly.) ### `sourceMapResolve.parseMapToJSON(string, [data])` ### The spec says that if a source map (as a string) starts with `)]}'`, it should be stripped off. This is to prevent XSSI attacks. This function does that and returns the result of `JSON.parse`ing what’s left. If this function throws `error`, `error.sourceMapData === data`. ### Errors All errors passed to callbacks or thrown by this module have a `sourceMapData` property that contain as much as possible of the intended result of the function up until the error occurred. Note that while the `map` property of result objects always is an object, `error.sourceMapData.map` will be a string if parsing that string fails. Note ==== This module resolves the source map for a given generated file by looking for a sourceMappingURL comment. The spec defines yet a way to provide the URL to the source map: By sending the `SourceMap: ` header along with the generated file. Since this module doesn’t retrive the generated code for you (instead _you_ give the generated code to the module), it’s up to you to look for such a header when you retrieve the file (should the need arise). License ======= [MIT](LICENSE). source-map-resolve-0.6.0/test/000077500000000000000000000000001363551167000162335ustar00rootroot00000000000000source-map-resolve-0.6.0/test/common.js000066400000000000000000000011131363551167000200550ustar00rootroot00000000000000function u1(url) { return "code\n/*# sourceMappingURL=" + url + " */" } function u2(url) { return "code\n//# sourceMappingURL=" + url } function u3(url) { return "code\n/*\n# sourceMappingURL=" + url + "\n*/" } function u4(url) { return "code\n/*\n//# sourceMappingURL=" + url + "\n*/" } function read(x) { return function() { return x } } function Throws(x) { throw new Error(x) } function identity(x) { return x } module.exports = { u1: u1, u2: u2, u3: u3, u4: u4, read: read, Throws: Throws, identity: identity } source-map-resolve-0.6.0/test/index.js000066400000000000000000001240361363551167000177060ustar00rootroot00000000000000var test = require("tape") var asyncify = require("simple-asyncify") var common = require("./common") var u1 = common.u1 var u2 = common.u2 var u3 = common.u3 var u4 = common.u4 var read = common.read var Throws = common.Throws var identity = common.identity var sourceMapResolve = require("../") // Polyfills. require("setimmediate") if (typeof window !== "undefined" && !window.atob) { window.atob = require("Base64").atob } "use strict" var map = { simple: { mappings: "AAAA", sources: ["foo.js"], names: [] }, sourceRoot: { mappings: "AAAA", sourceRoot: "/static/js/app/", sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"], names: [] }, sourceRootNoSlash: { mappings: "AAAA", sourceRoot: "/static/js/app", sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"], names: [] }, sourceRootEmpty: { mappings: "AAAA", sourceRoot: "", sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"], names: [] }, sourcesContent: { mappings: "AAAA", sourceRoot: "/static/js/app/", sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"], sourcesContent: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"], names: [] }, mixed: { mappings: "AAAA", sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"], sourcesContent: ["foo.js", null , null , "/version.js", "//foo.org/baz.js"], names: [] }, noSources: { mappings: "", sources: [], names: [] }, utf8 : { mappings: "AAAA", sources: ["foo.js"], sourcesContent: ["中文😊"], names: [] }, empty: {} } map.simpleString = JSON.stringify(map.simple) map.XSSIsafe = ")]}'" + map.simpleString var code = { fileRelative: u1("foo.js.map"), domainRelative: u2("/foo.js.map"), schemeRelative: u3("//foo.org/foo.js.map"), absolute: u4("https://foo.org/foo.js.map"), dataUri: u1("data:application/json," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D"), base64: u2("data:application/json;base64," + "eyJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VzIjpbImZvby5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyLkuK3mlofwn5iKIl0sIm5hbWVzIjpbXX0="), // jshint ignore:line base64InvalidUtf8: u3("data:application/json;base64,abc"), dataUriText: u4("data:text/json," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D"), dataUriParameter: u1("data:application/json;charset=UTF-8;foo=bar," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D"), dataUriNoMime: u2("data:,foo"), dataUriInvalidMime: u3("data:text/html,foo"), dataUriInvalidJSON: u4("data:application/json,foo"), dataUriInvalidCode: u1("data:application/json,%"), dataUriXSSIsafe: u2("data:application/json," + ")%5D%7D%27" + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D"), dataUriEmpty: u3("data:"), noMap: "" } function testResolveSourceMap(method, sync) { return function(t) { var wrap = (sync ? identity : asyncify) var codeUrl = "http://example.com/a/b/c/foo.js" t.plan(1 + 12*3 + 8*4) t.equal(typeof method, "function", "is a function") if (sync) { method = asyncify(method) } var next = false function isAsync() { t.ok(next, "is async") } method(code.fileRelative, codeUrl, wrap(read(map.simpleString)), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "foo.js.map", url: "http://example.com/a/b/c/foo.js.map", sourcesRelativeTo: "http://example.com/a/b/c/foo.js.map", map: map.simple }, "fileRelative") isAsync() }) method(code.domainRelative, codeUrl, wrap(read(map.simpleString)), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "/foo.js.map", url: "http://example.com/foo.js.map", sourcesRelativeTo: "http://example.com/foo.js.map", map: map.simple }, "domainRelative") isAsync() }) method(code.schemeRelative, codeUrl, wrap(read(map.simpleString)), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "//foo.org/foo.js.map", url: "http://foo.org/foo.js.map", sourcesRelativeTo: "http://foo.org/foo.js.map", map: map.simple }, "schemeRelative") isAsync() }) method(code.absolute, codeUrl, wrap(read(map.simpleString)), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple }, "absolute") isAsync() }) method(code.dataUri, codeUrl, wrap(Throws), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple }, "dataUri") isAsync() }) method(code.base64, codeUrl, wrap(Throws), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json;base64," + "eyJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VzIjpbImZvby5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyLkuK3mlofwn5iKIl0sIm5hbWVzIjpbXX0=", // jshint ignore:line url: null, sourcesRelativeTo: codeUrl, map: map.utf8 }, "base64") isAsync() }) method(code.base64InvalidUtf8, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:application/json;base64,abc", url: null, sourcesRelativeTo: codeUrl, map: "abc" }, "base64InvalidUtf8 .sourceMapData") t.ok(error instanceof TypeError && error.message !== "data:application/json;base64,abc", "base64InvalidUtf8") t.notOk(result) isAsync() }) method(code.dataUriText, codeUrl, wrap(Throws), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:text/json," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple }, "dataUriText") isAsync() }) method(code.dataUriParameter, codeUrl, wrap(Throws), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json;charset=UTF-8;foo=bar," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple }, "dataUriParameter") isAsync() }) method(code.dataUriNoMime, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:,foo", url: null, sourcesRelativeTo: codeUrl, map: "foo" }, "dataUriNoMime .sourceMapData") t.ok(error.message.match(/mime type.+text\/plain/), "dataUriNoMime") t.notOk(result) isAsync() }) method(code.dataUriInvalidMime, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:text/html,foo", url: null, sourcesRelativeTo: codeUrl, map: "foo" }, "dataUriInvalidMime .sourceMapData") t.ok(error.message.match(/mime type.+text\/html/), "dataUriInvalidMime") t.notOk(result) isAsync() }) method(code.dataUriInvalidJSON, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:application/json,foo", url: null, sourcesRelativeTo: codeUrl, map: "foo" }, "dataUriInvalidJSON .sourceMapData") t.ok(error instanceof SyntaxError && error.message !== "data:application/json,foo", "dataUriInvalidJSON") t.notOk(result) isAsync() }) method(code.dataUriInvalidCode, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:application/json,%", url: null, sourcesRelativeTo: codeUrl, map: "%" }, "dataUriInvalidCode .sourceMapData") t.ok(error instanceof URIError && error.message !== "data:application/json,%", "dataUriInvalidCode") t.notOk(result) isAsync() }) method(code.dataUriXSSIsafe, codeUrl, wrap(Throws), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json," + ")%5D%7D%27" + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple }, "dataUriXSSIsafe") isAsync() }) method(code.dataUriEmpty, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:", url: null, sourcesRelativeTo: codeUrl, map: "" }, "dataUriEmpty .sourceMapData") t.ok(error.message.match(/mime type.+text\/plain/), "dataUriEmpty") t.notOk(result) isAsync() }) method(code.noMap, codeUrl, wrap(Throws), function(error, result) { t.error(error) t.equal(result, null, "noMap") isAsync() }) method(code.absolute, codeUrl, wrap(read([map.simpleString])), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple }, "read non-string") isAsync() }) method(code.absolute, codeUrl, wrap(read("invalid JSON")), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: "invalid JSON" }, "read invalid JSON .sourceMapData") t.ok(error instanceof SyntaxError, "read invalid JSON") t.notOk(result) isAsync() }) method(code.absolute, codeUrl, wrap(read(map.XSSIsafe)), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple }, "XSSIsafe map") isAsync() }) method(code.absolute, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: null }, "read throws .sourceMapData") t.equal(error.message, "https://foo.org/foo.js.map", "read throws") t.notOk(result) isAsync() }) next = true } } test(".resolveSourceMap", testResolveSourceMap(sourceMapResolve.resolveSourceMap, false)) test(".resolveSourceMapSync", testResolveSourceMap(sourceMapResolve.resolveSourceMapSync, true)) function testResolveSources(method, sync) { return function(t) { var wrap = (sync ? identity : asyncify) var mapUrl = "http://example.com/a/b/c/foo.js.map" t.plan(1 + 11*3 + 4) t.equal(typeof method, "function", "is a function") if (sync) { method = asyncify(method) } var next = false function isAsync() { t.ok(next, "is async") } var options method(map.simple, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["http://example.com/a/b/c/foo.js"] }, "simple") isAsync() }) method(map.sourceRoot, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ] }, "sourceRoot") isAsync() }) options = {sourceRoot: false} method(map.sourceRoot, mapUrl, wrap(identity), options, function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ] }, "ignore sourceRoot") isAsync() }) options = {sourceRoot: "/static/js/"} method(map.sourceRoot, mapUrl, wrap(identity), options, function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [ "http://example.com/static/js/foo.js", "http://example.com/static/js/lib/bar.js", "http://example.com/static/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [ "http://example.com/static/js/foo.js", "http://example.com/static/js/lib/bar.js", "http://example.com/static/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ] }, "custom sourceRoot") isAsync() }) method(map.sourceRootNoSlash, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ] }, "sourceRootNoSlash") isAsync() }) method(map.sourceRootEmpty, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ] }, "sourceRootEmpty") isAsync() }) method(map.sourcesContent, mapUrl, wrap(Throws), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [ "foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js" ] }, "sourcesContent") isAsync() }) method(map.mixed, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [ "foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "/version.js", "//foo.org/baz.js" ] }, "mixed") isAsync() }) method(map.noSources, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [], sourcesContent: [] }, "noSources") isAsync() }) method(map.empty, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: [], sourcesContent: [] }, "empty") isAsync() }) method(map.simple, mapUrl, wrap(read(["non", "string"])), function(error, result) { t.error(error) t.deepEqual(result, { sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["non,string"] }, "read non-string") isAsync() }) method(map.mixed, mapUrl, wrap(Throws), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "read throws .sourcesResolved") var sourcesContent = result.sourcesContent for (var index = 0, len = sourcesContent.length; index < len; index++) { var item = sourcesContent[index] if (item instanceof Error) { sourcesContent[index] = null } } t.deepEqual(sourcesContent, [ "foo.js", null, null, "/version.js", "//foo.org/baz.js" ], "read throws .sourcesContent") isAsync() }) next = true } } test(".resolveSources", testResolveSources(sourceMapResolve.resolveSources, false)) test(".resolveSourcesSync", testResolveSources(sourceMapResolve.resolveSourcesSync, true)) test(".resolveSourcesSync no read", function(t) { t.plan(1) var mapUrl = "http://example.com/a/b/c/foo.js.map" var result = sourceMapResolve.resolveSourcesSync(map.mixed, mapUrl, null) t.deepEqual(result, { sourcesResolved: [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], sourcesContent: [] }) }) function testResolve(method, sync) { return function(t) { var wrap = (sync ? identity : asyncify) var wrapMap = function(mapFn, fn) { return wrap(function(url) { if (/\.map$/.test(url)) { return mapFn(url) } return fn(url) }) } var codeUrl = "http://example.com/a/b/c/foo.js" t.plan(1 + 15*3 + 23*4 + 4) t.equal(typeof method, "function", "is a function") if (sync) { method = asyncify(method) } var next = false function isAsync() { t.ok(next, "is async") } var readSimple = wrapMap(read(map.simpleString), identity) method(code.fileRelative, codeUrl, readSimple, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "foo.js.map", url: "http://example.com/a/b/c/foo.js.map", sourcesRelativeTo: "http://example.com/a/b/c/foo.js.map", map: map.simple, sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["http://example.com/a/b/c/foo.js"] }, "fileRelative") isAsync() }) method(code.domainRelative, codeUrl, readSimple, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "/foo.js.map", url: "http://example.com/foo.js.map", sourcesRelativeTo: "http://example.com/foo.js.map", map: map.simple, sourcesResolved: ["http://example.com/foo.js"], sourcesContent: ["http://example.com/foo.js"] }, "domainRelative") isAsync() }) method(code.schemeRelative, codeUrl, readSimple, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "//foo.org/foo.js.map", url: "http://foo.org/foo.js.map", sourcesRelativeTo: "http://foo.org/foo.js.map", map: map.simple, sourcesResolved: ["http://foo.org/foo.js"], sourcesContent: ["http://foo.org/foo.js"] }, "schemeRelative") isAsync() }) method(code.absolute, codeUrl, readSimple, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple, sourcesResolved: ["https://foo.org/foo.js"], sourcesContent: ["https://foo.org/foo.js"] }, "absolute") isAsync() }) method(code.dataUri, codeUrl, wrapMap(Throws, identity), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple, sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["http://example.com/a/b/c/foo.js"] }, "dataUri") isAsync() }) method(code.base64, codeUrl, wrapMap(Throws, identity), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json;base64," + "eyJtYXBwaW5ncyI6IkFBQUEiLCJzb3VyY2VzIjpbImZvby5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyLkuK3mlofwn5iKIl0sIm5hbWVzIjpbXX0=", // jshint ignore:line url: null, sourcesRelativeTo: codeUrl, map: map.utf8, sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["中文😊"] }, "base64") isAsync() }) method(code.base64InvalidUtf8, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:application/json;base64,abc", url: null, sourcesRelativeTo: codeUrl, map: "abc" }, "base64InvalidUtf8 .sourceMapData") t.ok(error instanceof TypeError && error.message !== "data:application/json;base64,abc", "base64InvalidUtf8") t.notOk(result) isAsync() }) method(code.dataUriText, codeUrl, wrapMap(Throws, identity), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:text/json," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple, sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["http://example.com/a/b/c/foo.js"] }, "dataUriText") isAsync() }) method(code.dataUriParameter, codeUrl, wrapMap(Throws, identity), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json;charset=UTF-8;foo=bar," + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple, sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["http://example.com/a/b/c/foo.js"] }, "dataUriParameter") isAsync() }) method(code.dataUriNoMime, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:,foo", url: null, sourcesRelativeTo: codeUrl, map: "foo" }, "dataUriNoMime .sourceMapData") t.ok(error.message.match(/mime type.+text\/plain/), "dataUriNoMime") t.notOk(result) isAsync() }) method(code.dataUriInvalidMime, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:text/html,foo", url: null, sourcesRelativeTo: codeUrl, map: "foo" }, "dataUriInvalidMime .sourceMapData") t.ok(error.message.match(/mime type.+text\/html/), "dataUriInvalidMime") t.notOk(result) isAsync() }) method(code.dataUriInvalidJSON, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:application/json,foo", url: null, sourcesRelativeTo: codeUrl, map: "foo" }, "dataUriInvalidJSON .sourceMapData") t.ok(error instanceof SyntaxError && error.message !== "data:application/json,foo", "dataUriInvalidJSON") t.notOk(result) isAsync() }) method(code.dataUriInvalidCode, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:application/json,%", url: null, sourcesRelativeTo: codeUrl, map: "%" }, "dataUriInvalidCode .sourceMapData") t.ok(error instanceof URIError && error.message !== "data:application/json,%", "dataUriInvalidCode") t.notOk(result) isAsync() }) method(code.dataUriXSSIsafe, codeUrl, wrapMap(Throws, identity), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "data:application/json," + ")%5D%7D%27" + "%7B%22mappings%22%3A%22AAAA%22%2C%22sources%22%3A%5B%22" + "foo.js%22%5D%2C%22names%22%3A%5B%5D%7D", url: null, sourcesRelativeTo: codeUrl, map: map.simple, sourcesResolved: ["http://example.com/a/b/c/foo.js"], sourcesContent: ["http://example.com/a/b/c/foo.js"] }, "dataUriXSSIsafe") isAsync() }) method(code.dataUriEmpty, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "data:", url: null, sourcesRelativeTo: codeUrl, map: "" }, "dataUriEmpty .sourceMapData") t.ok(error.message.match(/mime type.+text\/plain/), "dataUriEmpty") t.notOk(result) isAsync() }) method(code.noMap, codeUrl, wrap(Throws), function(error, result) { t.error(error) t.equal(result, null, "noMap") isAsync() }) method(code.absolute, codeUrl, wrap(read([map.simpleString])), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple, sourcesResolved: ["https://foo.org/foo.js"], sourcesContent: [map.simpleString] }, "read non-string") isAsync() }) method(code.absolute, codeUrl, wrap(read("invalid JSON")), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: "invalid JSON" }, "read invalid JSON .sourceMapData") t.ok(error instanceof SyntaxError, "read invalid JSON") t.notOk(result) isAsync() }) method(code.absolute, codeUrl, wrapMap(read(map.XSSIsafe), identity), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple, sourcesResolved: ["https://foo.org/foo.js"], sourcesContent: ["https://foo.org/foo.js"] }, "XSSIsafe map") isAsync() }) method(code.absolute, codeUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: "https://foo.org/foo.js.map", url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: null }, "read throws .sourceMapData") t.equal(error.message, "https://foo.org/foo.js.map", "read throws") t.notOk(result) isAsync() }) function readMap(what) { return wrapMap(read(JSON.stringify(what)), identity) } var options method(code.fileRelative, codeUrl, readMap(map.simple), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, ["http://example.com/a/b/c/foo.js"], "simple") t.deepEqual(result.sourcesContent, ["http://example.com/a/b/c/foo.js"], "simple") isAsync() }) method(code.fileRelative, codeUrl, readMap(map.sourceRoot), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "sourceRoot") t.deepEqual(result.sourcesContent, [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "sourceRoot") isAsync() }) options = {sourceRoot: false} method(code.fileRelative, codeUrl, readMap(map.sourceRoot), options, function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "ignore sourceRoot") t.deepEqual(result.sourcesContent, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "ignore sourceRoot") isAsync() }) options = {sourceRoot: "/static/js/"} method(code.fileRelative, codeUrl, readMap(map.sourceRoot), options, function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/static/js/foo.js", "http://example.com/static/js/lib/bar.js", "http://example.com/static/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "custom sourceRoot") t.deepEqual(result.sourcesContent, [ "http://example.com/static/js/foo.js", "http://example.com/static/js/lib/bar.js", "http://example.com/static/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "custom sourceRoot") isAsync() }) method(code.fileRelative, codeUrl, readMap(map.sourceRootNoSlash), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "sourceRootNoSlash") t.deepEqual(result.sourcesContent, [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "sourceRootNoSlash") isAsync() }) method(code.fileRelative, codeUrl, readMap(map.sourceRootEmpty), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "sourceRootEmpty") t.deepEqual(result.sourcesContent, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "sourceRootEmpty") isAsync() }) method(code.fileRelative, codeUrl, readMap(map.sourcesContent), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/static/js/app/foo.js", "http://example.com/static/js/app/lib/bar.js", "http://example.com/static/js/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "sourcesContent") t.deepEqual(result.sourcesContent, [ "foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js" ], "sourcesContent") isAsync() }) method(code.fileRelative, codeUrl, readMap(map.mixed), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "mixed") t.deepEqual(result.sourcesContent, [ "foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "/version.js", "//foo.org/baz.js" ], "mixed") isAsync() }) method(code.fileRelative, codeUrl, readMap(map.noSources), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [], "noSources") t.deepEqual(result.sourcesContent, [], "noSources") isAsync() }) method(code.fileRelative, codeUrl, readMap(map.empty), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [], "noSources") t.deepEqual(result.sourcesContent, [], "noSources") isAsync() }) method(code.fileRelative, codeUrl, wrap(read([map.simpleString])), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, ["http://example.com/a/b/c/foo.js"], "read non-string") t.deepEqual(result.sourcesContent, [map.simpleString], "read non-string") isAsync() }) function ThrowsMap(what) { return wrapMap(read(JSON.stringify(what)), Throws) } method(code.fileRelative, codeUrl, ThrowsMap(map.mixed), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "read throws .sourcesResolved") var sourcesContent = result.sourcesContent for (var index = 0, len = sourcesContent.length; index < len; index++) { var item = sourcesContent[index] if (item instanceof Error) { sourcesContent[index] = null } } t.deepEqual(sourcesContent, [ "foo.js", null, null, "/version.js", "//foo.org/baz.js" ], "read throws .sourcesContent") isAsync() }) var mapUrl = "https://foo.org/foo.js.map" method(null, mapUrl, readSimple, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: null, url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple, sourcesResolved: ["https://foo.org/foo.js"], sourcesContent: ["https://foo.org/foo.js"] }, "mapUrl simple") isAsync() }) method(null, mapUrl, wrap(read([map.simpleString])), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: null, url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple, sourcesResolved: ["https://foo.org/foo.js"], sourcesContent: [map.simpleString] }, "mapUrl read non-string") isAsync() }) method(null, mapUrl, wrap(read("invalid JSON")), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: null, url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: "invalid JSON" }, "mapUrl read invalid JSON .sourceMapData") t.ok(error instanceof SyntaxError, "mapUrl read invalid JSON") t.notOk(result) isAsync() }) method(null, mapUrl, wrapMap(read(map.XSSIsafe), identity), function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: null, url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: map.simple, sourcesResolved: ["https://foo.org/foo.js"], sourcesContent: ["https://foo.org/foo.js"] }, "mapUrl XSSIsafe map") isAsync() }) method(null, mapUrl, wrap(Throws), function(error, result) { t.deepEqual(error.sourceMapData, { sourceMappingURL: null, url: "https://foo.org/foo.js.map", sourcesRelativeTo: "https://foo.org/foo.js.map", map: null }, "mapUrl read throws .sourceMapData") t.equal(error.message, "https://foo.org/foo.js.map", "mapUrl read throws") t.notOk(result) isAsync() }) mapUrl = "http://example.com/a/b/c/foo.js.map" options = {sourceRoot: "/static/js/"} method(null, mapUrl, readMap(map.sourceRoot), options, function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/static/js/foo.js", "http://example.com/static/js/lib/bar.js", "http://example.com/static/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "mapUrl custom sourceRoot") t.deepEqual(result.sourcesContent, [ "http://example.com/static/js/foo.js", "http://example.com/static/js/lib/bar.js", "http://example.com/static/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "mapUrl custom sourceRoot") isAsync() }) method(null, mapUrl, readMap(map.mixed), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, [ "http://example.com/a/b/c/foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "http://example.com/version.js", "http://foo.org/baz.js" ], "mapUrl mixed") t.deepEqual(result.sourcesContent, [ "foo.js", "http://example.com/a/b/c/lib/bar.js", "http://example.com/a/b/vendor/dom.js", "/version.js", "//foo.org/baz.js" ], "mapUrl mixed") isAsync() }) next = true } } test(".resolve", testResolve(sourceMapResolve.resolve, false)) test(".resolveSync", testResolve(sourceMapResolve.resolveSync, true)) test(".parseMapToJSON", function(t) { t.plan(1) t.deepEqual(sourceMapResolve.parseMapToJSON(map.XSSIsafe), map.simple) }) source-map-resolve-0.6.0/test/read.js000066400000000000000000000042371363551167000175120ustar00rootroot00000000000000var test = require("tape") var asyncify = require("simple-asyncify") var common = require("./common") var u1 = common.u1 var sourceMapResolve = require("../") var mapUrl = "operators%20map.json" var codeUrl = "./built files/operators:+-<>%25.js" var sourceUrl = "../source files/operators:+-<>%25.coffee" function readTest(t, files) { return function(file, callback) { var fileData = files[file] t.ok(fileData, "decoded file name") if (callback) { callback(null, fileData) } else { return fileData } } } function testResolveSourceMap(method, sync) { return function(t) { t.plan(2) if (sync) { method = asyncify(method) } var read = readTest(t, { "built files/operators map.json": "{}" }) method(u1(mapUrl), codeUrl, read, function(error) { t.error(error) }) } } test(".resolveSourceMap", testResolveSourceMap(sourceMapResolve.resolveSourceMap, false)) test(".resolveSourceMapSync", testResolveSourceMap(sourceMapResolve.resolveSourceMapSync, true)) function testResolveSources(method, sync) { return function(t) { t.plan(2) if (sync) { method = asyncify(method) } var map = { sources: [sourceUrl] } var read = readTest(t, { "../source files/operators:+-<>%.coffee": "source code" }) method(map, mapUrl, read, function(error) { t.error(error) }) } } test(".resolveSources", testResolveSources(sourceMapResolve.resolveSources, false)) test(".resolveSourcesSync", testResolveSources(sourceMapResolve.resolveSourcesSync, true)) function testResolve(method, sync) { return function(t) { t.plan(3) if (sync) { method = asyncify(method) } var map = { sources: [sourceUrl] } var read = readTest(t, { "built files/operators map.json": JSON.stringify(map), "source files/operators:+-<>%.coffee": "source code" }) method(u1(mapUrl), codeUrl, read, function(error) { t.error(error) }) } } test(".resolve", testResolve(sourceMapResolve.resolve, false)) test(".resolveSync", testResolve(sourceMapResolve.resolveSync, true)) source-map-resolve-0.6.0/test/windows.js000066400000000000000000000107051363551167000202660ustar00rootroot00000000000000var path = require("path") var test = require("tape") var asyncify = require("simple-asyncify") var common = require("./common") var u1 = common.u1 var u2 = common.u2 var u3 = common.u3 var read = common.read var identity = common.identity var sourceMapResolve = require("../") path.sep = "\\" function testResolveSourceMap(method, sync) { return function(t) { var wrap = (sync ? identity : asyncify) var codeUrl = "c:\\a\\b\\c\\foo.js" t.plan(3 * 2) if (sync) { method = asyncify(method) } var map = {} var readMap = wrap(read(JSON.stringify(map))) method(u1("foo.js.map"), codeUrl, readMap, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "foo.js.map", url: "/a/b/c/foo.js.map", sourcesRelativeTo: "/a/b/c/foo.js.map", map: map }) }) method(u2("/foo.js.map"), codeUrl, readMap, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "/foo.js.map", url: "/foo.js.map", sourcesRelativeTo: "/foo.js.map", map: map }) }) method(u3("../foo.js.map"), codeUrl, readMap, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "../foo.js.map", url: "/a/b/foo.js.map", sourcesRelativeTo: "/a/b/foo.js.map", map: map }) }) } } test(".resolveSourceMap", testResolveSourceMap(sourceMapResolve.resolveSourceMap, false)) test(".resolveSourceMapSync", testResolveSourceMap(sourceMapResolve.resolveSourceMapSync, true)) function testResolveSources(method, sync) { return function(t) { var wrap = (sync ? identity : asyncify) var mapUrl = "c:\\a\\b\\c\\foo.js.map" t.plan(1 * 3) if (sync) { method = asyncify(method) } var map = { sources: ["foo.js", "/foo.js", "../foo.js"] } method(map, mapUrl, wrap(identity), function(error, result) { t.error(error) t.deepEqual(result.sourcesResolved, ["/a/b/c/foo.js", "/foo.js", "/a/b/foo.js"]) t.deepEqual(result.sourcesContent, ["/a/b/c/foo.js", "/foo.js", "/a/b/foo.js"]) }) } } test(".resolveSources", testResolveSources(sourceMapResolve.resolveSources, false)) test(".resolveSourcesSync", testResolveSources(sourceMapResolve.resolveSourcesSync, true)) function testResolve(method, sync) { return function(t) { var wrap = (sync ? identity : asyncify) var wrapMap = function(mapFn, fn) { return wrap(function(url) { if (/\.map$/.test(url)) { return mapFn(url) } return fn(url) }) } var codeUrl = "c:\\a\\b\\c\\foo.js" t.plan(3 * 2) if (sync) { method = asyncify(method) } var map = { sources: ["foo.js", "/foo.js", "../foo.js"] } var readMap = wrapMap(read(JSON.stringify(map)), identity) method(u1("foo.js.map"), codeUrl, readMap, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "foo.js.map", url: "/a/b/c/foo.js.map", sourcesRelativeTo: "/a/b/c/foo.js.map", map: map, sourcesResolved: ["/a/b/c/foo.js", "/foo.js", "/a/b/foo.js"], sourcesContent: ["/a/b/c/foo.js", "/foo.js", "/a/b/foo.js"] }) }) method(u2("/foo.js.map"), codeUrl, readMap, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "/foo.js.map", url: "/foo.js.map", sourcesRelativeTo: "/foo.js.map", map: map, sourcesResolved: ["/foo.js", "/foo.js", "/foo.js"], sourcesContent: ["/foo.js", "/foo.js", "/foo.js"] }) }) method(u3("../foo.js.map"), codeUrl, readMap, function(error, result) { t.error(error) t.deepEqual(result, { sourceMappingURL: "../foo.js.map", url: "/a/b/foo.js.map", sourcesRelativeTo: "/a/b/foo.js.map", map: map, sourcesResolved: ["/a/b/foo.js", "/foo.js", "/a/foo.js"], sourcesContent: ["/a/b/foo.js", "/foo.js", "/a/foo.js"] }) }) } } test(".resolve", testResolve(sourceMapResolve.resolve, false)) test(".resolveSync", testResolve(sourceMapResolve.resolveSync, true))