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.
412 lines
8.3 KiB
412 lines
8.3 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const getGeneratedSourceInfo = require("./getGeneratedSourceInfo"); |
|
const getSource = require("./getSource"); |
|
const readMappings = require("./readMappings"); |
|
const splitIntoLines = require("./splitIntoLines"); |
|
|
|
const streamChunksOfSourceMapFull = ( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
onName |
|
) => { |
|
const lines = splitIntoLines(source); |
|
if (lines.length === 0) { |
|
return { |
|
generatedLine: 1, |
|
generatedColumn: 0 |
|
}; |
|
} |
|
const { sources, sourcesContent, names, mappings } = sourceMap; |
|
for (let i = 0; i < sources.length; i++) { |
|
onSource( |
|
i, |
|
getSource(sourceMap, i), |
|
(sourcesContent && sourcesContent[i]) || undefined |
|
); |
|
} |
|
if (names) { |
|
for (let i = 0; i < names.length; i++) { |
|
onName(i, names[i]); |
|
} |
|
} |
|
|
|
const lastLine = lines[lines.length - 1]; |
|
const lastNewLine = lastLine.endsWith("\n"); |
|
const finalLine = lastNewLine ? lines.length + 1 : lines.length; |
|
const finalColumn = lastNewLine ? 0 : lastLine.length; |
|
|
|
let currentGeneratedLine = 1; |
|
let currentGeneratedColumn = 0; |
|
|
|
let mappingActive = false; |
|
let activeMappingSourceIndex = -1; |
|
let activeMappingOriginalLine = -1; |
|
let activeMappingOriginalColumn = -1; |
|
let activeMappingNameIndex = -1; |
|
|
|
const onMapping = ( |
|
generatedLine, |
|
generatedColumn, |
|
sourceIndex, |
|
originalLine, |
|
originalColumn, |
|
nameIndex |
|
) => { |
|
if (mappingActive && currentGeneratedLine <= lines.length) { |
|
let chunk; |
|
const mappingLine = currentGeneratedLine; |
|
const mappingColumn = currentGeneratedColumn; |
|
const line = lines[currentGeneratedLine - 1]; |
|
if (generatedLine !== currentGeneratedLine) { |
|
chunk = line.slice(currentGeneratedColumn); |
|
currentGeneratedLine++; |
|
currentGeneratedColumn = 0; |
|
} else { |
|
chunk = line.slice(currentGeneratedColumn, generatedColumn); |
|
currentGeneratedColumn = generatedColumn; |
|
} |
|
if (chunk) { |
|
onChunk( |
|
chunk, |
|
mappingLine, |
|
mappingColumn, |
|
activeMappingSourceIndex, |
|
activeMappingOriginalLine, |
|
activeMappingOriginalColumn, |
|
activeMappingNameIndex |
|
); |
|
} |
|
mappingActive = false; |
|
} |
|
if (generatedLine > currentGeneratedLine && currentGeneratedColumn > 0) { |
|
if (currentGeneratedLine <= lines.length) { |
|
const chunk = lines[currentGeneratedLine - 1].slice( |
|
currentGeneratedColumn |
|
); |
|
onChunk( |
|
chunk, |
|
currentGeneratedLine, |
|
currentGeneratedColumn, |
|
-1, |
|
-1, |
|
-1, |
|
-1 |
|
); |
|
} |
|
currentGeneratedLine++; |
|
currentGeneratedColumn = 0; |
|
} |
|
while (generatedLine > currentGeneratedLine) { |
|
if (currentGeneratedLine <= lines.length) { |
|
onChunk( |
|
lines[currentGeneratedLine - 1], |
|
currentGeneratedLine, |
|
0, |
|
-1, |
|
-1, |
|
-1, |
|
-1 |
|
); |
|
} |
|
currentGeneratedLine++; |
|
} |
|
if (generatedColumn > currentGeneratedColumn) { |
|
if (currentGeneratedLine <= lines.length) { |
|
const chunk = lines[currentGeneratedLine - 1].slice( |
|
currentGeneratedColumn, |
|
generatedColumn |
|
); |
|
onChunk( |
|
chunk, |
|
currentGeneratedLine, |
|
currentGeneratedColumn, |
|
-1, |
|
-1, |
|
-1, |
|
-1 |
|
); |
|
} |
|
currentGeneratedColumn = generatedColumn; |
|
} |
|
if ( |
|
sourceIndex >= 0 && |
|
(generatedLine < finalLine || |
|
(generatedLine === finalLine && generatedColumn < finalColumn)) |
|
) { |
|
mappingActive = true; |
|
activeMappingSourceIndex = sourceIndex; |
|
activeMappingOriginalLine = originalLine; |
|
activeMappingOriginalColumn = originalColumn; |
|
activeMappingNameIndex = nameIndex; |
|
} |
|
}; |
|
readMappings(mappings, onMapping); |
|
onMapping(finalLine, finalColumn, -1, -1, -1, -1); |
|
return { |
|
generatedLine: finalLine, |
|
generatedColumn: finalColumn |
|
}; |
|
}; |
|
|
|
const streamChunksOfSourceMapLinesFull = ( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
_onName |
|
) => { |
|
const lines = splitIntoLines(source); |
|
if (lines.length === 0) { |
|
return { |
|
generatedLine: 1, |
|
generatedColumn: 0 |
|
}; |
|
} |
|
const { sources, sourcesContent, mappings } = sourceMap; |
|
for (let i = 0; i < sources.length; i++) { |
|
onSource( |
|
i, |
|
getSource(sourceMap, i), |
|
(sourcesContent && sourcesContent[i]) || undefined |
|
); |
|
} |
|
|
|
let currentGeneratedLine = 1; |
|
|
|
const onMapping = ( |
|
generatedLine, |
|
_generatedColumn, |
|
sourceIndex, |
|
originalLine, |
|
originalColumn, |
|
_nameIndex |
|
) => { |
|
if ( |
|
sourceIndex < 0 || |
|
generatedLine < currentGeneratedLine || |
|
generatedLine > lines.length |
|
) { |
|
return; |
|
} |
|
while (generatedLine > currentGeneratedLine) { |
|
if (currentGeneratedLine <= lines.length) { |
|
onChunk( |
|
lines[currentGeneratedLine - 1], |
|
currentGeneratedLine, |
|
0, |
|
-1, |
|
-1, |
|
-1, |
|
-1 |
|
); |
|
} |
|
currentGeneratedLine++; |
|
} |
|
if (generatedLine <= lines.length) { |
|
onChunk( |
|
lines[generatedLine - 1], |
|
generatedLine, |
|
0, |
|
sourceIndex, |
|
originalLine, |
|
originalColumn, |
|
-1 |
|
); |
|
currentGeneratedLine++; |
|
} |
|
}; |
|
readMappings(mappings, onMapping); |
|
for (; currentGeneratedLine <= lines.length; currentGeneratedLine++) { |
|
onChunk( |
|
lines[currentGeneratedLine - 1], |
|
currentGeneratedLine, |
|
0, |
|
-1, |
|
-1, |
|
-1, |
|
-1 |
|
); |
|
} |
|
|
|
const lastLine = lines[lines.length - 1]; |
|
const lastNewLine = lastLine.endsWith("\n"); |
|
|
|
const finalLine = lastNewLine ? lines.length + 1 : lines.length; |
|
const finalColumn = lastNewLine ? 0 : lastLine.length; |
|
|
|
return { |
|
generatedLine: finalLine, |
|
generatedColumn: finalColumn |
|
}; |
|
}; |
|
|
|
const streamChunksOfSourceMapFinal = ( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
onName |
|
) => { |
|
const result = getGeneratedSourceInfo(source); |
|
const { generatedLine: finalLine, generatedColumn: finalColumn } = result; |
|
|
|
if (finalLine === 1 && finalColumn === 0) return result; |
|
const { sources, sourcesContent, names, mappings } = sourceMap; |
|
for (let i = 0; i < sources.length; i++) { |
|
onSource( |
|
i, |
|
getSource(sourceMap, i), |
|
(sourcesContent && sourcesContent[i]) || undefined |
|
); |
|
} |
|
if (names) { |
|
for (let i = 0; i < names.length; i++) { |
|
onName(i, names[i]); |
|
} |
|
} |
|
|
|
let mappingActiveLine = 0; |
|
|
|
const onMapping = ( |
|
generatedLine, |
|
generatedColumn, |
|
sourceIndex, |
|
originalLine, |
|
originalColumn, |
|
nameIndex |
|
) => { |
|
if ( |
|
generatedLine >= finalLine && |
|
(generatedColumn >= finalColumn || generatedLine > finalLine) |
|
) { |
|
return; |
|
} |
|
if (sourceIndex >= 0) { |
|
onChunk( |
|
undefined, |
|
generatedLine, |
|
generatedColumn, |
|
sourceIndex, |
|
originalLine, |
|
originalColumn, |
|
nameIndex |
|
); |
|
mappingActiveLine = generatedLine; |
|
} else if (mappingActiveLine === generatedLine) { |
|
onChunk(undefined, generatedLine, generatedColumn, -1, -1, -1, -1); |
|
mappingActiveLine = 0; |
|
} |
|
}; |
|
readMappings(mappings, onMapping); |
|
return result; |
|
}; |
|
|
|
const streamChunksOfSourceMapLinesFinal = ( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
_onName |
|
) => { |
|
const result = getGeneratedSourceInfo(source); |
|
const { generatedLine, generatedColumn } = result; |
|
if (generatedLine === 1 && generatedColumn === 0) { |
|
return { |
|
generatedLine: 1, |
|
generatedColumn: 0 |
|
}; |
|
} |
|
|
|
const { sources, sourcesContent, mappings } = sourceMap; |
|
for (let i = 0; i < sources.length; i++) { |
|
onSource( |
|
i, |
|
getSource(sourceMap, i), |
|
(sourcesContent && sourcesContent[i]) || undefined |
|
); |
|
} |
|
|
|
const finalLine = generatedColumn === 0 ? generatedLine - 1 : generatedLine; |
|
|
|
let currentGeneratedLine = 1; |
|
|
|
const onMapping = ( |
|
generatedLine, |
|
_generatedColumn, |
|
sourceIndex, |
|
originalLine, |
|
originalColumn, |
|
_nameIndex |
|
) => { |
|
if ( |
|
sourceIndex >= 0 && |
|
currentGeneratedLine <= generatedLine && |
|
generatedLine <= finalLine |
|
) { |
|
onChunk( |
|
undefined, |
|
generatedLine, |
|
0, |
|
sourceIndex, |
|
originalLine, |
|
originalColumn, |
|
-1 |
|
); |
|
currentGeneratedLine = generatedLine + 1; |
|
} |
|
}; |
|
readMappings(mappings, onMapping); |
|
return result; |
|
}; |
|
|
|
module.exports = ( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
onName, |
|
finalSource, |
|
columns |
|
) => { |
|
if (columns) { |
|
return finalSource |
|
? streamChunksOfSourceMapFinal( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
onName |
|
) |
|
: streamChunksOfSourceMapFull( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
onName |
|
); |
|
} else { |
|
return finalSource |
|
? streamChunksOfSourceMapLinesFinal( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
onName |
|
) |
|
: streamChunksOfSourceMapLinesFull( |
|
source, |
|
sourceMap, |
|
onChunk, |
|
onSource, |
|
onName |
|
); |
|
} |
|
};
|
|
|