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