|
|
- Overview [![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: ["<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>"
- })
- ```
-
-
- Installation
- ============
-
- - `npm install source-map-resolve`
- - `bower install source-map-resolve`
- - `component install lydell/source-map-resolve`
-
- Works with CommonJS, AMD and browser globals, through UMD.
-
- Note: This module requires `setImmediate` and `atob`.
- Use polyfills if needed, such as:
-
- - <https://github.com/NobleJS/setImmediate>
- - <https://github.com/davidchambers/Base64.js>
-
-
- 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: <url>`
- 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: <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).
-
-
- Development
- ===========
-
- Tests
- -----
-
- 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.
-
- x-package.json5
- ---------------
-
- 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!
-
- [`xpkg`]: https://github.com/kof/node-xpkg
-
- Generating the browser version
- ------------------------------
-
- 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`.
-
-
- License
- =======
-
- [The X11 (“MIT”) License](LICENSE).
|