Resolve the source map and/or sources for a generated file.
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: ["<contents of /coffee/foo.coffee>"]
// }
})
})
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: ["<contents of /coffee/foo.coffee>"]
// }
result.map.sourcesContent = result.sourcesContent
var map = new sourceMap.sourceMapConsumer(result.map)
map.sourceContentFor("/coffee/foo.coffee")
// "<contents of /coffee/foo.coffee>"
})
npm install source-map-resolvebower install source-map-resolvecomponent install lydell/source-map-resolveWorks with CommonJS, AMD and browser globals, through UMD.
Note: This module requires setImmediate and atob.
Use polyfills if needed, such as:
sourceMapResolve.resolveSourceMap(code, codeUrl, read, callback)code is a string of code that may or may not contain a sourceMappingURLcodeUrl is the url to the file containing code. If the sourceMappingURLcodeUrl.read(url, callback) is a function that reads url and responds usingcallback(error, content). In Node.js you might want to use fs.readFile,XMLHttpRequest.callback(error, result) is a function that is invoked with either an errornull 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,null, since then there is no url to it.sourcesRelativeTo: The url that the sources of the source map are relativeurl property, this property might seemurl property can be null if thecodeUrl. This property will be identical to theurl property or codeUrl, whichever is appropriate. This way you cansourceMappingURL: 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 themapUrl.read(url, callback) is a function that reads url and responds usingcallback(error, content). In Node.js you might want to use fs.readFile,XMLHttpRequest.options is an optional object with any of the following properties:sourceRoot: Override the sourceRoot property of the source map, whichsourceRoot property with, or false to ignore it.undefined.callback(error, result) is a function that is invoked with either an errornull and the result.The result is an object with the following properties:
sourcesResolved: The same as map.sources, except all the sources aresourcesContent: An array with the contents of all sources in map.sources,map.sources. If getting the contents of a source fails,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 callingsourceMapResolve.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: <url>
header (see the Notes section). In this case, the sourceMappingURL property
of the result is null.
sourceMapResolve.*Sync()There are also sync versions of the three previous functions. They are identical
to the async versions, except:
fs.readFileSync, while in the browser you might want to use a synchronusXMLHttpRequest.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 thesourcesResolved 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.parseing what’s left.
If this function throws error, error.sourceMapData === data.
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.
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: <url> 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).
First off, run npm install to install testing modules and browser polyfills.
npm test lints the code and runs the test suite in Node.js.
package.json, component.json and bower.json are all generated from
x-package.json5 by using xpkg. Only edit x-package.json5, and remember to
run xpkg before commiting!
source-map-resolve.js is generated from source-map-resolve-node.js and
source-map-resolve-template.js. Only edit the two latter files, not
source-map-resolve.js! To generate it, run npm run build.
MIT.