232 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
Overview [](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
 | 
						||
=======
 | 
						||
 | 
						||
[MIT](LICENSE).
 |