mirror of
				https://kkgithub.com/actions/setup-python.git
				synced 2025-11-04 12:44:05 +08:00 
			
		
		
		
	
		
			
	
	
		
			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
							 | 
						|||
| 
								 | 
							
								=======
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								[The X11 (“MIT”) License](LICENSE).
							 |