next 15.5.1-canary.38 → 15.5.1-canary.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/index.js +3 -3
  3. package/dist/build/swc/index.js +1 -1
  4. package/dist/build/webpack/loaders/next-metadata-route-loader.js +20 -9
  5. package/dist/build/webpack/loaders/next-metadata-route-loader.js.map +1 -1
  6. package/dist/build/webpack-config.js +2 -2
  7. package/dist/client/app-bootstrap.js +1 -1
  8. package/dist/client/index.js +1 -1
  9. package/dist/compiled/next-server/pages-api-turbo.runtime.prod.js +1 -1
  10. package/dist/compiled/next-server/pages-api-turbo.runtime.prod.js.map +1 -1
  11. package/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
  12. package/dist/compiled/next-server/pages-turbo.runtime.prod.js.map +1 -1
  13. package/dist/esm/build/index.js +3 -3
  14. package/dist/esm/build/swc/index.js +1 -1
  15. package/dist/esm/build/webpack/loaders/next-metadata-route-loader.js +20 -9
  16. package/dist/esm/build/webpack/loaders/next-metadata-route-loader.js.map +1 -1
  17. package/dist/esm/build/webpack-config.js +2 -2
  18. package/dist/esm/client/app-bootstrap.js +1 -1
  19. package/dist/esm/client/index.js +1 -1
  20. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  21. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  22. package/dist/esm/server/lib/app-info-log.js +1 -1
  23. package/dist/esm/server/lib/start-server.js +1 -1
  24. package/dist/esm/shared/lib/canary-only.js +1 -1
  25. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  26. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  27. package/dist/server/lib/app-info-log.js +1 -1
  28. package/dist/server/lib/start-server.js +1 -1
  29. package/dist/shared/lib/canary-only.js +1 -1
  30. package/dist/telemetry/anonymous-meta.js +1 -1
  31. package/dist/telemetry/events/session-stopped.js +2 -2
  32. package/dist/telemetry/events/version.js +2 -2
  33. package/package.json +15 -15
@@ -303,7 +303,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
303
303
  const nextBuildSpan = trace('next-build', undefined, {
304
304
  buildMode: experimentalBuildMode,
305
305
  isTurboBuild: String(isTurbopack),
306
- version: "15.5.1-canary.38"
306
+ version: "15.5.1-canary.39"
307
307
  });
308
308
  NextBuildContext.nextBuildSpan = nextBuildSpan;
309
309
  NextBuildContext.dir = dir;
@@ -782,7 +782,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
782
782
  // Files outside of the distDir can be "type": "module"
783
783
  await writeFileUtf8(path.join(distDir, 'package.json'), '{"type": "commonjs"}');
784
784
  // These are written to distDir, so they need to come after creating and cleaning distDr.
785
- await recordFrameworkVersion("15.5.1-canary.38");
785
+ await recordFrameworkVersion("15.5.1-canary.39");
786
786
  await updateBuildDiagnostics({
787
787
  buildStage: 'start'
788
788
  });
@@ -2441,7 +2441,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
2441
2441
  distDir,
2442
2442
  config,
2443
2443
  staticPages,
2444
- nextVersion: "15.5.1-canary.38",
2444
+ nextVersion: "15.5.1-canary.39",
2445
2445
  tracingRoot: outputFileTracingRoot,
2446
2446
  hasNodeMiddleware,
2447
2447
  hasInstrumentationHook,
@@ -11,7 +11,7 @@ import { isDeepStrictEqual } from 'util';
11
11
  import { getDefineEnv } from '../define-env';
12
12
  import { getReactCompilerLoader } from '../get-babel-loader-config';
13
13
  import { throwTurbopackInternalError } from '../../shared/lib/turbopack/internal-error';
14
- const nextVersion = "15.5.1-canary.38";
14
+ const nextVersion = "15.5.1-canary.39";
15
15
  const ArchName = arch();
16
16
  const PlatformName = platform();
17
17
  function infoLog(...args) {
@@ -116,12 +116,18 @@ ${errorOnBadHandler(resourcePath)}
116
116
  ${await createReExportsCode(resourcePath, loaderContext)}
117
117
 
118
118
  export async function GET(_, ctx) {
119
- const params = await ctx.params
120
- const { __metadata_id__, ...rest } = params || {}
121
- const restParams = params ? rest : undefined
119
+ const paramsPromise = ctx.params
120
+ const idPromise = paramsPromise.then(params => params?.__metadata_id__)
121
+ const restParamsPromise = paramsPromise.then(params => {
122
+ if (!params) return undefined
123
+ const { __metadata_id__, ...rest } = params
124
+ return rest
125
+ })
122
126
 
123
127
  ${''}
124
128
  if (process.env.NODE_ENV !== 'production') {
129
+ const restParams = await restParamsPromise
130
+ const __metadata_id__ = await idPromise
125
131
  const imageMetadata = await generateImageMetadata({ params: restParams })
126
132
  const id = imageMetadata.find((item) => {
127
133
  if (item?.id == null) {
@@ -138,7 +144,7 @@ export async function GET(_, ctx) {
138
144
  }
139
145
  }
140
146
 
141
- return handler({ params: restParams, id: __metadata_id__ })
147
+ return handler({ params: restParamsPromise, id: idPromise })
142
148
  }
143
149
 
144
150
  export const dynamicParams = false
@@ -166,7 +172,7 @@ ${errorOnBadHandler(resourcePath)}
166
172
  ${await createReExportsCode(resourcePath, loaderContext)}
167
173
 
168
174
  export async function GET(_, ctx) {
169
- return handler({ params: await ctx.params })
175
+ return handler({ params: ctx.params })
170
176
  }
171
177
  `;
172
178
  }
@@ -220,10 +226,12 @@ ${errorOnBadHandler(resourcePath)}
220
226
  ${await createReExportsCode(resourcePath, loaderContext)}
221
227
 
222
228
  export async function GET(_, ctx) {
223
- const { __metadata_id__: id, ...params } = await ctx.params || {}
224
- const hasXmlExtension = id ? id.endsWith('.xml') : false
229
+ const paramsPromise = ctx.params
230
+ const idPromise = paramsPromise.then(params => params?.__metadata_id__)
225
231
 
226
232
  if (process.env.NODE_ENV !== 'production') {
233
+ const id = await idPromise
234
+ const hasXmlExtension = id ? id.endsWith('.xml') : false
227
235
  const sitemaps = await generateSitemaps()
228
236
  let foundId
229
237
  for (const item of sitemaps) {
@@ -243,8 +251,11 @@ export async function GET(_, ctx) {
243
251
  }
244
252
  }
245
253
 
246
- const targetId = id && hasXmlExtension ? id.slice(0, -4) : undefined
247
- const data = await handler({ id: targetId })
254
+ const targetIdPromise = idPromise.then(id => {
255
+ const hasXmlExtension = id ? id.endsWith('.xml') : false
256
+ return id && hasXmlExtension ? id.slice(0, -4) : undefined
257
+ })
258
+ const data = await handler({ id: targetIdPromise })
248
259
  const content = resolveRouteData(data, fileType)
249
260
 
250
261
  return new NextResponse(content, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/build/webpack/loaders/next-metadata-route-loader.ts"],"sourcesContent":["import type webpack from 'webpack'\nimport fs from 'fs'\nimport path from 'path'\nimport { imageExtMimeTypeMap } from '../../../lib/mime-type'\nimport { getLoaderModuleNamedExports } from './utils'\n\nfunction errorOnBadHandler(resourcePath: string) {\n return `\n if (typeof handler !== 'function') {\n throw new Error('Default export is missing in ${JSON.stringify(\n resourcePath\n )}')\n }\n `\n}\n\n/* re-export the userland route configs */\nasync function createReExportsCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n // Re-export configs but avoid conflicted exports\n const reExportNames = exportNames.filter(\n (name) =>\n name !== 'default' &&\n name !== 'generateSitemaps' &&\n name !== 'dynamicParams'\n )\n\n return reExportNames.length > 0\n ? `export { ${reExportNames.join(', ')} } from ${JSON.stringify(\n resourcePath\n )}\\n`\n : ''\n}\n\nconst CACHE_HEADERS = {\n NO_CACHE: 'no-cache, no-store',\n REVALIDATE: 'public, max-age=0, must-revalidate',\n}\n\nexport type MetadataRouteLoaderOptions = {\n // Using separate argument to avoid json being parsed and hit error\n // x-ref: https://github.com/vercel/next.js/pull/62615\n filePath: string\n isDynamicRouteExtension: '1' | '0'\n}\n\nexport function getFilenameAndExtension(resourcePath: string) {\n const filename = path.basename(resourcePath)\n const [name, ext] = filename.split('.', 2)\n return {\n name,\n ext,\n }\n}\n\nfunction getContentType(resourcePath: string) {\n let { name, ext } = getFilenameAndExtension(resourcePath)\n if (ext === 'jpg') ext = 'jpeg'\n\n if (name === 'favicon' && ext === 'ico') return 'image/x-icon'\n if (name === 'sitemap') return 'application/xml'\n if (name === 'robots') return 'text/plain'\n if (name === 'manifest') return 'application/manifest+json'\n\n if (ext === 'png' || ext === 'jpeg' || ext === 'ico' || ext === 'svg') {\n return imageExtMimeTypeMap[ext]\n }\n return 'text/plain'\n}\n\nasync function getStaticAssetRouteCode(\n resourcePath: string,\n fileBaseName: string\n) {\n const cache =\n process.env.NODE_ENV !== 'production'\n ? CACHE_HEADERS.NO_CACHE\n : CACHE_HEADERS.REVALIDATE\n\n const isTwitter = fileBaseName === 'twitter-image'\n const isOpenGraph = fileBaseName === 'opengraph-image'\n // Twitter image file size limit is 5MB.\n // General Open Graph image file size limit is 8MB.\n // x-ref: https://developer.x.com/en/docs/x-for-websites/cards/overview/summary\n // x-ref(facebook): https://developers.facebook.com/docs/sharing/webmasters/images\n const fileSizeLimit = isTwitter ? 5 : 8\n const imgName = isTwitter ? 'Twitter' : 'Open Graph'\n\n const code = `\\\n/* static asset route */\nimport { NextResponse } from 'next/server'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst buffer = Buffer.from(${JSON.stringify(\n (await fs.promises.readFile(resourcePath)).toString('base64')\n )}, 'base64'\n )\n\nif (${isTwitter || isOpenGraph}) {\n const fileSizeInMB = buffer.byteLength / 1024 / 1024\n if (fileSizeInMB > ${fileSizeLimit}) {\n throw new Error('File size for ${imgName} image ${JSON.stringify(resourcePath)} exceeds ${fileSizeLimit}MB. ' +\n \\`(Current: \\${fileSizeInMB.toFixed(2)}MB)\\n\\` +\n 'Read more: https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image#image-files-jpg-png-gif'\n )\n }\n}\n\nexport function GET() {\n return new NextResponse(buffer, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(cache)},\n },\n })\n}\n\nexport const dynamic = 'force-static'\n`\n return code\n}\n\nasync function getDynamicTextRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic asset route */\nimport { NextResponse } from 'next/server'\nimport handler from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route with generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateImageMetadata } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const params = await ctx.params\n const { __metadata_id__, ...rest } = params || {}\n const restParams = params ? rest : undefined\n \n ${/* we need a dev assertion for id since dynamicParams=false won't work well in dev */ ''}\n if (process.env.NODE_ENV !== 'production') {\n const imageMetadata = await generateImageMetadata({ params: restParams })\n const id = imageMetadata.find((item) => {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n\n return item.id.toString() === __metadata_id__\n })?.id\n\n if (id == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n }\n\n return handler({ params: restParams, id: __metadata_id__ })\n}\n\nexport const dynamicParams = false\nexport async function generateStaticParams({ params }) {\n const imageMetadata = await generateImageMetadata({ params })\n const staticParams = []\n\n for (const item of imageMetadata) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n staticParams.push({ __metadata_id__: item.id.toString() })\n }\n return staticParams\n}\n`\n}\n\nasync function getSingleImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route without generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n return handler({ params: await ctx.params })\n}\n`\n}\n\n// <metadata-image>/[id]/route.js\nasync function getImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateParamsExport = exportNames.includes('generateImageMetadata')\n\n if (hasGenerateParamsExport) {\n return getDynamicImageRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleImageRouteCode(resourcePath, loaderContext)\n }\n}\n\nasync function getSingleSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* single sitemap route */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const code = `\\\n/* dynamic sitemap route with generateSitemaps */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateSitemaps } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const { __metadata_id__: id, ...params } = await ctx.params || {}\n const hasXmlExtension = id ? id.endsWith('.xml') : false\n\n if (process.env.NODE_ENV !== 'production') {\n const sitemaps = await generateSitemaps()\n let foundId\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n \n const baseId = id && hasXmlExtension ? id.slice(0, -4) : undefined\n if (item.id.toString() === baseId) {\n foundId = item.id\n }\n }\n if (foundId == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n }\n\n const targetId = id && hasXmlExtension ? id.slice(0, -4) : undefined\n const data = await handler({ id: targetId })\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n\nexport const dynamicParams = false\nexport async function generateStaticParams() {\n const sitemaps = await generateSitemaps()\n const params = []\n\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n params.push({ __metadata_id__: item.id.toString() + '.xml' })\n }\n return params\n}\n`\n return code\n}\n\n// <metadata-sitemap>/[id]/route.js\nasync function getSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateSitemaps = exportNames.includes('generateSitemaps')\n\n if (hasGenerateSitemaps) {\n return getDynamicSitemapRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleSitemapRouteCode(resourcePath, loaderContext)\n }\n}\n\n// When it's static route, it could be favicon.ico, sitemap.xml, robots.txt etc.\n// TODO-METADATA: improve the cache control strategy\nconst nextMetadataRouterLoader: webpack.LoaderDefinitionFunction<MetadataRouteLoaderOptions> =\n async function () {\n const { isDynamicRouteExtension, filePath } = this.getOptions()\n const { name: fileBaseName } = getFilenameAndExtension(filePath)\n this.addDependency(filePath)\n\n let code = ''\n if (isDynamicRouteExtension === '1') {\n if (fileBaseName === 'robots' || fileBaseName === 'manifest') {\n code = await getDynamicTextRouteCode(filePath, this)\n } else if (fileBaseName === 'sitemap') {\n code = await getSitemapRouteCode(filePath, this)\n } else {\n code = await getImageRouteCode(filePath, this)\n }\n } else {\n code = await getStaticAssetRouteCode(filePath, fileBaseName)\n }\n\n return code\n }\n\nexport default nextMetadataRouterLoader\n"],"names":["fs","path","imageExtMimeTypeMap","getLoaderModuleNamedExports","errorOnBadHandler","resourcePath","JSON","stringify","createReExportsCode","loaderContext","exportNames","reExportNames","filter","name","length","join","CACHE_HEADERS","NO_CACHE","REVALIDATE","getFilenameAndExtension","filename","basename","ext","split","getContentType","getStaticAssetRouteCode","fileBaseName","cache","process","env","NODE_ENV","isTwitter","isOpenGraph","fileSizeLimit","imgName","code","promises","readFile","toString","getDynamicTextRouteCode","getDynamicImageRouteCode","getSingleImageRouteCode","getImageRouteCode","hasGenerateParamsExport","includes","getSingleSitemapRouteCode","getDynamicSitemapRouteCode","getSitemapRouteCode","hasGenerateSitemaps","nextMetadataRouterLoader","isDynamicRouteExtension","filePath","getOptions","addDependency"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../src/build/webpack/loaders/next-metadata-route-loader.ts"],"sourcesContent":["import type webpack from 'webpack'\nimport fs from 'fs'\nimport path from 'path'\nimport { imageExtMimeTypeMap } from '../../../lib/mime-type'\nimport { getLoaderModuleNamedExports } from './utils'\n\nfunction errorOnBadHandler(resourcePath: string) {\n return `\n if (typeof handler !== 'function') {\n throw new Error('Default export is missing in ${JSON.stringify(\n resourcePath\n )}')\n }\n `\n}\n\n/* re-export the userland route configs */\nasync function createReExportsCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n // Re-export configs but avoid conflicted exports\n const reExportNames = exportNames.filter(\n (name) =>\n name !== 'default' &&\n name !== 'generateSitemaps' &&\n name !== 'dynamicParams'\n )\n\n return reExportNames.length > 0\n ? `export { ${reExportNames.join(', ')} } from ${JSON.stringify(\n resourcePath\n )}\\n`\n : ''\n}\n\nconst CACHE_HEADERS = {\n NO_CACHE: 'no-cache, no-store',\n REVALIDATE: 'public, max-age=0, must-revalidate',\n}\n\nexport type MetadataRouteLoaderOptions = {\n // Using separate argument to avoid json being parsed and hit error\n // x-ref: https://github.com/vercel/next.js/pull/62615\n filePath: string\n isDynamicRouteExtension: '1' | '0'\n}\n\nexport function getFilenameAndExtension(resourcePath: string) {\n const filename = path.basename(resourcePath)\n const [name, ext] = filename.split('.', 2)\n return {\n name,\n ext,\n }\n}\n\nfunction getContentType(resourcePath: string) {\n let { name, ext } = getFilenameAndExtension(resourcePath)\n if (ext === 'jpg') ext = 'jpeg'\n\n if (name === 'favicon' && ext === 'ico') return 'image/x-icon'\n if (name === 'sitemap') return 'application/xml'\n if (name === 'robots') return 'text/plain'\n if (name === 'manifest') return 'application/manifest+json'\n\n if (ext === 'png' || ext === 'jpeg' || ext === 'ico' || ext === 'svg') {\n return imageExtMimeTypeMap[ext]\n }\n return 'text/plain'\n}\n\nasync function getStaticAssetRouteCode(\n resourcePath: string,\n fileBaseName: string\n) {\n const cache =\n process.env.NODE_ENV !== 'production'\n ? CACHE_HEADERS.NO_CACHE\n : CACHE_HEADERS.REVALIDATE\n\n const isTwitter = fileBaseName === 'twitter-image'\n const isOpenGraph = fileBaseName === 'opengraph-image'\n // Twitter image file size limit is 5MB.\n // General Open Graph image file size limit is 8MB.\n // x-ref: https://developer.x.com/en/docs/x-for-websites/cards/overview/summary\n // x-ref(facebook): https://developers.facebook.com/docs/sharing/webmasters/images\n const fileSizeLimit = isTwitter ? 5 : 8\n const imgName = isTwitter ? 'Twitter' : 'Open Graph'\n\n const code = `\\\n/* static asset route */\nimport { NextResponse } from 'next/server'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst buffer = Buffer.from(${JSON.stringify(\n (await fs.promises.readFile(resourcePath)).toString('base64')\n )}, 'base64'\n )\n\nif (${isTwitter || isOpenGraph}) {\n const fileSizeInMB = buffer.byteLength / 1024 / 1024\n if (fileSizeInMB > ${fileSizeLimit}) {\n throw new Error('File size for ${imgName} image ${JSON.stringify(resourcePath)} exceeds ${fileSizeLimit}MB. ' +\n \\`(Current: \\${fileSizeInMB.toFixed(2)}MB)\\n\\` +\n 'Read more: https://nextjs.org/docs/app/api-reference/file-conventions/metadata/opengraph-image#image-files-jpg-png-gif'\n )\n }\n}\n\nexport function GET() {\n return new NextResponse(buffer, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(cache)},\n },\n })\n}\n\nexport const dynamic = 'force-static'\n`\n return code\n}\n\nasync function getDynamicTextRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic asset route */\nimport { NextResponse } from 'next/server'\nimport handler from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route with generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateImageMetadata } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const paramsPromise = ctx.params\n const idPromise = paramsPromise.then(params => params?.__metadata_id__)\n const restParamsPromise = paramsPromise.then(params => {\n if (!params) return undefined\n const { __metadata_id__, ...rest } = params\n return rest\n })\n \n ${/* we need a dev assertion for id since dynamicParams=false won't work well in dev */ ''}\n if (process.env.NODE_ENV !== 'production') {\n const restParams = await restParamsPromise\n const __metadata_id__ = await idPromise\n const imageMetadata = await generateImageMetadata({ params: restParams })\n const id = imageMetadata.find((item) => {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n\n return item.id.toString() === __metadata_id__\n })?.id\n\n if (id == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n }\n\n return handler({ params: restParamsPromise, id: idPromise })\n}\n\nexport const dynamicParams = false\nexport async function generateStaticParams({ params }) {\n const imageMetadata = await generateImageMetadata({ params })\n const staticParams = []\n\n for (const item of imageMetadata) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateImageMetadata')\n }\n staticParams.push({ __metadata_id__: item.id.toString() })\n }\n return staticParams\n}\n`\n}\n\nasync function getSingleImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* dynamic image route without generateImageMetadata */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n return handler({ params: ctx.params })\n}\n`\n}\n\n// <metadata-image>/[id]/route.js\nasync function getImageRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateParamsExport = exportNames.includes('generateImageMetadata')\n\n if (hasGenerateParamsExport) {\n return getDynamicImageRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleImageRouteCode(resourcePath, loaderContext)\n }\n}\n\nasync function getSingleSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n return `\\\n/* single sitemap route */\nimport { NextResponse } from 'next/server'\nimport { default as handler } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET() {\n const data = await handler()\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n`\n}\n\nasync function getDynamicSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const code = `\\\n/* dynamic sitemap route with generateSitemaps */\nimport { NextResponse } from 'next/server'\nimport { default as handler, generateSitemaps } from ${JSON.stringify(resourcePath)}\nimport { resolveRouteData } from 'next/dist/build/webpack/loaders/metadata/resolve-route-data'\n\nconst contentType = ${JSON.stringify(getContentType(resourcePath))}\nconst fileType = ${JSON.stringify(getFilenameAndExtension(resourcePath).name)}\n\n${errorOnBadHandler(resourcePath)}\n${await createReExportsCode(resourcePath, loaderContext)}\n\nexport async function GET(_, ctx) {\n const paramsPromise = ctx.params\n const idPromise = paramsPromise.then(params => params?.__metadata_id__)\n\n if (process.env.NODE_ENV !== 'production') {\n const id = await idPromise\n const hasXmlExtension = id ? id.endsWith('.xml') : false\n const sitemaps = await generateSitemaps()\n let foundId\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n \n const baseId = id && hasXmlExtension ? id.slice(0, -4) : undefined\n if (item.id.toString() === baseId) {\n foundId = item.id\n }\n }\n if (foundId == null) {\n return new NextResponse('Not Found', {\n status: 404,\n })\n }\n }\n\n const targetIdPromise = idPromise.then(id => {\n const hasXmlExtension = id ? id.endsWith('.xml') : false\n return id && hasXmlExtension ? id.slice(0, -4) : undefined\n })\n const data = await handler({ id: targetIdPromise })\n const content = resolveRouteData(data, fileType)\n\n return new NextResponse(content, {\n headers: {\n 'Content-Type': contentType,\n 'Cache-Control': ${JSON.stringify(CACHE_HEADERS.REVALIDATE)},\n },\n })\n}\n\nexport const dynamicParams = false\nexport async function generateStaticParams() {\n const sitemaps = await generateSitemaps()\n const params = []\n\n for (const item of sitemaps) {\n if (item?.id == null) {\n throw new Error('id property is required for every item returned from generateSitemaps')\n }\n params.push({ __metadata_id__: item.id.toString() + '.xml' })\n }\n return params\n}\n`\n return code\n}\n\n// <metadata-sitemap>/[id]/route.js\nasync function getSitemapRouteCode(\n resourcePath: string,\n loaderContext: webpack.LoaderContext<any>\n) {\n const exportNames = await getLoaderModuleNamedExports(\n resourcePath,\n loaderContext\n )\n\n const hasGenerateSitemaps = exportNames.includes('generateSitemaps')\n\n if (hasGenerateSitemaps) {\n return getDynamicSitemapRouteCode(resourcePath, loaderContext)\n } else {\n return getSingleSitemapRouteCode(resourcePath, loaderContext)\n }\n}\n\n// When it's static route, it could be favicon.ico, sitemap.xml, robots.txt etc.\n// TODO-METADATA: improve the cache control strategy\nconst nextMetadataRouterLoader: webpack.LoaderDefinitionFunction<MetadataRouteLoaderOptions> =\n async function () {\n const { isDynamicRouteExtension, filePath } = this.getOptions()\n const { name: fileBaseName } = getFilenameAndExtension(filePath)\n this.addDependency(filePath)\n\n let code = ''\n if (isDynamicRouteExtension === '1') {\n if (fileBaseName === 'robots' || fileBaseName === 'manifest') {\n code = await getDynamicTextRouteCode(filePath, this)\n } else if (fileBaseName === 'sitemap') {\n code = await getSitemapRouteCode(filePath, this)\n } else {\n code = await getImageRouteCode(filePath, this)\n }\n } else {\n code = await getStaticAssetRouteCode(filePath, fileBaseName)\n }\n\n return code\n }\n\nexport default nextMetadataRouterLoader\n"],"names":["fs","path","imageExtMimeTypeMap","getLoaderModuleNamedExports","errorOnBadHandler","resourcePath","JSON","stringify","createReExportsCode","loaderContext","exportNames","reExportNames","filter","name","length","join","CACHE_HEADERS","NO_CACHE","REVALIDATE","getFilenameAndExtension","filename","basename","ext","split","getContentType","getStaticAssetRouteCode","fileBaseName","cache","process","env","NODE_ENV","isTwitter","isOpenGraph","fileSizeLimit","imgName","code","promises","readFile","toString","getDynamicTextRouteCode","getDynamicImageRouteCode","getSingleImageRouteCode","getImageRouteCode","hasGenerateParamsExport","includes","getSingleSitemapRouteCode","getDynamicSitemapRouteCode","getSitemapRouteCode","hasGenerateSitemaps","nextMetadataRouterLoader","isDynamicRouteExtension","filePath","getOptions","addDependency"],"mappings":"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","ignoreList":[0]}
@@ -1608,7 +1608,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1608
1608
  isClient && new CopyFilePlugin({
1609
1609
  // file path to build output of `@next/polyfill-nomodule`
1610
1610
  filePath: require.resolve('./polyfills/polyfill-nomodule'),
1611
- cacheKey: "15.5.1-canary.38",
1611
+ cacheKey: "15.5.1-canary.39",
1612
1612
  name: `static/chunks/polyfills${dev ? '' : '-[hash]'}.js`,
1613
1613
  minimize: false,
1614
1614
  info: {
@@ -1792,7 +1792,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1792
1792
  // - Next.js location on disk (some loaders use absolute paths and some resolve options depend on absolute paths)
1793
1793
  // - Next.js version
1794
1794
  // - next.config.js keys that affect compilation
1795
- version: `${__dirname}|${"15.5.1-canary.38"}|${configVars}`,
1795
+ version: `${__dirname}|${"15.5.1-canary.39"}|${configVars}`,
1796
1796
  cacheDirectory: path.join(distDir, 'cache', 'webpack'),
1797
1797
  // For production builds, it's more efficient to compress all cache files together instead of compression each one individually.
1798
1798
  // So we disable compression here and allow the build runner to take care of compressing the cache as a whole.
@@ -5,7 +5,7 @@
5
5
  * - next/script with `beforeInteractive` strategy
6
6
  */ import { getAssetPrefix } from './asset-prefix';
7
7
  import { setAttributesFromProps } from './set-attributes-from-props';
8
- const version = "15.5.1-canary.38";
8
+ const version = "15.5.1-canary.39";
9
9
  window.next = {
10
10
  version,
11
11
  appDir: true
@@ -26,7 +26,7 @@ import { SearchParamsContext, PathParamsContext } from '../shared/lib/hooks-clie
26
26
  import { onRecoverableError } from './react-client-callbacks/on-recoverable-error';
27
27
  import tracer from './tracing/tracer';
28
28
  import { isNextRouterError } from './components/is-next-router-error';
29
- export const version = "15.5.1-canary.38";
29
+ export const version = "15.5.1-canary.39";
30
30
  export let router;
31
31
  export const emitter = mitt();
32
32
  const looseToArray = (input)=>[].slice.call(input);
@@ -90,7 +90,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
90
90
  }
91
91
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
92
92
  const hotReloaderSpan = trace('hot-reloader', undefined, {
93
- version: "15.5.1-canary.38"
93
+ version: "15.5.1-canary.39"
94
94
  });
95
95
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
96
96
  // of the current `next dev` invocation.
@@ -158,7 +158,7 @@ export default class HotReloaderWebpack {
158
158
  this.previewProps = previewProps;
159
159
  this.rewrites = rewrites;
160
160
  this.hotReloaderSpan = trace('hot-reloader', undefined, {
161
- version: "15.5.1-canary.38"
161
+ version: "15.5.1-canary.39"
162
162
  });
163
163
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
164
164
  // of the current `next dev` invocation.
@@ -14,7 +14,7 @@ export function logStartInfo({ networkUrl, appUrl, envInfo, experimentalFeatures
14
14
  bundlerSuffix = ' (webpack)';
15
15
  }
16
16
  }
17
- Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.5.1-canary.38"}`))}${bundlerSuffix}`);
17
+ Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.5.1-canary.39"}`))}${bundlerSuffix}`);
18
18
  if (appUrl) {
19
19
  Log.bootstrap(`- Local: ${appUrl}`);
20
20
  }
@@ -111,7 +111,7 @@ export async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup,
111
111
  export async function startServer(serverOptions) {
112
112
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
113
113
  let { port } = serverOptions;
114
- process.title = `next-server (v${"15.5.1-canary.38"})`;
114
+ process.title = `next-server (v${"15.5.1-canary.39"})`;
115
115
  let handlersReady = ()=>{};
116
116
  let handlersError = ()=>{};
117
117
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -1,6 +1,6 @@
1
1
  export function isStableBuild() {
2
2
  var _process_env___NEXT_VERSION;
3
- return !((_process_env___NEXT_VERSION = "15.5.1-canary.38") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
3
+ return !((_process_env___NEXT_VERSION = "15.5.1-canary.39") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
4
4
  }
5
5
  export class CanaryOnlyError extends Error {
6
6
  constructor(arg){
@@ -146,7 +146,7 @@ async function createHotReloaderTurbopack(opts, serverFields, distDir, resetFetc
146
146
  }
147
147
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
148
148
  const hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
149
- version: "15.5.1-canary.38"
149
+ version: "15.5.1-canary.39"
150
150
  });
151
151
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
152
152
  // of the current `next dev` invocation.
@@ -226,7 +226,7 @@ class HotReloaderWebpack {
226
226
  this.previewProps = previewProps;
227
227
  this.rewrites = rewrites;
228
228
  this.hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
229
- version: "15.5.1-canary.38"
229
+ version: "15.5.1-canary.39"
230
230
  });
231
231
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
232
232
  // of the current `next dev` invocation.
@@ -82,7 +82,7 @@ function logStartInfo({ networkUrl, appUrl, envInfo, experimentalFeatures, logBu
82
82
  bundlerSuffix = ' (webpack)';
83
83
  }
84
84
  }
85
- _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.5.1-canary.38"}`))}${bundlerSuffix}`);
85
+ _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.5.1-canary.39"}`))}${bundlerSuffix}`);
86
86
  if (appUrl) {
87
87
  _log.bootstrap(`- Local: ${appUrl}`);
88
88
  }
@@ -179,7 +179,7 @@ async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup, server
179
179
  async function startServer(serverOptions) {
180
180
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
181
181
  let { port } = serverOptions;
182
- process.title = `next-server (v${"15.5.1-canary.38"})`;
182
+ process.title = `next-server (v${"15.5.1-canary.39"})`;
183
183
  let handlersReady = ()=>{};
184
184
  let handlersError = ()=>{};
185
185
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -22,7 +22,7 @@ _export(exports, {
22
22
  });
23
23
  function isStableBuild() {
24
24
  var _process_env___NEXT_VERSION;
25
- return !((_process_env___NEXT_VERSION = "15.5.1-canary.38") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
25
+ return !((_process_env___NEXT_VERSION = "15.5.1-canary.39") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
26
26
  }
27
27
  class CanaryOnlyError extends Error {
28
28
  constructor(arg){
@@ -81,7 +81,7 @@ function getAnonymousMeta() {
81
81
  isWsl: _iswsl.default,
82
82
  isCI: _ciinfo.isCI,
83
83
  ciName: _ciinfo.isCI && _ciinfo.name || null,
84
- nextVersion: "15.5.1-canary.38"
84
+ nextVersion: "15.5.1-canary.39"
85
85
  };
86
86
  return traits;
87
87
  }
@@ -11,11 +11,11 @@ Object.defineProperty(exports, "eventCliSessionStopped", {
11
11
  const EVENT_VERSION = 'NEXT_CLI_SESSION_STOPPED';
12
12
  function eventCliSessionStopped(event) {
13
13
  // This should be an invariant, if it fails our build tooling is broken.
14
- if (typeof "15.5.1-canary.38" !== 'string') {
14
+ if (typeof "15.5.1-canary.39" !== 'string') {
15
15
  return [];
16
16
  }
17
17
  const payload = {
18
- nextVersion: "15.5.1-canary.38",
18
+ nextVersion: "15.5.1-canary.39",
19
19
  nodeVersion: process.version,
20
20
  cliCommand: event.cliCommand,
21
21
  durationMilliseconds: event.durationMilliseconds,
@@ -12,12 +12,12 @@ const EVENT_VERSION = 'NEXT_CLI_SESSION_STARTED';
12
12
  function eventCliSession(nextConfig, event) {
13
13
  var _nextConfig_experimental_staleTimes, _nextConfig_experimental_staleTimes1, _nextConfig_experimental_reactCompiler, _nextConfig_experimental_reactCompiler1;
14
14
  // This should be an invariant, if it fails our build tooling is broken.
15
- if (typeof "15.5.1-canary.38" !== 'string') {
15
+ if (typeof "15.5.1-canary.39" !== 'string') {
16
16
  return [];
17
17
  }
18
18
  const { images, i18n } = nextConfig || {};
19
19
  const payload = {
20
- nextVersion: "15.5.1-canary.38",
20
+ nextVersion: "15.5.1-canary.39",
21
21
  nodeVersion: process.version,
22
22
  cliCommand: event.cliCommand,
23
23
  isSrcDir: event.isSrcDir,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "next",
3
- "version": "15.5.1-canary.38",
3
+ "version": "15.5.1-canary.39",
4
4
  "description": "The React Framework",
5
5
  "main": "./dist/server/next.js",
6
6
  "license": "MIT",
@@ -102,7 +102,7 @@
102
102
  ]
103
103
  },
104
104
  "dependencies": {
105
- "@next/env": "15.5.1-canary.38",
105
+ "@next/env": "15.5.1-canary.39",
106
106
  "@swc/helpers": "0.5.15",
107
107
  "caniuse-lite": "^1.0.30001579",
108
108
  "postcss": "8.4.31",
@@ -132,14 +132,14 @@
132
132
  },
133
133
  "optionalDependencies": {
134
134
  "sharp": "^0.34.3",
135
- "@next/swc-darwin-arm64": "15.5.1-canary.38",
136
- "@next/swc-darwin-x64": "15.5.1-canary.38",
137
- "@next/swc-linux-arm64-gnu": "15.5.1-canary.38",
138
- "@next/swc-linux-arm64-musl": "15.5.1-canary.38",
139
- "@next/swc-linux-x64-gnu": "15.5.1-canary.38",
140
- "@next/swc-linux-x64-musl": "15.5.1-canary.38",
141
- "@next/swc-win32-arm64-msvc": "15.5.1-canary.38",
142
- "@next/swc-win32-x64-msvc": "15.5.1-canary.38"
135
+ "@next/swc-darwin-arm64": "15.5.1-canary.39",
136
+ "@next/swc-darwin-x64": "15.5.1-canary.39",
137
+ "@next/swc-linux-arm64-gnu": "15.5.1-canary.39",
138
+ "@next/swc-linux-arm64-musl": "15.5.1-canary.39",
139
+ "@next/swc-linux-x64-gnu": "15.5.1-canary.39",
140
+ "@next/swc-linux-x64-musl": "15.5.1-canary.39",
141
+ "@next/swc-win32-arm64-msvc": "15.5.1-canary.39",
142
+ "@next/swc-win32-x64-msvc": "15.5.1-canary.39"
143
143
  },
144
144
  "devDependencies": {
145
145
  "@ampproject/toolbox-optimizer": "2.8.3",
@@ -174,11 +174,11 @@
174
174
  "@jest/types": "29.5.0",
175
175
  "@mswjs/interceptors": "0.23.0",
176
176
  "@napi-rs/triples": "1.2.0",
177
- "@next/font": "15.5.1-canary.38",
178
- "@next/polyfill-module": "15.5.1-canary.38",
179
- "@next/polyfill-nomodule": "15.5.1-canary.38",
180
- "@next/react-refresh-utils": "15.5.1-canary.38",
181
- "@next/swc": "15.5.1-canary.38",
177
+ "@next/font": "15.5.1-canary.39",
178
+ "@next/polyfill-module": "15.5.1-canary.39",
179
+ "@next/polyfill-nomodule": "15.5.1-canary.39",
180
+ "@next/react-refresh-utils": "15.5.1-canary.39",
181
+ "@next/swc": "15.5.1-canary.39",
182
182
  "@opentelemetry/api": "1.6.0",
183
183
  "@playwright/test": "1.51.1",
184
184
  "@rspack/core": "1.5.0",