| #! /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); |
| } |
| }); |
| } |