diff --git a/packages/utils/src/webpack/__tests__/utils-get-asset-name.ts b/packages/utils/src/webpack/__tests__/utils-get-asset-name.ts index 4bef95ec06..d5ac71496f 100644 --- a/packages/utils/src/webpack/__tests__/utils-get-asset-name.ts +++ b/packages/utils/src/webpack/__tests__/utils-get-asset-name.ts @@ -50,10 +50,19 @@ describe('Webpack/utils/getAssetName', () => { expect(getAssetName('login-abcde-chunk.js')).toBe('login-abcde-chunk.js'); }); - test('should remove the hash when it is provided as a slug', () => { + test('should remove the hash when it is provided as a slug inside a static folder', () => { expect(getAssetName('static/d2490/pages/app.js')).toBe('static/pages/app.js'); }); + test('should remove base64 hash when matching next manifests', () => { + expect(getAssetName('static/JyGdYu5ApqW15bVPkT0MK/_buildManifest.js')).toBe( + 'static/[hash]/_buildManifest.js', + ); + expect(getAssetName('static/gzzXRvk7zbHlZFnyz0PfQ/_ssgManifest.js')).toBe( + 'static/[hash]/_ssgManifest.js', + ); + }); + test('should not remove hash when it is provided as filename', () => { expect(getAssetName('static/chunks/d249062c08abb6b31a03.js')).toBe( 'static/chunks/d249062c08abb6b31a03.js', diff --git a/packages/utils/src/webpack/utils.ts b/packages/utils/src/webpack/utils.ts index 001523151d..9137a21bf4 100644 --- a/packages/utils/src/webpack/utils.ts +++ b/packages/utils/src/webpack/utils.ts @@ -16,15 +16,40 @@ const BASE64URL_SEPARATOR_PATTERN = '[.~]'; const EXTENSION_PATTERN = /(?:\.[a-z0-9]{2,}){1,}/; const PATTERNS = [ - // Match path/name-HEXHASH.EXT, path/name.HEXHASH.EXT, path/name_HEXHASH.EXT, path/name-HEXHASH.chunk.EXT - `(.*)${HEX_HASH_SEPARATOR_PATTERN}${HEX_HASH_PATTERN}(${EXTENSION_PATTERN.source})$`, - - // Match static/HASH.ext - `(static)/${HEX_HASH_PATTERN}(.*${EXTENSION_PATTERN.source})$`, - - // Match path/name-BASE64URLHASH.EXT, path/name.BASE64URLHASH.EXT, path/name_BASE64URLHASH.EXT, path/name-BASE64URLHASH.chunk.EXT - `(.*)${BASE64URL_SEPARATOR_PATTERN}${BASE64URL_HASH_PATTERN}(${EXTENSION_PATTERN.source})$`, -].map((pattern) => new RegExp(pattern)); + // Match path/name-HEXHASH.EXT, + // path/name.HEXHASH.EXT, + // path/name_HEXHASH.EXT, + // path/name-HEXHASH.chunk.EXT + { + pattern: new RegExp( + `(.*)${HEX_HASH_SEPARATOR_PATTERN}${HEX_HASH_PATTERN}(${EXTENSION_PATTERN.source})$`, + ), + replace: '$1$2', + }, + + // Match path/name-BASE64URLHASH.EXT, + // path/name.BASE64URLHASH.EXT, + // path/name_BASE64URLHASH.EXT, + // path/name-BASE64URLHASH.chunk.EXT + { + pattern: new RegExp( + `(.*)${BASE64URL_SEPARATOR_PATTERN}${BASE64URL_HASH_PATTERN}(${EXTENSION_PATTERN.source})$`, + ), + replace: '$1$2', + }, + + // Match static/HEXHASH.ext + { + pattern: new RegExp(`(static)/${HEX_HASH_PATTERN}(.*${EXTENSION_PATTERN.source})$`), + replace: '$1$2', + }, + + // Match static/HEXHASH/_name.ext + { + pattern: new RegExp(`(static)/${BASE64URL_HASH_PATTERN}/(_.*${EXTENSION_PATTERN.source})$`), + replace: '$1/[hash]/$2', + }, +]; const NO_BASENAME = /(^|.*\/)\..*$/; @@ -37,8 +62,9 @@ export const getAssetName = (statsAssetPath?: string | null): string => { } for (let i = 0; i < PATTERNS.length; i += 1) { - const pattern = PATTERNS[i]; - const extracted: string = statsAssetPath.replace(pattern, '$1$2'); + const { pattern, replace } = PATTERNS[i]; + + const extracted: string = statsAssetPath.replace(pattern, replace); if (extracted && extracted !== statsAssetPath && !NO_BASENAME.test(extracted)) { return extracted;