|
|
- /*
- 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;
|