diff --git a/packages/next-swc/crates/next-core/src/next_app/metadata/mod.rs b/packages/next-swc/crates/next-core/src/next_app/metadata/mod.rs index 7f27edde09c669..f9c4fa76844449 100644 --- a/packages/next-swc/crates/next-core/src/next_app/metadata/mod.rs +++ b/packages/next-swc/crates/next-core/src/next_app/metadata/mod.rs @@ -258,7 +258,7 @@ fn djb2_hash(str: &str) -> u32 { }) } -// this is here to mirror next.js behaviour. +// this is here to mirror next.js behaviour (`toString(36).slice(0, 6)`) fn format_radix(mut x: u32, radix: u32) -> String { let mut result = vec![]; @@ -273,7 +273,8 @@ fn format_radix(mut x: u32, radix: u32) -> String { } } - result.into_iter().rev().collect() + result.reverse(); + result[..6].into_iter().collect() } /// If there's special convention like (...) or @ in the page path, diff --git a/packages/next/src/shared/lib/hash.ts b/packages/next/src/shared/lib/hash.ts index fbc1e4371416ef..187beafce8cc08 100644 --- a/packages/next/src/shared/lib/hash.ts +++ b/packages/next/src/shared/lib/hash.ts @@ -1,11 +1,17 @@ // http://www.cse.yorku.ca/~oz/hash.html +// More specifically, 32-bit hash via djbxor +// (ref: https://gist.github.com/eplawless/52813b1d8ad9af510d85?permalink_comment_id=3367765#gistcomment-3367765) +// This is due to number type differences between rust for turbopack to js number types, +// where rust does not have easy way to repreesnt js's 53-bit float number type for the matching +// overflow behavior. This is more `correct` in terms of having canonical hash across different runtime / implementation +// as can gaurantee determinstic output from 32bit hash. export function djb2Hash(str: string) { let hash = 5381 for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i) - hash = (hash << 5) + hash + char + hash = ((hash << 5) + hash + char) & 0xffffffff } - return Math.abs(hash) + return hash >>> 0 } export function hexHash(str: string) { diff --git a/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts b/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts index 60c77d18241b3b..9a42f386249448 100644 --- a/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts +++ b/test/e2e/app-dir/metadata-dynamic-routes/index.test.ts @@ -8,7 +8,7 @@ const CACHE_HEADERS = { REVALIDATE: 'public, max-age=0, must-revalidate', } -const hashRegex = /\?\w+$/ +const hashRegex = /\?\w+/ createNextDescribe( 'app dir - metadata dynamic routes', @@ -160,12 +160,12 @@ createNextDescribe( // slug is id param from generateImageMetadata expect(iconUrls).toMatchObject([ { - href: '/dynamic/big/icon-48jo90/small', + href: '/dynamic/big/icon-ahg52g/small', sizes: '48x48', type: 'image/png', }, { - href: '/dynamic/big/icon-48jo90/medium', + href: '/dynamic/big/icon-ahg52g/medium', sizes: '72x72', type: 'image/png', }, @@ -183,12 +183,12 @@ createNextDescribe( // slug is index by default expect(appleTouchIconUrls).toEqual([ { - href: '/dynamic/big/apple-icon-48jo90/0', + href: '/dynamic/big/apple-icon-ahg52g/0', sizes: '48x48', type: 'image/png', }, { - href: '/dynamic/big/apple-icon-48jo90/1', + href: '/dynamic/big/apple-icon-ahg52g/1', sizes: '64x64', type: 'image/png', }, diff --git a/test/turbopack-tests-manifest.json b/test/turbopack-tests-manifest.json index edcd923eb748c9..08b52e882891eb 100644 --- a/test/turbopack-tests-manifest.json +++ b/test/turbopack-tests-manifest.json @@ -3313,13 +3313,13 @@ "app dir - metadata dynamic routes social image routes should support generate multi sitemaps with generateSitemaps", "app dir - metadata dynamic routes text routes should handle robots.[ext] dynamic routes", "app dir - metadata dynamic routes text routes should handle sitemap.[ext] dynamic routes", - "app dir - metadata dynamic routes text routes should not throw if client components are imported but not used" + "app dir - metadata dynamic routes text routes should not throw if client components are imported but not used", + "app dir - metadata dynamic routes social image routes should fill params into routes groups url of static images", + "app dir - metadata dynamic routes social image routes should support params as argument in dynamic routes", + "app dir - metadata dynamic routes should generate unique path for image routes under group routes" ], "failed": [ - "app dir - metadata dynamic routes should generate unique path for image routes under group routes", - "app dir - metadata dynamic routes social image routes should fill params into routes groups url of static images", - "app dir - metadata dynamic routes social image routes should handle custom fonts in both edge and nodejs runtime", - "app dir - metadata dynamic routes social image routes should support params as argument in dynamic routes" + "app dir - metadata dynamic routes social image routes should handle custom fonts in both edge and nodejs runtime" ], "pending": [], "flakey": [],