[6a3a178] | 1 | /*
|
---|
| 2 | MIT License http://www.opensource.org/licenses/mit-license.php
|
---|
| 3 | Author Tobias Koppers @sokra
|
---|
| 4 | */
|
---|
| 5 | "use strict";
|
---|
| 6 |
|
---|
| 7 | const base64VLQ = require("./base64-vlq");
|
---|
| 8 | const SourceNode = require("./SourceNode");
|
---|
| 9 | const CodeNode = require("./CodeNode");
|
---|
| 10 | const SourceListMap = require("./SourceListMap");
|
---|
| 11 |
|
---|
| 12 | module.exports = function fromStringWithSourceMap(code, map) {
|
---|
| 13 | const sources = map.sources;
|
---|
| 14 | const sourcesContent = map.sourcesContent;
|
---|
| 15 | const mappings = map.mappings.split(";");
|
---|
| 16 | const lines = code.split("\n");
|
---|
| 17 | const nodes = [];
|
---|
| 18 | let currentNode = null;
|
---|
| 19 | let currentLine = 1;
|
---|
| 20 | let currentSourceIdx = 0;
|
---|
| 21 | let currentSourceNodeLine;
|
---|
| 22 | function addCode(generatedCode) {
|
---|
| 23 | if(currentNode && currentNode instanceof CodeNode) {
|
---|
| 24 | currentNode.addGeneratedCode(generatedCode);
|
---|
| 25 | } else if(currentNode && currentNode instanceof SourceNode && !generatedCode.trim()) {
|
---|
| 26 | currentNode.addGeneratedCode(generatedCode);
|
---|
| 27 | currentSourceNodeLine++;
|
---|
| 28 | } else {
|
---|
| 29 | currentNode = new CodeNode(generatedCode);
|
---|
| 30 | nodes.push(currentNode);
|
---|
| 31 | }
|
---|
| 32 | }
|
---|
| 33 | function addSource(generatedCode, source, originalSource, linePosition) {
|
---|
| 34 | if(currentNode && currentNode instanceof SourceNode &&
|
---|
| 35 | currentNode.source === source &&
|
---|
| 36 | currentSourceNodeLine === linePosition
|
---|
| 37 | ) {
|
---|
| 38 | currentNode.addGeneratedCode(generatedCode);
|
---|
| 39 | currentSourceNodeLine++;
|
---|
| 40 | } else {
|
---|
| 41 | currentNode = new SourceNode(generatedCode, source, originalSource, linePosition);
|
---|
| 42 | currentSourceNodeLine = linePosition + 1;
|
---|
| 43 | nodes.push(currentNode);
|
---|
| 44 | }
|
---|
| 45 | }
|
---|
| 46 | mappings.forEach(function(mapping, idx) {
|
---|
| 47 | let line = lines[idx];
|
---|
| 48 | if(typeof line === 'undefined') return;
|
---|
| 49 | if(idx !== lines.length - 1) line += "\n";
|
---|
| 50 | if(!mapping)
|
---|
| 51 | return addCode(line);
|
---|
| 52 | mapping = { value: 0, rest: mapping };
|
---|
| 53 | let lineAdded = false;
|
---|
| 54 | while(mapping.rest)
|
---|
| 55 | lineAdded = processMapping(mapping, line, lineAdded) || lineAdded;
|
---|
| 56 | if(!lineAdded)
|
---|
| 57 | addCode(line);
|
---|
| 58 | });
|
---|
| 59 | if(mappings.length < lines.length) {
|
---|
| 60 | let idx = mappings.length;
|
---|
| 61 | while(!lines[idx].trim() && idx < lines.length-1) {
|
---|
| 62 | addCode(lines[idx] + "\n");
|
---|
| 63 | idx++;
|
---|
| 64 | }
|
---|
| 65 | addCode(lines.slice(idx).join("\n"));
|
---|
| 66 | }
|
---|
| 67 | return new SourceListMap(nodes);
|
---|
| 68 | function processMapping(mapping, line, ignore) {
|
---|
| 69 | if(mapping.rest && mapping.rest[0] !== ",") {
|
---|
| 70 | base64VLQ.decode(mapping.rest, mapping);
|
---|
| 71 | }
|
---|
| 72 | if(!mapping.rest)
|
---|
| 73 | return false;
|
---|
| 74 | if(mapping.rest[0] === ",") {
|
---|
| 75 | mapping.rest = mapping.rest.substr(1);
|
---|
| 76 | return false;
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | base64VLQ.decode(mapping.rest, mapping);
|
---|
| 80 | const sourceIdx = mapping.value + currentSourceIdx;
|
---|
| 81 | currentSourceIdx = sourceIdx;
|
---|
| 82 |
|
---|
| 83 | let linePosition;
|
---|
| 84 | if(mapping.rest && mapping.rest[0] !== ",") {
|
---|
| 85 | base64VLQ.decode(mapping.rest, mapping);
|
---|
| 86 | linePosition = mapping.value + currentLine;
|
---|
| 87 | currentLine = linePosition;
|
---|
| 88 | } else {
|
---|
| 89 | linePosition = currentLine;
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | if(mapping.rest) {
|
---|
| 93 | const next = mapping.rest.indexOf(",");
|
---|
| 94 | mapping.rest = next === -1 ? "" : mapping.rest.substr(next);
|
---|
| 95 | }
|
---|
| 96 |
|
---|
| 97 | if(!ignore) {
|
---|
| 98 | addSource(line, sources ? sources[sourceIdx] : null, sourcesContent ? sourcesContent[sourceIdx] : null, linePosition)
|
---|
| 99 | return true;
|
---|
| 100 | }
|
---|
| 101 | }
|
---|
| 102 | };
|
---|