diff options
Diffstat (limited to 'node_modules/source-map-resolve/lib')
| -rw-r--r-- | node_modules/source-map-resolve/lib/resolve-url.js | 12 | ||||
| -rw-r--r-- | node_modules/source-map-resolve/lib/source-map-resolve-node.js | 285 | 
2 files changed, 297 insertions, 0 deletions
diff --git a/node_modules/source-map-resolve/lib/resolve-url.js b/node_modules/source-map-resolve/lib/resolve-url.js new file mode 100644 index 000000000..2ca8fa9a9 --- /dev/null +++ b/node_modules/source-map-resolve/lib/resolve-url.js @@ -0,0 +1,12 @@ +// Copyright 2014 Simon Lydell +// X11 (“MIT”) Licensed. (See LICENSE.) + +var url = require("url") + +function resolveUrl(/* ...urls */) { +  return Array.prototype.reduce.call(arguments, function(resolved, nextUrl) { +    return url.resolve(resolved, nextUrl) +  }) +} + +module.exports = resolveUrl diff --git a/node_modules/source-map-resolve/lib/source-map-resolve-node.js b/node_modules/source-map-resolve/lib/source-map-resolve-node.js new file mode 100644 index 000000000..f5904b229 --- /dev/null +++ b/node_modules/source-map-resolve/lib/source-map-resolve-node.js @@ -0,0 +1,285 @@ +// Copyright 2014, 2015, 2016 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") + + + +function callbackAsync(callback, error, result) { +  setImmediate(function() { callback(error, result) }) +} + +function parseMapToJSON(string, data) { +  try { +    return JSON.parse(string.replace(/^\)\]\}'/, "")) +  } catch (error) { +    error.sourceMapData = data +    throw error +  } +} + +function readSync(read, url, data) { +  try { +    return String(read(url)) +  } catch (error) { +    error.sourceMapData = data +    throw error +  } +} + + + +function resolveSourceMap(code, codeUrl, read, callback) { +  var mapData +  try { +    mapData = resolveSourceMapHelper(code, codeUrl) +  } catch (error) { +    return callbackAsync(callback, error) +  } +  if (!mapData || mapData.map) { +    return callbackAsync(callback, null, mapData) +  } +  read(mapData.url, function(error, result) { +    if (error) { +      error.sourceMapData = mapData +      return callback(error) +    } +    mapData.map = String(result) +    try { +      mapData.map = parseMapToJSON(mapData.map, mapData) +    } catch (error) { +      return callback(error) +    } +    callback(null, mapData) +  }) +} + +function resolveSourceMapSync(code, codeUrl, read) { +  var mapData = resolveSourceMapHelper(code, codeUrl) +  if (!mapData || mapData.map) { +    return mapData +  } +  mapData.map = readSync(read, mapData.url, mapData) +  mapData.map = parseMapToJSON(mapData.map, mapData) +  return mapData +} + +var dataUriRegex = /^data:([^,;]*)(;[^,;]*)*(?:,(.*))?$/ +var jsonMimeTypeRegex = /^(?:application|text)\/json$/ + +function resolveSourceMapHelper(code, codeUrl) { +  codeUrl = urix(codeUrl) + +  var url = sourceMappingURL.getFrom(code) +  if (!url) { +    return null +  } + +  var dataUri = url.match(dataUriRegex) +  if (dataUri) { +    var mimeType = dataUri[1] +    var lastParameter = dataUri[2] || "" +    var encoded = dataUri[3] || "" +    var data = { +      sourceMappingURL: url, +      url: null, +      sourcesRelativeTo: codeUrl, +      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) +  return { +    sourceMappingURL: url, +    url: mapUrl, +    sourcesRelativeTo: mapUrl, +    map: null +  } +} + + + +function resolveSources(map, mapUrl, read, options, callback) { +  if (typeof options === "function") { +    callback = options +    options = {} +  } +  var pending = map.sources.length +  var result = { +    sourcesResolved: [], +    sourcesContent:  [] +  } + +  var done = function() { +    pending-- +    if (pending === 0) { +      callback(null, result) +    } +  } + +  resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { +    result.sourcesResolved[index] = fullUrl +    if (typeof sourceContent === "string") { +      result.sourcesContent[index] = sourceContent +      callbackAsync(done, null) +    } else { +      read(fullUrl, function(error, source) { +        result.sourcesContent[index] = error ? error : String(source) +        done() +      }) +    } +  }) +} + +function resolveSourcesSync(map, mapUrl, read, options) { +  var result = { +    sourcesResolved: [], +    sourcesContent:  [] +  } +  resolveSourcesHelper(map, mapUrl, options, function(fullUrl, sourceContent, index) { +    result.sourcesResolved[index] = fullUrl +    if (read !== null) { +      if (typeof sourceContent === "string") { +        result.sourcesContent[index] = sourceContent +      } else { +        try { +          result.sourcesContent[index] = String(read(fullUrl)) +        } catch (error) { +          result.sourcesContent[index] = error +        } +      } +    } +  }) +  return result +} + +var endingSlash = /\/?$/ + +function resolveSourcesHelper(map, mapUrl, options, fn) { +  options = options || {} +  mapUrl = urix(mapUrl) +  var fullUrl +  var sourceContent +  var sourceRoot +  for (var index = 0, len = map.sources.length; index < len; index++) { +    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, sourceRoot.replace(endingSlash, "/"), map.sources[index]) +    } +    sourceContent = (map.sourcesContent || [])[index] +    fn(fullUrl, sourceContent, index) +  } +} + + + +function resolve(code, codeUrl, read, options, callback) { +  if (typeof options === "function") { +    callback = options +    options = {} +  } +  if (code === null) { +    var mapUrl = codeUrl +    var data = { +      sourceMappingURL: null, +      url: mapUrl, +      sourcesRelativeTo: mapUrl, +      map: null +    } +    read(mapUrl, 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) +      } +      mapData.sourcesResolved = result.sourcesResolved +      mapData.sourcesContent  = result.sourcesContent +      callback(null, mapData) +    }) +  } +} + +function resolveSync(code, codeUrl, read, options) { +  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 +  mapData.sourcesContent  = result.sourcesContent +  return mapData +} + + + +module.exports = { +  resolveSourceMap:     resolveSourceMap, +  resolveSourceMapSync: resolveSourceMapSync, +  resolveSources:       resolveSources, +  resolveSourcesSync:   resolveSourcesSync, +  resolve:              resolve, +  resolveSync:          resolveSync, +  parseMapToJSON:       parseMapToJSON +}  | 
