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