68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| #!/usr/bin/env node
 | |
| 
 | |
| /**
 | |
|  * @license
 | |
|  * Copyright Google Inc. All Rights Reserved.
 | |
|  *
 | |
|  * Use of this source code is governed by an MIT-style license that can be
 | |
|  * found in the LICENSE file at https://angular.io/license
 | |
|  */
 | |
| 
 | |
| const vlq = require('vlq');
 | |
| const fs = require('fs');
 | |
| const path = require('path');
 | |
| 
 | |
| module.exports = function getMappings(bundlePath) {
 | |
|   const sourceMap = JSON.parse(getFile(`${bundlePath}.map`));
 | |
|   const sourcesContent = sourceMap.sourcesContent.map(file => file.split('\n'));
 | |
|   const bundleLines = getFile(bundlePath).split('\n');
 | |
| 
 | |
|   let sourceLines = sourcesContent[0];
 | |
|   let sourceFileIndex = 0;
 | |
|   let sourceLineIndex = 0;
 | |
|   let sourceColIndex = 0;
 | |
| 
 | |
|   return decodeLines(sourceMap).reduce((matchData, mapLine, genLineIndex) => {
 | |
|     mapLine.forEach((segment, index) => {
 | |
|       if (segment.length) {
 | |
|         const [genColDiff, sourceFileDiff, sourceLineDiff, sourceColDiff] = segment;
 | |
| 
 | |
|         // if source file changes, grab new file from sourcesContent
 | |
|         if (sourceFileDiff !== 0) {
 | |
|           sourceFileIndex += sourceFileDiff;
 | |
|           sourceLines = sourcesContent[sourceFileIndex];
 | |
|         }
 | |
| 
 | |
|         const genText = bundleLines[genLineIndex].trim();
 | |
|         const sourceText = sourceLines[sourceLineIndex + sourceLineDiff].trim();
 | |
| 
 | |
|         // only record mappings that are long enough to be meaningful
 | |
|         if (index === 0 && genText.length > 15 && sourceText.length > 15) {
 | |
|           matchData.push({
 | |
|             genLineIndex,
 | |
|             sourceLineIndex,
 | |
|             sourceFile: sourceMap.sources[sourceFileIndex],
 | |
|             genText,
 | |
|             sourceText
 | |
|           });
 | |
|         }
 | |
| 
 | |
|         sourceLineIndex += sourceLineDiff;
 | |
|         sourceColIndex += sourceColDiff;
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     return matchData;
 | |
|   }, []);
 | |
| };
 | |
| 
 | |
| function getFile(filePath) {
 | |
|   return fs.readFileSync(path.resolve(process.cwd(), filePath), 'UTF-8');
 | |
| }
 | |
| 
 | |
| function decodeLines(sourceMap) {
 | |
|   return sourceMap.mappings.split(';').map(line => {
 | |
|     return line.split(',').map(seg => vlq.decode(seg));
 | |
|   });
 | |
| }
 |