You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			413 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			413 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | /* | ||
|  | 	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 | ||
|  | 			  ); | ||
|  | 	} | ||
|  | }; |