/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const Source = require("./Source"); const streamChunksOfSourceMap = require("./helpers/streamChunksOfSourceMap"); const streamChunksOfCombinedSourceMap = require("./helpers/streamChunksOfCombinedSourceMap"); const { getMap, getSourceAndMap } = require("./helpers/getFromStreamChunks"); class SourceMapSource extends Source { constructor( value, name, sourceMap, originalSource, innerSourceMap, removeOriginalSource ) { super(); const valueIsBuffer = Buffer.isBuffer(value); this._valueAsString = valueIsBuffer ? undefined : value; this._valueAsBuffer = valueIsBuffer ? value : undefined; this._name = name; this._hasSourceMap = !!sourceMap; const sourceMapIsBuffer = Buffer.isBuffer(sourceMap); const sourceMapIsString = typeof sourceMap === "string"; this._sourceMapAsObject = sourceMapIsBuffer || sourceMapIsString ? undefined : sourceMap; this._sourceMapAsString = sourceMapIsString ? sourceMap : undefined; this._sourceMapAsBuffer = sourceMapIsBuffer ? sourceMap : undefined; this._hasOriginalSource = !!originalSource; const originalSourceIsBuffer = Buffer.isBuffer(originalSource); this._originalSourceAsString = originalSourceIsBuffer ? undefined : originalSource; this._originalSourceAsBuffer = originalSourceIsBuffer ? originalSource : undefined; this._hasInnerSourceMap = !!innerSourceMap; const innerSourceMapIsBuffer = Buffer.isBuffer(innerSourceMap); const innerSourceMapIsString = typeof innerSourceMap === "string"; this._innerSourceMapAsObject = innerSourceMapIsBuffer || innerSourceMapIsString ? undefined : innerSourceMap; this._innerSourceMapAsString = innerSourceMapIsString ? innerSourceMap : undefined; this._innerSourceMapAsBuffer = innerSourceMapIsBuffer ? innerSourceMap : undefined; this._removeOriginalSource = removeOriginalSource; } _ensureValueBuffer() { if (this._valueAsBuffer === undefined) { this._valueAsBuffer = Buffer.from(this._valueAsString, "utf-8"); } } _ensureValueString() { if (this._valueAsString === undefined) { this._valueAsString = this._valueAsBuffer.toString("utf-8"); } } _ensureOriginalSourceBuffer() { if (this._originalSourceAsBuffer === undefined && this._hasOriginalSource) { this._originalSourceAsBuffer = Buffer.from( this._originalSourceAsString, "utf-8" ); } } _ensureOriginalSourceString() { if (this._originalSourceAsString === undefined && this._hasOriginalSource) { this._originalSourceAsString = this._originalSourceAsBuffer.toString( "utf-8" ); } } _ensureInnerSourceMapObject() { if (this._innerSourceMapAsObject === undefined && this._hasInnerSourceMap) { this._ensureInnerSourceMapString(); this._innerSourceMapAsObject = JSON.parse(this._innerSourceMapAsString); } } _ensureInnerSourceMapBuffer() { if (this._innerSourceMapAsBuffer === undefined && this._hasInnerSourceMap) { this._ensureInnerSourceMapString(); this._innerSourceMapAsBuffer = Buffer.from( this._innerSourceMapAsString, "utf-8" ); } } _ensureInnerSourceMapString() { if (this._innerSourceMapAsString === undefined && this._hasInnerSourceMap) { if (this._innerSourceMapAsBuffer !== undefined) { this._innerSourceMapAsString = this._innerSourceMapAsBuffer.toString( "utf-8" ); } else { this._innerSourceMapAsString = JSON.stringify( this._innerSourceMapAsObject ); } } } _ensureSourceMapObject() { if (this._sourceMapAsObject === undefined) { this._ensureSourceMapString(); this._sourceMapAsObject = JSON.parse(this._sourceMapAsString); } } _ensureSourceMapBuffer() { if (this._sourceMapAsBuffer === undefined) { this._ensureSourceMapString(); this._sourceMapAsBuffer = Buffer.from(this._sourceMapAsString, "utf-8"); } } _ensureSourceMapString() { if (this._sourceMapAsString === undefined) { if (this._sourceMapAsBuffer !== undefined) { this._sourceMapAsString = this._sourceMapAsBuffer.toString("utf-8"); } else { this._sourceMapAsString = JSON.stringify(this._sourceMapAsObject); } } } getArgsAsBuffers() { this._ensureValueBuffer(); this._ensureSourceMapBuffer(); this._ensureOriginalSourceBuffer(); this._ensureInnerSourceMapBuffer(); return [ this._valueAsBuffer, this._name, this._sourceMapAsBuffer, this._originalSourceAsBuffer, this._innerSourceMapAsBuffer, this._removeOriginalSource ]; } buffer() { this._ensureValueBuffer(); return this._valueAsBuffer; } source() { this._ensureValueString(); return this._valueAsString; } map(options) { if (!this._hasInnerSourceMap) { this._ensureSourceMapObject(); return this._sourceMapAsObject; } return getMap(this, options); } sourceAndMap(options) { if (!this._hasInnerSourceMap) { this._ensureValueString(); this._ensureSourceMapObject(); return { source: this._valueAsString, map: this._sourceMapAsObject }; } return getSourceAndMap(this, options); } streamChunks(options, onChunk, onSource, onName) { this._ensureValueString(); this._ensureSourceMapObject(); this._ensureOriginalSourceString(); if (this._hasInnerSourceMap) { this._ensureInnerSourceMapObject(); return streamChunksOfCombinedSourceMap( this._valueAsString, this._sourceMapAsObject, this._name, this._originalSourceAsString, this._innerSourceMapAsObject, this._removeOriginalSource, onChunk, onSource, onName, !!(options && options.finalSource), !!(options && options.columns !== false) ); } else { return streamChunksOfSourceMap( this._valueAsString, this._sourceMapAsObject, onChunk, onSource, onName, !!(options && options.finalSource), !!(options && options.columns !== false) ); } } updateHash(hash) { this._ensureValueBuffer(); this._ensureSourceMapBuffer(); this._ensureOriginalSourceBuffer(); this._ensureInnerSourceMapBuffer(); hash.update("SourceMapSource"); hash.update(this._valueAsBuffer); hash.update(this._sourceMapAsBuffer); if (this._hasOriginalSource) { hash.update(this._originalSourceAsBuffer); } if (this._hasInnerSourceMap) { hash.update(this._innerSourceMapAsBuffer); } hash.update(this._removeOriginalSource ? "true" : "false"); } } module.exports = SourceMapSource;