1Overview [![Build Status](https://travis-ci.org/lydell/source-map-resolve.svg?branch=master)](https://travis-ci.org/lydell/source-map-resolve) 2======== 3 4Resolve the source map and/or sources for a generated file. 5 6```js 7var sourceMapResolve = require("source-map-resolve") 8var sourceMap = require("source-map") 9 10var code = [ 11 "!function(){...}();", 12 "/*# sourceMappingURL=foo.js.map */" 13].join("\n") 14 15sourceMapResolve.resolveSourceMap(code, "/js/foo.js", fs.readFile, function(error, result) { 16 if (error) { 17 return notifyFailure(error) 18 } 19 result 20 // { 21 // map: {file: "foo.js", mappings: "...", sources: ["/coffee/foo.coffee"], names: []}, 22 // url: "/js/foo.js.map", 23 // sourcesRelativeTo: "/js/foo.js.map", 24 // sourceMappingURL: "foo.js.map" 25 // } 26 27 sourceMapResolve.resolveSources(result.map, result.sourcesRelativeTo, fs.readFile, function(error, result) { 28 if (error) { 29 return notifyFailure(error) 30 } 31 result 32 // { 33 // sourcesResolved: ["/coffee/foo.coffee"], 34 // sourcesContent: ["<contents of /coffee/foo.coffee>"] 35 // } 36 }) 37}) 38 39sourceMapResolve.resolve(code, "/js/foo.js", fs.readFile, function(error, result) { 40 if (error) { 41 return notifyFailure(error) 42 } 43 result 44 // { 45 // map: {file: "foo.js", mappings: "...", sources: ["/coffee/foo.coffee"], names: []}, 46 // url: "/js/foo.js.map", 47 // sourcesRelativeTo: "/js/foo.js.map", 48 // sourceMappingURL: "foo.js.map", 49 // sourcesResolved: ["/coffee/foo.coffee"], 50 // sourcesContent: ["<contents of /coffee/foo.coffee>"] 51 // } 52 result.map.sourcesContent = result.sourcesContent 53 var map = new sourceMap.sourceMapConsumer(result.map) 54 map.sourceContentFor("/coffee/foo.coffee") 55 // "<contents of /coffee/foo.coffee>" 56}) 57``` 58 59 60Installation 61============ 62 63- `npm install source-map-resolve` 64- `bower install source-map-resolve` 65- `component install lydell/source-map-resolve` 66 67Works with CommonJS, AMD and browser globals, through UMD. 68 69Note: This module requires `setImmediate` and `atob`. 70Use polyfills if needed, such as: 71 72- <https://github.com/NobleJS/setImmediate> 73- <https://github.com/davidchambers/Base64.js> 74 75 76Usage 77===== 78 79### `sourceMapResolve.resolveSourceMap(code, codeUrl, read, callback)` ### 80 81- `code` is a string of code that may or may not contain a sourceMappingURL 82 comment. Such a comment is used to resolve the source map. 83- `codeUrl` is the url to the file containing `code`. If the sourceMappingURL 84 is relative, it is resolved against `codeUrl`. 85- `read(url, callback)` is a function that reads `url` and responds using 86 `callback(error, content)`. In Node.js you might want to use `fs.readFile`, 87 while in the browser you might want to use an asynchronus `XMLHttpRequest`. 88- `callback(error, result)` is a function that is invoked with either an error 89 or `null` and the result. 90 91The result is an object with the following properties: 92 93- `map`: The source map for `code`, as an object (not a string). 94- `url`: The url to the source map. If the source map came from a data uri, 95 this property is `null`, since then there is no url to it. 96- `sourcesRelativeTo`: The url that the sources of the source map are relative 97 to. Since the sources are relative to the source map, and the url to the 98 source map is provided as the `url` property, this property might seem 99 superfluos. However, remember that the `url` property can be `null` if the 100 source map came from a data uri. If so, the sources are relative to the file 101 containing the data uri—`codeUrl`. This property will be identical to the 102 `url` property or `codeUrl`, whichever is appropriate. This way you can 103 conveniently resolve the sources without having to think about where the 104 source map came from. 105- `sourceMappingURL`: The url of the sourceMappingURL comment in `code`. 106 107If `code` contains no sourceMappingURL, the result is `null`. 108 109### `sourceMapResolve.resolveSources(map, mapUrl, read, [options], callback)` ### 110 111- `map` is a source map, as an object (not a string). 112- `mapUrl` is the url to the file containing `map`. Relative sources in the 113 source map, if any, are resolved against `mapUrl`. 114- `read(url, callback)` is a function that reads `url` and responds using 115 `callback(error, content)`. In Node.js you might want to use `fs.readFile`, 116 while in the browser you might want to use an asynchronus `XMLHttpRequest`. 117- `options` is an optional object with any of the following properties: 118 - `sourceRoot`: Override the `sourceRoot` property of the source map, which 119 might only be relevant when resolving sources in the browser. This lets you 120 bypass it when using the module outside of a browser, if needed. Pass a 121 string to replace the `sourceRoot` property with, or `false` to ignore it. 122 Defaults to `undefined`. 123- `callback(error, result)` is a function that is invoked with either an error 124 or `null` and the result. 125 126The result is an object with the following properties: 127 128- `sourcesResolved`: The same as `map.sources`, except all the sources are 129 fully resolved. 130- `sourcesContent`: An array with the contents of all sources in `map.sources`, 131 in the same order as `map.sources`. If getting the contents of a source fails, 132 an error object is put into the array instead. 133 134### `sourceMapResolve.resolve(code, codeUrl, read, [options], callback)` ### 135 136The arguments are identical to `sourceMapResolve.resolveSourceMap`, except that 137you may also provide the same `options` as in `sourceMapResolve.resolveSources`. 138 139This is a convenience method that first resolves the source map and then its 140sources. You could also do this by first calling 141`sourceMapResolve.resolveSourceMap` and then `sourceMapResolve.resolveSources`. 142 143The result is identical to `sourceMapResolve.resolveSourceMap`, with the 144properties from `sourceMapResolve.resolveSources` merged into it. 145 146There is one extra feature available, though. If `code` is `null`, `codeUrl` is 147treated as a url to the source map instead of to `code`, and will be read. This 148is handy if you _sometimes_ get the source map url from the `SourceMap: <url>` 149header (see the [Notes] section). In this case, the `sourceMappingURL` property 150of the result is `null`. 151 152 153[Notes]: #notes 154 155### `sourceMapResolve.*Sync()` ### 156 157There are also sync versions of the three previous functions. They are identical 158to the async versions, except: 159 160- They expect a sync reading function. In Node.js you might want to use 161 `fs.readFileSync`, while in the browser you might want to use a synchronus 162 `XMLHttpRequest`. 163- They throw errors and return the result instead of using a callback. 164 165`sourceMapResolve.resolveSourcesSync` also accepts `null` as the `read` 166parameter. The result is the same as when passing a function as the `read 167parameter`, except that the `sourcesContent` property of the result will be an 168empty array. In other words, the sources aren’t read. You only get the 169`sourcesResolved` property. (This only supported in the synchronus version, since 170there is no point doing it asynchronusly.) 171 172### `sourceMapResolve.parseMapToJSON(string, [data])` ### 173 174The spec says that if a source map (as a string) starts with `)]}'`, it should 175be stripped off. This is to prevent XSSI attacks. This function does that and 176returns the result of `JSON.parse`ing what’s left. 177 178If this function throws `error`, `error.sourceMapData === data`. 179 180### Errors 181 182All errors passed to callbacks or thrown by this module have a `sourceMapData` 183property that contain as much as possible of the intended result of the function 184up until the error occurred. 185 186Note that while the `map` property of result objects always is an object, 187`error.sourceMapData.map` will be a string if parsing that string fails. 188 189 190Note 191==== 192 193This module resolves the source map for a given generated file by looking for a 194sourceMappingURL comment. The spec defines yet a way to provide the URL to the 195source map: By sending the `SourceMap: <url>` header along with the generated 196file. Since this module doesn’t retrive the generated code for you (instead 197_you_ give the generated code to the module), it’s up to you to look for such a 198header when you retrieve the file (should the need arise). 199 200 201Development 202=========== 203 204Tests 205----- 206 207First off, run `npm install` to install testing modules and browser polyfills. 208 209`npm test` lints the code and runs the test suite in Node.js. 210 211x-package.json5 212--------------- 213 214package.json, component.json and bower.json are all generated from 215x-package.json5 by using [`xpkg`]. Only edit x-package.json5, and remember to 216run `xpkg` before commiting! 217 218[`xpkg`]: https://github.com/kof/node-xpkg 219 220Generating the browser version 221------------------------------ 222 223source-map-resolve.js is generated from source-map-resolve-node.js and 224source-map-resolve-template.js. Only edit the two latter files, _not_ 225source-map-resolve.js! To generate it, run `npm run build`. 226 227 228License 229======= 230 231[The X11 (“MIT”) License](LICENSE). 232