mirror of
				https://github.com/fooflington/selfdefined.git
				synced 2025-10-30 13:58:31 +00:00 
			
		
		
		
	
		
			
	
	
		
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #! /usr/bin/env node | ||
|  | /* eslint-disable no-console, no-var */ | ||
|  | // Util script for debugging source code generation issues | ||
|  | 
 | ||
|  | var script = process.argv[2].replace(/\\n/g, '\n'), | ||
|  |     verbose = process.argv[3] === '-v'; | ||
|  | 
 | ||
|  | var Handlebars = require('./lib'), | ||
|  |     SourceMap = require('source-map'), | ||
|  |       SourceMapConsumer = SourceMap.SourceMapConsumer; | ||
|  | 
 | ||
|  | var template = Handlebars.precompile(script, { | ||
|  |       srcName: 'input.hbs', | ||
|  |       destName: 'output.js', | ||
|  | 
 | ||
|  |       assumeObjects: true, | ||
|  |       compat: false, | ||
|  |       strict: true, | ||
|  |       trackIds: true, | ||
|  |       knownHelpersOnly: false | ||
|  |     }); | ||
|  | 
 | ||
|  | if (!verbose) { | ||
|  |   console.log(template); | ||
|  | } else { | ||
|  |   var consumer = new SourceMapConsumer(template.map), | ||
|  |       lines = template.code.split('\n'), | ||
|  |       srcLines = script.split('\n'); | ||
|  | 
 | ||
|  |   console.log(); | ||
|  |   console.log('Source:'); | ||
|  |   srcLines.forEach(function(source, index) { | ||
|  |     console.log(index + 1, source); | ||
|  |   }); | ||
|  |   console.log(); | ||
|  |   console.log('Generated:'); | ||
|  |   console.log(template.code); | ||
|  |   lines.forEach(function(source, index) { | ||
|  |     console.log(index + 1, source); | ||
|  |   }); | ||
|  |   console.log(); | ||
|  |   console.log('Map:'); | ||
|  |   console.log(template.map); | ||
|  |   console.log(); | ||
|  | 
 | ||
|  |   function collectSource(lines, lineName, colName, order) { | ||
|  |     var ret = {}, | ||
|  |         ordered = [], | ||
|  |         last; | ||
|  | 
 | ||
|  |     function collect(current) { | ||
|  |       if (last) { | ||
|  |         var mapLines = lines.slice(last[lineName] - 1, current && current[lineName]); | ||
|  |         if (mapLines.length) { | ||
|  |           if (current) { | ||
|  |             mapLines[mapLines.length - 1] = mapLines[mapLines.length - 1].slice(0, current[colName]); | ||
|  |           } | ||
|  |           mapLines[0] = mapLines[0].slice(last[colName]); | ||
|  |         } | ||
|  |         ret[last[lineName] + ':' + last[colName]] = mapLines.join('\n'); | ||
|  |         ordered.push({ | ||
|  |           startLine: last[lineName], | ||
|  |           startCol: last[colName], | ||
|  |           endLine: current && current[lineName] | ||
|  |         }); | ||
|  |       } | ||
|  |       last = current; | ||
|  |     } | ||
|  | 
 | ||
|  |     consumer.eachMapping(collect, undefined, order); | ||
|  |     collect(); | ||
|  | 
 | ||
|  |     return ret; | ||
|  |   } | ||
|  | 
 | ||
|  |   srcLines = collectSource(srcLines, 'originalLine', 'originalColumn', SourceMapConsumer.ORIGINAL_ORDER); | ||
|  |   lines = collectSource(lines, 'generatedLine', 'generatedColumn'); | ||
|  | 
 | ||
|  |   consumer.eachMapping(function(mapping) { | ||
|  |     var originalSrc = srcLines[mapping.originalLine + ':' + mapping.originalColumn], | ||
|  |         generatedSrc = lines[mapping.generatedLine + ':' + mapping.generatedColumn]; | ||
|  | 
 | ||
|  |     if (!mapping.originalLine) { | ||
|  |       console.log('generated', mapping.generatedLine + ':' + mapping.generatedColumn, generatedSrc); | ||
|  |     } else { | ||
|  |       console.log('map', | ||
|  |           mapping.source, | ||
|  |           mapping.originalLine + ':' + mapping.originalColumn, | ||
|  |           originalSrc, | ||
|  |           '->', | ||
|  |           mapping.generatedLine + ':' + mapping.generatedColumn, | ||
|  |           generatedSrc); | ||
|  |     } | ||
|  |   }); | ||
|  | } |