diff --git a/lib/mappings-encoded.js b/lib/mappings-encoded.js new file mode 100644 index 00000000..021dacf5 --- /dev/null +++ b/lib/mappings-encoded.js @@ -0,0 +1,3 @@ +const mappings = "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"; + +exports.mappings = mappings; diff --git a/lib/source-map-consumer-sync.js b/lib/source-map-consumer-sync.js new file mode 100644 index 00000000..a17f2b26 --- /dev/null +++ b/lib/source-map-consumer-sync.js @@ -0,0 +1,1007 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +const util = require("./util"); +const binarySearch = require("./binary-search"); +const ArraySet = require("./array-set").ArraySet; +const base64VLQ = require("./base64-vlq"); // eslint-disable-line no-unused-vars +const wasm = require("./wasm-sync"); + +const INTERNAL = Symbol("smcInternal"); + +class SourceMapConsumerSync { + constructor(aSourceMap, aSourceMapURL) { + if (aSourceMap == INTERNAL) { + // noop + } else { + return _factory(aSourceMap, aSourceMapURL); + } + } + + static initialize(opts) { + // noop + } + + static fromSourceMap(aSourceMap, aSourceMapURL) { + return _factoryBSM(aSourceMap, aSourceMapURL); + } + + /** + * Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl` + * (see the `SourceMapConsumer` constructor for details. Then, invoke the `async + * function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait + * for `f` to complete, call `destroy` on the consumer, and return `f`'s return + * value. + * + * You must not use the consumer after `f` completes! + * + * By using `with`, you do not have to remember to manually call `destroy` on + * the consumer, since it will be called automatically once `f` completes. + * + * ```js + * const xSquared = await SourceMapConsumer.with( + * myRawSourceMap, + * null, + * async function (consumer) { + * // Use `consumer` inside here and don't worry about remembering + * // to call `destroy`. + * + * const x = await whatever(consumer); + * return x * x; + * } + * ); + * + * // You may not use that `consumer` anymore out here; it has + * // been destroyed. But you can use `xSquared`. + * console.log(xSquared); + * ``` + */ + static async with(rawSourceMap, sourceMapUrl, f) { + const consumer = new SourceMapConsumerSync(rawSourceMap, sourceMapUrl); + try { + return await f(consumer); + } finally { + consumer.destroy(); + } + } + + /** + * Iterate over each mapping between an original source/line/column and a + * generated line/column in this source map. + * + * @param Function aCallback + * The function that is called with each mapping. + * @param Object aContext + * Optional. If specified, this object will be the value of `this` every + * time that `aCallback` is called. + * @param aOrder + * Either `SourceMapConsumer.GENERATED_ORDER` or + * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to + * iterate over the mappings sorted by the generated file's line/column + * order or the original's source/line/column order, respectively. Defaults to + * `SourceMapConsumer.GENERATED_ORDER`. + */ + eachMapping(aCallback, aContext, aOrder) { + throw new Error("Subclasses must implement eachMapping"); + } + + /** + * Returns all generated line and column information for the original source, + * line, and column provided. If no column is provided, returns all mappings + * corresponding to a either the line we are searching for or the next + * closest line that has any mappings. Otherwise, returns all mappings + * corresponding to the given line and either the column we are searching for + * or the next closest column that has any offsets. + * + * The only argument is an object with the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number is 1-based. + * - column: Optional. the column number in the original source. + * The column number is 0-based. + * + * and an array of objects is returned, each with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + allGeneratedPositionsFor(aArgs) { + throw new Error("Subclasses must implement allGeneratedPositionsFor"); + } + + destroy() { + throw new Error("Subclasses must implement destroy"); + } +} + +/** + * The version of the source mapping spec that we are consuming. + */ +SourceMapConsumerSync.prototype._version = 3; +SourceMapConsumerSync.GENERATED_ORDER = 1; +SourceMapConsumerSync.ORIGINAL_ORDER = 2; + +SourceMapConsumerSync.GREATEST_LOWER_BOUND = 1; +SourceMapConsumerSync.LEAST_UPPER_BOUND = 2; + +exports.SourceMapConsumerSync = SourceMapConsumerSync; + +/** + * A BasicSourceMapConsumer instance represents a parsed source map which we can + * query for information about the original file positions by giving it a file + * position in the generated source. + * + * The first parameter is the raw source map (either as a JSON string, or + * already parsed to an object). According to the spec, source maps have the + * following attributes: + * + * - version: Which version of the source map spec this map is following. + * - sources: An array of URLs to the original source files. + * - names: An array of identifiers which can be referenced by individual mappings. + * - sourceRoot: Optional. The URL root from which all sources are relative. + * - sourcesContent: Optional. An array of contents of the original source files. + * - mappings: A string of base64 VLQs which contain the actual mappings. + * - file: Optional. The generated file this source map is associated with. + * + * Here is an example source map, taken from the source map spec[0]: + * + * { + * version : 3, + * file: "out.js", + * sourceRoot : "", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AA,AB;;ABCDE;" + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# + */ +class BasicSourceMapConsumerSync extends SourceMapConsumerSync { + constructor(aSourceMap, aSourceMapURL) { + super(INTERNAL); + const that = this; + let sourceMap = aSourceMap; + if (typeof aSourceMap === "string") { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + const version = util.getArg(sourceMap, "version"); + const sources = util.getArg(sourceMap, "sources").map(String); + // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which + // requires the array) to play nice here. + const names = util.getArg(sourceMap, "names", []); + let sourceRoot = util.getArg(sourceMap, "sourceRoot", null); + const sourcesContent = util.getArg(sourceMap, "sourcesContent", null); + const mappings = util.getArg(sourceMap, "mappings"); + const file = util.getArg(sourceMap, "file", null); + + // Once again, Sass deviates from the spec and supplies the version as a + // string rather than a number, so we use loose equality checking here. + if (version != that._version) { + throw new Error("Unsupported version: " + version); + } + + that._sourceLookupCache = new Map(); + + // Pass `true` below to allow duplicate names and sources. While source maps + // are intended to be compressed and deduplicated, the TypeScript compiler + // sometimes generates source maps with duplicates in them. See Github issue + // #72 and bugzil.la/889492. + that._names = ArraySet.fromArray(names.map(String), true); + that._sources = ArraySet.fromArray(sources, true); + + that._absoluteSources = ArraySet.fromArray(that._sources.toArray().map(function (s) { + return util.computeSourceURL(sourceRoot, s, aSourceMapURL); + }), true); + + that.sourceRoot = sourceRoot; + that.sourcesContent = sourcesContent; + that._mappings = mappings; + that._sourceMapURL = aSourceMapURL; + that.file = file; + + that._computedColumnSpans = false; + that._mappingsPtr = 0; + that._wasm = wasm(); + } + + /** + * Utility function to find the index of a source. Returns -1 if not + * found. + */ + _findSourceIndex(aSource) { + // In the most common usecases, we'll be constantly looking up the index for the same source + // files, so we cache the index lookup to avoid constantly recomputing the full URLs. + const cachedIndex = this._sourceLookupCache.get(aSource); + if (typeof cachedIndex === "number") { + return cachedIndex; + } + + // Treat the source as map-relative overall by default. + const sourceAsMapRelative = util.computeSourceURL(null, aSource, this._sourceMapURL); + if (this._absoluteSources.has(sourceAsMapRelative)) { + const index = this._absoluteSources.indexOf(sourceAsMapRelative); + this._sourceLookupCache.set(aSource, index); + return index; + } + + // Fall back to treating the source as sourceRoot-relative. + const sourceAsSourceRootRelative = util.computeSourceURL(this.sourceRoot, aSource, this._sourceMapURL); + if (this._absoluteSources.has(sourceAsSourceRootRelative)) { + const index = this._absoluteSources.indexOf(sourceAsSourceRootRelative); + this._sourceLookupCache.set(aSource, index); + return index; + } + + // To avoid this cache growing forever, we do not cache lookup misses. + return -1; + } + + /** + * Create a BasicSourceMapConsumer from a SourceMapGenerator. + * + * @param SourceMapGenerator aSourceMap + * The source map that will be consumed. + * @param String aSourceMapURL + * The URL at which the source map can be found (optional) + * @returns BasicSourceMapConsumer + */ + static fromSourceMap(aSourceMap, aSourceMapURL) { + return new BasicSourceMapConsumerSync(aSourceMap.toString()); + } + + get sources() { + return this._absoluteSources.toArray(); + } + + _getMappingsPtr() { + if (this._mappingsPtr === 0) { + this._parseMappings(); + } + + return this._mappingsPtr; + } + + /** + * Parse the mappings in a string in to a data structure which we can easily + * query (the ordered arrays in the `this.__generatedMappings` and + * `this.__originalMappings` properties). + */ + _parseMappings() { + const aStr = this._mappings; + const size = aStr.length; + + const mappingsBufPtr = this._wasm.exports.allocate_mappings(size); + const mappingsBuf = new Uint8Array(this._wasm.exports.memory.buffer, mappingsBufPtr, size); + for (let i = 0; i < size; i++) { + mappingsBuf[i] = aStr.charCodeAt(i); + } + + const mappingsPtr = this._wasm.exports.parse_mappings(mappingsBufPtr); + + if (!mappingsPtr) { + const error = this._wasm.exports.get_last_error(); + let msg = `Error parsing mappings (code ${error}): `; + + // XXX: keep these error codes in sync with `fitzgen/source-map-mappings`. + switch (error) { + case 1: + msg += "the mappings contained a negative line, column, source index, or name index"; + break; + case 2: + msg += "the mappings contained a number larger than 2**32"; + break; + case 3: + msg += "reached EOF while in the middle of parsing a VLQ"; + break; + case 4: + msg += "invalid base 64 character while parsing a VLQ"; + break; + default: + msg += "unknown error code"; + break; + } + + throw new Error(msg); + } + + this._mappingsPtr = mappingsPtr; + } + + eachMapping(aCallback, aContext, aOrder) { + const context = aContext || null; + const order = aOrder || SourceMapConsumerSync.GENERATED_ORDER; + const sourceRoot = this.sourceRoot; + + this._wasm.withMappingCallback( + mapping => { + if (mapping.source !== null) { + mapping.source = this._sources.at(mapping.source); + mapping.source = util.computeSourceURL(sourceRoot, mapping.source, this._sourceMapURL); + + if (mapping.name !== null) { + mapping.name = this._names.at(mapping.name); + } + } + if (this._computedColumnSpans && mapping.lastGeneratedColumn === null) { + mapping.lastGeneratedColumn = Infinity; + } + + aCallback.call(context, mapping); + }, + () => { + switch (order) { + case SourceMapConsumerSync.GENERATED_ORDER: + this._wasm.exports.by_generated_location(this._getMappingsPtr()); + break; + case SourceMapConsumerSync.ORIGINAL_ORDER: + this._wasm.exports.by_original_location(this._getMappingsPtr()); + break; + default: + throw new Error("Unknown order of iteration."); + } + } + ); + } + + allGeneratedPositionsFor(aArgs) { + let source = util.getArg(aArgs, "source"); + const originalLine = util.getArg(aArgs, "line"); + const originalColumn = aArgs.column || 0; + + source = this._findSourceIndex(source); + if (source < 0) { + return []; + } + + if (originalLine < 1) { + throw new Error("Line numbers must be >= 1"); + } + + if (originalColumn < 0) { + throw new Error("Column numbers must be >= 0"); + } + + const mappings = []; + + this._wasm.withMappingCallback( + m => { + let lastColumn = m.lastGeneratedColumn; + if (this._computedColumnSpans && lastColumn === null) { + lastColumn = Infinity; + } + mappings.push({ + line: m.generatedLine, + column: m.generatedColumn, + lastColumn, + }); + }, () => { + this._wasm.exports.all_generated_locations_for( + this._getMappingsPtr(), + source, + originalLine - 1, + "column" in aArgs, + originalColumn + ); + } + ); + + return mappings; + } + + destroy() { + if (this._mappingsPtr !== 0) { + this._wasm.exports.free_mappings(this._mappingsPtr); + this._mappingsPtr = 0; + } + } + + /** + * Compute the last column for each generated mapping. The last column is + * inclusive. + */ + computeColumnSpans() { + if (this._computedColumnSpans) { + return; + } + + this._wasm.exports.compute_column_spans(this._getMappingsPtr()); + this._computedColumnSpans = true; + } + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + originalPositionFor(aArgs) { + const needle = { + generatedLine: util.getArg(aArgs, "line"), + generatedColumn: util.getArg(aArgs, "column") + }; + + if (needle.generatedLine < 1) { + throw new Error("Line numbers must be >= 1"); + } + + if (needle.generatedColumn < 0) { + throw new Error("Column numbers must be >= 0"); + } + + let bias = util.getArg(aArgs, "bias", SourceMapConsumerSync.GREATEST_LOWER_BOUND); + if (bias == null) { + bias = SourceMapConsumerSync.GREATEST_LOWER_BOUND; + } + + let mapping; + this._wasm.withMappingCallback(m => mapping = m, () => { + this._wasm.exports.original_location_for( + this._getMappingsPtr(), + needle.generatedLine - 1, + needle.generatedColumn, + bias + ); + }); + + if (mapping) { + if (mapping.generatedLine === needle.generatedLine) { + let source = util.getArg(mapping, "source", null); + if (source !== null) { + source = this._sources.at(source); + source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); + } + + let name = util.getArg(mapping, "name", null); + if (name !== null) { + name = this._names.at(name); + } + + return { + source, + line: util.getArg(mapping, "originalLine", null), + column: util.getArg(mapping, "originalColumn", null), + name + }; + } + } + + return { + source: null, + line: null, + column: null, + name: null + }; + } + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + hasContentsOfAllSources() { + if (!this.sourcesContent) { + return false; + } + return this.sourcesContent.length >= this._sources.size() && + !this.sourcesContent.some(function (sc) { return sc == null; }); + } + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + sourceContentFor(aSource, nullOnMissing) { + if (!this.sourcesContent) { + return null; + } + + const index = this._findSourceIndex(aSource); + if (index >= 0) { + return this.sourcesContent[index]; + } + + // This function is used recursively from + // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we + // don't want to throw if we can't find the source - we just want to + // return null, so we provide a flag to exit gracefully. + if (nullOnMissing) { + return null; + } + + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or + * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the + * closest element that is smaller than or greater than the one we are + * searching for, respectively, if the exact element cannot be found. + * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + generatedPositionFor(aArgs) { + let source = util.getArg(aArgs, "source"); + source = this._findSourceIndex(source); + if (source < 0) { + return { + line: null, + column: null, + lastColumn: null + }; + } + + const needle = { + source, + originalLine: util.getArg(aArgs, "line"), + originalColumn: util.getArg(aArgs, "column") + }; + + if (needle.originalLine < 1) { + throw new Error("Line numbers must be >= 1"); + } + + if (needle.originalColumn < 0) { + throw new Error("Column numbers must be >= 0"); + } + + let bias = util.getArg(aArgs, "bias", SourceMapConsumerSync.GREATEST_LOWER_BOUND); + if (bias == null) { + bias = SourceMapConsumerSync.GREATEST_LOWER_BOUND; + } + + let mapping; + this._wasm.withMappingCallback(m => mapping = m, () => { + this._wasm.exports.generated_location_for( + this._getMappingsPtr(), + needle.source, + needle.originalLine - 1, + needle.originalColumn, + bias + ); + }); + + if (mapping) { + if (mapping.source === needle.source) { + let lastColumn = mapping.lastGeneratedColumn; + if (this._computedColumnSpans && lastColumn === null) { + lastColumn = Infinity; + } + return { + line: util.getArg(mapping, "generatedLine", null), + column: util.getArg(mapping, "generatedColumn", null), + lastColumn, + }; + } + } + + return { + line: null, + column: null, + lastColumn: null + }; + } +} + +BasicSourceMapConsumerSync.prototype.consumer = SourceMapConsumerSync; +exports.BasicSourceMapConsumerSync = BasicSourceMapConsumerSync; + +/** + * An IndexedSourceMapConsumer instance represents a parsed source map which + * we can query for information. It differs from BasicSourceMapConsumer in + * that it takes "indexed" source maps (i.e. ones with a "sections" field) as + * input. + * + * The first parameter is a raw source map (either as a JSON string, or already + * parsed to an object). According to the spec for indexed source maps, they + * have the following attributes: + * + * - version: Which version of the source map spec this map is following. + * - file: Optional. The generated file this source map is associated with. + * - sections: A list of section definitions. + * + * Each value under the "sections" field has two fields: + * - offset: The offset into the original specified at which this section + * begins to apply, defined as an object with a "line" and "column" + * field. + * - map: A source map definition. This source map could also be indexed, + * but doesn't have to be. + * + * Instead of the "map" field, it's also possible to have a "url" field + * specifying a URL to retrieve a source map from, but that's currently + * unsupported. + * + * Here's an example source map, taken from the source map spec[0], but + * modified to omit a section which uses the "url" field. + * + * { + * version : 3, + * file: "app.js", + * sections: [{ + * offset: {line:100, column:10}, + * map: { + * version : 3, + * file: "section.js", + * sources: ["foo.js", "bar.js"], + * names: ["src", "maps", "are", "fun"], + * mappings: "AAAA,E;;ABCDE;" + * } + * }], + * } + * + * The second parameter, if given, is a string whose value is the URL + * at which the source map was found. This URL is used to compute the + * sources array. + * + * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt + */ +class IndexedSourceMapConsumerSync extends SourceMapConsumerSync { + constructor(aSourceMap, aSourceMapURL) { + super(INTERNAL); + const that = this; + + let sourceMap = aSourceMap; + if (typeof aSourceMap === "string") { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + const version = util.getArg(sourceMap, "version"); + const sections = util.getArg(sourceMap, "sections"); + + if (version != that._version) { + throw new Error("Unsupported version: " + version); + } + + let lastOffset = { + line: -1, + column: 0 + }; + + that._sections = sections.map(s => { + if (s.url) { + // The url field will require support for asynchronicity. + // See https://github.com/mozilla/source-map/issues/16 + throw new Error("Support for url field in sections not implemented."); + } + const offset = util.getArg(s, "offset"); + const offsetLine = util.getArg(offset, "line"); + const offsetColumn = util.getArg(offset, "column"); + + if (offsetLine < lastOffset.line || + (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { + throw new Error("Section offsets must be ordered and non-overlapping."); + } + lastOffset = offset; + + const cons = new SourceMapConsumerSync(util.getArg(s, "map"), aSourceMapURL); + return { + generatedOffset: { + // The offset fields are 0-based, but we use 1-based indices when + // encoding/decoding from VLQ. + generatedLine: offsetLine + 1, + generatedColumn: offsetColumn + 1 + }, + consumer: cons + }; + }); + } + + /** + * The list of original sources. + */ + get sources() { + const sources = []; + for (let i = 0; i < this._sections.length; i++) { + for (let j = 0; j < this._sections[i].consumer.sources.length; j++) { + sources.push(this._sections[i].consumer.sources[j]); + } + } + return sources; + } + + /** + * Returns the original source, line, and column information for the generated + * source's line and column positions provided. The only argument is an object + * with the following properties: + * + * - line: The line number in the generated source. The line number + * is 1-based. + * - column: The column number in the generated source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - source: The original source file, or null. + * - line: The line number in the original source, or null. The + * line number is 1-based. + * - column: The column number in the original source, or null. The + * column number is 0-based. + * - name: The original identifier, or null. + */ + originalPositionFor(aArgs) { + const needle = { + generatedLine: util.getArg(aArgs, "line"), + generatedColumn: util.getArg(aArgs, "column") + }; + + // Find the section containing the generated position we're trying to map + // to an original position. + const sectionIndex = binarySearch.search(needle, this._sections, + function (aNeedle, section) { + const cmp = aNeedle.generatedLine - section.generatedOffset.generatedLine; + if (cmp) { + return cmp; + } + + return (aNeedle.generatedColumn - + section.generatedOffset.generatedColumn); + }); + const section = this._sections[sectionIndex]; + + if (!section) { + return { + source: null, + line: null, + column: null, + name: null + }; + } + + return section.consumer.originalPositionFor({ + line: needle.generatedLine - + (section.generatedOffset.generatedLine - 1), + column: needle.generatedColumn - + (section.generatedOffset.generatedLine === needle.generatedLine + ? section.generatedOffset.generatedColumn - 1 + : 0), + bias: aArgs.bias + }); + } + + /** + * Return true if we have the source content for every source in the source + * map, false otherwise. + */ + hasContentsOfAllSources() { + return this._sections.every(function (s) { + return s.consumer.hasContentsOfAllSources(); + }); + } + + /** + * Returns the original source content. The only argument is the url of the + * original source file. Returns null if no original source content is + * available. + */ + sourceContentFor(aSource, nullOnMissing) { + for (let i = 0; i < this._sections.length; i++) { + const section = this._sections[i]; + + const content = section.consumer.sourceContentFor(aSource, true); + if (content) { + return content; + } + } + if (nullOnMissing) { + return null; + } + throw new Error('"' + aSource + '" is not in the SourceMap.'); + } + + _findSectionIndex(source) { + for (let i = 0; i < this._sections.length; i++) { + const { consumer } = this._sections[i]; + if (consumer._findSourceIndex(source) !== -1) { + return i; + } + } + return -1; + } + + /** + * Returns the generated line and column information for the original source, + * line, and column positions provided. The only argument is an object with + * the following properties: + * + * - source: The filename of the original source. + * - line: The line number in the original source. The line number + * is 1-based. + * - column: The column number in the original source. The column + * number is 0-based. + * + * and an object is returned with the following properties: + * + * - line: The line number in the generated source, or null. The + * line number is 1-based. + * - column: The column number in the generated source, or null. + * The column number is 0-based. + */ + generatedPositionFor(aArgs) { + const index = this._findSectionIndex(util.getArg(aArgs, "source")); + const section = index >= 0 ? this._sections[index] : null; + const nextSection = + index >= 0 && index + 1 < this._sections.length + ? this._sections[index + 1] + : null; + + const generatedPosition = + section && section.consumer.generatedPositionFor(aArgs); + if (generatedPosition && generatedPosition.line !== null) { + const lineShift = section.generatedOffset.generatedLine - 1; + const columnShift = section.generatedOffset.generatedColumn - 1; + + if (generatedPosition.line === 1) { + generatedPosition.column += columnShift; + if (typeof generatedPosition.lastColumn === "number") { + generatedPosition.lastColumn += columnShift; + } + } + + if ( + generatedPosition.lastColumn === Infinity && + nextSection && + generatedPosition.line === nextSection.generatedOffset.generatedLine + ) { + generatedPosition.lastColumn = + nextSection.generatedOffset.generatedColumn - 2; + } + generatedPosition.line += lineShift; + + return generatedPosition; + } + + return { + line: null, + column: null, + lastColumn: null + }; + } + + allGeneratedPositionsFor(aArgs) { + const index = this._findSectionIndex(util.getArg(aArgs, "source")); + const section = index >= 0 ? this._sections[index] : null; + const nextSection = + index >= 0 && index + 1 < this._sections.length + ? this._sections[index + 1] + : null; + + if (!section) return []; + + return section.consumer.allGeneratedPositionsFor(aArgs).map( + generatedPosition => { + const lineShift = section.generatedOffset.generatedLine - 1; + const columnShift = section.generatedOffset.generatedColumn - 1; + + if (generatedPosition.line === 1) { + generatedPosition.column += columnShift; + if (typeof generatedPosition.lastColumn === "number") { + generatedPosition.lastColumn += columnShift; + } + } + + if ( + generatedPosition.lastColumn === Infinity && + nextSection && + generatedPosition.line === nextSection.generatedOffset.generatedLine + ) { + generatedPosition.lastColumn = + nextSection.generatedOffset.generatedColumn - 2; + } + generatedPosition.line += lineShift; + + return generatedPosition; + } + ); + } + + eachMapping(aCallback, aContext, aOrder) { + this._sections.forEach((section, index) => { + const nextSection = + index + 1 < this._sections.length + ? this._sections[index + 1] + : null; + const { generatedOffset } = section; + + const lineShift = generatedOffset.generatedLine - 1; + const columnShift = generatedOffset.generatedColumn - 1; + + section.consumer.eachMapping(function (mapping) { + if (mapping.generatedLine === 1) { + mapping.generatedColumn += columnShift; + + if (typeof mapping.lastGeneratedColumn === "number") { + mapping.lastGeneratedColumn += columnShift; + } + } + + if ( + mapping.lastGeneratedColumn === Infinity && + nextSection && + mapping.generatedLine === nextSection.generatedOffset.generatedLine + ) { + mapping.lastGeneratedColumn = + nextSection.generatedOffset.generatedColumn - 2; + } + mapping.generatedLine += lineShift; + + aCallback.call(this, mapping); + }, aContext, aOrder); + }); + } + + computeColumnSpans() { + for (let i = 0; i < this._sections.length; i++) { + this._sections[i].consumer.computeColumnSpans(); + } + } + + destroy() { + for (let i = 0; i < this._sections.length; i++) { + this._sections[i].consumer.destroy(); + } + } +} +exports.IndexedSourceMapConsumerSync = IndexedSourceMapConsumerSync; + +/* + * Cheat to get around inter-twingled classes. `factory()` can be at the end + * where it has access to non-hoisted classes, but it gets hoisted itself. + */ +function _factory(aSourceMap, aSourceMapURL) { + let sourceMap = aSourceMap; + if (typeof aSourceMap === "string") { + sourceMap = util.parseSourceMapInput(aSourceMap); + } + + const consumer = sourceMap.sections != null + ? new IndexedSourceMapConsumerSync(sourceMap, aSourceMapURL) + : new BasicSourceMapConsumerSync(sourceMap, aSourceMapURL); + return consumer; +} + +function _factoryBSM(aSourceMap, aSourceMapURL) { + return BasicSourceMapConsumerSync.fromSourceMap(aSourceMap, aSourceMapURL); +} diff --git a/lib/wasm-sync.js b/lib/wasm-sync.js new file mode 100644 index 00000000..679fc65d --- /dev/null +++ b/lib/wasm-sync.js @@ -0,0 +1,108 @@ +const mappings = require("./mappings-encoded").mappings; + +/** + * Provide the JIT with a nice shape / hidden class. + */ +function Mapping() { + this.generatedLine = 0; + this.generatedColumn = 0; + this.lastGeneratedColumn = null; + this.source = null; + this.originalLine = null; + this.originalColumn = null; + this.name = null; +} + +function str2ab(str) { + // todo: browser environment + return Buffer.from(str, "base64"); +} + +let cachedWasm = null; + +module.exports = function wasm() { + if (cachedWasm) { + return cachedWasm; + } + + const callbackStack = []; + + const wasmModule = new WebAssembly.Module(str2ab(mappings)); + const instance = new WebAssembly.Instance(wasmModule, { + env: { + mapping_callback( + generatedLine, + generatedColumn, + + hasLastGeneratedColumn, + lastGeneratedColumn, + + hasOriginal, + source, + originalLine, + originalColumn, + + hasName, + name + ) { + const mapping = new Mapping(); + // JS uses 1-based line numbers, wasm uses 0-based. + mapping.generatedLine = generatedLine + 1; + mapping.generatedColumn = generatedColumn; + + if (hasLastGeneratedColumn) { + // JS uses inclusive last generated column, wasm uses exclusive. + mapping.lastGeneratedColumn = lastGeneratedColumn - 1; + } + + if (hasOriginal) { + mapping.source = source; + // JS uses 1-based line numbers, wasm uses 0-based. + mapping.originalLine = originalLine + 1; + mapping.originalColumn = originalColumn; + + if (hasName) { + mapping.name = name; + } + } + + callbackStack[callbackStack.length - 1](mapping); + }, + + start_all_generated_locations_for() { console.time("all_generated_locations_for"); }, + end_all_generated_locations_for() { console.timeEnd("all_generated_locations_for"); }, + + start_compute_column_spans() { console.time("compute_column_spans"); }, + end_compute_column_spans() { console.timeEnd("compute_column_spans"); }, + + start_generated_location_for() { console.time("generated_location_for"); }, + end_generated_location_for() { console.timeEnd("generated_location_for"); }, + + start_original_location_for() { console.time("original_location_for"); }, + end_original_location_for() { console.timeEnd("original_location_for"); }, + + start_parse_mappings() { console.time("parse_mappings"); }, + end_parse_mappings() { console.timeEnd("parse_mappings"); }, + + start_sort_by_generated_location() { console.time("sort_by_generated_location"); }, + end_sort_by_generated_location() { console.timeEnd("sort_by_generated_location"); }, + + start_sort_by_original_location() { console.time("sort_by_original_location"); }, + end_sort_by_original_location() { console.timeEnd("sort_by_original_location"); }, + } + }); + + cachedWasm = { + exports: instance.exports, + withMappingCallback: (mappingCallback, f) => { + callbackStack.push(mappingCallback); + try { + f(); + } finally { + callbackStack.pop(); + } + } + }; + + return cachedWasm; +}; diff --git a/source-map.js b/source-map.js index a84abf1e..6a39e35f 100644 --- a/source-map.js +++ b/source-map.js @@ -5,4 +5,5 @@ */ exports.SourceMapGenerator = require("./lib/source-map-generator").SourceMapGenerator; exports.SourceMapConsumer = require("./lib/source-map-consumer").SourceMapConsumer; +exports.SourceMapConsumerSync = require("./lib/source-map-consumer-sync").SourceMapConsumerSync; exports.SourceNode = require("./lib/source-node").SourceNode; diff --git a/test/test-source-map-consumer-sync.js b/test/test-source-map-consumer-sync.js new file mode 100644 index 00000000..868aa6f7 --- /dev/null +++ b/test/test-source-map-consumer-sync.js @@ -0,0 +1,1588 @@ +/* -*- Mode: js; js-indent-level: 2; -*- */ +/* + * Copyright 2011 Mozilla Foundation and contributors + * Licensed under the New BSD license. See LICENSE or: + * http://opensource.org/licenses/BSD-3-Clause + */ + +const util = require("./util"); +const SourceMapConsumerSync = require("../lib/source-map-consumer-sync").SourceMapConsumerSync; +const IndexedSourceMapConsumerSync = require("../lib/source-map-consumer-sync").IndexedSourceMapConsumerSync; +const BasicSourceMapConsumerSync = require("../lib/source-map-consumer-sync").BasicSourceMapConsumerSync; +const SourceMapGenerator = require("../lib/source-map-generator").SourceMapGenerator; + +exports["test that we can instantiate with a string or an object"] = async function(assert) { + let map = new SourceMapConsumerSync(util.testMap); + map = new SourceMapConsumerSync(JSON.stringify(util.testMap)); + assert.ok(true); + map.destroy(); +}; + +exports["test that the object returned from new SourceMapConsumerSync inherits from SourceMapConsumerSync"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMap); + assert.ok(map instanceof SourceMapConsumerSync); + map.destroy(); +}; + +exports["test that a BasicSourceMapConsumerSync is returned for sourcemaps without sections"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMap); + assert.ok(map instanceof BasicSourceMapConsumerSync); + map.destroy(); +}; + +exports["test that an IndexedSourceMapConsumerSync is returned for sourcemaps with sections"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMap); + assert.ok(map instanceof IndexedSourceMapConsumerSync); + map.destroy(); +}; + +exports["test that the `sources` field has the original sources"] = async function(assert) { + let map; + let sources; + + map = new SourceMapConsumerSync(util.testMap); + sources = map.sources; + assert.equal(sources[0], "/the/root/one.js"); + assert.equal(sources[1], "/the/root/two.js"); + assert.equal(sources.length, 2); + map.destroy(); + + map = new SourceMapConsumerSync(util.indexedTestMap); + sources = map.sources; + assert.equal(sources[0], "/the/root/one.js"); + assert.equal(sources[1], "/the/root/two.js"); + assert.equal(sources.length, 2); + map.destroy(); + + map = new SourceMapConsumerSync(util.indexedTestMapDifferentSourceRoots); + sources = map.sources; + assert.equal(sources[0], "/the/root/one.js"); + assert.equal(sources[1], "/different/root/two.js"); + assert.equal(sources.length, 2); + map.destroy(); + + map = new SourceMapConsumerSync(util.testMapNoSourceRoot); + sources = map.sources; + assert.equal(sources[0], "one.js"); + assert.equal(sources[1], "two.js"); + assert.equal(sources.length, 2); + map.destroy(); + + map = new SourceMapConsumerSync(util.testMapEmptySourceRoot); + sources = map.sources; + assert.equal(sources[0], "one.js"); + assert.equal(sources[1], "two.js"); + assert.equal(sources.length, 2); + map.destroy(); +}; + +exports["test that the source root is reflected in a mapping's source field"] = async function(assert) { + let map; + let mapping; + + map = new SourceMapConsumerSync(util.testMap); + + mapping = map.originalPositionFor({ + line: 2, + column: 1 + }); + assert.equal(mapping.source, "/the/root/two.js"); + + mapping = map.originalPositionFor({ + line: 1, + column: 1 + }); + assert.equal(mapping.source, "/the/root/one.js"); + map.destroy(); + + + map = new SourceMapConsumerSync(util.testMapNoSourceRoot); + + mapping = map.originalPositionFor({ + line: 2, + column: 1 + }); + assert.equal(mapping.source, "two.js"); + + mapping = map.originalPositionFor({ + line: 1, + column: 1 + }); + assert.equal(mapping.source, "one.js"); + map.destroy(); + + + map = new SourceMapConsumerSync(util.testMapEmptySourceRoot); + + mapping = map.originalPositionFor({ + line: 2, + column: 1 + }); + assert.equal(mapping.source, "two.js"); + + mapping = map.originalPositionFor({ + line: 1, + column: 1 + }); + assert.equal(mapping.source, "one.js"); + map.destroy(); +}; + +exports["test mapping tokens back exactly"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMap); + + util.assertMapping(1, 1, "/the/root/one.js", 1, 1, null, null, map, assert); + util.assertMapping(1, 5, "/the/root/one.js", 1, 5, null, null, map, assert); + util.assertMapping(1, 9, "/the/root/one.js", 1, 11, null, null, map, assert); + util.assertMapping(1, 18, "/the/root/one.js", 1, 21, "bar", null, map, assert); + util.assertMapping(1, 21, "/the/root/one.js", 2, 3, null, null, map, assert); + util.assertMapping(1, 28, "/the/root/one.js", 2, 10, "baz", null, map, assert); + util.assertMapping(1, 32, "/the/root/one.js", 2, 14, "bar", null, map, assert); + + util.assertMapping(2, 1, "/the/root/two.js", 1, 1, null, null, map, assert); + util.assertMapping(2, 5, "/the/root/two.js", 1, 5, null, null, map, assert); + util.assertMapping(2, 9, "/the/root/two.js", 1, 11, null, null, map, assert); + util.assertMapping(2, 18, "/the/root/two.js", 1, 21, "n", null, map, assert); + util.assertMapping(2, 21, "/the/root/two.js", 2, 3, null, null, map, assert); + util.assertMapping(2, 28, "/the/root/two.js", 2, 10, "n", null, map, assert); + + map.destroy(); +}; + +exports["test mapping tokens back exactly in indexed source map"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMap); + + util.assertMapping(1, 1, "/the/root/one.js", 1, 1, null, null, map, assert); + util.assertMapping(1, 5, "/the/root/one.js", 1, 5, null, null, map, assert); + util.assertMapping(1, 9, "/the/root/one.js", 1, 11, null, null, map, assert); + util.assertMapping(1, 18, "/the/root/one.js", 1, 21, "bar", null, map, assert); + util.assertMapping(1, 21, "/the/root/one.js", 2, 3, null, null, map, assert); + util.assertMapping(1, 28, "/the/root/one.js", 2, 10, "baz", null, map, assert); + util.assertMapping(1, 32, "/the/root/one.js", 2, 14, "bar", null, map, assert); + + util.assertMapping(2, 1, "/the/root/two.js", 1, 1, null, null, map, assert); + util.assertMapping(2, 5, "/the/root/two.js", 1, 5, null, null, map, assert); + util.assertMapping(2, 9, "/the/root/two.js", 1, 11, null, null, map, assert); + util.assertMapping(2, 18, "/the/root/two.js", 1, 21, "n", null, map, assert); + util.assertMapping(2, 21, "/the/root/two.js", 2, 3, null, null, map, assert); + util.assertMapping(2, 28, "/the/root/two.js", 2, 10, "n", null, map, assert); + + map.destroy(); +}; + +exports["test mapping tokens fuzzy"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMap); + + // Finding original positions with default (glb) bias. + util.assertMapping(1, 20, "/the/root/one.js", 1, 21, "bar", null, map, assert, true); + util.assertMapping(1, 30, "/the/root/one.js", 2, 10, "baz", null, map, assert, true); + util.assertMapping(2, 12, "/the/root/two.js", 1, 11, null, null, map, assert, true); + + // Finding original positions with lub bias. + util.assertMapping(1, 16, "/the/root/one.js", 1, 21, "bar", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, true); + util.assertMapping(1, 26, "/the/root/one.js", 2, 10, "baz", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, true); + util.assertMapping(2, 6, "/the/root/two.js", 1, 11, null, SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, true); + + // Finding generated positions with default (glb) bias. + util.assertMapping(1, 18, "/the/root/one.js", 1, 22, "bar", null, map, assert, null, true); + util.assertMapping(1, 28, "/the/root/one.js", 2, 13, "baz", null, map, assert, null, true); + util.assertMapping(2, 9, "/the/root/two.js", 1, 16, null, null, map, assert, null, true); + + // Finding generated positions with lub bias. + util.assertMapping(1, 18, "/the/root/one.js", 1, 20, "bar", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, null, true); + util.assertMapping(1, 28, "/the/root/one.js", 2, 7, "baz", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, null, true); + util.assertMapping(2, 9, "/the/root/two.js", 1, 6, null, SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, null, true); + + map.destroy(); +}; + +exports["test mapping tokens fuzzy in indexed source map"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMap); + + // Finding original positions with default (glb) bias. + util.assertMapping(1, 20, "/the/root/one.js", 1, 21, "bar", null, map, assert, true); + util.assertMapping(1, 30, "/the/root/one.js", 2, 10, "baz", null, map, assert, true); + util.assertMapping(2, 12, "/the/root/two.js", 1, 11, null, null, map, assert, true); + + // Finding original positions with lub bias. + util.assertMapping(1, 16, "/the/root/one.js", 1, 21, "bar", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, true); + util.assertMapping(1, 26, "/the/root/one.js", 2, 10, "baz", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, true); + util.assertMapping(2, 6, "/the/root/two.js", 1, 11, null, SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, true); + + // Finding generated positions with default (glb) bias. + util.assertMapping(1, 18, "/the/root/one.js", 1, 22, "bar", null, map, assert, null, true); + util.assertMapping(1, 28, "/the/root/one.js", 2, 13, "baz", null, map, assert, null, true); + util.assertMapping(2, 9, "/the/root/two.js", 1, 16, null, null, map, assert, null, true); + + // Finding generated positions with lub bias. + util.assertMapping(1, 18, "/the/root/one.js", 1, 20, "bar", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, null, true); + util.assertMapping(1, 28, "/the/root/one.js", 2, 7, "baz", SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, null, true); + util.assertMapping(2, 9, "/the/root/two.js", 1, 6, null, SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, null, true); + + map.destroy(); +}; + +exports["test mappings and end of lines"] = async function(assert) { + const smg = new SourceMapGenerator({ + file: "foo.js" + }); + smg.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 1, column: 1 }, + source: "bar.js" + }); + smg.addMapping({ + original: { line: 2, column: 2 }, + generated: { line: 2, column: 2 }, + source: "bar.js" + }); + smg.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 1, column: 1 }, + source: "baz.js" + }); + + const map = await SourceMapConsumerSync.fromSourceMap(smg); + + // When finding original positions, mappings end at the end of the line. + util.assertMapping(2, 1, null, null, null, null, null, map, assert, true); + + // When finding generated positions, mappings do not end at the end of the line. + util.assertMapping(1, 1, "bar.js", 2, 1, null, null, map, assert, null, true); + + // When finding generated positions with, mappings end at the end of the source. + util.assertMapping(null, null, "bar.js", 3, 1, null, SourceMapConsumerSync.LEAST_UPPER_BOUND, map, assert, null, true); + + map.destroy(); +}; + +exports["test creating source map consumers with )]}' prefix"] = async function(assert) { + const map = new SourceMapConsumerSync(")]}'\n" + JSON.stringify(util.testMap)); + assert.ok(true); + map.destroy(); +}; + +exports["test eachMapping"] = async function(assert) { + let map; + + map = new SourceMapConsumerSync(util.testMap); + let previousLine = -Infinity; + let previousColumn = -Infinity; + map.eachMapping(function(mapping) { + assert.ok(mapping.generatedLine >= previousLine); + + assert.ok(mapping.source === "/the/root/one.js" || mapping.source === "/the/root/two.js"); + + if (mapping.generatedLine === previousLine) { + assert.ok(mapping.generatedColumn >= previousColumn); + previousColumn = mapping.generatedColumn; + } else { + previousLine = mapping.generatedLine; + previousColumn = -Infinity; + } + }); + map.destroy(); + + map = new SourceMapConsumerSync(util.testMapNoSourceRoot); + map.eachMapping(function(mapping) { + assert.ok(mapping.source === "one.js" || mapping.source === "two.js"); + }); + map.destroy(); + + map = new SourceMapConsumerSync(util.testMapEmptySourceRoot); + map.eachMapping(function(mapping) { + assert.ok(mapping.source === "one.js" || mapping.source === "two.js"); + }); + map.destroy(); + + map = new SourceMapConsumerSync(util.mapWithSourcelessMapping); + map.eachMapping(function(mapping) { + assert.ok(mapping.source === null || (typeof mapping.originalColumn === "number" && typeof mapping.originalLine === "number")); + }); + map.destroy(); +}; + +exports["test eachMapping for indexed source maps"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMap); + map.computeColumnSpans(); + let previousLine = -Infinity; + let previousColumn = -Infinity; + let previousLastColumn = -Infinity; + + map.eachMapping(function(mapping) { + assert.ok(mapping.generatedLine >= previousLine); + + if (mapping.source) { + assert.equal(mapping.source.indexOf(util.testMap.sourceRoot), 0); + } + + if (mapping.generatedLine === previousLine) { + assert.ok(mapping.generatedColumn >= previousColumn); + if (typeof previousLastColumn === "number") { + assert.ok(mapping.generatedColumn > previousLastColumn); + } + previousColumn = mapping.generatedColumn; + previousLastColumn = mapping.lastGeneratedColumn; + } else { + previousLine = mapping.generatedLine; + previousColumn = -Infinity; + previousLastColumn = -Infinity; + } + }); + + map.destroy(); +}; + +exports["test eachMapping for indexed source maps with column offsets"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMapColumnOffset); + map.computeColumnSpans(); + let previousLine = -Infinity; + let previousColumn = -Infinity; + let previousLastColumn = -Infinity; + + map.eachMapping(function(mapping) { + assert.ok(mapping.generatedLine >= previousLine); + + if (mapping.source) { + assert.equal(mapping.source.indexOf(util.testMap.sourceRoot), 0); + } + + if (mapping.generatedLine === previousLine) { + assert.ok(mapping.generatedColumn >= previousColumn); + if (typeof previousLastColumn === "number") { + assert.ok(mapping.generatedColumn > previousLastColumn); + } + previousColumn = mapping.generatedColumn; + previousLastColumn = mapping.lastGeneratedColumn; + } else { + previousLine = mapping.generatedLine; + previousColumn = -Infinity; + previousLastColumn = -Infinity; + } + }); + + map.destroy(); +}; + +exports["test iterating over mappings in a different order"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMap); + let previousLine = -Infinity; + let previousColumn = -Infinity; + let previousSource = ""; + + map.eachMapping(function(mapping) { + assert.ok(mapping.source >= previousSource); + + if (mapping.source === previousSource) { + assert.ok(mapping.originalLine >= previousLine); + + if (mapping.originalLine === previousLine) { + assert.ok(mapping.originalColumn >= previousColumn); + previousColumn = mapping.originalColumn; + } else { + previousLine = mapping.originalLine; + previousColumn = -Infinity; + } + } else { + previousSource = mapping.source; + previousLine = -Infinity; + previousColumn = -Infinity; + } + }, null, SourceMapConsumerSync.ORIGINAL_ORDER); + + map.destroy(); +}; + +exports["test iterating over mappings in a different order in indexed source maps"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMap); + let previousLine = -Infinity; + let previousColumn = -Infinity; + let previousSource = ""; + map.eachMapping(function(mapping) { + assert.ok(mapping.source >= previousSource); + + if (mapping.source === previousSource) { + assert.ok(mapping.originalLine >= previousLine); + + if (mapping.originalLine === previousLine) { + assert.ok(mapping.originalColumn >= previousColumn); + previousColumn = mapping.originalColumn; + } else { + previousLine = mapping.originalLine; + previousColumn = -Infinity; + } + } else { + previousSource = mapping.source; + previousLine = -Infinity; + previousColumn = -Infinity; + } + }, null, SourceMapConsumerSync.ORIGINAL_ORDER); + map.destroy(); +}; + +exports["test that we can set the context for `this` in eachMapping"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMap); + const context = {}; + map.eachMapping(function() { + assert.equal(this, context); + }, context); + map.destroy(); +}; + +exports["test that we can set the context for `this` in eachMapping in indexed source maps"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMap); + const context = {}; + map.eachMapping(function() { + assert.equal(this, context); + }, context); + map.destroy(); +}; + +exports["test that the `sourcesContent` field has the original sources"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMapWithSourcesContent); + const sourcesContent = map.sourcesContent; + + assert.equal(sourcesContent[0], " ONE.foo = function (bar) {\n return baz(bar);\n };"); + assert.equal(sourcesContent[1], " TWO.inc = function (n) {\n return n + 1;\n };"); + assert.equal(sourcesContent.length, 2); + + map.destroy(); +}; + +exports["test that we can get the original sources for the sources"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMapWithSourcesContent); + const sources = map.sources; + + assert.equal(map.sourceContentFor(sources[0]), " ONE.foo = function (bar) {\n return baz(bar);\n };"); + assert.equal(map.sourceContentFor(sources[1]), " TWO.inc = function (n) {\n return n + 1;\n };"); + assert.equal(map.sourceContentFor("one.js"), " ONE.foo = function (bar) {\n return baz(bar);\n };"); + assert.equal(map.sourceContentFor("two.js"), " TWO.inc = function (n) {\n return n + 1;\n };"); + assert.throws(function() { + map.sourceContentFor(""); + }, Error); + assert.throws(function() { + map.sourceContentFor("/the/root/three.js"); + }, Error); + assert.throws(function() { + map.sourceContentFor("three.js"); + }, Error); + + map.destroy(); +}; + +exports["test that we can get the original source content with relative source paths"] = async function(assert) { + const map = new SourceMapConsumerSync(util.testMapRelativeSources); + const sources = map.sources; + + assert.equal(map.sourceContentFor(sources[0]), " ONE.foo = function (bar) {\n return baz(bar);\n };"); + assert.equal(map.sourceContentFor(sources[1]), " TWO.inc = function (n) {\n return n + 1;\n };"); + assert.equal(map.sourceContentFor("one.js"), " ONE.foo = function (bar) {\n return baz(bar);\n };"); + assert.equal(map.sourceContentFor("two.js"), " TWO.inc = function (n) {\n return n + 1;\n };"); + assert.throws(function() { + map.sourceContentFor(""); + }, Error); + assert.throws(function() { + map.sourceContentFor("/the/root/three.js"); + }, Error); + assert.throws(function() { + map.sourceContentFor("three.js"); + }, Error); + + map.destroy(); +}; + +exports["test that we can get the original source content for the sources on an indexed source map"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMap); + const sources = map.sources; + + assert.equal(map.sourceContentFor(sources[0]), " ONE.foo = function (bar) {\n return baz(bar);\n };"); + assert.equal(map.sourceContentFor(sources[1]), " TWO.inc = function (n) {\n return n + 1;\n };"); + assert.equal(map.sourceContentFor("one.js"), " ONE.foo = function (bar) {\n return baz(bar);\n };"); + assert.equal(map.sourceContentFor("two.js"), " TWO.inc = function (n) {\n return n + 1;\n };"); + assert.throws(function() { + map.sourceContentFor(""); + }, Error); + assert.throws(function() { + map.sourceContentFor("/the/root/three.js"); + }, Error); + assert.throws(function() { + map.sourceContentFor("three.js"); + }, Error); + + map.destroy(); +}; + +exports["test hasContentsOfAllSources, single source with contents"] = async function(assert) { + // Has one source: foo.js (with contents). + const mapWithContents = new SourceMapGenerator(); + mapWithContents.addMapping({ source: "foo.js", + original: { line: 1, column: 10 }, + generated: { line: 1, column: 10 } }); + mapWithContents.setSourceContent("foo.js", "content of foo.js"); + + const consumer = new SourceMapConsumerSync(mapWithContents.toJSON()); + assert.ok(consumer.hasContentsOfAllSources()); + consumer.destroy(); +}; + +exports["test hasContentsOfAllSources, single source without contents"] = async function(assert) { + // Has one source: foo.js (without contents). + const mapWithoutContents = new SourceMapGenerator(); + mapWithoutContents.addMapping({ source: "foo.js", + original: { line: 1, column: 10 }, + generated: { line: 1, column: 10 } }); + const consumer = new SourceMapConsumerSync(mapWithoutContents.toJSON()); + assert.ok(!consumer.hasContentsOfAllSources()); + consumer.destroy(); +}; + +exports["test hasContentsOfAllSources, two sources with contents"] = async function(assert) { + // Has two sources: foo.js (with contents) and bar.js (with contents). + const mapWithBothContents = new SourceMapGenerator(); + mapWithBothContents.addMapping({ source: "foo.js", + original: { line: 1, column: 10 }, + generated: { line: 1, column: 10 } }); + mapWithBothContents.addMapping({ source: "bar.js", + original: { line: 1, column: 10 }, + generated: { line: 1, column: 10 } }); + mapWithBothContents.setSourceContent("foo.js", "content of foo.js"); + mapWithBothContents.setSourceContent("bar.js", "content of bar.js"); + const consumer = new SourceMapConsumerSync(mapWithBothContents.toJSON()); + assert.ok(consumer.hasContentsOfAllSources()); + consumer.destroy(); +}; + +exports["test hasContentsOfAllSources, two sources one with and one without contents"] = async function(assert) { + // Has two sources: foo.js (with contents) and bar.js (without contents). + const mapWithoutSomeContents = new SourceMapGenerator(); + mapWithoutSomeContents.addMapping({ source: "foo.js", + original: { line: 1, column: 10 }, + generated: { line: 1, column: 10 } }); + mapWithoutSomeContents.addMapping({ source: "bar.js", + original: { line: 1, column: 10 }, + generated: { line: 1, column: 10 } }); + mapWithoutSomeContents.setSourceContent("foo.js", "content of foo.js"); + const consumer = new SourceMapConsumerSync(mapWithoutSomeContents.toJSON()); + assert.ok(!consumer.hasContentsOfAllSources()); + consumer.destroy(); +}; + +exports["test sourceRoot + generatedPositionFor"] = async function(assert) { + let map = new SourceMapGenerator({ + sourceRoot: "foo/bar", + file: "baz.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "bang.coffee" + }); + map.addMapping({ + original: { line: 5, column: 5 }, + generated: { line: 6, column: 6 }, + source: "bang.coffee" + }); + + + map = new SourceMapConsumerSync(map.toString(), "http://example.com/"); + + // Should handle without sourceRoot. + let pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: "bang.coffee" + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + // Should handle with sourceRoot. + pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: "foo/bar/bang.coffee" + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + // Should handle absolute case. + pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: "http://example.com/foo/bar/bang.coffee" + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + map.destroy(); +}; + +exports["test sourceRoot + generatedPositionFor for path above the root"] = async function(assert) { + let map = new SourceMapGenerator({ + sourceRoot: "foo/bar", + file: "baz.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "../bang.coffee" + }); + + map = new SourceMapConsumerSync(map.toString()); + + // Should handle with sourceRoot. + const pos = map.generatedPositionFor({ + line: 1, + column: 1, + source: "foo/bang.coffee" + }); + + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + map.destroy(); +}; + +exports["test index map + generatedPositionFor"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMapColumnOffset, "http://example.com/"); + map.computeColumnSpans(); + + let pos = map.generatedPositionFor({ + line: 1, + column: 11, + source: "one.js" + }); + + assert.equal(pos.line, 1); + assert.equal(pos.column, 9); + assert.equal(pos.lastColumn, 17); + + pos = map.generatedPositionFor({ + line: 2, + column: 3, + source: "one.js" + }); + + assert.equal(pos.line, 1); + assert.equal(pos.column, 21); + assert.equal(pos.lastColumn, 27); + + pos = map.generatedPositionFor({ + line: 1, + column: 11, + source: "two.js" + }); + + assert.equal(pos.line, 1); + assert.equal(pos.column, 59); + assert.equal(pos.lastColumn, 67); + + pos = map.generatedPositionFor({ + line: 2, + column: 3, + source: "two.js" + }); + + assert.equal(pos.line, 1); + assert.equal(pos.column, 71); + assert.equal(pos.lastColumn, 77); + + map.destroy(); +}; + +exports["test allGeneratedPositionsFor for line"] = async function(assert) { + let map = new SourceMapGenerator({ + file: "generated.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "bar.coffee" + }); + map.addMapping({ + original: { line: 2, column: 1 }, + generated: { line: 3, column: 2 }, + source: "bar.coffee" + }); + map.addMapping({ + original: { line: 2, column: 2 }, + generated: { line: 3, column: 3 }, + source: "bar.coffee" + }); + map.addMapping({ + original: { line: 3, column: 1 }, + generated: { line: 4, column: 2 }, + source: "bar.coffee" + }); + + map = new SourceMapConsumerSync(map.toString(), "http://example.com/"); + + let mappings = map.allGeneratedPositionsFor({ + line: 2, + source: "bar.coffee" + }); + + assert.equal(mappings.length, 2); + assert.equal(mappings[0].line, 3); + assert.equal(mappings[0].column, 2); + assert.equal(mappings[1].line, 3); + assert.equal(mappings[1].column, 3); + + mappings = map.allGeneratedPositionsFor({ + line: 2, + source: "http://example.com/bar.coffee" + }); + + assert.equal(mappings.length, 2); + assert.equal(mappings[0].line, 3); + assert.equal(mappings[0].column, 2); + assert.equal(mappings[1].line, 3); + assert.equal(mappings[1].column, 3); + + map.destroy(); +}; + +exports["test allGeneratedPositionsFor for line fuzzy"] = async function(assert) { + let map = new SourceMapGenerator({ + file: "generated.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "bar.coffee" + }); + map.addMapping({ + original: { line: 3, column: 1 }, + generated: { line: 4, column: 2 }, + source: "bar.coffee" + }); + + map = new SourceMapConsumerSync(map.toString()); + + const mappings = map.allGeneratedPositionsFor({ + line: 2, + source: "bar.coffee" + }); + + assert.equal(mappings.length, 1); + assert.equal(mappings[0].line, 4); + assert.equal(mappings[0].column, 2); + + map.destroy(); +}; + +exports["test allGeneratedPositionsFor for empty source map"] = async function(assert) { + let map = new SourceMapGenerator({ + file: "generated.js" + }); + map = new SourceMapConsumerSync(map.toString()); + + const mappings = map.allGeneratedPositionsFor({ + line: 2, + source: "bar.coffee" + }); + + assert.equal(mappings.length, 0); + + map.destroy(); +}; + +exports["test allGeneratedPositionsFor for column"] = async function(assert) { + let map = new SourceMapGenerator({ + file: "generated.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 1, column: 2 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 1, column: 3 }, + source: "foo.coffee" + }); + + map = new SourceMapConsumerSync(map.toString()); + + const mappings = map.allGeneratedPositionsFor({ + line: 1, + column: 1, + source: "foo.coffee" + }); + + assert.equal(mappings.length, 2); + assert.equal(mappings[0].line, 1); + assert.equal(mappings[0].column, 2); + assert.equal(mappings[1].line, 1); + assert.equal(mappings[1].column, 3); + + map.destroy(); +}; + +exports["test allGeneratedPositionsFor for column fuzzy"] = async function(assert) { + let map = new SourceMapGenerator({ + file: "generated.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 1, column: 2 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 1, column: 3 }, + source: "foo.coffee" + }); + + map = new SourceMapConsumerSync(map.toString()); + + const mappings = map.allGeneratedPositionsFor({ + line: 1, + column: 0, + source: "foo.coffee" + }); + + assert.equal(mappings.length, 2); + assert.equal(mappings[0].line, 1); + assert.equal(mappings[0].column, 2); + assert.equal(mappings[1].line, 1); + assert.equal(mappings[1].column, 3); + + map.destroy(); +}; + +exports["test allGeneratedPositionsFor for column on different line fuzzy"] = async function(assert) { + let map = new SourceMapGenerator({ + file: "generated.js" + }); + map.addMapping({ + original: { line: 2, column: 1 }, + generated: { line: 2, column: 2 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 2, column: 1 }, + generated: { line: 2, column: 3 }, + source: "foo.coffee" + }); + + map = new SourceMapConsumerSync(map.toString()); + + const mappings = map.allGeneratedPositionsFor({ + line: 1, + column: 0, + source: "foo.coffee" + }); + + assert.equal(mappings.length, 0); + + map.destroy(); +}; + +exports["test allGeneratedPositionsFor for index map"] = async function(assert) { + const map = new SourceMapConsumerSync(util.indexedTestMapColumnOffset); + map.computeColumnSpans(); + + let mappings = map.allGeneratedPositionsFor({ + line: 2, + column: 3, + source: "one.js" + }); + + assert.deepEqual(mappings, [ + { + line: 1, + column: 21, + lastColumn: 27, + } + ]); + + mappings = map.allGeneratedPositionsFor({ + line: 2, + column: 14, + source: "one.js" + }); + + assert.deepEqual(mappings, [ + { + line: 1, + column: 32, + lastColumn: 49 + } + ]); + + mappings = map.allGeneratedPositionsFor({ + line: 2, + column: 3, + source: "two.js" + }); + + assert.deepEqual(mappings, [ + { + line: 1, + column: 71, + lastColumn: 77, + } + ]); + + mappings = map.allGeneratedPositionsFor({ + line: 2, + column: 10, + source: "two.js" + }); + + assert.deepEqual(mappings, [ + { + line: 1, + column: 78, + lastColumn: Infinity, + } + ]); + + map.destroy(); +}; + +exports["test computeColumnSpans"] = async function(assert) { + let map = new SourceMapGenerator({ + file: "generated.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 1, column: 1 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 2, column: 1 }, + generated: { line: 2, column: 1 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 2, column: 2 }, + generated: { line: 2, column: 10 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 2, column: 3 }, + generated: { line: 2, column: 20 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 3, column: 1 }, + generated: { line: 3, column: 1 }, + source: "foo.coffee" + }); + map.addMapping({ + original: { line: 3, column: 2 }, + generated: { line: 3, column: 2 }, + source: "foo.coffee" + }); + + map = new SourceMapConsumerSync(map.toString()); + + map.computeColumnSpans(); + + let mappings = map.allGeneratedPositionsFor({ + line: 1, + source: "foo.coffee" + }); + + assert.equal(mappings.length, 1); + assert.equal(mappings[0].lastColumn, Infinity); + + mappings = map.allGeneratedPositionsFor({ + line: 2, + source: "foo.coffee" + }); + + assert.equal(mappings.length, 3); + assert.equal(mappings[0].lastColumn, 9); + assert.equal(mappings[1].lastColumn, 19); + assert.equal(mappings[2].lastColumn, Infinity); + + mappings = map.allGeneratedPositionsFor({ + line: 3, + source: "foo.coffee" + }); + + assert.equal(mappings.length, 2); + assert.equal(mappings[0].lastColumn, 1); + assert.equal(mappings[1].lastColumn, Infinity); + + map.destroy(); +}; + +exports["test sourceRoot + originalPositionFor"] = async function(assert) { + let map = new SourceMapGenerator({ + sourceRoot: "foo/bar", + file: "baz.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "bang.coffee" + }); + + map = new SourceMapConsumerSync(map.toString()); + + const pos = map.originalPositionFor({ + line: 2, + column: 2, + }); + + // Should always have the prepended source root + assert.equal(pos.source, "foo/bar/bang.coffee"); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + + map.destroy(); +}; + +// Was github issue #43, but that's no longer valid. +exports["test source resolution with sourceMapURL"] = async function(assert) { + let map = new SourceMapGenerator({ + sourceRoot: "", + file: "foo.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "original.js", + }); + + map = new SourceMapConsumerSync(map.toString(), "http://cdn.example.com"); + + const sources = map.sources; + assert.equal(sources.length, 1, + "Should only be one source."); + assert.equal(sources[0], "http://cdn.example.com/original.js", + "Should be joined with the source map URL."); + + map.destroy(); +}; + +exports["test sourceRoot prepending"] = async function(assert) { + let map = new SourceMapGenerator({ + sourceRoot: "http://example.com/foo/bar", + file: "foo.js" + }); + map.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "/original.js" + }); + + map = new SourceMapConsumerSync(map.toString()); + + const sources = map.sources; + assert.equal(sources.length, 1, + "Should only be one source."); + assert.equal(sources[0], "http://example.com/foo/bar/original.js", + "Source include the source root."); + + map.destroy(); +}; + +exports["test indexed source map errors when sections are out of order by line"] = async function(assert) { + // Make a deep copy of the indexedTestMap + const misorderedIndexedTestMap = JSON.parse(JSON.stringify(util.indexedTestMap)); + + misorderedIndexedTestMap.sections[0].offset = { + line: 2, + column: 0 + }; + + let error; + try { + new SourceMapConsumerSync(misorderedIndexedTestMap); + } catch (e) { + error = e; + } + assert.ok(error instanceof Error); +}; + +exports["test github issue #64"] = async function(assert) { + const map = new SourceMapConsumerSync({ + "version": 3, + "file": "foo.js", + "sourceRoot": "http://example.com/", + "sources": ["/a"], + "names": [], + "mappings": "AACA", + "sourcesContent": ["foo"] + }); + + assert.equal(map.sourceContentFor("a"), "foo"); + assert.equal(map.sourceContentFor("/a"), "foo"); + + map.destroy(); +}; + +exports["test full source content with sourceMapURL"] = async function(assert) { + const map = new SourceMapConsumerSync({ + "version": 3, + "file": "foo.js", + "sourceRoot": "", + "sources": ["original.js"], + "names": [], + "mappings": "AACA", + "sourcesContent": ["yellow warbler"] + }, "http://cdn.example.com"); + + assert.equal(map.sourceContentFor("http://cdn.example.com/original.js"), "yellow warbler", + "Source content should be found using full URL"); + + map.destroy(); +}; + +exports["test bug 885597"] = async function(assert) { + const map = new SourceMapConsumerSync({ + "version": 3, + "file": "foo.js", + "sourceRoot": "file:///Users/AlGore/Invented/The/Internet/", + "sources": ["/a"], + "names": [], + "mappings": "AACA", + "sourcesContent": ["foo"] + }); + + const s = map.sources[0]; + assert.equal(map.sourceContentFor(s), "foo"); + + map.destroy(); +}; + +exports["test github issue #72, duplicate sources"] = async function(assert) { + const map = new SourceMapConsumerSync({ + "version": 3, + "file": "foo.js", + "sources": ["source1.js", "source1.js", "source3.js"], + "names": [], + "mappings": ";EAAC;;IAEE;;MEEE", + "sourceRoot": "http://example.com" + }); + + let pos = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.source, "http://example.com/source1.js"); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + + pos = map.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.source, "http://example.com/source1.js"); + assert.equal(pos.line, 3); + assert.equal(pos.column, 3); + + pos = map.originalPositionFor({ + line: 6, + column: 6 + }); + assert.equal(pos.source, "http://example.com/source3.js"); + assert.equal(pos.line, 5); + assert.equal(pos.column, 5); + + map.destroy(); +}; + +exports["test github issue #72, duplicate names"] = async function(assert) { + const map = new SourceMapConsumerSync({ + "version": 3, + "file": "foo.js", + "sources": ["source.js"], + "names": ["name1", "name1", "name3"], + "mappings": ";EAACA;;IAEEA;;MAEEE", + "sourceRoot": "http://example.com" + }); + + let pos = map.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.name, "name1"); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + + pos = map.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.name, "name1"); + assert.equal(pos.line, 3); + assert.equal(pos.column, 3); + + pos = map.originalPositionFor({ + line: 6, + column: 6 + }); + assert.equal(pos.name, "name3"); + assert.equal(pos.line, 5); + assert.equal(pos.column, 5); + + map.destroy(); +}; + +exports["test SourceMapConsumerSync.fromSourceMap"] = async function(assert) { + const smg = new SourceMapGenerator({ + sourceRoot: "http://example.com/", + file: "foo.js" + }); + smg.addMapping({ + original: { line: 1, column: 1 }, + generated: { line: 2, column: 2 }, + source: "bar.js" + }); + smg.addMapping({ + original: { line: 2, column: 2 }, + generated: { line: 4, column: 4 }, + source: "baz.js", + name: "dirtMcGirt" + }); + smg.setSourceContent("baz.js", "baz.js content"); + + const smc = await SourceMapConsumerSync.fromSourceMap(smg); + assert.equal(smc.file, "foo.js"); + assert.equal(smc.sourceRoot, "http://example.com/"); + assert.equal(smc.sources.length, 2); + assert.equal(smc.sources[0], "http://example.com/bar.js"); + assert.equal(smc.sources[1], "http://example.com/baz.js"); + assert.equal(smc.sourceContentFor("baz.js"), "baz.js content"); + + let pos = smc.originalPositionFor({ + line: 2, + column: 2 + }); + assert.equal(pos.line, 1); + assert.equal(pos.column, 1); + assert.equal(pos.source, "http://example.com/bar.js"); + assert.equal(pos.name, null); + + pos = smc.generatedPositionFor({ + line: 1, + column: 1, + source: "http://example.com/bar.js" + }); + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + + pos = smc.originalPositionFor({ + line: 4, + column: 4 + }); + assert.equal(pos.line, 2); + assert.equal(pos.column, 2); + assert.equal(pos.source, "http://example.com/baz.js"); + assert.equal(pos.name, "dirtMcGirt"); + + pos = smc.generatedPositionFor({ + line: 2, + column: 2, + source: "http://example.com/baz.js" + }); + assert.equal(pos.line, 4); + assert.equal(pos.column, 4); + + smc.destroy(); +}; + +exports["test issue #191"] = async function(assert) { + const generator = new SourceMapGenerator({ file: "a.css" }); + generator.addMapping({ + source: "b.css", + original: { + line: 1, + column: 0 + }, + generated: { + line: 1, + column: 0 + } + }); + + // Create a SourceMapConsumerSync from the SourceMapGenerator, ... + const consumer = await SourceMapConsumerSync.fromSourceMap(generator); + // ... and then try and use the SourceMapGenerator again. This should not + // throw. + generator.toJSON(); + + assert.ok(true, "Using a SourceMapGenerator again after creating a " + + "SourceMapConsumerSync from it should not throw"); + + consumer.destroy(); +}; + +exports["test sources where their prefix is the source root: issue #199"] = async function(assert) { + const testSourceMap = { + "version": 3, + "sources": ["/source/app/app/app.js"], + "names": ["System"], + "mappings": "AAAAA", + "file": "app/app.js", + "sourcesContent": ["'use strict';"], + "sourceRoot": "/source/" + }; + + const consumer = new SourceMapConsumerSync(testSourceMap); + + function consumerHasSource(s) { + assert.ok(consumer.sourceContentFor(s)); + } + + consumer.sources.forEach(consumerHasSource); + testSourceMap.sources.forEach(consumerHasSource); + + consumer.destroy(); +}; + +exports["test sources where their prefix is the source root and the source root is a url: issue #199"] = async function(assert) { + const testSourceMap = { + "version": 3, + "sources": ["http://example.com/source/app/app/app.js"], + "names": ["System"], + "mappings": "AAAAA", + "sourcesContent": ["'use strict';"], + "sourceRoot": "http://example.com/source/" + }; + + const consumer = new SourceMapConsumerSync(testSourceMap); + + function consumerHasSource(s) { + assert.ok(consumer.sourceContentFor(s)); + } + + consumer.sources.forEach(consumerHasSource); + testSourceMap.sources.forEach(consumerHasSource); + + consumer.destroy(); +}; + +exports["test consuming names and sources that are numbers"] = async function(assert) { + const testSourceMap = { + "version": 3, + "sources": [0], + "names": [1], + "mappings": "AAAAA", + }; + + const consumer = new SourceMapConsumerSync(testSourceMap); + + assert.equal(consumer.sources.length, 1); + assert.equal(consumer.sources[0], "0"); + + let i = 0; + consumer.eachMapping(function(m) { + i++; + assert.equal(m.name, "1"); + }); + assert.equal(i, 1); + + consumer.destroy(); +}; + +exports["test non-normalized sourceRoot (from issue #227)"] = async function(assert) { + const consumer = new SourceMapConsumerSync({ + version: 3, + sources: [ "index.js" ], + names: [], + mappings: ";;AAAA,IAAI,OAAO,MAAP", + file: "index.js", + sourceRoot: "./src/", + sourcesContent: [ 'var name = "Mark"\n' ] + }); + assert.doesNotThrow(() => { + // Before the fix, this threw an exception. + consumer.sourceContentFor(consumer.sources[0]); + }); + + consumer.destroy(); +}; + +exports["test webpack URL resolution"] = async function(assert) { + const map = { + version: 3, + sources: ["webpack:///webpack/bootstrap 67e184f9679733298d44"], + names: [], + mappings: "CAAS", + file: "static/js/manifest.b7cf97680f7a50fa150f.js", + sourceRoot: "" + }; + const consumer = new SourceMapConsumerSync(map); + + assert.equal(consumer.sources.length, 1); + assert.equal(consumer.sources[0], "webpack:///webpack/bootstrap%2067e184f9679733298d44"); + + consumer.destroy(); +}; + +exports["test webpack URL resolution with sourceMapURL"] = async function(assert) { + const map = { + version: 3, + sources: ["webpack:///webpack/bootstrap 67e184f9679733298d44"], + names: [], + mappings: "CAAS", + file: "static/js/manifest.b7cf97680f7a50fa150f.js", + sourceRoot: "" + }; + const consumer = new SourceMapConsumerSync(map, "http://www.example.com/q.js.map"); + + assert.equal(consumer.sources.length, 1); + assert.equal(consumer.sources[0], "webpack:///webpack/bootstrap%2067e184f9679733298d44"); + + consumer.destroy(); +}; + +exports["test relative webpack URL resolution with sourceMapURL"] = async function(assert) { + const map = { + version: 3, + sources: ["webpack/bootstrap.js"], + names: [], + mappings: "CAAS", + file: "static/js/manifest.b7cf97680f7a50fa150f.js", + sourceRoot: "webpack:///" + }; + const consumer = new SourceMapConsumerSync(map, "http://www.example.com/q.js.map"); + + assert.equal(consumer.sources.length, 1); + assert.equal(consumer.sources[0], "webpack:///webpack/bootstrap.js"); + + consumer.destroy(); +}; + +exports["test basic URL resolution with sourceMapURL"] = async function(assert) { + const map = { + version: 3, + sources: ["something.js"], + names: [], + mappings: "CAAS", + file: "static/js/manifest.b7cf97680f7a50fa150f.js", + sourceRoot: "src" + }; + const consumer = new SourceMapConsumerSync(map, "http://www.example.com/x/q.js.map"); + + assert.equal(consumer.sources.length, 1); + assert.equal(consumer.sources[0], "http://www.example.com/x/src/something.js"); + + consumer.destroy(); +}; + +exports["test absolute sourceURL resolution with sourceMapURL"] = async function(assert) { + const map = { + version: 3, + sources: ["something.js"], + names: [], + mappings: "CAAS", + file: "static/js/manifest.b7cf97680f7a50fa150f.js", + sourceRoot: "http://www.example.com/src" + }; + const consumer = new SourceMapConsumerSync(map, "http://www.example.com/x/q.js.map"); + + assert.equal(consumer.sources.length, 1); + assert.equal(consumer.sources[0], "http://www.example.com/src/something.js"); + + consumer.destroy(); +}; + +exports["test line numbers > 2**32"] = async function(assert) { + const map = new SourceMapConsumerSync({ + version: 3, + sources: ["something.js"], + names: [], + mappings: "C+/////DAS", + file: "foo.js", + }); + + let error; + try { + // Triggers parse which fails on too big of a line number. + map.eachMapping(m => console.log(m)); + } catch (e) { + error = e; + } + + assert.ok(error != null); + map.destroy(); +}; + +exports["test line numbers < 0"] = async function(assert) { + const map = new SourceMapConsumerSync({ + version: 3, + sources: ["something.js"], + names: [], + mappings: "CDAS", + file: "foo.js", + }); + + let error; + try { + // Triggers parse which fails on too big of a line number. + map.eachMapping(m => console.log(m)); + } catch (e) { + error = e; + } + + assert.ok(error != null); + map.destroy(); +}; + +exports["test SourceMapConsumerSync.with"] = async function(assert) { + let consumer = null; + const six = await SourceMapConsumerSync.with(util.testMap, null, async function(c) { + // Don't keep references to the consumer around at home, kids. + consumer = c; + + // We should properly treat the with callback as an async function. + await new Promise(r => setTimeout(r, 1)); + + // Should not have parsed and allocated mappings yet. + assert.equal(c._mappingsPtr, 0); + + // Force the mappings to be parsed and assert that we allocated mappings. + c.eachMapping(_ => {}); + assert.ok(c._mappingsPtr != 0); + + return 6; + }); + + // Yes, we can return values. + assert.equal(six, 6); + + // At the end of `with`, we destroyed the mappings. + assert.equal(consumer._mappingsPtr, 0); +}; + +exports["test SourceMapConsumerSync.with and exceptions"] = async function(assert) { + let consumer = null; + let error = null; + + try { + await SourceMapConsumerSync.with(util.testMap, null, async function(c) { + consumer = c; + assert.equal(c._mappingsPtr, 0); + + c.eachMapping(_ => {}); + assert.ok(c._mappingsPtr != 0); + + throw 6; + }); + } catch (e) { + error = e; + } + + assert.equal(error, 6); + assert.equal(consumer._mappingsPtr, 0); +};