From d7b033d5286bd449ec10ab3d8e176eb35f3748f0 Mon Sep 17 00:00:00 2001 From: tada5hi Date: Wed, 21 Dec 2022 21:00:05 +0100 Subject: [PATCH 1/3] feat(terser): emit source map if requested --- packages/terser/src/module.ts | 12 +++++++++++- packages/terser/src/type.ts | 1 + packages/terser/src/worker.ts | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) 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..517f1e677 100644 --- a/packages/terser/src/worker.ts +++ b/packages/terser/src/worker.ts @@ -40,6 +40,10 @@ export async function runWorker() { nameCache: options.nameCache }; + if (isObject(result.map)) { + output.sourceMap = result.map; + } + parentPort.postMessage(output); } catch (e) { process.exit(1); From e3874f01ab99bdef3554cbb32329da66a8978dc2 Mon Sep 17 00:00:00 2001 From: tada5hi Date: Fri, 23 Dec 2022 10:58:40 +0100 Subject: [PATCH 2/3] tests(terser): add test for source map option --- packages/terser/src/worker.ts | 4 ++++ packages/terser/test/test.js | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/packages/terser/src/worker.ts b/packages/terser/src/worker.ts index 517f1e677..1c3ea03b0 100644 --- a/packages/terser/src/worker.ts +++ b/packages/terser/src/worker.ts @@ -40,6 +40,10 @@ 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; } diff --git a/packages/terser/test/test.js b/packages/terser/test/test.js index faf3da233..b702b9fee 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.truthy(output.map.names); +}); + test.serial('minify via terser options', async (t) => { const bundle = await rollup({ input: 'test/fixtures/empty.js', From 198df6a18c5a769abdc4beede8c8535e9fb58cc7 Mon Sep 17 00:00:00 2001 From: tada5hi Date: Mon, 2 Jan 2023 22:35:16 +0100 Subject: [PATCH 3/3] test(terser): better check for source-map names --- packages/terser/test/test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/terser/test/test.js b/packages/terser/test/test.js index b702b9fee..67d1eb6df 100644 --- a/packages/terser/test/test.js +++ b/packages/terser/test/test.js @@ -27,7 +27,7 @@ test.serial('minify with source map', async (t) => { t.truthy(output.map); t.is(output.map.version, 3); t.is(output.map.file, 'unminified.js'); - t.truthy(output.map.names); + t.deepEqual(output.map.names, ['window', 'a', 'console', 'log']); }); test.serial('minify via terser options', async (t) => {