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.
102 lines
3.0 KiB
102 lines
3.0 KiB
/*
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
Author Tobias Koppers @sokra
|
|
*/
|
|
"use strict";
|
|
|
|
const base64VLQ = require("./base64-vlq");
|
|
const SourceNode = require("./SourceNode");
|
|
const CodeNode = require("./CodeNode");
|
|
const SourceListMap = require("./SourceListMap");
|
|
|
|
module.exports = function fromStringWithSourceMap(code, map) {
|
|
const sources = map.sources;
|
|
const sourcesContent = map.sourcesContent;
|
|
const mappings = map.mappings.split(";");
|
|
const lines = code.split("\n");
|
|
const nodes = [];
|
|
let currentNode = null;
|
|
let currentLine = 1;
|
|
let currentSourceIdx = 0;
|
|
let currentSourceNodeLine;
|
|
function addCode(generatedCode) {
|
|
if(currentNode && currentNode instanceof CodeNode) {
|
|
currentNode.addGeneratedCode(generatedCode);
|
|
} else if(currentNode && currentNode instanceof SourceNode && !generatedCode.trim()) {
|
|
currentNode.addGeneratedCode(generatedCode);
|
|
currentSourceNodeLine++;
|
|
} else {
|
|
currentNode = new CodeNode(generatedCode);
|
|
nodes.push(currentNode);
|
|
}
|
|
}
|
|
function addSource(generatedCode, source, originalSource, linePosition) {
|
|
if(currentNode && currentNode instanceof SourceNode &&
|
|
currentNode.source === source &&
|
|
currentSourceNodeLine === linePosition
|
|
) {
|
|
currentNode.addGeneratedCode(generatedCode);
|
|
currentSourceNodeLine++;
|
|
} else {
|
|
currentNode = new SourceNode(generatedCode, source, originalSource, linePosition);
|
|
currentSourceNodeLine = linePosition + 1;
|
|
nodes.push(currentNode);
|
|
}
|
|
}
|
|
mappings.forEach(function(mapping, idx) {
|
|
let line = lines[idx];
|
|
if(typeof line === 'undefined') return;
|
|
if(idx !== lines.length - 1) line += "\n";
|
|
if(!mapping)
|
|
return addCode(line);
|
|
mapping = { value: 0, rest: mapping };
|
|
let lineAdded = false;
|
|
while(mapping.rest)
|
|
lineAdded = processMapping(mapping, line, lineAdded) || lineAdded;
|
|
if(!lineAdded)
|
|
addCode(line);
|
|
});
|
|
if(mappings.length < lines.length) {
|
|
let idx = mappings.length;
|
|
while(!lines[idx].trim() && idx < lines.length-1) {
|
|
addCode(lines[idx] + "\n");
|
|
idx++;
|
|
}
|
|
addCode(lines.slice(idx).join("\n"));
|
|
}
|
|
return new SourceListMap(nodes);
|
|
function processMapping(mapping, line, ignore) {
|
|
if(mapping.rest && mapping.rest[0] !== ",") {
|
|
base64VLQ.decode(mapping.rest, mapping);
|
|
}
|
|
if(!mapping.rest)
|
|
return false;
|
|
if(mapping.rest[0] === ",") {
|
|
mapping.rest = mapping.rest.substr(1);
|
|
return false;
|
|
}
|
|
|
|
base64VLQ.decode(mapping.rest, mapping);
|
|
const sourceIdx = mapping.value + currentSourceIdx;
|
|
currentSourceIdx = sourceIdx;
|
|
|
|
let linePosition;
|
|
if(mapping.rest && mapping.rest[0] !== ",") {
|
|
base64VLQ.decode(mapping.rest, mapping);
|
|
linePosition = mapping.value + currentLine;
|
|
currentLine = linePosition;
|
|
} else {
|
|
linePosition = currentLine;
|
|
}
|
|
|
|
if(mapping.rest) {
|
|
const next = mapping.rest.indexOf(",");
|
|
mapping.rest = next === -1 ? "" : mapping.rest.substr(next);
|
|
}
|
|
|
|
if(!ignore) {
|
|
addSource(line, sources ? sources[sourceIdx] : null, sourcesContent ? sourcesContent[sourceIdx] : null, linePosition)
|
|
return true;
|
|
}
|
|
}
|
|
};
|
|
|