diff --git a/.changeset/famous-dryers-play.md b/.changeset/famous-dryers-play.md new file mode 100644 index 0000000000..bc76eb2b3d --- /dev/null +++ b/.changeset/famous-dryers-play.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/template-webpack-plugin": patch +--- + +Fix source-maps (`.js.map` files) were not accessible in the `compiler.hooks.afterEmit` hook. diff --git a/.changeset/seven-cougars-look.md b/.changeset/seven-cougars-look.md new file mode 100644 index 0000000000..7a3dfb21b1 --- /dev/null +++ b/.changeset/seven-cougars-look.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/template-webpack-plugin": patch +--- + +Fix incorrect hash of `background.[contenthash].js` in `.lynx.bundle` files. diff --git a/packages/webpack/template-webpack-plugin/src/LynxEncodePlugin.ts b/packages/webpack/template-webpack-plugin/src/LynxEncodePlugin.ts index 5acfb6cdec..9a0225d384 100644 --- a/packages/webpack/template-webpack-plugin/src/LynxEncodePlugin.ts +++ b/packages/webpack/template-webpack-plugin/src/LynxEncodePlugin.ts @@ -130,14 +130,13 @@ export class LynxEncodePluginImpl { const { manifest } = encodeData; if (!isDebug() && !isDev && !isRsdoctor()) { - templateHooks.beforeEmit.tap(this.name, (args) => { + compiler.hooks.afterEmit.tap(this.name, () => { this.deleteDebuggingAssets(compilation, [ encodeData.lepusCode.root, ...encodeData.lepusCode.chunks, ...Object.keys(manifest).map(name => ({ name })), ...encodeData.css.chunks, ]); - return args; }); } diff --git a/packages/webpack/template-webpack-plugin/src/LynxTemplatePlugin.ts b/packages/webpack/template-webpack-plugin/src/LynxTemplatePlugin.ts index e6711d73fc..42bf5ff7fa 100644 --- a/packages/webpack/template-webpack-plugin/src/LynxTemplatePlugin.ts +++ b/packages/webpack/template-webpack-plugin/src/LynxTemplatePlugin.ts @@ -522,7 +522,7 @@ class LynxTemplatePluginImpl { * and source-map is generated */ compiler.webpack.Compilation - .PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE, + .PROCESS_ASSETS_STAGE_OPTIMIZE_HASH, }, () => { return this.#generateTemplate( @@ -571,9 +571,10 @@ class LynxTemplatePluginImpl { /** * Generate the html after minification and dev tooling is done * and source-map is generated + * and real content hash is generated */ compiler.webpack.Compilation - .PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE, + .PROCESS_ASSETS_STAGE_OPTIMIZE_HASH, }, async () => { await this.#generateAsyncTemplate(compilation); }); diff --git a/packages/webpack/template-webpack-plugin/test/cases/assets/production/rspack.config.js b/packages/webpack/template-webpack-plugin/test/cases/assets/production/rspack.config.js index b6fcdcff8b..d46fc9af76 100644 --- a/packages/webpack/template-webpack-plugin/test/cases/assets/production/rspack.config.js +++ b/packages/webpack/template-webpack-plugin/test/cases/assets/production/rspack.config.js @@ -1,3 +1,5 @@ +import fs from 'node:fs'; + import { LynxEncodePlugin, LynxTemplatePlugin } from '../../../../src'; /** @type {import('webpack').Configuration} */ @@ -27,20 +29,26 @@ export default { filename: 'template.js', intermediate: '.rspeedy/main', }), - (compiler) => { + + compiler => { const { DEBUG, NODE_ENV } = process.env; + compiler.hooks.beforeCompile.tap('test', () => { + process.env['DEBUG'] = ''; + process.env['NODE_ENV'] = 'production'; + }); + + // Reset + compiler.hooks.done.tap('test', () => { + process.env['DEBUG'] = DEBUG; + process.env['NODE_ENV'] = NODE_ENV; + }); + }, + + (compiler) => { compiler.hooks.thisCompilation.tap('test', (compilation) => { const encodeHooks = LynxTemplatePlugin.getLynxTemplatePluginHooks( compilation, ); - compilation.hooks.processAssets.tap( - { stage: -1000, name: 'test' }, - () => { - process.env['DEBUG'] = ''; - process.env['NODE_ENV'] = 'production'; - }, - ); - let appService; encodeHooks.beforeEmit.tap('test', (args) => { appService = args.finalEncodeOptions.manifest['/app-service.js']; @@ -56,11 +64,27 @@ export default { { stage: 10000, name: 'test' }, () => { expect(appService).not.toBeFalsy(); - process.env['DEBUG'] = DEBUG; - process.env['NODE_ENV'] = NODE_ENV; }, ); }); }, + + compiler => { + compiler.hooks.afterEmit.tap({ + name: 'test', + stage: -128, + }, () => { + const files = fs.readdirSync(compiler.outputPath); + expect(files).toContain('main.bundle.js'); + }); + + compiler.hooks.thisCompilation.tap('test', (compilation) => { + compiler.hooks.done.tap('test', () => { + expect(Object.keys(compilation.assets)).not.toContain( + 'main.bundle.js', + ); + }); + }); + }, ], };