'use strict'; /*jshint asi: true*/ var test = require('tap').test var generator = require('..'); var foo = '' + function foo () { var hello = 'hello'; var world = 'world'; console.log('%s %s', hello, world); } var bar = '' + function bar () { console.log('yes?'); } function decode(base64) { return new Buffer(base64, 'base64').toString(); } function inspect(obj, depth) { console.error(require('util').inspect(obj, false, depth || 5, true)); } test('generated mappings', function (t) { t.test('one file no offset', function (t) { var gen = generator() .addGeneratedMappings('foo.js', foo) t.deepEqual( gen._mappings() , [ { generatedLine: 1, generatedColumn: 0, originalLine: 1, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 2, generatedColumn: 0, originalLine: 2, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 3, generatedColumn: 0, originalLine: 3, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 4, generatedColumn: 0, originalLine: 4, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 5, generatedColumn: 0, originalLine: 5, originalColumn: 0, source: 'foo.js', name: null } ] , 'generates correct mappings' ) t.deepEqual( decode(gen.base64Encode()) , '{"version":3,"sources":["foo.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA","file":"","sourceRoot":""}' , 'encodes generated mappings' ) t.equal( gen.inlineMappingUrl() , '//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvby5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIifQ==' , 'returns correct inline mapping url' ) t.end() }) t.test('two files no offset', function (t) { var gen = generator() .addGeneratedMappings('foo.js', foo) .addGeneratedMappings('bar.js', bar) t.deepEqual( gen._mappings() , [ { generatedLine: 1, generatedColumn: 0, originalLine: 1, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 2, generatedColumn: 0, originalLine: 2, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 3, generatedColumn: 0, originalLine: 3, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 4, generatedColumn: 0, originalLine: 4, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 5, generatedColumn: 0, originalLine: 5, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 1, generatedColumn: 0, originalLine: 1, originalColumn: 0, source: 'bar.js', name: null }, { generatedLine: 2, generatedColumn: 0, originalLine: 2, originalColumn: 0, source: 'bar.js', name: null }, { generatedLine: 3, generatedColumn: 0, originalLine: 3, originalColumn: 0, source: 'bar.js', name: null } ] , 'generates correct mappings' ) t.deepEqual( decode(gen.base64Encode()) , '{"version":3,"sources":["foo.js","bar.js"],"names":[],"mappings":"ACAA,ADAA;ACCA,ADAA;ACCA,ADAA;AACA;AACA","file":"","sourceRoot":""}' , 'encodes generated mappings' ) t.equal( gen.inlineMappingUrl() , '//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvby5qcyIsImJhci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUNBQSxBREFBO0FDQ0EsQURBQTtBQ0NBLEFEQUE7QUFDQTtBQUNBIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIifQ==' , 'returns correct inline mapping url' ) t.end() }) t.test('one line source', function (t) { var gen = generator().addGeneratedMappings('one-liner.js', 'console.log("line one");') t.deepEqual( gen._mappings() , [ { generatedLine: 1, generatedColumn: 0, originalLine: 1, originalColumn: 0, source: 'one-liner.js', name: null } ] , 'generates correct mappings' ) t.end() }) t.test('with offset', function (t) { var gen = generator() .addGeneratedMappings('foo.js', foo, { line: 20 }) .addGeneratedMappings('bar.js', bar, { line: 23, column: 22 }) t.deepEqual( gen._mappings() , [ { generatedLine: 21, generatedColumn: 0, originalLine: 1, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 22, generatedColumn: 0, originalLine: 2, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 23, generatedColumn: 0, originalLine: 3, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 24, generatedColumn: 0, originalLine: 4, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 25, generatedColumn: 0, originalLine: 5, originalColumn: 0, source: 'foo.js', name: null }, { generatedLine: 24, generatedColumn: 22, originalLine: 1, originalColumn: 0, source: 'bar.js', name: null }, { generatedLine: 25, generatedColumn: 22, originalLine: 2, originalColumn: 0, source: 'bar.js', name: null }, { generatedLine: 26, generatedColumn: 22, originalLine: 3, originalColumn: 0, source: 'bar.js', name: null } ] , 'generates correct mappings' ) t.equal( decode(gen.base64Encode()) , '{"version":3,"sources":["foo.js","bar.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA,sBCHA;ADIA,sBCHA;sBACA","file":"","sourceRoot":""}' , 'encodes generated mappings with offset' ) t.end() }) }) test('given mappings, with one having no original', function (t) { t.test('no offset', function (t) { var gen = generator() .addMappings('foo.js', [{ original: { line: 2, column: 3 } , generated: { line: 5, column: 10 } }]) // This addresses an edgecase in which a transpiler generates mappings but doesn't include the original position. // If we set source to sourceFile (as usual) in that case, the mappings are considered invalid by the source-map module's // SourceMapGenerator. Keeping source undefined fixes this problem. // Raised issue: https://github.com/thlorenz/inline-source-map/issues/2 // Validate function: https://github.com/mozilla/source-map/blob/a3372ea78e662582087dd25ebda999c06424e047/lib/source-map/source-map-generator.js#L232 .addMappings('bar.js', [ { original: { line: 6, column: 0 } , generated: { line: 7, column: 20 } } , { generated: { line: 8, column: 30 } } ]) t.deepEqual( gen._mappings() , [ { generatedLine: 5, generatedColumn: 10, originalLine: 2, originalColumn: 3, source: 'foo.js', name: null }, { generatedLine: 7, generatedColumn: 20, originalLine: 6, originalColumn: 0, source: 'bar.js', name: null }, { generatedLine: 8, generatedColumn: 30, originalLine: false, originalColumn: false, source: undefined, name: null } ] , 'adds correct mappings' ) t.deepEqual( decode(gen.base64Encode()) , '{"version":3,"sources":["foo.js","bar.js"],"names":[],"mappings":";;;;UACG;;oBCIH;8B","file":"","sourceRoot":""}' , 'encodes generated mappings' ) t.equal( gen.inlineMappingUrl() , '//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZvby5qcyIsImJhci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O1VBQ0c7O29CQ0lIOzhCIiwiZmlsZSI6IiIsInNvdXJjZVJvb3QiOiIifQ==' , 'returns correct inline mapping url' ) t.end() }) t.test('with offset', function (t) { var gen = generator() .addMappings('foo.js', [{ original: { line: 2, column: 3 } , generated: { line: 5, column: 10 } }], { line: 5 }) .addMappings('bar.js', [{ original: { line: 6, column: 0 } , generated: { line: 7, column: 20 } }, { generated: { line: 8, column: 30 } }], { line: 9, column: 3 }) t.deepEqual( gen._mappings() , [ { generatedLine: 10, generatedColumn: 10, originalLine: 2, originalColumn: 3, source: 'foo.js', name: null }, { generatedLine: 16, generatedColumn: 23, originalLine: 6, originalColumn: 0, source: 'bar.js', name: null }, { generatedLine: 17, generatedColumn: 33, originalLine: false, originalColumn: false, source: undefined, name: null } ] , 'adds correct mappings' ) t.equal( decode(gen.base64Encode()) , '{\"version\":3,\"sources\":[\"foo.js\",\"bar.js\"],\"names\":[],\"mappings\":\";;;;;;;;;UACG;;;;;;uBCIH;iC\",\"file\":\"\",\"sourceRoot\":\"\"}' , 'encodes mappings with offset' ) t.end() }) });