From 443dc973adb2c8db97687fb094076ac014d6807d Mon Sep 17 00:00:00 2001 From: Denis Bardadym Date: Mon, 29 Mar 2021 15:35:24 +0200 Subject: [PATCH] Expose rendered module code to generateBundle hook (#4028) * Expose rendered module code to generateBundle hook * Use string | null for rendered code * Update docs to include new field Co-authored-by: Denis Bardadym Co-authored-by: Lukas Taegert-Atkinson --- docs/02-javascript-api.md | 2 ++ docs/05-plugin-development.md | 3 ++- src/Chunk.ts | 6 +++++- src/rollup/types.d.ts | 1 + test/misc/bundle-information.js | 13 +++++++++++++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/02-javascript-api.md b/docs/02-javascript-api.md index cf10af2ae1b..93253d4260a 100755 --- a/docs/02-javascript-api.md +++ b/docs/02-javascript-api.md @@ -1,3 +1,4 @@ + --- title: JavaScript API --- @@ -59,6 +60,7 @@ async function build() { // removedExports: string[]; // exported variable names that were removed // renderedLength: number; // the length of the remaining code in this module // originalLength: number; // the original length of the code in this module + // code: string | null; // remaining code in this module // }; // }, // name: string // the name of this chunk as used in naming patterns diff --git a/docs/05-plugin-development.md b/docs/05-plugin-development.md index 95b6c07de9e..79a39e94951 100644 --- a/docs/05-plugin-development.md +++ b/docs/05-plugin-development.md @@ -339,7 +339,8 @@ Called at the end of `bundle.generate()` or immediately before the files are wri renderedExports: string[], removedExports: string[], renderedLength: number, - originalLength: number + originalLength: number, + code: string | null }, }, name: string, diff --git a/src/Chunk.ts b/src/Chunk.ts index c4e8d6b512c..7fd282de596 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -611,11 +611,15 @@ export default class Chunk { } } const { renderedExports, removedExports } = module.getRenderedExports(); + const chunk = this; renderedModules[module.id] = { originalLength: module.originalCode.length, removedExports, renderedExports, - renderedLength + renderedLength, + get code() { + return chunk.renderedModuleSources.get(module)?.toString() ?? null; + } }; } diff --git a/src/rollup/types.d.ts b/src/rollup/types.d.ts index 3f671969bbd..bd448dce28b 100644 --- a/src/rollup/types.d.ts +++ b/src/rollup/types.d.ts @@ -727,6 +727,7 @@ export interface RenderedModule { removedExports: string[]; renderedExports: string[]; renderedLength: number; + code: string | null; } export interface PreRenderedChunk { diff --git a/test/misc/bundle-information.js b/test/misc/bundle-information.js index 5d1a8380482..53fdb648eba 100644 --- a/test/misc/bundle-information.js +++ b/test/misc/bundle-information.js @@ -89,6 +89,7 @@ describe('The bundle object', () => { [ { input1: { + code: 'console.log("input1", used, shared);const out = true;', originalLength: 96, removedExports: [], renderedExports: ['out'], @@ -97,6 +98,7 @@ describe('The bundle object', () => { }, { input2: { + code: 'console.log("input2");var input2 = 42;', originalLength: 55, removedExports: [], renderedExports: ['default'], @@ -105,6 +107,7 @@ describe('The bundle object', () => { }, { shared: { + code: 'console.log("shared");const used = "used"; var shared = "stuff";', originalLength: 100, removedExports: ['unused'], renderedExports: ['used', 'default'], @@ -194,6 +197,7 @@ describe('The bundle object', () => { [ { input: { + code: 'console.log(external2);', originalLength: 137, removedExports: [], renderedExports: [], @@ -438,6 +442,7 @@ describe('The bundle object', () => { [ { input: { + code: 'var input = null;', originalLength: 47, removedExports: [], renderedExports: ['default'], @@ -525,6 +530,7 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the [ { input: { + code: 'console.log(other);Promise.all([import(\'./dynamic1\'), import(\'./dynamic2\')]).then(([{dynamic1}, {dynamic2}]) => console.log(dynamic1, dynamic2));', originalLength: 169, removedExports: [], renderedExports: [], @@ -533,6 +539,7 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the }, { dynamic1: { + code: 'const dynamic1 = "dynamic1";', originalLength: 34, removedExports: [], renderedExports: ['dynamic1'], @@ -541,6 +548,7 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the }, { other: { + code: 'const other = "other";', originalLength: 28, removedExports: [], renderedExports: ['other'], @@ -549,6 +557,7 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the }, { dynamic2: { + code: 'const dynamic2 = "dynamic2";', originalLength: 34, removedExports: [], renderedExports: ['dynamic2'], @@ -606,12 +615,14 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the output.modules, { code: { + code: 'function renderedFn() {}\nclass renderedClass {}\nconst renderedConst = 1;', originalLength: 184, removedExports: ['removedFn', 'removedClass', 'removedConst'], renderedExports: ['renderedFn', 'renderedClass', 'renderedConst'], renderedLength: 72 }, input: { + code: null, originalLength: 84, removedExports: [], renderedExports: [], @@ -658,12 +669,14 @@ console.log(other);Promise.all([import('./dynamic1'), import('./dynamic2')]).the output.modules, { code: { + code: 'function renderedFn() {}\nclass renderedClass {}\nconst renderedConst = 1;', originalLength: 233, removedExports: ['removedFn', 'removedClass', 'removedConst'], renderedExports: ['renderedFn', 'renderedClass', 'renderedConst'], renderedLength: 72 }, input: { + code: null, originalLength: 63, removedExports: [], renderedExports: [],