Skip to content

Commit

Permalink
Merge pull request #4251 from relative-ci/nextjs-manifest-asset-name
Browse files Browse the repository at this point in the history
Nextjs - add support for manifest asset names
  • Loading branch information
vio committed Feb 14, 2024
2 parents bae1845 + 0c5f862 commit f4a5b69
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 12 deletions.
11 changes: 10 additions & 1 deletion packages/utils/src/webpack/__tests__/utils-get-asset-name.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
48 changes: 37 additions & 11 deletions packages/utils/src/webpack/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = /(^|.*\/)\..*$/;

Expand All @@ -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;
Expand Down

0 comments on commit f4a5b69

Please sign in to comment.