modif comtabilite
This commit is contained in:
+2
-1
@@ -40,6 +40,7 @@
|
||||
"afterEach": false,
|
||||
"define": false,
|
||||
"window": false,
|
||||
"atob": true
|
||||
"atob": true,
|
||||
"JSON": false
|
||||
}
|
||||
}
|
||||
|
||||
-2
@@ -1,2 +0,0 @@
|
||||
.*
|
||||
!.jshintrc
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "node"
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014, 2015, 2016, 2017 Simon Lydell
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "source-map-resolve",
|
||||
"version": "0.3.1",
|
||||
"version": "0.5.2",
|
||||
"author": "Simon Lydell",
|
||||
"license": "MIT",
|
||||
"description": "Resolve the source map and/or sources for a generated file.",
|
||||
@@ -24,7 +24,7 @@
|
||||
".*"
|
||||
],
|
||||
"dependencies": {
|
||||
"source-map-url": "~0.3.0",
|
||||
"resolve-url": "~0.2.1"
|
||||
"source-map-url": "^0.4.0",
|
||||
"resolve-url": "^0.2.1"
|
||||
}
|
||||
}
|
||||
+40
@@ -1,3 +1,43 @@
|
||||
### Version 0.5.2 (2018-05-10) ###
|
||||
|
||||
- Improved: Updated the version range of `atob` to disallow depending on `2.0.3`
|
||||
which as a [security
|
||||
vulnerability](https://snyk.io/test/npm/atob/2.0.3?severity=high&severity=medium&severity=low).
|
||||
|
||||
### Version 0.5.1 (2017-10-21) ###
|
||||
|
||||
- Fixed: URLs are now decoded before being passed to `read` in Node.js. This
|
||||
allows reading files with spaces, for example.
|
||||
- Fixed: Missing or empty `sources` fields (such as `sources: []`) in source
|
||||
maps are now handled. Previously, such source maps would cause crashes or
|
||||
callbacks never bing called. Now, an empty result is produced:
|
||||
|
||||
```js
|
||||
sourcesResolved: [],
|
||||
sourcesContent: []
|
||||
```
|
||||
|
||||
### Version 0.5.0 (2016-02-28) ###
|
||||
|
||||
- Improved: Errors now have a `sourceMapData` property that contain as much as
|
||||
possible of the intended result of the function up until the error occurred.
|
||||
- Changed: `resolveSources` and `resolve`, as well as their `*Sync`
|
||||
alternatives, no longer fail when one single source fails to be fetched.
|
||||
Instead, the `sourcesContent` array in the result object will contain error
|
||||
objects for all failed sources, and strings otherwise. (Backwards-incompatible
|
||||
change.)
|
||||
|
||||
### Version 0.4.0 (2015-08-29) ###
|
||||
|
||||
- Removed: The `ignoreSourceRoot` option of `resolveSources`. It has been
|
||||
replaced with `sourceRoot: false`. (Backwards-incompatible change.)
|
||||
- Added: The `sourceRoot` option of `resolveSources`. It not only allows to
|
||||
ignore the source root, it also lets you replace it.
|
||||
- Added: The `parseMapToJSON` method.
|
||||
- Added: The `resolve` method now accepts `null, mapUrl, ...` as arguments, in
|
||||
addition to the existing signature, which will read `mapUrl` instead of
|
||||
looking for a sourceMappingURL in the code.
|
||||
|
||||
### Version 0.3.1 (2014-08-16) ###
|
||||
|
||||
- Improved: Updated the source-map-url dependency to 0.3.0.
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "source-map-resolve",
|
||||
"version": "0.3.1",
|
||||
"version": "0.5.2",
|
||||
"author": "Simon Lydell",
|
||||
"license": "MIT",
|
||||
"description": "Resolve the source map and/or sources for a generated file.",
|
||||
@@ -23,7 +23,7 @@
|
||||
"source-map-resolve.js"
|
||||
],
|
||||
"dependencies": {
|
||||
"lydell/source-map-url": "~0.3.0",
|
||||
"lydell/source-map-url": "~0.4.0",
|
||||
"lydell/resolve-url": "~0.2.1"
|
||||
}
|
||||
}
|
||||
Generated
Vendored
+4
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright 2014 Simon Lydell
|
||||
// Copyright 2014, 2017 Simon Lydell
|
||||
// X11 (“MIT”) Licensed. (See LICENSE.)
|
||||
|
||||
var fs = require("fs")
|
||||
@@ -14,6 +14,9 @@ nodeCode = nodeCode
|
||||
// Remove `urix`.
|
||||
.replace(/(\w+)\s*=\s*urix\(\1\)\s*/g, "")
|
||||
|
||||
// Remove `decode-uri-component`.
|
||||
.replace(/(var readUrl = )decodeUriComponent\(([\w.]+)\)/g, "$1$2")
|
||||
|
||||
// Change `module.exports = {...}` to `return {...}`.
|
||||
.replace(/module\.exports = (\{[^}]+\})\s*$/, "return $1")
|
||||
|
||||
|
||||
Generated
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
// Copyright 2017 Simon Lydell
|
||||
// X11 (“MIT”) Licensed. (See LICENSE.)
|
||||
|
||||
var decodeUriComponent = require("decode-uri-component")
|
||||
|
||||
function customDecodeUriComponent(string) {
|
||||
// `decodeUriComponent` turns `+` into ` `, but that's not wanted.
|
||||
return decodeUriComponent(string.replace(/\+/g, "%2B"))
|
||||
}
|
||||
|
||||
module.exports = customDecodeUriComponent
|
||||
Generated
Vendored
+133
-46
@@ -1,10 +1,11 @@
|
||||
// Copyright 2014 Simon Lydell
|
||||
// Copyright 2014, 2015, 2016, 2017 Simon Lydell
|
||||
// X11 (“MIT”) Licensed. (See LICENSE.)
|
||||
|
||||
var sourceMappingURL = require("source-map-url")
|
||||
var resolveUrl = require("./resolve-url")
|
||||
var urix = require("urix")
|
||||
var atob = require("atob")
|
||||
var sourceMappingURL = require("source-map-url")
|
||||
var resolveUrl = require("./resolve-url")
|
||||
var decodeUriComponent = require("./decode-uri-component")
|
||||
var urix = require("urix")
|
||||
var atob = require("atob")
|
||||
|
||||
|
||||
|
||||
@@ -12,8 +13,23 @@ function callbackAsync(callback, error, result) {
|
||||
setImmediate(function() { callback(error, result) })
|
||||
}
|
||||
|
||||
function parseMapToJSON(string) {
|
||||
return JSON.parse(string.replace(/^\)\]\}'/, ""))
|
||||
function parseMapToJSON(string, data) {
|
||||
try {
|
||||
return JSON.parse(string.replace(/^\)\]\}'/, ""))
|
||||
} catch (error) {
|
||||
error.sourceMapData = data
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
function readSync(read, url, data) {
|
||||
var readUrl = decodeUriComponent(url)
|
||||
try {
|
||||
return String(read(readUrl))
|
||||
} catch (error) {
|
||||
error.sourceMapData = data
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,12 +44,15 @@ function resolveSourceMap(code, codeUrl, read, callback) {
|
||||
if (!mapData || mapData.map) {
|
||||
return callbackAsync(callback, null, mapData)
|
||||
}
|
||||
read(mapData.url, function(error, result) {
|
||||
var readUrl = decodeUriComponent(mapData.url)
|
||||
read(readUrl, function(error, result) {
|
||||
if (error) {
|
||||
error.sourceMapData = mapData
|
||||
return callback(error)
|
||||
}
|
||||
mapData.map = String(result)
|
||||
try {
|
||||
mapData.map = parseMapToJSON(String(result))
|
||||
mapData.map = parseMapToJSON(mapData.map, mapData)
|
||||
} catch (error) {
|
||||
return callback(error)
|
||||
}
|
||||
@@ -46,7 +65,8 @@ function resolveSourceMapSync(code, codeUrl, read) {
|
||||
if (!mapData || mapData.map) {
|
||||
return mapData
|
||||
}
|
||||
mapData.map = parseMapToJSON(String(read(mapData.url)))
|
||||
mapData.map = readSync(read, mapData.url, mapData)
|
||||
mapData.map = parseMapToJSON(mapData.map, mapData)
|
||||
return mapData
|
||||
}
|
||||
|
||||
@@ -64,17 +84,24 @@ function resolveSourceMapHelper(code, codeUrl) {
|
||||
var dataUri = url.match(dataUriRegex)
|
||||
if (dataUri) {
|
||||
var mimeType = dataUri[1]
|
||||
var lastParameter = dataUri[2]
|
||||
var encoded = dataUri[3]
|
||||
if (!jsonMimeTypeRegex.test(mimeType)) {
|
||||
throw new Error("Unuseful data uri mime type: " + (mimeType || "text/plain"))
|
||||
}
|
||||
return {
|
||||
var lastParameter = dataUri[2] || ""
|
||||
var encoded = dataUri[3] || ""
|
||||
var data = {
|
||||
sourceMappingURL: url,
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: parseMapToJSON(lastParameter === ";base64" ? atob(encoded) : decodeURIComponent(encoded))
|
||||
map: encoded
|
||||
}
|
||||
if (!jsonMimeTypeRegex.test(mimeType)) {
|
||||
var error = new Error("Unuseful data uri mime type: " + (mimeType || "text/plain"))
|
||||
error.sourceMapData = data
|
||||
throw error
|
||||
}
|
||||
data.map = parseMapToJSON(
|
||||
lastParameter === ";base64" ? atob(encoded) : decodeURIComponent(encoded),
|
||||
data
|
||||
)
|
||||
return data
|
||||
}
|
||||
|
||||
var mapUrl = resolveUrl(codeUrl, url)
|
||||
@@ -93,21 +120,18 @@ function resolveSources(map, mapUrl, read, options, callback) {
|
||||
callback = options
|
||||
options = {}
|
||||
}
|
||||
var pending = map.sources.length
|
||||
var errored = false
|
||||
var pending = map.sources ? map.sources.length : 0
|
||||
var result = {
|
||||
sourcesResolved: [],
|
||||
sourcesContent: []
|
||||
}
|
||||
|
||||
var done = function(error) {
|
||||
if (errored) {
|
||||
return
|
||||
}
|
||||
if (error) {
|
||||
errored = true
|
||||
return callback(error)
|
||||
}
|
||||
if (pending === 0) {
|
||||
callbackAsync(callback, null, result)
|
||||
return
|
||||
}
|
||||
|
||||
var done = function() {
|
||||
pending--
|
||||
if (pending === 0) {
|
||||
callback(null, result)
|
||||
@@ -120,9 +144,10 @@ function resolveSources(map, mapUrl, read, options, callback) {
|
||||
result.sourcesContent[index] = sourceContent
|
||||
callbackAsync(done, null)
|
||||
} else {
|
||||
read(fullUrl, function(error, source) {
|
||||
result.sourcesContent[index] = String(source)
|
||||
done(error)
|
||||
var readUrl = decodeUriComponent(fullUrl)
|
||||
read(readUrl, function(error, source) {
|
||||
result.sourcesContent[index] = error ? error : String(source)
|
||||
done()
|
||||
})
|
||||
}
|
||||
})
|
||||
@@ -133,16 +158,27 @@ function resolveSourcesSync(map, mapUrl, read, options) {
|
||||
sourcesResolved: [],
|
||||
sourcesContent: []
|
||||
}
|
||||
|
||||
if (!map.sources || map.sources.length === 0) {
|
||||
return result
|
||||
}
|
||||
|
||||
resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) {
|
||||
result.sourcesResolved[index] = fullUrl
|
||||
if (read !== null) {
|
||||
if (typeof sourceContent === "string") {
|
||||
result.sourcesContent[index] = sourceContent
|
||||
} else {
|
||||
result.sourcesContent[index] = String(read(fullUrl))
|
||||
var readUrl = decodeUriComponent(fullUrl)
|
||||
try {
|
||||
result.sourcesContent[index] = String(read(readUrl))
|
||||
} catch (error) {
|
||||
result.sourcesContent[index] = error
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -153,14 +189,23 @@ function resolveSourcesHelper(map, mapUrl, options, fn) {
|
||||
mapUrl = urix(mapUrl)
|
||||
var fullUrl
|
||||
var sourceContent
|
||||
var sourceRoot
|
||||
for (var index = 0, len = map.sources.length; index < len; index++) {
|
||||
if (map.sourceRoot && !options.ignoreSourceRoot) {
|
||||
sourceRoot = null
|
||||
if (typeof options.sourceRoot === "string") {
|
||||
sourceRoot = options.sourceRoot
|
||||
} else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) {
|
||||
sourceRoot = map.sourceRoot
|
||||
}
|
||||
// If the sourceRoot is the empty string, it is equivalent to not setting
|
||||
// the property at all.
|
||||
if (sourceRoot === null || sourceRoot === '') {
|
||||
fullUrl = resolveUrl(mapUrl, map.sources[index])
|
||||
} else {
|
||||
// Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes
|
||||
// `/scripts/subdir/<source>`, not `/scripts/<source>`. Pointing to a file as source root
|
||||
// does not make sense.
|
||||
fullUrl = resolveUrl(mapUrl, map.sourceRoot.replace(endingSlash, "/"), map.sources[index])
|
||||
} else {
|
||||
fullUrl = resolveUrl(mapUrl, map.sources[index])
|
||||
fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index])
|
||||
}
|
||||
sourceContent = (map.sourcesContent || [])[index]
|
||||
fn(fullUrl, sourceContent, index)
|
||||
@@ -174,13 +219,41 @@ function resolve(code, codeUrl, read, options, callback) {
|
||||
callback = options
|
||||
options = {}
|
||||
}
|
||||
resolveSourceMap(code, codeUrl, read, function(error, mapData) {
|
||||
if (error) {
|
||||
return callback(error)
|
||||
}
|
||||
if (!mapData) {
|
||||
return callback(null, null)
|
||||
if (code === null) {
|
||||
var mapUrl = codeUrl
|
||||
var data = {
|
||||
sourceMappingURL: null,
|
||||
url: mapUrl,
|
||||
sourcesRelativeTo: mapUrl,
|
||||
map: null
|
||||
}
|
||||
var readUrl = decodeUriComponent(mapUrl)
|
||||
read(readUrl, function(error, result) {
|
||||
if (error) {
|
||||
error.sourceMapData = data
|
||||
return callback(error)
|
||||
}
|
||||
data.map = String(result)
|
||||
try {
|
||||
data.map = parseMapToJSON(data.map, data)
|
||||
} catch (error) {
|
||||
return callback(error)
|
||||
}
|
||||
_resolveSources(data)
|
||||
})
|
||||
} else {
|
||||
resolveSourceMap(code, codeUrl, read, function(error, mapData) {
|
||||
if (error) {
|
||||
return callback(error)
|
||||
}
|
||||
if (!mapData) {
|
||||
return callback(null, null)
|
||||
}
|
||||
_resolveSources(mapData)
|
||||
})
|
||||
}
|
||||
|
||||
function _resolveSources(mapData) {
|
||||
resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) {
|
||||
if (error) {
|
||||
return callback(error)
|
||||
@@ -189,13 +262,26 @@ function resolve(code, codeUrl, read, options, callback) {
|
||||
mapData.sourcesContent = result.sourcesContent
|
||||
callback(null, mapData)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function resolveSync(code, codeUrl, read, options) {
|
||||
var mapData = resolveSourceMapSync(code, codeUrl, read)
|
||||
if (!mapData) {
|
||||
return null
|
||||
var mapData
|
||||
if (code === null) {
|
||||
var mapUrl = codeUrl
|
||||
mapData = {
|
||||
sourceMappingURL: null,
|
||||
url: mapUrl,
|
||||
sourcesRelativeTo: mapUrl,
|
||||
map: null
|
||||
}
|
||||
mapData.map = readSync(read, mapUrl, mapData)
|
||||
mapData.map = parseMapToJSON(mapData.map, mapData)
|
||||
} else {
|
||||
mapData = resolveSourceMapSync(code, codeUrl, read)
|
||||
if (!mapData) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options)
|
||||
mapData.sourcesResolved = result.sourcesResolved
|
||||
@@ -211,5 +297,6 @@ module.exports = {
|
||||
resolveSources: resolveSources,
|
||||
resolveSourcesSync: resolveSourcesSync,
|
||||
resolve: resolve,
|
||||
resolveSync: resolveSync
|
||||
resolveSync: resolveSync,
|
||||
parseMapToJSON: parseMapToJSON
|
||||
}
|
||||
|
||||
+24
-39
@@ -1,32 +1,27 @@
|
||||
{
|
||||
"_args": [
|
||||
[
|
||||
"source-map-resolve@0.3.1",
|
||||
"/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah"
|
||||
]
|
||||
],
|
||||
"_from": "source-map-resolve@0.3.1",
|
||||
"_id": "source-map-resolve@0.3.1",
|
||||
"_from": "source-map-resolve@^0.5.2",
|
||||
"_id": "source-map-resolve@0.5.2",
|
||||
"_inBundle": false,
|
||||
"_integrity": "sha1-YQ9hIqRFuN1RU1oqcbeD38Ekh2E=",
|
||||
"_integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
|
||||
"_location": "/source-map-resolve",
|
||||
"_phantomChildren": {},
|
||||
"_requested": {
|
||||
"type": "version",
|
||||
"type": "range",
|
||||
"registry": true,
|
||||
"raw": "source-map-resolve@0.3.1",
|
||||
"raw": "source-map-resolve@^0.5.2",
|
||||
"name": "source-map-resolve",
|
||||
"escapedName": "source-map-resolve",
|
||||
"rawSpec": "0.3.1",
|
||||
"rawSpec": "^0.5.2",
|
||||
"saveSpec": null,
|
||||
"fetchSpec": "0.3.1"
|
||||
"fetchSpec": "^0.5.2"
|
||||
},
|
||||
"_requiredBy": [
|
||||
"/css"
|
||||
],
|
||||
"_resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz",
|
||||
"_spec": "0.3.1",
|
||||
"_where": "/mnt/data/Sites/anissabensalah.net/user/themes/anissabensalah",
|
||||
"_resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
|
||||
"_shasum": "72e2cc34095543e43b2c62b2c4c10d4a9054f259",
|
||||
"_spec": "source-map-resolve@^0.5.2",
|
||||
"_where": "/home/kevin/Documents/Sites/anissabensalah.net/user/themes/anissabensalah/node_modules/css",
|
||||
"author": {
|
||||
"name": "Simon Lydell"
|
||||
},
|
||||
@@ -34,19 +29,22 @@
|
||||
"bugs": {
|
||||
"url": "https://github.com/lydell/source-map-resolve/issues"
|
||||
},
|
||||
"bundleDependencies": false,
|
||||
"dependencies": {
|
||||
"atob": "~1.1.0",
|
||||
"resolve-url": "~0.2.1",
|
||||
"source-map-url": "~0.3.0",
|
||||
"urix": "~0.1.0"
|
||||
"atob": "^2.1.1",
|
||||
"decode-uri-component": "^0.2.0",
|
||||
"resolve-url": "^0.2.1",
|
||||
"source-map-url": "^0.4.0",
|
||||
"urix": "^0.1.0"
|
||||
},
|
||||
"deprecated": false,
|
||||
"description": "Resolve the source map and/or sources for a generated file.",
|
||||
"devDependencies": {
|
||||
"Base64": "~0.2.0",
|
||||
"jshint": "~2.4.3",
|
||||
"setimmediate": "~1.0.1",
|
||||
"simple-asyncify": "~0.1.0",
|
||||
"tape": "~2.5.0"
|
||||
"Base64": "1.0.1",
|
||||
"jshint": "2.9.5",
|
||||
"setimmediate": "1.0.5",
|
||||
"simple-asyncify": "1.0.0",
|
||||
"tape": "4.9.0"
|
||||
},
|
||||
"homepage": "https://github.com/lydell/source-map-resolve#readme",
|
||||
"keywords": [
|
||||
@@ -75,18 +73,5 @@
|
||||
"test": "npm run lint && npm run unit",
|
||||
"unit": "node test/source-map-resolve.js && node test/windows.js"
|
||||
},
|
||||
"testling": {
|
||||
"files": "test/source-map-resolve.js",
|
||||
"browsers": [
|
||||
"ie/8..latest",
|
||||
"chrome/latest",
|
||||
"firefox/latest",
|
||||
"opera/12",
|
||||
"opera/latest",
|
||||
"safari/5",
|
||||
"iphone/6",
|
||||
"android-browser/4"
|
||||
]
|
||||
},
|
||||
"version": "0.3.1"
|
||||
"version": "0.5.2"
|
||||
}
|
||||
|
||||
+37
-14
@@ -1,8 +1,6 @@
|
||||
Overview [](https://travis-ci.org/lydell/source-map-resolve)
|
||||
Overview [](https://travis-ci.org/lydell/source-map-resolve)
|
||||
========
|
||||
|
||||
[](https://ci.testling.com/lydell/source-map-resolve)
|
||||
|
||||
Resolve the source map and/or sources for a generated file.
|
||||
|
||||
```js
|
||||
@@ -117,9 +115,11 @@ If `code` contains no sourceMappingURL, the result is `null`.
|
||||
`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:
|
||||
- `ignoreSourceRoot`: The `sourceRoot` property of source maps 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. Defaults to `false`.
|
||||
- `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.
|
||||
|
||||
@@ -128,21 +128,30 @@ 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`.
|
||||
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`.
|
||||
you may also provide the same `options` as in `sourceMapResolve.resolveSources`.
|
||||
|
||||
This is simply a convienience method that first resolves the source map and
|
||||
then its sources. You could also do this by first calling
|
||||
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
|
||||
@@ -160,6 +169,23 @@ 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
|
||||
====
|
||||
@@ -182,9 +208,6 @@ 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.
|
||||
|
||||
To run the tests in a browser, run `testling` (`npm install -g testling`) or
|
||||
`testling -u`.
|
||||
|
||||
x-package.json5
|
||||
---------------
|
||||
|
||||
|
||||
+128
-42
@@ -1,4 +1,4 @@
|
||||
// Copyright 2014 Simon Lydell
|
||||
// Copyright 2014, 2015, 2016, 2017 Simon Lydell
|
||||
// X11 (“MIT”) Licensed. (See LICENSE.)
|
||||
|
||||
// Note: source-map-resolve.js is generated from source-map-resolve-node.js and
|
||||
@@ -21,8 +21,23 @@ void (function(root, factory) {
|
||||
setImmediate(function() { callback(error, result) })
|
||||
}
|
||||
|
||||
function parseMapToJSON(string) {
|
||||
return JSON.parse(string.replace(/^\)\]\}'/, ""))
|
||||
function parseMapToJSON(string, data) {
|
||||
try {
|
||||
return JSON.parse(string.replace(/^\)\]\}'/, ""))
|
||||
} catch (error) {
|
||||
error.sourceMapData = data
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
function readSync(read, url, data) {
|
||||
var readUrl = url
|
||||
try {
|
||||
return String(read(readUrl))
|
||||
} catch (error) {
|
||||
error.sourceMapData = data
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -37,12 +52,15 @@ void (function(root, factory) {
|
||||
if (!mapData || mapData.map) {
|
||||
return callbackAsync(callback, null, mapData)
|
||||
}
|
||||
read(mapData.url, function(error, result) {
|
||||
var readUrl = mapData.url
|
||||
read(readUrl, function(error, result) {
|
||||
if (error) {
|
||||
error.sourceMapData = mapData
|
||||
return callback(error)
|
||||
}
|
||||
mapData.map = String(result)
|
||||
try {
|
||||
mapData.map = parseMapToJSON(String(result))
|
||||
mapData.map = parseMapToJSON(mapData.map, mapData)
|
||||
} catch (error) {
|
||||
return callback(error)
|
||||
}
|
||||
@@ -55,7 +73,8 @@ void (function(root, factory) {
|
||||
if (!mapData || mapData.map) {
|
||||
return mapData
|
||||
}
|
||||
mapData.map = parseMapToJSON(String(read(mapData.url)))
|
||||
mapData.map = readSync(read, mapData.url, mapData)
|
||||
mapData.map = parseMapToJSON(mapData.map, mapData)
|
||||
return mapData
|
||||
}
|
||||
|
||||
@@ -71,17 +90,24 @@ void (function(root, factory) {
|
||||
var dataUri = url.match(dataUriRegex)
|
||||
if (dataUri) {
|
||||
var mimeType = dataUri[1]
|
||||
var lastParameter = dataUri[2]
|
||||
var encoded = dataUri[3]
|
||||
if (!jsonMimeTypeRegex.test(mimeType)) {
|
||||
throw new Error("Unuseful data uri mime type: " + (mimeType || "text/plain"))
|
||||
}
|
||||
return {
|
||||
var lastParameter = dataUri[2] || ""
|
||||
var encoded = dataUri[3] || ""
|
||||
var data = {
|
||||
sourceMappingURL: url,
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: parseMapToJSON(lastParameter === ";base64" ? atob(encoded) : decodeURIComponent(encoded))
|
||||
map: encoded
|
||||
}
|
||||
if (!jsonMimeTypeRegex.test(mimeType)) {
|
||||
var error = new Error("Unuseful data uri mime type: " + (mimeType || "text/plain"))
|
||||
error.sourceMapData = data
|
||||
throw error
|
||||
}
|
||||
data.map = parseMapToJSON(
|
||||
lastParameter === ";base64" ? atob(encoded) : decodeURIComponent(encoded),
|
||||
data
|
||||
)
|
||||
return data
|
||||
}
|
||||
|
||||
var mapUrl = resolveUrl(codeUrl, url)
|
||||
@@ -100,21 +126,18 @@ void (function(root, factory) {
|
||||
callback = options
|
||||
options = {}
|
||||
}
|
||||
var pending = map.sources.length
|
||||
var errored = false
|
||||
var pending = map.sources ? map.sources.length : 0
|
||||
var result = {
|
||||
sourcesResolved: [],
|
||||
sourcesContent: []
|
||||
}
|
||||
|
||||
var done = function(error) {
|
||||
if (errored) {
|
||||
return
|
||||
}
|
||||
if (error) {
|
||||
errored = true
|
||||
return callback(error)
|
||||
}
|
||||
if (pending === 0) {
|
||||
callbackAsync(callback, null, result)
|
||||
return
|
||||
}
|
||||
|
||||
var done = function() {
|
||||
pending--
|
||||
if (pending === 0) {
|
||||
callback(null, result)
|
||||
@@ -127,9 +150,10 @@ void (function(root, factory) {
|
||||
result.sourcesContent[index] = sourceContent
|
||||
callbackAsync(done, null)
|
||||
} else {
|
||||
read(fullUrl, function(error, source) {
|
||||
result.sourcesContent[index] = String(source)
|
||||
done(error)
|
||||
var readUrl = fullUrl
|
||||
read(readUrl, function(error, source) {
|
||||
result.sourcesContent[index] = error ? error : String(source)
|
||||
done()
|
||||
})
|
||||
}
|
||||
})
|
||||
@@ -140,16 +164,27 @@ void (function(root, factory) {
|
||||
sourcesResolved: [],
|
||||
sourcesContent: []
|
||||
}
|
||||
|
||||
if (!map.sources || map.sources.length === 0) {
|
||||
return result
|
||||
}
|
||||
|
||||
resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) {
|
||||
result.sourcesResolved[index] = fullUrl
|
||||
if (read !== null) {
|
||||
if (typeof sourceContent === "string") {
|
||||
result.sourcesContent[index] = sourceContent
|
||||
} else {
|
||||
result.sourcesContent[index] = String(read(fullUrl))
|
||||
var readUrl = fullUrl
|
||||
try {
|
||||
result.sourcesContent[index] = String(read(readUrl))
|
||||
} catch (error) {
|
||||
result.sourcesContent[index] = error
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -159,14 +194,23 @@ void (function(root, factory) {
|
||||
options = options || {}
|
||||
var fullUrl
|
||||
var sourceContent
|
||||
var sourceRoot
|
||||
for (var index = 0, len = map.sources.length; index < len; index++) {
|
||||
if (map.sourceRoot && !options.ignoreSourceRoot) {
|
||||
sourceRoot = null
|
||||
if (typeof options.sourceRoot === "string") {
|
||||
sourceRoot = options.sourceRoot
|
||||
} else if (typeof map.sourceRoot === "string" && options.sourceRoot !== false) {
|
||||
sourceRoot = map.sourceRoot
|
||||
}
|
||||
// If the sourceRoot is the empty string, it is equivalent to not setting
|
||||
// the property at all.
|
||||
if (sourceRoot === null || sourceRoot === '') {
|
||||
fullUrl = resolveUrl(mapUrl, map.sources[index])
|
||||
} else {
|
||||
// Make sure that the sourceRoot ends with a slash, so that `/scripts/subdir` becomes
|
||||
// `/scripts/subdir/<source>`, not `/scripts/<source>`. Pointing to a file as source root
|
||||
// does not make sense.
|
||||
fullUrl = resolveUrl(mapUrl, map.sourceRoot.replace(endingSlash, "/"), map.sources[index])
|
||||
} else {
|
||||
fullUrl = resolveUrl(mapUrl, map.sources[index])
|
||||
fullUrl = resolveUrl(mapUrl, sourceRoot.replace(endingSlash, "/"), map.sources[index])
|
||||
}
|
||||
sourceContent = (map.sourcesContent || [])[index]
|
||||
fn(fullUrl, sourceContent, index)
|
||||
@@ -180,13 +224,41 @@ void (function(root, factory) {
|
||||
callback = options
|
||||
options = {}
|
||||
}
|
||||
resolveSourceMap(code, codeUrl, read, function(error, mapData) {
|
||||
if (error) {
|
||||
return callback(error)
|
||||
}
|
||||
if (!mapData) {
|
||||
return callback(null, null)
|
||||
if (code === null) {
|
||||
var mapUrl = codeUrl
|
||||
var data = {
|
||||
sourceMappingURL: null,
|
||||
url: mapUrl,
|
||||
sourcesRelativeTo: mapUrl,
|
||||
map: null
|
||||
}
|
||||
var readUrl = mapUrl
|
||||
read(readUrl, function(error, result) {
|
||||
if (error) {
|
||||
error.sourceMapData = data
|
||||
return callback(error)
|
||||
}
|
||||
data.map = String(result)
|
||||
try {
|
||||
data.map = parseMapToJSON(data.map, data)
|
||||
} catch (error) {
|
||||
return callback(error)
|
||||
}
|
||||
_resolveSources(data)
|
||||
})
|
||||
} else {
|
||||
resolveSourceMap(code, codeUrl, read, function(error, mapData) {
|
||||
if (error) {
|
||||
return callback(error)
|
||||
}
|
||||
if (!mapData) {
|
||||
return callback(null, null)
|
||||
}
|
||||
_resolveSources(mapData)
|
||||
})
|
||||
}
|
||||
|
||||
function _resolveSources(mapData) {
|
||||
resolveSources(mapData.map, mapData.sourcesRelativeTo, read, options, function(error, result) {
|
||||
if (error) {
|
||||
return callback(error)
|
||||
@@ -195,13 +267,26 @@ void (function(root, factory) {
|
||||
mapData.sourcesContent = result.sourcesContent
|
||||
callback(null, mapData)
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function resolveSync(code, codeUrl, read, options) {
|
||||
var mapData = resolveSourceMapSync(code, codeUrl, read)
|
||||
if (!mapData) {
|
||||
return null
|
||||
var mapData
|
||||
if (code === null) {
|
||||
var mapUrl = codeUrl
|
||||
mapData = {
|
||||
sourceMappingURL: null,
|
||||
url: mapUrl,
|
||||
sourcesRelativeTo: mapUrl,
|
||||
map: null
|
||||
}
|
||||
mapData.map = readSync(read, mapUrl, mapData)
|
||||
mapData.map = parseMapToJSON(mapData.map, mapData)
|
||||
} else {
|
||||
mapData = resolveSourceMapSync(code, codeUrl, read)
|
||||
if (!mapData) {
|
||||
return null
|
||||
}
|
||||
}
|
||||
var result = resolveSourcesSync(mapData.map, mapData.sourcesRelativeTo, read, options)
|
||||
mapData.sourcesResolved = result.sourcesResolved
|
||||
@@ -217,7 +302,8 @@ void (function(root, factory) {
|
||||
resolveSources: resolveSources,
|
||||
resolveSourcesSync: resolveSourcesSync,
|
||||
resolve: resolve,
|
||||
resolveSync: resolveSync
|
||||
resolveSync: resolveSync,
|
||||
parseMapToJSON: parseMapToJSON
|
||||
}
|
||||
|
||||
}));
|
||||
|
||||
Generated
Vendored
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright 2014 Simon Lydell
|
||||
// Copyright 2014, 2015, 2016, 2017 Simon Lydell
|
||||
// X11 (“MIT”) Licensed. (See LICENSE.)
|
||||
|
||||
// Note: source-map-resolve.js is generated from source-map-resolve-node.js and
|
||||
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
// Copyright 2017 Simon Lydell
|
||||
// X11 (“MIT”) Licensed. (See LICENSE.)
|
||||
|
||||
var test = require("tape")
|
||||
var asyncify = require("simple-asyncify")
|
||||
var common = require("./common")
|
||||
var u = common.u
|
||||
|
||||
var sourceMapResolve = require("../")
|
||||
|
||||
var mapUrl = "operators%20map.json"
|
||||
var codeUrl = "./built files/operators:+-<>%25.js"
|
||||
var sourceUrl = "../source files/operators:+-<>%25.coffee"
|
||||
|
||||
function readTest(t, files) {
|
||||
return function(file, callback) {
|
||||
var fileData = files[file]
|
||||
t.ok(fileData, "decoded file name")
|
||||
if (callback) {
|
||||
callback(null, fileData)
|
||||
} else {
|
||||
return fileData
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function testResolveSourceMap(method, sync) {
|
||||
return function(t) {
|
||||
t.plan(2)
|
||||
|
||||
if (sync) {
|
||||
method = asyncify(method)
|
||||
}
|
||||
|
||||
var read = readTest(t, {
|
||||
"built files/operators map.json": "{}"
|
||||
})
|
||||
|
||||
method(u(mapUrl), codeUrl, read, function(error) {
|
||||
t.error(error)
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
test(".resolveSourceMap", testResolveSourceMap(sourceMapResolve.resolveSourceMap, false))
|
||||
|
||||
test(".resolveSourceMapSync", testResolveSourceMap(sourceMapResolve.resolveSourceMapSync, true))
|
||||
|
||||
|
||||
function testResolveSources(method, sync) {
|
||||
return function(t) {
|
||||
t.plan(2)
|
||||
|
||||
if (sync) {
|
||||
method = asyncify(method)
|
||||
}
|
||||
|
||||
var map = {
|
||||
sources: [sourceUrl]
|
||||
}
|
||||
var read = readTest(t, {
|
||||
"../source files/operators:+-<>%.coffee": "source code"
|
||||
})
|
||||
|
||||
method(map, mapUrl, read, function(error) {
|
||||
t.error(error)
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
test(".resolveSources", testResolveSources(sourceMapResolve.resolveSources, false))
|
||||
|
||||
test(".resolveSourcesSync", testResolveSources(sourceMapResolve.resolveSourcesSync, true))
|
||||
|
||||
|
||||
function testResolve(method, sync) {
|
||||
return function(t) {
|
||||
t.plan(3)
|
||||
|
||||
if (sync) {
|
||||
method = asyncify(method)
|
||||
}
|
||||
|
||||
var map = {
|
||||
sources: [sourceUrl]
|
||||
}
|
||||
var read = readTest(t, {
|
||||
"built files/operators map.json": JSON.stringify(map),
|
||||
"source files/operators:+-<>%.coffee": "source code"
|
||||
})
|
||||
|
||||
method(u(mapUrl), codeUrl, read, function(error) {
|
||||
t.error(error)
|
||||
})
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
test(".resolve", testResolve(sourceMapResolve.resolve, false))
|
||||
|
||||
test(".resolveSync", testResolve(sourceMapResolve.resolveSync, true))
|
||||
Generated
Vendored
+360
-17
@@ -1,4 +1,4 @@
|
||||
// Copyright 2014 Simon Lydell
|
||||
// Copyright 2014, 2015, 2016, 2017 Simon Lydell
|
||||
// X11 (“MIT”) Licensed. (See LICENSE.)
|
||||
|
||||
var test = require("tape")
|
||||
@@ -37,6 +37,12 @@ var map = {
|
||||
sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"],
|
||||
names: []
|
||||
},
|
||||
sourceRootEmpty: {
|
||||
mappings: "AAAA",
|
||||
sourceRoot: "",
|
||||
sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"],
|
||||
names: []
|
||||
},
|
||||
sourcesContent: {
|
||||
mappings: "AAAA",
|
||||
sourceRoot: "/static/js/app/",
|
||||
@@ -49,7 +55,13 @@ var map = {
|
||||
sources: ["foo.js", "lib/bar.js", "../vendor/dom.js", "/version.js", "//foo.org/baz.js"],
|
||||
sourcesContent: ["foo.js", null , null , "/version.js", "//foo.org/baz.js"],
|
||||
names: []
|
||||
}
|
||||
},
|
||||
noSources: {
|
||||
mappings: "",
|
||||
sources: [],
|
||||
names: []
|
||||
},
|
||||
empty: {}
|
||||
}
|
||||
map.simpleString = JSON.stringify(map.simple)
|
||||
map.XSSIsafe = ")]}'" + map.simpleString
|
||||
@@ -87,7 +99,7 @@ function testResolveSourceMap(method, sync) {
|
||||
|
||||
var codeUrl = "http://example.com/a/b/c/foo.js"
|
||||
|
||||
t.plan(1 + 18*3)
|
||||
t.plan(1 + 12*3 + 6*4)
|
||||
|
||||
t.equal(typeof method, "function", "is a function")
|
||||
|
||||
@@ -194,18 +206,36 @@ function testResolveSourceMap(method, sync) {
|
||||
})
|
||||
|
||||
method(code.dataUriNoMime, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:,foo",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: "foo"
|
||||
}, "dataUriNoMime .sourceMapData")
|
||||
t.ok(error.message.match(/mime type.+text\/plain/), "dataUriNoMime")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.dataUriInvalidMime, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:text/html,foo",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: "foo"
|
||||
}, "dataUriInvalidMime .sourceMapData")
|
||||
t.ok(error.message.match(/mime type.+text\/html/), "dataUriInvalidMime")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.dataUriInvalidJSON, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:application/json,foo",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: "foo"
|
||||
}, "dataUriInvalidJSON .sourceMapData")
|
||||
t.ok(error instanceof SyntaxError && error.message !== "data:application/json,foo",
|
||||
"dataUriInvalidJSON")
|
||||
t.notOk(result)
|
||||
@@ -226,6 +256,12 @@ function testResolveSourceMap(method, sync) {
|
||||
})
|
||||
|
||||
method(code.dataUriEmpty, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: ""
|
||||
}, "dataUriEmpty .sourceMapData")
|
||||
t.ok(error.message.match(/mime type.+text\/plain/), "dataUriEmpty")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
@@ -249,6 +285,12 @@ function testResolveSourceMap(method, sync) {
|
||||
})
|
||||
|
||||
method(code.absolute, codeUrl, wrap(read("invalid JSON")), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "https://foo.org/foo.js.map",
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: "invalid JSON"
|
||||
}, "read invalid JSON .sourceMapData")
|
||||
t.ok(error instanceof SyntaxError, "read invalid JSON")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
@@ -266,6 +308,12 @@ function testResolveSourceMap(method, sync) {
|
||||
})
|
||||
|
||||
method(code.absolute, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "https://foo.org/foo.js.map",
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: null
|
||||
}, "read throws .sourceMapData")
|
||||
t.equal(error.message, "https://foo.org/foo.js.map", "read throws")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
@@ -286,7 +334,7 @@ function testResolveSources(method, sync) {
|
||||
|
||||
var mapUrl = "http://example.com/a/b/c/foo.js.map"
|
||||
|
||||
t.plan(1 + 7*3 + 4)
|
||||
t.plan(1 + 11*3 + 4)
|
||||
|
||||
t.equal(typeof method, "function", "is a function")
|
||||
|
||||
@@ -329,7 +377,7 @@ function testResolveSources(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
options = {ignoreSourceRoot: true}
|
||||
options = {sourceRoot: false}
|
||||
method(map.sourceRoot, mapUrl, wrap(identity), options, function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
@@ -351,6 +399,28 @@ function testResolveSources(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
options = {sourceRoot: "/static/js/"}
|
||||
method(map.sourceRoot, mapUrl, wrap(identity), options, function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
sourcesResolved: [
|
||||
"http://example.com/static/js/foo.js",
|
||||
"http://example.com/static/js/lib/bar.js",
|
||||
"http://example.com/static/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
],
|
||||
sourcesContent: [
|
||||
"http://example.com/static/js/foo.js",
|
||||
"http://example.com/static/js/lib/bar.js",
|
||||
"http://example.com/static/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
]
|
||||
}, "custom sourceRoot")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(map.sourceRootNoSlash, mapUrl, wrap(identity), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
@@ -372,6 +442,27 @@ function testResolveSources(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(map.sourceRootEmpty, mapUrl, wrap(identity), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
sourcesResolved: [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
],
|
||||
sourcesContent: [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
]
|
||||
}, "sourceRootEmpty")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(map.sourcesContent, mapUrl, wrap(Throws), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
@@ -414,6 +505,24 @@ function testResolveSources(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(map.noSources, mapUrl, wrap(identity), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
sourcesResolved: [],
|
||||
sourcesContent: []
|
||||
}, "noSources")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(map.empty, mapUrl, wrap(identity), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
sourcesResolved: [],
|
||||
sourcesContent: []
|
||||
}, "empty")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(map.simple, mapUrl, wrap(read(["non", "string"])), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
@@ -423,12 +532,29 @@ function testResolveSources(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
var calledBack = false
|
||||
method(map.mixed, mapUrl, wrap(Throws), function(error, result) {
|
||||
t.equal(calledBack, false)
|
||||
calledBack = true
|
||||
t.equal(error.message, "http://example.com/a/b/c/lib/bar.js", "read throws")
|
||||
t.notOk(result)
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "read throws .sourcesResolved")
|
||||
var sourcesContent = result.sourcesContent
|
||||
for (var index = 0, len = sourcesContent.length; index < len; index++) {
|
||||
var item = sourcesContent[index]
|
||||
if (item instanceof Error) {
|
||||
sourcesContent[index] = null
|
||||
}
|
||||
}
|
||||
t.deepEqual(sourcesContent, [
|
||||
"foo.js",
|
||||
null,
|
||||
null,
|
||||
"/version.js",
|
||||
"//foo.org/baz.js"
|
||||
], "read throws .sourcesContent")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
@@ -473,7 +599,7 @@ function testResolve(method, sync) {
|
||||
|
||||
var codeUrl = "http://example.com/a/b/c/foo.js"
|
||||
|
||||
t.plan(1 + 18*3 + 7*4 + 4)
|
||||
t.plan(1 + 15*3 + 21*4 + 4)
|
||||
|
||||
t.equal(typeof method, "function", "is a function")
|
||||
|
||||
@@ -598,18 +724,36 @@ function testResolve(method, sync) {
|
||||
})
|
||||
|
||||
method(code.dataUriNoMime, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:,foo",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: "foo"
|
||||
}, "dataUriNoMime .sourceMapData")
|
||||
t.ok(error.message.match(/mime type.+text\/plain/), "dataUriNoMime")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.dataUriInvalidMime, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:text/html,foo",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: "foo"
|
||||
}, "dataUriInvalidMime .sourceMapData")
|
||||
t.ok(error.message.match(/mime type.+text\/html/), "dataUriInvalidMime")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.dataUriInvalidJSON, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:application/json,foo",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: "foo"
|
||||
}, "dataUriInvalidJSON .sourceMapData")
|
||||
t.ok(error instanceof SyntaxError && error.message !== "data:application/json,foo",
|
||||
"dataUriInvalidJSON")
|
||||
t.notOk(result)
|
||||
@@ -632,6 +776,12 @@ function testResolve(method, sync) {
|
||||
})
|
||||
|
||||
method(code.dataUriEmpty, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "data:",
|
||||
url: null,
|
||||
sourcesRelativeTo: codeUrl,
|
||||
map: ""
|
||||
}, "dataUriEmpty .sourceMapData")
|
||||
t.ok(error.message.match(/mime type.+text\/plain/), "dataUriEmpty")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
@@ -657,6 +807,12 @@ function testResolve(method, sync) {
|
||||
})
|
||||
|
||||
method(code.absolute, codeUrl, wrap(read("invalid JSON")), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "https://foo.org/foo.js.map",
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: "invalid JSON"
|
||||
}, "read invalid JSON .sourceMapData")
|
||||
t.ok(error instanceof SyntaxError, "read invalid JSON")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
@@ -676,6 +832,12 @@ function testResolve(method, sync) {
|
||||
})
|
||||
|
||||
method(code.absolute, codeUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: "https://foo.org/foo.js.map",
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: null
|
||||
}, "read throws .sourceMapData")
|
||||
t.equal(error.message, "https://foo.org/foo.js.map", "read throws")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
@@ -713,7 +875,7 @@ function testResolve(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
options = {ignoreSourceRoot: true}
|
||||
options = {sourceRoot: false}
|
||||
method(code.fileRelative, codeUrl, readMap(map.sourceRoot), options, function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
@@ -722,7 +884,7 @@ function testResolve(method, sync) {
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "sourceRoot")
|
||||
], "ignore sourceRoot")
|
||||
t.deepEqual(result.sourcesContent, [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
@@ -733,6 +895,26 @@ function testResolve(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
options = {sourceRoot: "/static/js/"}
|
||||
method(code.fileRelative, codeUrl, readMap(map.sourceRoot), options, function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
"http://example.com/static/js/foo.js",
|
||||
"http://example.com/static/js/lib/bar.js",
|
||||
"http://example.com/static/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "custom sourceRoot")
|
||||
t.deepEqual(result.sourcesContent, [
|
||||
"http://example.com/static/js/foo.js",
|
||||
"http://example.com/static/js/lib/bar.js",
|
||||
"http://example.com/static/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "custom sourceRoot")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.fileRelative, codeUrl, readMap(map.sourceRootNoSlash), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
@@ -752,6 +934,25 @@ function testResolve(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.fileRelative, codeUrl, readMap(map.sourceRootEmpty), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "sourceRootEmpty")
|
||||
t.deepEqual(result.sourcesContent, [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "sourceRootEmpty")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.fileRelative, codeUrl, readMap(map.sourcesContent), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
@@ -790,6 +991,20 @@ function testResolve(method, sync) {
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.fileRelative, codeUrl, readMap(map.noSources), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [], "noSources")
|
||||
t.deepEqual(result.sourcesContent, [], "noSources")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.fileRelative, codeUrl, readMap(map.empty), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [], "noSources")
|
||||
t.deepEqual(result.sourcesContent, [], "noSources")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(code.fileRelative, codeUrl, wrap(read([map.simpleString])), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, ["http://example.com/a/b/c/foo.js"], "read non-string")
|
||||
@@ -801,15 +1016,138 @@ function testResolve(method, sync) {
|
||||
return wrapMap(read(JSON.stringify(what)), Throws)
|
||||
}
|
||||
|
||||
var calledBack = false
|
||||
method(code.fileRelative, codeUrl, ThrowsMap(map.mixed), function(error, result) {
|
||||
t.equal(calledBack, false)
|
||||
calledBack = true
|
||||
t.equal(error.message, "http://example.com/a/b/c/lib/bar.js", "read throws")
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "read throws .sourcesResolved")
|
||||
var sourcesContent = result.sourcesContent
|
||||
for (var index = 0, len = sourcesContent.length; index < len; index++) {
|
||||
var item = sourcesContent[index]
|
||||
if (item instanceof Error) {
|
||||
sourcesContent[index] = null
|
||||
}
|
||||
}
|
||||
t.deepEqual(sourcesContent, [
|
||||
"foo.js",
|
||||
null,
|
||||
null,
|
||||
"/version.js",
|
||||
"//foo.org/baz.js"
|
||||
], "read throws .sourcesContent")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
var mapUrl = "https://foo.org/foo.js.map"
|
||||
|
||||
method(null, mapUrl, readSimple, function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
sourceMappingURL: null,
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: map.simple,
|
||||
sourcesResolved: ["https://foo.org/foo.js"],
|
||||
sourcesContent: ["https://foo.org/foo.js"]
|
||||
}, "mapUrl simple")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(null, mapUrl, wrap(read([map.simpleString])), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
sourceMappingURL: null,
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: map.simple,
|
||||
sourcesResolved: ["https://foo.org/foo.js"],
|
||||
sourcesContent: [map.simpleString]
|
||||
}, "mapUrl read non-string")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(null, mapUrl, wrap(read("invalid JSON")), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: null,
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: "invalid JSON"
|
||||
}, "mapUrl read invalid JSON .sourceMapData")
|
||||
t.ok(error instanceof SyntaxError, "mapUrl read invalid JSON")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(null, mapUrl, wrapMap(read(map.XSSIsafe), identity), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result, {
|
||||
sourceMappingURL: null,
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: map.simple,
|
||||
sourcesResolved: ["https://foo.org/foo.js"],
|
||||
sourcesContent: ["https://foo.org/foo.js"]
|
||||
}, "mapUrl XSSIsafe map")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(null, mapUrl, wrap(Throws), function(error, result) {
|
||||
t.deepEqual(error.sourceMapData, {
|
||||
sourceMappingURL: null,
|
||||
url: "https://foo.org/foo.js.map",
|
||||
sourcesRelativeTo: "https://foo.org/foo.js.map",
|
||||
map: null
|
||||
}, "mapUrl read throws .sourceMapData")
|
||||
t.equal(error.message, "https://foo.org/foo.js.map", "mapUrl read throws")
|
||||
t.notOk(result)
|
||||
isAsync()
|
||||
})
|
||||
|
||||
mapUrl = "http://example.com/a/b/c/foo.js.map"
|
||||
|
||||
options = {sourceRoot: "/static/js/"}
|
||||
method(null, mapUrl, readMap(map.sourceRoot), options, function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
"http://example.com/static/js/foo.js",
|
||||
"http://example.com/static/js/lib/bar.js",
|
||||
"http://example.com/static/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "mapUrl custom sourceRoot")
|
||||
t.deepEqual(result.sourcesContent, [
|
||||
"http://example.com/static/js/foo.js",
|
||||
"http://example.com/static/js/lib/bar.js",
|
||||
"http://example.com/static/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "mapUrl custom sourceRoot")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
method(null, mapUrl, readMap(map.mixed), function(error, result) {
|
||||
t.error(error)
|
||||
t.deepEqual(result.sourcesResolved, [
|
||||
"http://example.com/a/b/c/foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"http://example.com/version.js",
|
||||
"http://foo.org/baz.js"
|
||||
], "mapUrl mixed")
|
||||
t.deepEqual(result.sourcesContent, [
|
||||
"foo.js",
|
||||
"http://example.com/a/b/c/lib/bar.js",
|
||||
"http://example.com/a/b/vendor/dom.js",
|
||||
"/version.js",
|
||||
"//foo.org/baz.js"
|
||||
], "mapUrl mixed")
|
||||
isAsync()
|
||||
})
|
||||
|
||||
next = true
|
||||
}
|
||||
}
|
||||
@@ -817,3 +1155,8 @@ function testResolve(method, sync) {
|
||||
test(".resolve", testResolve(sourceMapResolve.resolve, false))
|
||||
|
||||
test(".resolveSync", testResolve(sourceMapResolve.resolveSync, true))
|
||||
|
||||
test(".parseMapToJSON", function(t) {
|
||||
t.plan(1)
|
||||
t.deepEqual(sourceMapResolve.parseMapToJSON(map.XSSIsafe), map.simple)
|
||||
})
|
||||
|
||||
+14
-29
@@ -1,6 +1,6 @@
|
||||
{
|
||||
name: "source-map-resolve",
|
||||
version: "0.3.1",
|
||||
version: "0.5.2",
|
||||
author: "Simon Lydell",
|
||||
license: "MIT",
|
||||
description: "Resolve the source map and/or sources for a generated file.",
|
||||
@@ -29,33 +29,18 @@
|
||||
build: "node generate-source-map-resolve.js"
|
||||
},
|
||||
dependencies: {
|
||||
"source-map-url": "~0.3.0",
|
||||
"atob": "~1.1.0",
|
||||
"urix": "~0.1.0",
|
||||
// resolve-url is a dependency in package.json even though it is not
|
||||
// needed in Node.js, to allow using npm as a package manager for
|
||||
// browser projects too.
|
||||
"resolve-url": "~0.2.1"
|
||||
"atob": "^2.1.1",
|
||||
"decode-uri-component": "^0.2.0",
|
||||
"resolve-url": "^0.2.1",
|
||||
"source-map-url": "^0.4.0",
|
||||
"urix": "^0.1.0"
|
||||
},
|
||||
devDependencies: {
|
||||
"tape": "~2.5.0",
|
||||
"jshint": "~2.4.3",
|
||||
"setimmediate": "~1.0.1",
|
||||
"Base64": "~0.2.0",
|
||||
"simple-asyncify": "~0.1.0"
|
||||
},
|
||||
testling: {
|
||||
files: "test/source-map-resolve.js",
|
||||
browsers: [
|
||||
"ie/8..latest",
|
||||
"chrome/latest",
|
||||
"firefox/latest",
|
||||
"opera/12",
|
||||
"opera/latest",
|
||||
"safari/5",
|
||||
"iphone/6",
|
||||
"android-browser/4"
|
||||
]
|
||||
"Base64": "1.0.1",
|
||||
"jshint": "2.9.5",
|
||||
"setimmediate": "1.0.5",
|
||||
"simple-asyncify": "1.0.0",
|
||||
"tape": "4.9.0"
|
||||
}
|
||||
},
|
||||
component: {
|
||||
@@ -65,7 +50,7 @@
|
||||
"source-map-resolve.js"
|
||||
],
|
||||
dependencies: {
|
||||
"lydell/source-map-url": "~0.3.0",
|
||||
"lydell/source-map-url": "~0.4.0",
|
||||
"lydell/resolve-url": "~0.2.1"
|
||||
}
|
||||
},
|
||||
@@ -75,8 +60,8 @@
|
||||
".*"
|
||||
],
|
||||
dependencies: {
|
||||
"source-map-url": "~0.3.0",
|
||||
"resolve-url": "~0.2.1"
|
||||
"source-map-url": "^0.4.0",
|
||||
"resolve-url": "^0.2.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user