From caa47f7524e2b98fb97edfd9bdc15f7bbb5a1e0e Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sat, 10 Dec 2022 16:31:27 +0100 Subject: [PATCH] provide hashed file name when using this.getFileName in generateBundle --- src/Chunk.ts | 54 +++++++++---------- src/utils/FileEmitter.ts | 3 +- src/utils/renderChunks.ts | 4 +- .../samples/emit-chunk-hash/_config.js | 20 +++++++ .../samples/emit-chunk-hash/emitted.js | 1 + test/function/samples/emit-chunk-hash/main.js | 1 + 6 files changed, 52 insertions(+), 31 deletions(-) create mode 100644 test/function/samples/emit-chunk-hash/_config.js create mode 100644 test/function/samples/emit-chunk-hash/emitted.js create mode 100644 test/function/samples/emit-chunk-hash/main.js diff --git a/src/Chunk.ts b/src/Chunk.ts index 2685737a9de..da273cd3189 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -163,7 +163,6 @@ export default class Chunk { execIndex: number; exportMode: 'none' | 'named' | 'default' = 'named'; facadeModule: Module | null = null; - id: string | null = null; namespaceVariableName = ''; suggestedVariableName: string; variableName = ''; @@ -318,6 +317,32 @@ export default class Chunk { return true; } + finalizeChunk( + code: string, + map: SourceMap | null, + hashesByPlaceholder: Map + ): OutputChunk { + const renderedChunkInfo = this.getRenderedChunkInfo(); + const finalize = (code: string) => replacePlaceholders(code, hashesByPlaceholder); + const fileName = (this.fileName = finalize(renderedChunkInfo.fileName)); + return { + ...renderedChunkInfo, + code, + dynamicImports: renderedChunkInfo.dynamicImports.map(finalize), + fileName, + implicitlyLoadedBefore: renderedChunkInfo.implicitlyLoadedBefore.map(finalize), + importedBindings: Object.fromEntries( + Object.entries(renderedChunkInfo.importedBindings).map(([fileName, bindings]) => [ + finalize(fileName), + bindings + ]) + ), + imports: renderedChunkInfo.imports.map(finalize), + map, + referencedFiles: renderedChunkInfo.referencedFiles.map(finalize) + }; + } + generateExports(): void { this.sortedExportNames = null; const remainingExports = new Set(this.exports); @@ -449,31 +474,6 @@ export default class Chunk { return facades; } - generateOutputChunk( - code: string, - map: SourceMap | null, - hashesByPlaceholder: Map - ): OutputChunk { - const renderedChunkInfo = this.getRenderedChunkInfo(); - const finalize = (code: string) => replacePlaceholders(code, hashesByPlaceholder); - return { - ...renderedChunkInfo, - code, - dynamicImports: renderedChunkInfo.dynamicImports.map(finalize), - fileName: finalize(renderedChunkInfo.fileName), - implicitlyLoadedBefore: renderedChunkInfo.implicitlyLoadedBefore.map(finalize), - importedBindings: Object.fromEntries( - Object.entries(renderedChunkInfo.importedBindings).map(([fileName, bindings]) => [ - finalize(fileName), - bindings - ]) - ), - imports: renderedChunkInfo.imports.map(finalize), - map, - referencedFiles: renderedChunkInfo.referencedFiles.map(finalize) - }; - } - getChunkName(): string { return (this.name ??= this.outputOptions.sanitizeFileName(this.getFallbackChunkName())); } @@ -483,7 +483,7 @@ export default class Chunk { } getFileName(): string { - return this.preliminaryFileName?.fileName || this.getPreliminaryFileName().fileName; + return this.fileName || this.getPreliminaryFileName().fileName; } getImportPath(importer: string): string { diff --git a/src/utils/FileEmitter.ts b/src/utils/FileEmitter.ts index 8478b8ab199..16a7b27d8f6 100644 --- a/src/utils/FileEmitter.ts +++ b/src/utils/FileEmitter.ts @@ -144,8 +144,7 @@ function getChunkFileName( return file.fileName; } if (facadeChunkByModule) { - const chunk = facadeChunkByModule.get(file.module!)!; - return chunk.id || chunk.getFileName(); + return facadeChunkByModule.get(file.module!)!.getFileName(); } return error(errorChunkNotGeneratedForFileName(file.fileName || file.name)); } diff --git a/src/utils/renderChunks.ts b/src/utils/renderChunks.ts index 74bbf60c16e..ddfa637fd6c 100644 --- a/src/utils/renderChunks.ts +++ b/src/utils/renderChunks.ts @@ -309,7 +309,7 @@ function addChunksToBundle( map.file = replacePlaceholders(map.file, hashesByPlaceholder); updatedCode += emitSourceMapAndGetComment(finalFileName, map, pluginDriver, options); } - bundle[finalFileName] = chunk.generateOutputChunk(updatedCode, map, hashesByPlaceholder); + bundle[finalFileName] = chunk.finalizeChunk(updatedCode, map, hashesByPlaceholder); } for (const { chunk, code, fileName, map } of nonHashedChunksWithPlaceholders) { let updatedCode = @@ -317,7 +317,7 @@ function addChunksToBundle( if (map) { updatedCode += emitSourceMapAndGetComment(fileName, map, pluginDriver, options); } - bundle[fileName] = chunk.generateOutputChunk(updatedCode, map, hashesByPlaceholder); + bundle[fileName] = chunk.finalizeChunk(updatedCode, map, hashesByPlaceholder); } } diff --git a/test/function/samples/emit-chunk-hash/_config.js b/test/function/samples/emit-chunk-hash/_config.js new file mode 100644 index 00000000000..06b4563b867 --- /dev/null +++ b/test/function/samples/emit-chunk-hash/_config.js @@ -0,0 +1,20 @@ +const assert = require('node:assert'); +let referenceId; + +module.exports = { + description: 'gives access to the hashed filed name via this.getFileName in generateBundle', + options: { + input: 'main', + output: { + chunkFileNames: '[name]-[hash].js' + }, + plugins: { + buildStart() { + referenceId = this.emitFile({ type: 'chunk', id: 'emitted' }); + }, + generateBundle() { + assert.strictEqual(this.getFileName(referenceId), 'emitted-38bdd9b2.js'); + } + } + } +}; diff --git a/test/function/samples/emit-chunk-hash/emitted.js b/test/function/samples/emit-chunk-hash/emitted.js new file mode 100644 index 00000000000..cc1d88a24fa --- /dev/null +++ b/test/function/samples/emit-chunk-hash/emitted.js @@ -0,0 +1 @@ +assert.ok(true); diff --git a/test/function/samples/emit-chunk-hash/main.js b/test/function/samples/emit-chunk-hash/main.js new file mode 100644 index 00000000000..cc1d88a24fa --- /dev/null +++ b/test/function/samples/emit-chunk-hash/main.js @@ -0,0 +1 @@ +assert.ok(true);