You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
6.3 KiB
247 lines
6.3 KiB
/* |
|
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;
|
|
|