var buble = require( 'buble' ); var fs = require( 'fs' ); var assert = require( 'assert' ); var getLocation = require( '../../utils/getLocation' ); var SourceMapConsumer = require( 'source-map' ).SourceMapConsumer; module.exports = { description: 'preserves sourcemap chains when transforming', options: { plugins: [ { load: function ( id ) { if ( /foo.js$/.test( id ) ) { id = id.replace( /foo.js$/, 'bar.js' ); } else if ( /bar.js$/.test( id ) ) { id = id.replace( /bar.js$/, 'foo.js' ); } var code = fs.readFileSync( id, 'utf-8' ); var out = buble.transform( code, { transforms: { modules: false }, sourceMap: true, source: id }); if ( /main.js$/.test( id ) ) { delete out.map.sources; } else { const slash = out.map.sources[0].lastIndexOf( '/' ) + 1; out.map.sources = out.map.sources.map( source => '../' + source.slice( slash ) ); out.map.sourceRoot = 'fake'; } return { code: out.code, map: out.map }; } } ] }, test: function ( code, map ) { var smc = new SourceMapConsumer( map ); var generatedLoc; var originalLoc; generatedLoc = getLocation( code, code.indexOf( '22' ) ); originalLoc = smc.originalPositionFor( generatedLoc ); assert.equal( originalLoc.source, '../foo.js' ); assert.equal( originalLoc.line, 1 ); assert.equal( originalLoc.column, 32 ); generatedLoc = getLocation( code, code.indexOf( '20' ) ); originalLoc = smc.originalPositionFor( generatedLoc ); assert.equal( originalLoc.source, '../bar.js' ); assert.equal( originalLoc.line, 1 ); assert.equal( originalLoc.column, 37 ); generatedLoc = getLocation( code, code.indexOf( 'log' ) ); originalLoc = smc.originalPositionFor( generatedLoc ); assert.equal( originalLoc.source, '../main.js' ); assert.ok( /columns/.test( smc.sourceContentFor( '../main.js' ) ) ); assert.equal( originalLoc.line, 4 ); assert.equal( originalLoc.column, 19 ); } };