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; |
|
} |
|
} |
|
};
|
|
|