diff --git a/packages/terser/src/module.ts b/packages/terser/src/module.ts index 1a2adc93c..a74cc7f3c 100644 --- a/packages/terser/src/module.ts +++ b/packages/terser/src/module.ts @@ -31,7 +31,11 @@ export default function terser(input: Options = {}) { } try { - const { code: result, nameCache } = await workerPool.addAsync({ + const { + code: result, + nameCache, + sourceMap + } = await workerPool.addAsync({ code, options: merge({}, options || {}, defaultOptions) }); @@ -67,6 +71,12 @@ export default function terser(input: Options = {}) { options.nameCache.props = props; } + if ((!!defaultOptions.sourceMap || !!options.sourceMap) && isObject(sourceMap)) { + return { + code: result, + map: sourceMap + }; + } return result; } catch (e) { return Promise.reject(e); diff --git a/packages/terser/src/type.ts b/packages/terser/src/type.ts index 5e01b0620..daaf66651 100644 --- a/packages/terser/src/type.ts +++ b/packages/terser/src/type.ts @@ -20,6 +20,7 @@ export interface WorkerContextSerialized { export interface WorkerOutput { code: string; nameCache?: Options['nameCache']; + sourceMap?: Record; } export interface WorkerPoolOptions { diff --git a/packages/terser/src/worker.ts b/packages/terser/src/worker.ts index 7b56842c0..1c3ea03b0 100644 --- a/packages/terser/src/worker.ts +++ b/packages/terser/src/worker.ts @@ -40,6 +40,14 @@ export async function runWorker() { nameCache: options.nameCache }; + if (typeof result.map === 'string') { + output.sourceMap = JSON.parse(result.map); + } + + if (isObject(result.map)) { + output.sourceMap = result.map; + } + parentPort.postMessage(output); } catch (e) { process.exit(1); diff --git a/packages/terser/test/test.js b/packages/terser/test/test.js index faf3da233..67d1eb6df 100644 --- a/packages/terser/test/test.js +++ b/packages/terser/test/test.js @@ -15,6 +15,21 @@ test.serial('minify', async (t) => { t.falsy(output.map); }); +test.serial('minify with source map', async (t) => { + const bundle = await rollup({ + input: 'test/fixtures/unminified.js', + plugins: [terser()] + }); + const result = await bundle.generate({ format: 'cjs', sourcemap: true }); + t.is(result.output.length, 2); + const [output] = result.output; + + t.truthy(output.map); + t.is(output.map.version, 3); + t.is(output.map.file, 'unminified.js'); + t.deepEqual(output.map.names, ['window', 'a', 'console', 'log']); +}); + test.serial('minify via terser options', async (t) => { const bundle = await rollup({ input: 'test/fixtures/empty.js',