/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const Source = require("./Source"); const RawSource = require("./RawSource"); const streamChunks = require("./helpers/streamChunks"); const { getMap, getSourceAndMap } = require("./helpers/getFromStreamChunks"); const REPLACE_REGEX = /\n(?=.|\s)/g; class PrefixSource extends Source { constructor(prefix, source) { super(); this._source = typeof source === "string" || Buffer.isBuffer(source) ? new RawSource(source, true) : source; this._prefix = prefix; } getPrefix() { return this._prefix; } original() { return this._source; } source() { const node = this._source.source(); const prefix = this._prefix; return prefix + node.replace(REPLACE_REGEX, "\n" + prefix); } // TODO efficient buffer() implementation map(options) { return getMap(this, options); } sourceAndMap(options) { return getSourceAndMap(this, options); } streamChunks(options, onChunk, onSource, onName) { const prefix = this._prefix; const prefixOffset = prefix.length; const linesOnly = !!(options && options.columns === false); const { generatedLine, generatedColumn, source } = streamChunks( this._source, options, ( chunk, generatedLine, generatedColumn, sourceIndex, originalLine, originalColumn, nameIndex ) => { if (generatedColumn !== 0) { // In the middle of the line, we just adject the column generatedColumn += prefixOffset; } else if (chunk !== undefined) { // At the start of the line, when we have source content // add the prefix as generated mapping // (in lines only mode we just add it to the original mapping // for performance reasons) if (linesOnly || sourceIndex < 0) { chunk = prefix + chunk; } else if (prefixOffset > 0) { onChunk(prefix, generatedLine, generatedColumn, -1, -1, -1, -1); generatedColumn += prefixOffset; } } else if (!linesOnly) { // Without source content, we only need to adject the column info // expect in lines only mode where prefix is added to original mapping generatedColumn += prefixOffset; } onChunk( chunk, generatedLine, generatedColumn, sourceIndex, originalLine, originalColumn, nameIndex ); }, onSource, onName ); return { generatedLine, generatedColumn: generatedColumn === 0 ? 0 : prefixOffset + generatedColumn, source: source !== undefined ? prefix + source.replace(REPLACE_REGEX, "\n" + prefix) : undefined }; } updateHash(hash) { hash.update("PrefixSource"); this._source.updateHash(hash); hash.update(this._prefix); } } module.exports = PrefixSource;