/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const base64VLQ = require("./base64-vlq"); const getNumberOfLines = require("./helpers").getNumberOfLines; const getUnfinishedLine = require("./helpers").getUnfinishedLine; const LINE_MAPPING = ";AAAA"; class SingleLineNode { constructor(generatedCode, source, originalSource, line) { this.generatedCode = generatedCode; this.originalSource = originalSource; this.source = source; this.line = line || 1; this._numberOfLines = getNumberOfLines(this.generatedCode); this._endsWithNewLine = generatedCode[generatedCode.length - 1] === "\n"; } clone() { return new SingleLineNode(this.generatedCode, this.source, this.originalSource, this.line); } getGeneratedCode() { return this.generatedCode; } getMappings(mappingsContext) { if(!this.generatedCode) return ""; const lines = this._numberOfLines; const sourceIdx = mappingsContext.ensureSource(this.source, this.originalSource); let mappings = "A"; // generated column 0 if(mappingsContext.unfinishedGeneratedLine) mappings = "," + base64VLQ.encode(mappingsContext.unfinishedGeneratedLine); mappings += base64VLQ.encode(sourceIdx - mappingsContext.currentSource); // source index mappings += base64VLQ.encode(this.line - mappingsContext.currentOriginalLine); // original line index mappings += "A"; // original column 0 mappingsContext.currentSource = sourceIdx; mappingsContext.currentOriginalLine = this.line; const unfinishedGeneratedLine = mappingsContext.unfinishedGeneratedLine = getUnfinishedLine(this.generatedCode) mappings += Array(lines).join(LINE_MAPPING); if(unfinishedGeneratedLine === 0) { mappings += ";"; } else { if(lines !== 0) mappings += LINE_MAPPING; } return mappings; } getNormalizedNodes() { return [this]; } mapGeneratedCode(fn) { const generatedCode = fn(this.generatedCode); return new SingleLineNode(generatedCode, this.source, this.originalSource, this.line); } merge(otherNode) { if(otherNode instanceof SingleLineNode) { return this.mergeSingleLineNode(otherNode); } return false; } mergeSingleLineNode(otherNode) { if(this.source === otherNode.source && this.originalSource === otherNode.originalSource) { if(this.line === otherNode.line) { this.generatedCode += otherNode.generatedCode; this._numberOfLines += otherNode._numberOfLines; this._endsWithNewLine = otherNode._endsWithNewLine; return this; } else if(this.line + 1 === otherNode.line && this._endsWithNewLine && this._numberOfLines === 1 && otherNode._numberOfLines <= 1) { return new SourceNode(this.generatedCode + otherNode.generatedCode, this.source, this.originalSource, this.line); } } return false; } } module.exports = SingleLineNode; const SourceNode = require("./SourceNode"); // circular dependency