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.
118 lines
3.6 KiB
118 lines
3.6 KiB
2 years ago
|
/*
|
||
|
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;
|