| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| |
| const CodeNode = require("./CodeNode"); |
| const SourceNode = require("./SourceNode"); |
| const MappingsContext = require("./MappingsContext"); |
| const getNumberOfLines = require("./helpers").getNumberOfLines; |
| |
| class SourceListMap { |
| |
| constructor(generatedCode, source, originalSource) { |
| if(Array.isArray(generatedCode)) { |
| this.children = generatedCode; |
| } else { |
| this.children = []; |
| if(generatedCode || source) |
| this.add(generatedCode, source, originalSource); |
| } |
| } |
| |
| add(generatedCode, source, originalSource) { |
| if(typeof generatedCode === "string") { |
| if(source) { |
| this.children.push(new SourceNode(generatedCode, source, originalSource)); |
| } else if(this.children.length > 0 && this.children[this.children.length - 1] instanceof CodeNode) { |
| this.children[this.children.length - 1].addGeneratedCode(generatedCode); |
| } else { |
| this.children.push(new CodeNode(generatedCode)); |
| } |
| } else if(generatedCode.getMappings && generatedCode.getGeneratedCode) { |
| this.children.push(generatedCode); |
| } else if(generatedCode.children) { |
| generatedCode.children.forEach(function(sln) { |
| this.children.push(sln); |
| }, this); |
| } else { |
| throw new Error("Invalid arguments to SourceListMap.protfotype.add: Expected string, Node or SourceListMap"); |
| } |
| }; |
| |
| preprend(generatedCode, source, originalSource) { |
| if(typeof generatedCode === "string") { |
| if(source) { |
| this.children.unshift(new SourceNode(generatedCode, source, originalSource)); |
| } else if(this.children.length > 0 && this.children[this.children.length - 1].preprendGeneratedCode) { |
| this.children[this.children.length - 1].preprendGeneratedCode(generatedCode); |
| } else { |
| this.children.unshift(new CodeNode(generatedCode)); |
| } |
| } else if(generatedCode.getMappings && generatedCode.getGeneratedCode) { |
| this.children.unshift(generatedCode); |
| } else if(generatedCode.children) { |
| generatedCode.children.slice().reverse().forEach(function(sln) { |
| this.children.unshift(sln); |
| }, this); |
| } else { |
| throw new Error("Invalid arguments to SourceListMap.protfotype.prerend: Expected string, Node or SourceListMap"); |
| } |
| }; |
| |
| mapGeneratedCode(fn) { |
| const normalizedNodes = []; |
| this.children.forEach(function(sln) { |
| sln.getNormalizedNodes().forEach(function(newNode) { |
| normalizedNodes.push(newNode); |
| }); |
| }); |
| const optimizedNodes = []; |
| normalizedNodes.forEach(function(sln) { |
| sln = sln.mapGeneratedCode(fn); |
| if(optimizedNodes.length === 0) { |
| optimizedNodes.push(sln); |
| } else { |
| const last = optimizedNodes[optimizedNodes.length - 1]; |
| const mergedNode = last.merge(sln); |
| if(mergedNode) { |
| optimizedNodes[optimizedNodes.length - 1] = mergedNode; |
| } else { |
| optimizedNodes.push(sln); |
| } |
| } |
| }); |
| return new SourceListMap(optimizedNodes); |
| }; |
| |
| toString() { |
| return this.children.map(function(sln) { |
| return sln.getGeneratedCode(); |
| }).join(""); |
| }; |
| |
| toStringWithSourceMap(options) { |
| const mappingsContext = new MappingsContext(); |
| const source = this.children.map(function(sln) { |
| return sln.getGeneratedCode(); |
| }).join(""); |
| const mappings = this.children.map(function(sln) { |
| return sln.getMappings(mappingsContext); |
| }).join(""); |
| const arrays = mappingsContext.getArrays(); |
| return { |
| source, |
| map: { |
| version: 3, |
| file: options && options.file, |
| sources: arrays.sources, |
| sourcesContent: mappingsContext.hasSourceContent ? arrays.sourcesContent : undefined, |
| mappings: mappings |
| } |
| }; |
| } |
| } |
| |
| module.exports = SourceListMap; |