diff --git a/src/Chunk.ts b/src/Chunk.ts index 6b27aa02389..fb4856ae7d5 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -1042,8 +1042,9 @@ export default class Chunk { if (options.sourcemap) { timeStart('sourcemap', 3); - let file = options.file ? options.sourcemapFile || options.file : this.id; - if (file) file = resolve(typeof process !== 'undefined' ? process.cwd() : '', file); + const file = options.file + ? options.sourcemapFile || options.file + : resolve(options.dir, this.id); if ( this.graph.hasLoaders || diff --git a/src/rollup/index.ts b/src/rollup/index.ts index f14ddf73ca7..e38ee145cfc 100644 --- a/src/rollup/index.ts +++ b/src/rollup/index.ts @@ -1,5 +1,5 @@ import { getTimings, initialiseTimers, timeEnd, timeStart } from '../utils/timers'; -import { basename } from '../utils/path'; +import { basename, resolve, dirname } from '../utils/path'; import { writeFile } from '../utils/fs'; import { mapSequence } from '../utils/promise'; import error from '../utils/error'; @@ -153,6 +153,8 @@ export default function rollup( function generate(rawOutputOptions: GenericConfigObject) { const outputOptions = normalizeOutputOptions(inputOptions, rawOutputOptions); + outputOptions.dir = dirname(resolve(inputOptions.input)); + if (outputOptions.entryNames || outputOptions.chunkNames) error({ code: 'INVALID_OPTION', @@ -169,6 +171,7 @@ export default function rollup( .then(addons => { chunk.generateInternalExports(outputOptions); chunk.preRender(outputOptions); + chunk.id = basename(inputOptions.input); return chunk.render(outputOptions, addons); }) .then(rendered => { @@ -312,6 +315,12 @@ export default function rollup( }); } + if (outputOptions.sourcemapFile) + error({ + code: 'INVALID_OPTION', + message: '"sourcemapFile" is only supported for single-file builds.' + }); + timeStart('GENERATE', 1); const generated: { [chunkName: string]: OutputChunk } = {}; diff --git a/test/misc/index.js b/test/misc/index.js index d90370a04dc..a340ec60ac8 100644 --- a/test/misc/index.js +++ b/test/misc/index.js @@ -1,6 +1,9 @@ const assert = require('assert'); +const path = require('path'); const rollup = require('../../dist/rollup'); const { executeBundle, loader } = require('../utils.js'); +const { SourceMapConsumer } = require( 'source-map' ); +const { getLocator } = require( 'locate-character' ); describe('sanity checks', () => { it('exists', () => { @@ -158,6 +161,31 @@ describe('sanity checks', () => { }); }); +describe('in-memory sourcemaps', () => { + it( 'generates an in-memory sourcemap', async () => { + const bundle = await rollup.rollup({ + input: 'main', + plugins: [loader({ main: `console.log( 42 );` })], + }); + + const generated = await bundle.generate({ + format: 'cjs', + sourcemap: true, + sourcemapFile: path.resolve( 'bundle.js' ) + }); + + const smc = new SourceMapConsumer( generated.map ); + const locator = getLocator( generated.code, { offsetLine: 1 }); + + let generatedLoc = locator( '42' ); + let loc = smc.originalPositionFor( generatedLoc ); // 42 + assert.equal( loc.source, 'main' ); + assert.equal( loc.line, 1 ); + assert.equal( loc.column, 13 ); + }); + +}); + describe('deprecations', () => { it('warns on options.entry, but handles', () => { const warnings = [];