next 15.2.0-canary.28 → 15.2.0-canary.29

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.

Potentially problematic release.


This version of next might be problematic. Click here for more details.

Files changed (144) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/index.js +2 -2
  3. package/dist/build/swc/index.js +1 -1
  4. package/dist/build/webpack/plugins/define-env-plugin.js +2 -1
  5. package/dist/build/webpack/plugins/define-env-plugin.js.map +1 -1
  6. package/dist/build/webpack/plugins/slow-module-detection-plugin.d.ts +12 -0
  7. package/dist/build/webpack/plugins/slow-module-detection-plugin.js +187 -0
  8. package/dist/build/webpack/plugins/slow-module-detection-plugin.js.map +1 -0
  9. package/dist/build/webpack-config.js +19 -4
  10. package/dist/build/webpack-config.js.map +1 -1
  11. package/dist/client/app-bootstrap.js +1 -1
  12. package/dist/client/components/errors/stitched-error.js +3 -3
  13. package/dist/client/components/errors/stitched-error.js.map +1 -1
  14. package/dist/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js +3 -3
  15. package/dist/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js.map +1 -1
  16. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.d.ts +2 -2
  17. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js +273 -144
  18. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
  19. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js +4 -4
  20. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js.map +1 -1
  21. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.d.ts +3 -3
  22. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js +9 -14
  23. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js.map +1 -1
  24. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js +1 -1
  25. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js.map +1 -1
  26. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js +1 -3
  27. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js.map +1 -1
  28. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.d.ts +2 -1
  29. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js +2 -2
  30. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js.map +1 -1
  31. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js +2 -1
  32. package/dist/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js.map +1 -1
  33. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.d.ts +1 -4
  34. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js +2 -3
  35. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
  36. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js +111 -86
  37. package/dist/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js.map +1 -1
  38. package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.d.ts +4 -3
  39. package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js +8 -2
  40. package/dist/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js.map +1 -1
  41. package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.d.ts +14 -0
  42. package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js +49 -0
  43. package/dist/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js.map +1 -0
  44. package/dist/client/components/react-dev-overlay/_experimental/internal/styles/base.js +8 -2
  45. package/dist/client/components/react-dev-overlay/_experimental/internal/styles/base.js.map +1 -1
  46. package/dist/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js +3 -3
  47. package/dist/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js.map +1 -1
  48. package/dist/client/components/react-dev-overlay/internal/styles/Base.js +8 -2
  49. package/dist/client/components/react-dev-overlay/internal/styles/Base.js.map +1 -1
  50. package/dist/client/index.js +1 -1
  51. package/dist/compiled/next-server/app-page-experimental.runtime.dev.js +2 -2
  52. package/dist/compiled/next-server/app-page-experimental.runtime.dev.js.map +1 -1
  53. package/dist/compiled/next-server/app-page.runtime.dev.js +2 -2
  54. package/dist/compiled/next-server/app-page.runtime.dev.js.map +1 -1
  55. package/dist/compiled/next-server/pages-turbo.runtime.prod.js +2 -2
  56. package/dist/compiled/next-server/pages-turbo.runtime.prod.js.map +1 -1
  57. package/dist/compiled/next-server/server.runtime.prod.js +1 -1
  58. package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
  59. package/dist/esm/build/index.js +2 -2
  60. package/dist/esm/build/swc/index.js +1 -1
  61. package/dist/esm/build/webpack/plugins/define-env-plugin.js +2 -1
  62. package/dist/esm/build/webpack/plugins/define-env-plugin.js.map +1 -1
  63. package/dist/esm/build/webpack/plugins/slow-module-detection-plugin.js +177 -0
  64. package/dist/esm/build/webpack/plugins/slow-module-detection-plugin.js.map +1 -0
  65. package/dist/esm/build/webpack-config.js +19 -4
  66. package/dist/esm/build/webpack-config.js.map +1 -1
  67. package/dist/esm/client/app-bootstrap.js +1 -1
  68. package/dist/esm/client/components/errors/stitched-error.js +3 -3
  69. package/dist/esm/client/components/errors/stitched-error.js.map +1 -1
  70. package/dist/esm/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js +3 -3
  71. package/dist/esm/client/components/react-dev-overlay/_experimental/app/react-dev-overlay.js.map +1 -1
  72. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js +274 -146
  73. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.js.map +1 -1
  74. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js +4 -4
  75. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/dev-tools-indicator.stories.js.map +1 -1
  76. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js +9 -15
  77. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/internal/next-logo.js.map +1 -1
  78. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js +1 -1
  79. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/dev-tools-indicator/styles.js.map +1 -1
  80. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js +1 -3
  81. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay/error-overlay.js.map +1 -1
  82. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js +2 -2
  83. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-feedback/error-feedback.js.map +1 -1
  84. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js +2 -1
  85. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/components/errors/error-overlay-footer/error-overlay-footer.js.map +1 -1
  86. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js +2 -3
  87. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.js.map +1 -1
  88. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js +111 -86
  89. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/errors.stories.js.map +1 -1
  90. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js +8 -2
  91. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/container/runtime-error/use-error-hook.js.map +1 -1
  92. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js +33 -0
  93. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/helpers/merge-refs.js.map +1 -0
  94. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/styles/base.js +8 -2
  95. package/dist/esm/client/components/react-dev-overlay/_experimental/internal/styles/base.js.map +1 -1
  96. package/dist/esm/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js +3 -3
  97. package/dist/esm/client/components/react-dev-overlay/_experimental/pages/react-dev-overlay.js.map +1 -1
  98. package/dist/esm/client/components/react-dev-overlay/internal/styles/Base.js +8 -2
  99. package/dist/esm/client/components/react-dev-overlay/internal/styles/Base.js.map +1 -1
  100. package/dist/esm/client/index.js +1 -1
  101. package/dist/esm/export/worker.js +9 -1
  102. package/dist/esm/export/worker.js.map +1 -1
  103. package/dist/esm/lib/turbopack-warning.js +2 -1
  104. package/dist/esm/lib/turbopack-warning.js.map +1 -1
  105. package/dist/esm/server/base-server.js +4 -4
  106. package/dist/esm/server/base-server.js.map +1 -1
  107. package/dist/esm/server/config-schema.js +4 -1
  108. package/dist/esm/server/config-schema.js.map +1 -1
  109. package/dist/esm/server/config-shared.js +2 -1
  110. package/dist/esm/server/config-shared.js.map +1 -1
  111. package/dist/esm/server/config.js +1 -1
  112. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  113. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  114. package/dist/esm/server/lib/app-info-log.js +1 -1
  115. package/dist/esm/server/lib/start-server.js +1 -1
  116. package/dist/esm/server/server-utils.js +22 -19
  117. package/dist/esm/server/server-utils.js.map +1 -1
  118. package/dist/esm/server/web-server.js +2 -2
  119. package/dist/esm/server/web-server.js.map +1 -1
  120. package/dist/export/worker.js +9 -1
  121. package/dist/export/worker.js.map +1 -1
  122. package/dist/lib/turbopack-warning.js +2 -1
  123. package/dist/lib/turbopack-warning.js.map +1 -1
  124. package/dist/server/base-server.js +4 -4
  125. package/dist/server/base-server.js.map +1 -1
  126. package/dist/server/config-schema.js +4 -1
  127. package/dist/server/config-schema.js.map +1 -1
  128. package/dist/server/config-shared.d.ts +11 -0
  129. package/dist/server/config-shared.js +2 -1
  130. package/dist/server/config-shared.js.map +1 -1
  131. package/dist/server/config.js +1 -1
  132. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  133. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  134. package/dist/server/lib/app-info-log.js +1 -1
  135. package/dist/server/lib/start-server.js +1 -1
  136. package/dist/server/server-utils.d.ts +4 -4
  137. package/dist/server/server-utils.js +22 -19
  138. package/dist/server/server-utils.js.map +1 -1
  139. package/dist/server/web-server.js +2 -2
  140. package/dist/server/web-server.js.map +1 -1
  141. package/dist/telemetry/anonymous-meta.js +1 -1
  142. package/dist/telemetry/events/session-stopped.js +2 -2
  143. package/dist/telemetry/events/version.js +2 -2
  144. package/package.json +15 -15
@@ -8,21 +8,20 @@ import { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-
8
8
  import { normalizeRscURL } from '../shared/lib/router/utils/app-paths';
9
9
  import { NEXT_INTERCEPTION_MARKER_PREFIX, NEXT_QUERY_PARAM_PREFIX } from '../lib/constants';
10
10
  import { normalizeNextQueryParam } from './web/utils';
11
- export function normalizeVercelUrl(req, trustQuery, paramKeys, pageIsDynamic, defaultRouteRegex) {
11
+ export function normalizeVercelUrl(req, paramKeys, defaultRouteRegex) {
12
+ if (!defaultRouteRegex) return;
12
13
  // make sure to normalize req.url on Vercel to strip dynamic params
13
14
  // from the query which are added during routing
14
- if (pageIsDynamic && trustQuery && defaultRouteRegex) {
15
- const _parsedUrl = parseUrl(req.url, true);
16
- delete _parsedUrl.search;
17
- for (const key of Object.keys(_parsedUrl.query)){
18
- const isNextQueryPrefix = key !== NEXT_QUERY_PARAM_PREFIX && key.startsWith(NEXT_QUERY_PARAM_PREFIX);
19
- const isNextInterceptionMarkerPrefix = key !== NEXT_INTERCEPTION_MARKER_PREFIX && key.startsWith(NEXT_INTERCEPTION_MARKER_PREFIX);
20
- if (isNextQueryPrefix || isNextInterceptionMarkerPrefix || (paramKeys || Object.keys(defaultRouteRegex.groups)).includes(key)) {
21
- delete _parsedUrl.query[key];
22
- }
15
+ const _parsedUrl = parseUrl(req.url, true);
16
+ delete _parsedUrl.search;
17
+ for (const key of Object.keys(_parsedUrl.query)){
18
+ const isNextQueryPrefix = key !== NEXT_QUERY_PARAM_PREFIX && key.startsWith(NEXT_QUERY_PARAM_PREFIX);
19
+ const isNextInterceptionMarkerPrefix = key !== NEXT_INTERCEPTION_MARKER_PREFIX && key.startsWith(NEXT_INTERCEPTION_MARKER_PREFIX);
20
+ if (isNextQueryPrefix || isNextInterceptionMarkerPrefix || (paramKeys || Object.keys(defaultRouteRegex.groups)).includes(key)) {
21
+ delete _parsedUrl.query[key];
23
22
  }
24
- req.url = formatUrl(_parsedUrl);
25
23
  }
24
+ req.url = formatUrl(_parsedUrl);
26
25
  }
27
26
  export function interpolateDynamicPath(pathname, params, defaultRouteRegex) {
28
27
  if (!defaultRouteRegex) return pathname;
@@ -45,12 +44,8 @@ export function interpolateDynamicPath(pathname, params, defaultRouteRegex) {
45
44
  }
46
45
  return pathname;
47
46
  }
48
- export function normalizeDynamicRouteParams(params, ignoreOptional, defaultRouteRegex, defaultRouteMatches) {
47
+ export function normalizeDynamicRouteParams(params, defaultRouteRegex, defaultRouteMatches) {
49
48
  let hasValidParams = true;
50
- if (!defaultRouteRegex) return {
51
- params,
52
- hasValidParams: false
53
- };
54
49
  params = Object.keys(defaultRouteRegex.groups).reduce((prev, key)=>{
55
50
  let value = params[key];
56
51
  if (typeof value === 'string') {
@@ -72,7 +67,7 @@ export function normalizeDynamicRouteParams(params, ignoreOptional, defaultRoute
72
67
  const isDefaultValue = Array.isArray(defaultValue) ? defaultValue.some((defaultVal)=>{
73
68
  return Array.isArray(value) ? value.some((val)=>val.includes(defaultVal)) : value == null ? void 0 : value.includes(defaultVal);
74
69
  }) : value == null ? void 0 : value.includes(defaultValue);
75
- if (isDefaultValue || typeof value === 'undefined' && !(isOptional && ignoreOptional)) {
70
+ if (isDefaultValue || typeof value === 'undefined' && !isOptional) {
76
71
  hasValidParams = false;
77
72
  }
78
73
  // non-provided optional values should be undefined so normalize
@@ -235,8 +230,16 @@ export function getUtils({ page, i18n, basePath, rewrites, pageIsDynamic, traili
235
230
  dynamicRouteMatcher,
236
231
  defaultRouteMatches,
237
232
  getParamsFromRouteMatches,
238
- normalizeDynamicRouteParams: (params, ignoreOptional)=>normalizeDynamicRouteParams(params, ignoreOptional, defaultRouteRegex, defaultRouteMatches),
239
- normalizeVercelUrl: (req, trustQuery, paramKeys)=>normalizeVercelUrl(req, trustQuery, paramKeys, pageIsDynamic, defaultRouteRegex),
233
+ normalizeDynamicRouteParams: (params)=>{
234
+ if (!defaultRouteRegex || !defaultRouteMatches) {
235
+ return {
236
+ params,
237
+ hasValidParams: false
238
+ };
239
+ }
240
+ return normalizeDynamicRouteParams(params, defaultRouteRegex, defaultRouteMatches);
241
+ },
242
+ normalizeVercelUrl: (req, paramKeys)=>normalizeVercelUrl(req, paramKeys, defaultRouteRegex),
240
243
  interpolateDynamicPath: (pathname, params)=>interpolateDynamicPath(pathname, params, defaultRouteRegex)
241
244
  };
242
245
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/server-utils.ts"],"sourcesContent":["import type { Rewrite } from '../lib/load-custom-routes'\nimport type { RouteMatchFn } from '../shared/lib/router/utils/route-matcher'\nimport type { NextConfig } from './config'\nimport type { BaseNextRequest } from './base-http'\nimport type { ParsedUrlQuery } from 'querystring'\nimport type { UrlWithParsedQuery } from 'url'\n\nimport { format as formatUrl, parse as parseUrl } from 'url'\nimport { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path'\nimport { getPathMatch } from '../shared/lib/router/utils/path-match'\nimport { getNamedRouteRegex } from '../shared/lib/router/utils/route-regex'\nimport { getRouteMatcher } from '../shared/lib/router/utils/route-matcher'\nimport {\n matchHas,\n prepareDestination,\n} from '../shared/lib/router/utils/prepare-destination'\nimport { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash'\nimport { normalizeRscURL } from '../shared/lib/router/utils/app-paths'\nimport {\n NEXT_INTERCEPTION_MARKER_PREFIX,\n NEXT_QUERY_PARAM_PREFIX,\n} from '../lib/constants'\nimport { normalizeNextQueryParam } from './web/utils'\n\nexport function normalizeVercelUrl(\n req: BaseNextRequest,\n trustQuery: boolean,\n paramKeys?: string[],\n pageIsDynamic?: boolean,\n defaultRouteRegex?: ReturnType<typeof getNamedRouteRegex> | undefined\n) {\n // make sure to normalize req.url on Vercel to strip dynamic params\n // from the query which are added during routing\n if (pageIsDynamic && trustQuery && defaultRouteRegex) {\n const _parsedUrl = parseUrl(req.url!, true)\n delete (_parsedUrl as any).search\n\n for (const key of Object.keys(_parsedUrl.query)) {\n const isNextQueryPrefix =\n key !== NEXT_QUERY_PARAM_PREFIX &&\n key.startsWith(NEXT_QUERY_PARAM_PREFIX)\n\n const isNextInterceptionMarkerPrefix =\n key !== NEXT_INTERCEPTION_MARKER_PREFIX &&\n key.startsWith(NEXT_INTERCEPTION_MARKER_PREFIX)\n\n if (\n isNextQueryPrefix ||\n isNextInterceptionMarkerPrefix ||\n (paramKeys || Object.keys(defaultRouteRegex.groups)).includes(key)\n ) {\n delete _parsedUrl.query[key]\n }\n }\n req.url = formatUrl(_parsedUrl)\n }\n}\n\nexport function interpolateDynamicPath(\n pathname: string,\n params: ParsedUrlQuery,\n defaultRouteRegex?: ReturnType<typeof getNamedRouteRegex> | undefined\n) {\n if (!defaultRouteRegex) return pathname\n\n for (const param of Object.keys(defaultRouteRegex.groups)) {\n const { optional, repeat } = defaultRouteRegex.groups[param]\n let builtParam = `[${repeat ? '...' : ''}${param}]`\n\n if (optional) {\n builtParam = `[${builtParam}]`\n }\n\n let paramValue: string\n const value = params[param]\n\n if (Array.isArray(value)) {\n paramValue = value.map((v) => v && encodeURIComponent(v)).join('/')\n } else if (value) {\n paramValue = encodeURIComponent(value)\n } else {\n paramValue = ''\n }\n\n pathname = pathname.replaceAll(builtParam, paramValue)\n }\n\n return pathname\n}\n\nexport function normalizeDynamicRouteParams(\n params: ParsedUrlQuery,\n ignoreOptional?: boolean,\n defaultRouteRegex?: ReturnType<typeof getNamedRouteRegex> | undefined,\n defaultRouteMatches?: ParsedUrlQuery | undefined\n) {\n let hasValidParams = true\n if (!defaultRouteRegex) return { params, hasValidParams: false }\n\n params = Object.keys(defaultRouteRegex.groups).reduce((prev, key) => {\n let value: string | string[] | undefined = params[key]\n\n if (typeof value === 'string') {\n value = normalizeRscURL(value)\n }\n if (Array.isArray(value)) {\n value = value.map((val) => {\n if (typeof val === 'string') {\n val = normalizeRscURL(val)\n }\n return val\n })\n }\n\n // if the value matches the default value we can't rely\n // on the parsed params, this is used to signal if we need\n // to parse x-now-route-matches or not\n const defaultValue = defaultRouteMatches![key]\n const isOptional = defaultRouteRegex!.groups[key].optional\n\n const isDefaultValue = Array.isArray(defaultValue)\n ? defaultValue.some((defaultVal) => {\n return Array.isArray(value)\n ? value.some((val) => val.includes(defaultVal))\n : value?.includes(defaultVal)\n })\n : value?.includes(defaultValue as string)\n\n if (\n isDefaultValue ||\n (typeof value === 'undefined' && !(isOptional && ignoreOptional))\n ) {\n hasValidParams = false\n }\n\n // non-provided optional values should be undefined so normalize\n // them to undefined\n if (\n isOptional &&\n (!value ||\n (Array.isArray(value) &&\n value.length === 1 &&\n // fallback optional catch-all SSG pages have\n // [[...paramName]] for the root path on Vercel\n (value[0] === 'index' || value[0] === `[[...${key}]]`)))\n ) {\n value = undefined\n delete params[key]\n }\n\n // query values from the proxy aren't already split into arrays\n // so make sure to normalize catch-all values\n if (\n value &&\n typeof value === 'string' &&\n defaultRouteRegex!.groups[key].repeat\n ) {\n value = value.split('/')\n }\n\n if (value) {\n prev[key] = value\n }\n return prev\n }, {} as ParsedUrlQuery)\n\n return {\n params,\n hasValidParams,\n }\n}\n\nexport function getUtils({\n page,\n i18n,\n basePath,\n rewrites,\n pageIsDynamic,\n trailingSlash,\n caseSensitive,\n}: {\n page: string\n i18n?: NextConfig['i18n']\n basePath: string\n rewrites: {\n fallback?: ReadonlyArray<Rewrite>\n afterFiles?: ReadonlyArray<Rewrite>\n beforeFiles?: ReadonlyArray<Rewrite>\n }\n pageIsDynamic: boolean\n trailingSlash?: boolean\n caseSensitive: boolean\n}) {\n let defaultRouteRegex: ReturnType<typeof getNamedRouteRegex> | undefined\n let dynamicRouteMatcher: RouteMatchFn | undefined\n let defaultRouteMatches: ParsedUrlQuery | undefined\n\n if (pageIsDynamic) {\n defaultRouteRegex = getNamedRouteRegex(page, {\n prefixRouteKeys: false,\n })\n dynamicRouteMatcher = getRouteMatcher(defaultRouteRegex)\n defaultRouteMatches = dynamicRouteMatcher(page) as ParsedUrlQuery\n }\n\n function handleRewrites(req: BaseNextRequest, parsedUrl: UrlWithParsedQuery) {\n const rewriteParams = {}\n let fsPathname = parsedUrl.pathname\n\n const matchesPage = () => {\n const fsPathnameNoSlash = removeTrailingSlash(fsPathname || '')\n return (\n fsPathnameNoSlash === removeTrailingSlash(page) ||\n dynamicRouteMatcher?.(fsPathnameNoSlash)\n )\n }\n\n const checkRewrite = (rewrite: Rewrite): boolean => {\n const matcher = getPathMatch(\n rewrite.source + (trailingSlash ? '(/)?' : ''),\n {\n removeUnnamedParams: true,\n strict: true,\n sensitive: !!caseSensitive,\n }\n )\n\n if (!parsedUrl.pathname) return false\n\n let params = matcher(parsedUrl.pathname)\n\n if ((rewrite.has || rewrite.missing) && params) {\n const hasParams = matchHas(\n req,\n parsedUrl.query,\n rewrite.has,\n rewrite.missing\n )\n\n if (hasParams) {\n Object.assign(params, hasParams)\n } else {\n params = false\n }\n }\n\n if (params) {\n const { parsedDestination, destQuery } = prepareDestination({\n appendParamsToQuery: true,\n destination: rewrite.destination,\n params: params,\n query: parsedUrl.query,\n })\n\n // if the rewrite destination is external break rewrite chain\n if (parsedDestination.protocol) {\n return true\n }\n\n Object.assign(rewriteParams, destQuery, params)\n Object.assign(parsedUrl.query, parsedDestination.query)\n delete (parsedDestination as any).query\n\n Object.assign(parsedUrl, parsedDestination)\n\n fsPathname = parsedUrl.pathname\n if (!fsPathname) return false\n\n if (basePath) {\n fsPathname = fsPathname.replace(new RegExp(`^${basePath}`), '') || '/'\n }\n\n if (i18n) {\n const result = normalizeLocalePath(fsPathname, i18n.locales)\n fsPathname = result.pathname\n parsedUrl.query.nextInternalLocale =\n result.detectedLocale || params.nextInternalLocale\n }\n\n if (fsPathname === page) {\n return true\n }\n\n if (pageIsDynamic && dynamicRouteMatcher) {\n const dynamicParams = dynamicRouteMatcher(fsPathname)\n if (dynamicParams) {\n parsedUrl.query = {\n ...parsedUrl.query,\n ...dynamicParams,\n }\n return true\n }\n }\n }\n return false\n }\n\n for (const rewrite of rewrites.beforeFiles || []) {\n checkRewrite(rewrite)\n }\n\n if (fsPathname !== page) {\n let finished = false\n\n for (const rewrite of rewrites.afterFiles || []) {\n finished = checkRewrite(rewrite)\n if (finished) break\n }\n\n if (!finished && !matchesPage()) {\n for (const rewrite of rewrites.fallback || []) {\n finished = checkRewrite(rewrite)\n if (finished) break\n }\n }\n }\n return rewriteParams\n }\n\n function getParamsFromRouteMatches(routeMatchesHeader: string) {\n // If we don't have a default route regex, we can't get params from route\n // matches\n if (!defaultRouteRegex) return null\n\n const { groups, routeKeys } = defaultRouteRegex\n\n const matcher = getRouteMatcher({\n re: {\n // Simulate a RegExp match from the \\`req.url\\` input\n exec: (str: string) => {\n // Normalize all the prefixed query params.\n const obj: Record<string, string> = Object.fromEntries(\n new URLSearchParams(str)\n )\n for (const [key, value] of Object.entries(obj)) {\n const normalizedKey = normalizeNextQueryParam(key)\n if (!normalizedKey) continue\n\n obj[normalizedKey] = value\n delete obj[key]\n }\n\n // Use all the named route keys.\n const result = {} as RegExpExecArray\n for (const keyName of Object.keys(routeKeys)) {\n const paramName = routeKeys[keyName]\n\n // If this param name is not a valid parameter name, then skip it.\n if (!paramName) continue\n\n const group = groups[paramName]\n const value = obj[keyName]\n\n // When we're missing a required param, we can't match the route.\n if (!group.optional && !value) return null\n\n result[group.pos] = value\n }\n\n return result\n },\n },\n groups,\n })\n\n const routeMatches = matcher(routeMatchesHeader)\n if (!routeMatches) return null\n\n return routeMatches\n }\n\n return {\n handleRewrites,\n defaultRouteRegex,\n dynamicRouteMatcher,\n defaultRouteMatches,\n getParamsFromRouteMatches,\n normalizeDynamicRouteParams: (\n params: ParsedUrlQuery,\n ignoreOptional?: boolean\n ) =>\n normalizeDynamicRouteParams(\n params,\n ignoreOptional,\n defaultRouteRegex,\n defaultRouteMatches\n ),\n normalizeVercelUrl: (\n req: BaseNextRequest,\n trustQuery: boolean,\n paramKeys?: string[]\n ) =>\n normalizeVercelUrl(\n req,\n trustQuery,\n paramKeys,\n pageIsDynamic,\n defaultRouteRegex\n ),\n interpolateDynamicPath: (\n pathname: string,\n params: Record<string, undefined | string | string[]>\n ) => interpolateDynamicPath(pathname, params, defaultRouteRegex),\n }\n}\n"],"names":["format","formatUrl","parse","parseUrl","normalizeLocalePath","getPathMatch","getNamedRouteRegex","getRouteMatcher","matchHas","prepareDestination","removeTrailingSlash","normalizeRscURL","NEXT_INTERCEPTION_MARKER_PREFIX","NEXT_QUERY_PARAM_PREFIX","normalizeNextQueryParam","normalizeVercelUrl","req","trustQuery","paramKeys","pageIsDynamic","defaultRouteRegex","_parsedUrl","url","search","key","Object","keys","query","isNextQueryPrefix","startsWith","isNextInterceptionMarkerPrefix","groups","includes","interpolateDynamicPath","pathname","params","param","optional","repeat","builtParam","paramValue","value","Array","isArray","map","v","encodeURIComponent","join","replaceAll","normalizeDynamicRouteParams","ignoreOptional","defaultRouteMatches","hasValidParams","reduce","prev","val","defaultValue","isOptional","isDefaultValue","some","defaultVal","length","undefined","split","getUtils","page","i18n","basePath","rewrites","trailingSlash","caseSensitive","dynamicRouteMatcher","prefixRouteKeys","handleRewrites","parsedUrl","rewriteParams","fsPathname","matchesPage","fsPathnameNoSlash","checkRewrite","rewrite","matcher","source","removeUnnamedParams","strict","sensitive","has","missing","hasParams","assign","parsedDestination","destQuery","appendParamsToQuery","destination","protocol","replace","RegExp","result","locales","nextInternalLocale","detectedLocale","dynamicParams","beforeFiles","finished","afterFiles","fallback","getParamsFromRouteMatches","routeMatchesHeader","routeKeys","re","exec","str","obj","fromEntries","URLSearchParams","entries","normalizedKey","keyName","paramName","group","pos","routeMatches"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/server/server-utils.ts"],"sourcesContent":["import type { Rewrite } from '../lib/load-custom-routes'\nimport type { RouteMatchFn } from '../shared/lib/router/utils/route-matcher'\nimport type { NextConfig } from './config'\nimport type { BaseNextRequest } from './base-http'\nimport type { ParsedUrlQuery } from 'querystring'\nimport type { UrlWithParsedQuery } from 'url'\n\nimport { format as formatUrl, parse as parseUrl } from 'url'\nimport { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path'\nimport { getPathMatch } from '../shared/lib/router/utils/path-match'\nimport { getNamedRouteRegex } from '../shared/lib/router/utils/route-regex'\nimport { getRouteMatcher } from '../shared/lib/router/utils/route-matcher'\nimport {\n matchHas,\n prepareDestination,\n} from '../shared/lib/router/utils/prepare-destination'\nimport { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash'\nimport { normalizeRscURL } from '../shared/lib/router/utils/app-paths'\nimport {\n NEXT_INTERCEPTION_MARKER_PREFIX,\n NEXT_QUERY_PARAM_PREFIX,\n} from '../lib/constants'\nimport { normalizeNextQueryParam } from './web/utils'\n\nexport function normalizeVercelUrl(\n req: BaseNextRequest,\n paramKeys: string[],\n defaultRouteRegex: ReturnType<typeof getNamedRouteRegex> | undefined\n) {\n if (!defaultRouteRegex) return\n\n // make sure to normalize req.url on Vercel to strip dynamic params\n // from the query which are added during routing\n const _parsedUrl = parseUrl(req.url!, true)\n delete (_parsedUrl as any).search\n\n for (const key of Object.keys(_parsedUrl.query)) {\n const isNextQueryPrefix =\n key !== NEXT_QUERY_PARAM_PREFIX && key.startsWith(NEXT_QUERY_PARAM_PREFIX)\n\n const isNextInterceptionMarkerPrefix =\n key !== NEXT_INTERCEPTION_MARKER_PREFIX &&\n key.startsWith(NEXT_INTERCEPTION_MARKER_PREFIX)\n\n if (\n isNextQueryPrefix ||\n isNextInterceptionMarkerPrefix ||\n (paramKeys || Object.keys(defaultRouteRegex.groups)).includes(key)\n ) {\n delete _parsedUrl.query[key]\n }\n }\n\n req.url = formatUrl(_parsedUrl)\n}\n\nexport function interpolateDynamicPath(\n pathname: string,\n params: ParsedUrlQuery,\n defaultRouteRegex?: ReturnType<typeof getNamedRouteRegex> | undefined\n) {\n if (!defaultRouteRegex) return pathname\n\n for (const param of Object.keys(defaultRouteRegex.groups)) {\n const { optional, repeat } = defaultRouteRegex.groups[param]\n let builtParam = `[${repeat ? '...' : ''}${param}]`\n\n if (optional) {\n builtParam = `[${builtParam}]`\n }\n\n let paramValue: string\n const value = params[param]\n\n if (Array.isArray(value)) {\n paramValue = value.map((v) => v && encodeURIComponent(v)).join('/')\n } else if (value) {\n paramValue = encodeURIComponent(value)\n } else {\n paramValue = ''\n }\n\n pathname = pathname.replaceAll(builtParam, paramValue)\n }\n\n return pathname\n}\n\nexport function normalizeDynamicRouteParams(\n params: ParsedUrlQuery,\n defaultRouteRegex: ReturnType<typeof getNamedRouteRegex>,\n defaultRouteMatches: ParsedUrlQuery\n) {\n let hasValidParams = true\n params = Object.keys(defaultRouteRegex.groups).reduce((prev, key) => {\n let value: string | string[] | undefined = params[key]\n\n if (typeof value === 'string') {\n value = normalizeRscURL(value)\n }\n if (Array.isArray(value)) {\n value = value.map((val) => {\n if (typeof val === 'string') {\n val = normalizeRscURL(val)\n }\n return val\n })\n }\n\n // if the value matches the default value we can't rely\n // on the parsed params, this is used to signal if we need\n // to parse x-now-route-matches or not\n const defaultValue = defaultRouteMatches![key]\n const isOptional = defaultRouteRegex!.groups[key].optional\n\n const isDefaultValue = Array.isArray(defaultValue)\n ? defaultValue.some((defaultVal) => {\n return Array.isArray(value)\n ? value.some((val) => val.includes(defaultVal))\n : value?.includes(defaultVal)\n })\n : value?.includes(defaultValue as string)\n\n if (isDefaultValue || (typeof value === 'undefined' && !isOptional)) {\n hasValidParams = false\n }\n\n // non-provided optional values should be undefined so normalize\n // them to undefined\n if (\n isOptional &&\n (!value ||\n (Array.isArray(value) &&\n value.length === 1 &&\n // fallback optional catch-all SSG pages have\n // [[...paramName]] for the root path on Vercel\n (value[0] === 'index' || value[0] === `[[...${key}]]`)))\n ) {\n value = undefined\n delete params[key]\n }\n\n // query values from the proxy aren't already split into arrays\n // so make sure to normalize catch-all values\n if (\n value &&\n typeof value === 'string' &&\n defaultRouteRegex!.groups[key].repeat\n ) {\n value = value.split('/')\n }\n\n if (value) {\n prev[key] = value\n }\n return prev\n }, {} as ParsedUrlQuery)\n\n return {\n params,\n hasValidParams,\n }\n}\n\nexport function getUtils({\n page,\n i18n,\n basePath,\n rewrites,\n pageIsDynamic,\n trailingSlash,\n caseSensitive,\n}: {\n page: string\n i18n?: NextConfig['i18n']\n basePath: string\n rewrites: {\n fallback?: ReadonlyArray<Rewrite>\n afterFiles?: ReadonlyArray<Rewrite>\n beforeFiles?: ReadonlyArray<Rewrite>\n }\n pageIsDynamic: boolean\n trailingSlash?: boolean\n caseSensitive: boolean\n}) {\n let defaultRouteRegex: ReturnType<typeof getNamedRouteRegex> | undefined\n let dynamicRouteMatcher: RouteMatchFn | undefined\n let defaultRouteMatches: ParsedUrlQuery | undefined\n\n if (pageIsDynamic) {\n defaultRouteRegex = getNamedRouteRegex(page, {\n prefixRouteKeys: false,\n })\n dynamicRouteMatcher = getRouteMatcher(defaultRouteRegex)\n defaultRouteMatches = dynamicRouteMatcher(page) as ParsedUrlQuery\n }\n\n function handleRewrites(req: BaseNextRequest, parsedUrl: UrlWithParsedQuery) {\n const rewriteParams = {}\n let fsPathname = parsedUrl.pathname\n\n const matchesPage = () => {\n const fsPathnameNoSlash = removeTrailingSlash(fsPathname || '')\n return (\n fsPathnameNoSlash === removeTrailingSlash(page) ||\n dynamicRouteMatcher?.(fsPathnameNoSlash)\n )\n }\n\n const checkRewrite = (rewrite: Rewrite): boolean => {\n const matcher = getPathMatch(\n rewrite.source + (trailingSlash ? '(/)?' : ''),\n {\n removeUnnamedParams: true,\n strict: true,\n sensitive: !!caseSensitive,\n }\n )\n\n if (!parsedUrl.pathname) return false\n\n let params = matcher(parsedUrl.pathname)\n\n if ((rewrite.has || rewrite.missing) && params) {\n const hasParams = matchHas(\n req,\n parsedUrl.query,\n rewrite.has,\n rewrite.missing\n )\n\n if (hasParams) {\n Object.assign(params, hasParams)\n } else {\n params = false\n }\n }\n\n if (params) {\n const { parsedDestination, destQuery } = prepareDestination({\n appendParamsToQuery: true,\n destination: rewrite.destination,\n params: params,\n query: parsedUrl.query,\n })\n\n // if the rewrite destination is external break rewrite chain\n if (parsedDestination.protocol) {\n return true\n }\n\n Object.assign(rewriteParams, destQuery, params)\n Object.assign(parsedUrl.query, parsedDestination.query)\n delete (parsedDestination as any).query\n\n Object.assign(parsedUrl, parsedDestination)\n\n fsPathname = parsedUrl.pathname\n if (!fsPathname) return false\n\n if (basePath) {\n fsPathname = fsPathname.replace(new RegExp(`^${basePath}`), '') || '/'\n }\n\n if (i18n) {\n const result = normalizeLocalePath(fsPathname, i18n.locales)\n fsPathname = result.pathname\n parsedUrl.query.nextInternalLocale =\n result.detectedLocale || params.nextInternalLocale\n }\n\n if (fsPathname === page) {\n return true\n }\n\n if (pageIsDynamic && dynamicRouteMatcher) {\n const dynamicParams = dynamicRouteMatcher(fsPathname)\n if (dynamicParams) {\n parsedUrl.query = {\n ...parsedUrl.query,\n ...dynamicParams,\n }\n return true\n }\n }\n }\n return false\n }\n\n for (const rewrite of rewrites.beforeFiles || []) {\n checkRewrite(rewrite)\n }\n\n if (fsPathname !== page) {\n let finished = false\n\n for (const rewrite of rewrites.afterFiles || []) {\n finished = checkRewrite(rewrite)\n if (finished) break\n }\n\n if (!finished && !matchesPage()) {\n for (const rewrite of rewrites.fallback || []) {\n finished = checkRewrite(rewrite)\n if (finished) break\n }\n }\n }\n return rewriteParams\n }\n\n function getParamsFromRouteMatches(routeMatchesHeader: string) {\n // If we don't have a default route regex, we can't get params from route\n // matches\n if (!defaultRouteRegex) return null\n\n const { groups, routeKeys } = defaultRouteRegex\n\n const matcher = getRouteMatcher({\n re: {\n // Simulate a RegExp match from the \\`req.url\\` input\n exec: (str: string) => {\n // Normalize all the prefixed query params.\n const obj: Record<string, string> = Object.fromEntries(\n new URLSearchParams(str)\n )\n for (const [key, value] of Object.entries(obj)) {\n const normalizedKey = normalizeNextQueryParam(key)\n if (!normalizedKey) continue\n\n obj[normalizedKey] = value\n delete obj[key]\n }\n\n // Use all the named route keys.\n const result = {} as RegExpExecArray\n for (const keyName of Object.keys(routeKeys)) {\n const paramName = routeKeys[keyName]\n\n // If this param name is not a valid parameter name, then skip it.\n if (!paramName) continue\n\n const group = groups[paramName]\n const value = obj[keyName]\n\n // When we're missing a required param, we can't match the route.\n if (!group.optional && !value) return null\n\n result[group.pos] = value\n }\n\n return result\n },\n },\n groups,\n })\n\n const routeMatches = matcher(routeMatchesHeader)\n if (!routeMatches) return null\n\n return routeMatches\n }\n\n return {\n handleRewrites,\n defaultRouteRegex,\n dynamicRouteMatcher,\n defaultRouteMatches,\n getParamsFromRouteMatches,\n normalizeDynamicRouteParams: (params: ParsedUrlQuery) => {\n if (!defaultRouteRegex || !defaultRouteMatches) {\n return { params, hasValidParams: false }\n }\n\n return normalizeDynamicRouteParams(\n params,\n defaultRouteRegex,\n defaultRouteMatches\n )\n },\n normalizeVercelUrl: (req: BaseNextRequest, paramKeys: string[]) =>\n normalizeVercelUrl(req, paramKeys, defaultRouteRegex),\n interpolateDynamicPath: (\n pathname: string,\n params: Record<string, undefined | string | string[]>\n ) => interpolateDynamicPath(pathname, params, defaultRouteRegex),\n }\n}\n"],"names":["format","formatUrl","parse","parseUrl","normalizeLocalePath","getPathMatch","getNamedRouteRegex","getRouteMatcher","matchHas","prepareDestination","removeTrailingSlash","normalizeRscURL","NEXT_INTERCEPTION_MARKER_PREFIX","NEXT_QUERY_PARAM_PREFIX","normalizeNextQueryParam","normalizeVercelUrl","req","paramKeys","defaultRouteRegex","_parsedUrl","url","search","key","Object","keys","query","isNextQueryPrefix","startsWith","isNextInterceptionMarkerPrefix","groups","includes","interpolateDynamicPath","pathname","params","param","optional","repeat","builtParam","paramValue","value","Array","isArray","map","v","encodeURIComponent","join","replaceAll","normalizeDynamicRouteParams","defaultRouteMatches","hasValidParams","reduce","prev","val","defaultValue","isOptional","isDefaultValue","some","defaultVal","length","undefined","split","getUtils","page","i18n","basePath","rewrites","pageIsDynamic","trailingSlash","caseSensitive","dynamicRouteMatcher","prefixRouteKeys","handleRewrites","parsedUrl","rewriteParams","fsPathname","matchesPage","fsPathnameNoSlash","checkRewrite","rewrite","matcher","source","removeUnnamedParams","strict","sensitive","has","missing","hasParams","assign","parsedDestination","destQuery","appendParamsToQuery","destination","protocol","replace","RegExp","result","locales","nextInternalLocale","detectedLocale","dynamicParams","beforeFiles","finished","afterFiles","fallback","getParamsFromRouteMatches","routeMatchesHeader","routeKeys","re","exec","str","obj","fromEntries","URLSearchParams","entries","normalizedKey","keyName","paramName","group","pos","routeMatches"],"mappings":"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"}
@@ -34,10 +34,10 @@ export default class NextWebServer extends BaseServer {
34
34
  });
35
35
  const dynamicRouteMatcher = getRouteMatcher(routeRegex);
36
36
  const defaultRouteMatches = dynamicRouteMatcher(pathname);
37
- const paramsResult = normalizeDynamicRouteParams(query, false, routeRegex, defaultRouteMatches);
37
+ const paramsResult = normalizeDynamicRouteParams(query, routeRegex, defaultRouteMatches);
38
38
  const normalizedParams = paramsResult.hasValidParams ? paramsResult.params : query;
39
39
  pathname = interpolateDynamicPath(pathname, normalizedParams, routeRegex);
40
- normalizeVercelUrl(req, true, Object.keys(routeRegex.routeKeys), true, routeRegex);
40
+ normalizeVercelUrl(req, Object.keys(routeRegex.routeKeys), routeRegex);
41
41
  }
42
42
  }
43
43
  // next.js core assumes page path without trailing slash
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/web-server.ts"],"sourcesContent":["import type { WebNextRequest, WebNextResponse } from './base-http/web'\nimport type RenderResult from './render-result'\nimport type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta'\nimport type { Params } from './request/params'\nimport type { LoadComponentsReturnType } from './load-components'\nimport type {\n LoadedRenderOpts,\n MiddlewareRoutingItem,\n NormalizedRouteManifest,\n Options,\n RouteHandler,\n} from './base-server'\nimport type { Revalidate, ExpireTime } from './lib/revalidate'\n\nimport { byteLength } from './api-utils/web'\nimport BaseServer, { NoFallbackError } from './base-server'\nimport { generateETag } from './lib/etag'\nimport { addRequestMeta, getRequestMeta } from './request-meta'\nimport WebResponseCache from './response-cache/web'\nimport { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash'\nimport { isDynamicRoute } from '../shared/lib/router/utils'\nimport {\n interpolateDynamicPath,\n normalizeVercelUrl,\n normalizeDynamicRouteParams,\n} from './server-utils'\nimport { getNamedRouteRegex } from '../shared/lib/router/utils/route-regex'\nimport { getRouteMatcher } from '../shared/lib/router/utils/route-matcher'\nimport { IncrementalCache } from './lib/incremental-cache'\nimport type { PAGE_TYPES } from '../lib/page-types'\nimport type { Rewrite } from '../lib/load-custom-routes'\nimport { buildCustomRoute } from '../lib/build-custom-route'\nimport { UNDERSCORE_NOT_FOUND_ROUTE } from '../api/constants'\nimport { getEdgeInstrumentationModule } from './web/globals'\nimport type { ServerOnInstrumentationRequestError } from './app-render/types'\nimport { getEdgePreviewProps } from './web/get-edge-preview-props'\n\ninterface WebServerOptions extends Options {\n buildId: string\n webServerConfig: {\n page: string\n pathname: string\n pagesType: PAGE_TYPES\n loadComponent: (page: string) => Promise<LoadComponentsReturnType | null>\n extendRenderOpts: Partial<BaseServer['renderOpts']> & {\n serverActionsManifest?: any\n }\n renderToHTML:\n | typeof import('./app-render/app-render').renderToHTMLOrFlight\n | undefined\n incrementalCacheHandler?: any\n interceptionRouteRewrites?: Rewrite[]\n }\n}\n\ntype WebRouteHandler = RouteHandler<WebNextRequest, WebNextResponse>\n\nexport default class NextWebServer extends BaseServer<\n WebServerOptions,\n WebNextRequest,\n WebNextResponse\n> {\n constructor(options: WebServerOptions) {\n super(options)\n\n // Extend `renderOpts`.\n Object.assign(this.renderOpts, options.webServerConfig.extendRenderOpts)\n }\n\n protected async getIncrementalCache({\n requestHeaders,\n }: {\n requestHeaders: IncrementalCache['requestHeaders']\n }) {\n const dev = !!this.renderOpts.dev\n // incremental-cache is request specific\n // although can have shared caches in module scope\n // per-cache handler\n return new IncrementalCache({\n dev,\n requestHeaders,\n requestProtocol: 'https',\n allowedRevalidateHeaderKeys:\n this.nextConfig.experimental.allowedRevalidateHeaderKeys,\n minimalMode: this.minimalMode,\n fetchCacheKeyPrefix: this.nextConfig.experimental.fetchCacheKeyPrefix,\n maxMemoryCacheSize: this.nextConfig.cacheMaxMemorySize,\n flushToDisk: false,\n CurCacheHandler:\n this.serverOptions.webServerConfig.incrementalCacheHandler,\n getPrerenderManifest: () => this.getPrerenderManifest(),\n })\n }\n protected getResponseCache() {\n return new WebResponseCache(this.minimalMode)\n }\n\n protected async hasPage(page: string) {\n return page === this.serverOptions.webServerConfig.page\n }\n\n protected getBuildId() {\n return this.serverOptions.buildId\n }\n\n protected getEnabledDirectories() {\n return {\n app: this.serverOptions.webServerConfig.pagesType === 'app',\n pages: this.serverOptions.webServerConfig.pagesType === 'pages',\n }\n }\n\n protected getPagesManifest() {\n return {\n // keep same theme but server path doesn't need to be accurate\n [this.serverOptions.webServerConfig.pathname]:\n `server${this.serverOptions.webServerConfig.page}.js`,\n }\n }\n\n protected getAppPathsManifest() {\n const page = this.serverOptions.webServerConfig.page\n return {\n [this.serverOptions.webServerConfig.page]: `app${page}.js`,\n }\n }\n\n protected attachRequestMeta(\n req: WebNextRequest,\n parsedUrl: NextUrlWithParsedQuery\n ) {\n addRequestMeta(req, 'initQuery', { ...parsedUrl.query })\n }\n\n protected getPrerenderManifest() {\n return {\n version: -1 as any, // letting us know this doesn't conform to spec\n routes: {},\n dynamicRoutes: {},\n notFoundRoutes: [],\n preview: getEdgePreviewProps(),\n }\n }\n\n protected getNextFontManifest() {\n return this.serverOptions.webServerConfig.extendRenderOpts.nextFontManifest\n }\n\n protected handleCatchallRenderRequest: WebRouteHandler = async (\n req,\n res,\n parsedUrl\n ) => {\n let { pathname, query } = parsedUrl\n if (!pathname) {\n throw new Error('pathname is undefined')\n }\n\n // interpolate query information into page for dynamic route\n // so that rewritten paths are handled properly\n const normalizedPage = this.serverOptions.webServerConfig.pathname\n\n if (pathname !== normalizedPage) {\n pathname = normalizedPage\n\n if (isDynamicRoute(pathname)) {\n const routeRegex = getNamedRouteRegex(pathname, {\n prefixRouteKeys: false,\n })\n const dynamicRouteMatcher = getRouteMatcher(routeRegex)\n const defaultRouteMatches = dynamicRouteMatcher(\n pathname\n ) as NextParsedUrlQuery\n const paramsResult = normalizeDynamicRouteParams(\n query,\n false,\n routeRegex,\n defaultRouteMatches\n )\n const normalizedParams = paramsResult.hasValidParams\n ? paramsResult.params\n : query\n\n pathname = interpolateDynamicPath(\n pathname,\n normalizedParams,\n routeRegex\n )\n normalizeVercelUrl(\n req,\n true,\n Object.keys(routeRegex.routeKeys),\n true,\n routeRegex\n )\n }\n }\n\n // next.js core assumes page path without trailing slash\n pathname = removeTrailingSlash(pathname)\n\n if (this.i18nProvider) {\n const { detectedLocale } = await this.i18nProvider.analyze(pathname)\n if (detectedLocale) {\n addRequestMeta(req, 'locale', detectedLocale)\n }\n }\n\n const bubbleNoFallback = getRequestMeta(req, 'bubbleNoFallback')\n\n try {\n await this.render(req, res, pathname, query, parsedUrl, true)\n\n return true\n } catch (err) {\n if (err instanceof NoFallbackError && bubbleNoFallback) {\n return false\n }\n throw err\n }\n }\n\n protected renderHTML(\n req: WebNextRequest,\n res: WebNextResponse,\n pathname: string,\n query: NextParsedUrlQuery,\n renderOpts: LoadedRenderOpts\n ): Promise<RenderResult> {\n const { renderToHTML } = this.serverOptions.webServerConfig\n if (!renderToHTML) {\n throw new Error(\n 'Invariant: routeModule should be configured when rendering pages'\n )\n }\n\n // For edge runtime if the pathname hit as /_not-found entrypoint,\n // override the pathname to /404 for rendering\n if (pathname === UNDERSCORE_NOT_FOUND_ROUTE) {\n pathname = '/404'\n }\n return renderToHTML(\n req as any,\n res as any,\n pathname,\n query,\n // Edge runtime does not support ISR/PPR, so we don't need to pass in\n // the unknown params.\n null,\n Object.assign(renderOpts, {\n disableOptimizedLoading: true,\n runtime: 'experimental-edge',\n }),\n undefined,\n false,\n {\n buildId: this.serverOptions.buildId,\n }\n )\n }\n\n protected async sendRenderResult(\n _req: WebNextRequest,\n res: WebNextResponse,\n options: {\n result: RenderResult\n type: 'html' | 'json'\n generateEtags: boolean\n poweredByHeader: boolean\n revalidate: Revalidate | undefined\n expireTime: ExpireTime | undefined\n }\n ): Promise<void> {\n res.setHeader('X-Edge-Runtime', '1')\n\n // Add necessary headers.\n // @TODO: Share the isomorphic logic with server/send-payload.ts.\n if (options.poweredByHeader && options.type === 'html') {\n res.setHeader('X-Powered-By', 'Next.js')\n }\n\n if (!res.getHeader('Content-Type')) {\n res.setHeader(\n 'Content-Type',\n options.result.contentType\n ? options.result.contentType\n : options.type === 'json'\n ? 'application/json'\n : 'text/html; charset=utf-8'\n )\n }\n\n let promise: Promise<void> | undefined\n if (options.result.isDynamic) {\n promise = options.result.pipeTo(res.transformStream.writable)\n } else {\n const payload = options.result.toUnchunkedString()\n res.setHeader('Content-Length', String(byteLength(payload)))\n if (options.generateEtags) {\n res.setHeader('ETag', generateETag(payload))\n }\n res.body(payload)\n }\n\n res.send()\n\n // If we have a promise, wait for it to resolve.\n if (promise) await promise\n }\n\n protected async findPageComponents({\n page,\n query,\n params,\n url: _url,\n }: {\n page: string\n query: NextParsedUrlQuery\n params: Params | null\n isAppPath: boolean\n url?: string\n }) {\n const result = await this.serverOptions.webServerConfig.loadComponent(page)\n if (!result) return null\n\n return {\n query: {\n ...(query || {}),\n ...(params || {}),\n },\n components: result,\n }\n }\n\n // Below are methods that are not implemented by the web server as they are\n // handled by the upstream proxy (edge runtime or node server).\n\n protected async runApi() {\n // This web server does not need to handle API requests.\n return true\n }\n\n protected async handleApiRequest() {\n // Edge API requests are handled separately in minimal mode.\n return false\n }\n\n protected loadEnvConfig() {\n // The web server does not need to load the env config. This is done by the\n // runtime already.\n }\n\n protected getPublicDir() {\n // Public files are not handled by the web server.\n return ''\n }\n\n protected getHasStaticDir() {\n return false\n }\n\n protected getFontManifest() {\n return undefined\n }\n\n protected handleCompression() {\n // For the web server layer, compression is automatically handled by the\n // upstream proxy (edge runtime or node server) and we can simply skip here.\n }\n\n protected async handleUpgrade(): Promise<void> {\n // The web server does not support web sockets.\n }\n\n protected async getFallbackErrorComponents(\n _url?: string\n ): Promise<LoadComponentsReturnType | null> {\n // The web server does not need to handle fallback errors in production.\n return null\n }\n protected getRoutesManifest(): NormalizedRouteManifest | undefined {\n // The web server does not need to handle rewrite rules. This is done by the\n // upstream proxy (edge runtime or node server).\n return undefined\n }\n\n protected getMiddleware(): MiddlewareRoutingItem | undefined {\n // The web server does not need to handle middleware. This is done by the\n // upstream proxy (edge runtime or node server).\n return undefined\n }\n\n protected getFilesystemPaths() {\n return new Set<string>()\n }\n\n protected getinterceptionRoutePatterns(): RegExp[] {\n return (\n this.serverOptions.webServerConfig.interceptionRouteRewrites?.map(\n (rewrite) => new RegExp(buildCustomRoute('rewrite', rewrite).regex)\n ) ?? []\n )\n }\n\n protected async loadInstrumentationModule() {\n return await getEdgeInstrumentationModule()\n }\n\n protected async instrumentationOnRequestError(\n ...args: Parameters<ServerOnInstrumentationRequestError>\n ) {\n await super.instrumentationOnRequestError(...args)\n const err = args[0]\n\n if (\n process.env.NODE_ENV !== 'production' &&\n typeof __next_log_error__ === 'function'\n ) {\n __next_log_error__(err)\n } else {\n console.error(err)\n }\n }\n}\n"],"names":["byteLength","BaseServer","NoFallbackError","generateETag","addRequestMeta","getRequestMeta","WebResponseCache","removeTrailingSlash","isDynamicRoute","interpolateDynamicPath","normalizeVercelUrl","normalizeDynamicRouteParams","getNamedRouteRegex","getRouteMatcher","IncrementalCache","buildCustomRoute","UNDERSCORE_NOT_FOUND_ROUTE","getEdgeInstrumentationModule","getEdgePreviewProps","NextWebServer","constructor","options","handleCatchallRenderRequest","req","res","parsedUrl","pathname","query","Error","normalizedPage","serverOptions","webServerConfig","routeRegex","prefixRouteKeys","dynamicRouteMatcher","defaultRouteMatches","paramsResult","normalizedParams","hasValidParams","params","Object","keys","routeKeys","i18nProvider","detectedLocale","analyze","bubbleNoFallback","render","err","assign","renderOpts","extendRenderOpts","getIncrementalCache","requestHeaders","dev","requestProtocol","allowedRevalidateHeaderKeys","nextConfig","experimental","minimalMode","fetchCacheKeyPrefix","maxMemoryCacheSize","cacheMaxMemorySize","flushToDisk","CurCacheHandler","incrementalCacheHandler","getPrerenderManifest","getResponseCache","hasPage","page","getBuildId","buildId","getEnabledDirectories","app","pagesType","pages","getPagesManifest","getAppPathsManifest","attachRequestMeta","version","routes","dynamicRoutes","notFoundRoutes","preview","getNextFontManifest","nextFontManifest","renderHTML","renderToHTML","disableOptimizedLoading","runtime","undefined","sendRenderResult","_req","setHeader","poweredByHeader","type","getHeader","result","contentType","promise","isDynamic","pipeTo","transformStream","writable","payload","toUnchunkedString","String","generateEtags","body","send","findPageComponents","url","_url","loadComponent","components","runApi","handleApiRequest","loadEnvConfig","getPublicDir","getHasStaticDir","getFontManifest","handleCompression","handleUpgrade","getFallbackErrorComponents","getRoutesManifest","getMiddleware","getFilesystemPaths","Set","getinterceptionRoutePatterns","interceptionRouteRewrites","map","rewrite","RegExp","regex","loadInstrumentationModule","instrumentationOnRequestError","args","process","env","NODE_ENV","__next_log_error__","console","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/server/web-server.ts"],"sourcesContent":["import type { WebNextRequest, WebNextResponse } from './base-http/web'\nimport type RenderResult from './render-result'\nimport type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta'\nimport type { Params } from './request/params'\nimport type { LoadComponentsReturnType } from './load-components'\nimport type {\n LoadedRenderOpts,\n MiddlewareRoutingItem,\n NormalizedRouteManifest,\n Options,\n RouteHandler,\n} from './base-server'\nimport type { Revalidate, ExpireTime } from './lib/revalidate'\n\nimport { byteLength } from './api-utils/web'\nimport BaseServer, { NoFallbackError } from './base-server'\nimport { generateETag } from './lib/etag'\nimport { addRequestMeta, getRequestMeta } from './request-meta'\nimport WebResponseCache from './response-cache/web'\nimport { removeTrailingSlash } from '../shared/lib/router/utils/remove-trailing-slash'\nimport { isDynamicRoute } from '../shared/lib/router/utils'\nimport {\n interpolateDynamicPath,\n normalizeVercelUrl,\n normalizeDynamicRouteParams,\n} from './server-utils'\nimport { getNamedRouteRegex } from '../shared/lib/router/utils/route-regex'\nimport { getRouteMatcher } from '../shared/lib/router/utils/route-matcher'\nimport { IncrementalCache } from './lib/incremental-cache'\nimport type { PAGE_TYPES } from '../lib/page-types'\nimport type { Rewrite } from '../lib/load-custom-routes'\nimport { buildCustomRoute } from '../lib/build-custom-route'\nimport { UNDERSCORE_NOT_FOUND_ROUTE } from '../api/constants'\nimport { getEdgeInstrumentationModule } from './web/globals'\nimport type { ServerOnInstrumentationRequestError } from './app-render/types'\nimport { getEdgePreviewProps } from './web/get-edge-preview-props'\n\ninterface WebServerOptions extends Options {\n buildId: string\n webServerConfig: {\n page: string\n pathname: string\n pagesType: PAGE_TYPES\n loadComponent: (page: string) => Promise<LoadComponentsReturnType | null>\n extendRenderOpts: Partial<BaseServer['renderOpts']> & {\n serverActionsManifest?: any\n }\n renderToHTML:\n | typeof import('./app-render/app-render').renderToHTMLOrFlight\n | undefined\n incrementalCacheHandler?: any\n interceptionRouteRewrites?: Rewrite[]\n }\n}\n\ntype WebRouteHandler = RouteHandler<WebNextRequest, WebNextResponse>\n\nexport default class NextWebServer extends BaseServer<\n WebServerOptions,\n WebNextRequest,\n WebNextResponse\n> {\n constructor(options: WebServerOptions) {\n super(options)\n\n // Extend `renderOpts`.\n Object.assign(this.renderOpts, options.webServerConfig.extendRenderOpts)\n }\n\n protected async getIncrementalCache({\n requestHeaders,\n }: {\n requestHeaders: IncrementalCache['requestHeaders']\n }) {\n const dev = !!this.renderOpts.dev\n // incremental-cache is request specific\n // although can have shared caches in module scope\n // per-cache handler\n return new IncrementalCache({\n dev,\n requestHeaders,\n requestProtocol: 'https',\n allowedRevalidateHeaderKeys:\n this.nextConfig.experimental.allowedRevalidateHeaderKeys,\n minimalMode: this.minimalMode,\n fetchCacheKeyPrefix: this.nextConfig.experimental.fetchCacheKeyPrefix,\n maxMemoryCacheSize: this.nextConfig.cacheMaxMemorySize,\n flushToDisk: false,\n CurCacheHandler:\n this.serverOptions.webServerConfig.incrementalCacheHandler,\n getPrerenderManifest: () => this.getPrerenderManifest(),\n })\n }\n protected getResponseCache() {\n return new WebResponseCache(this.minimalMode)\n }\n\n protected async hasPage(page: string) {\n return page === this.serverOptions.webServerConfig.page\n }\n\n protected getBuildId() {\n return this.serverOptions.buildId\n }\n\n protected getEnabledDirectories() {\n return {\n app: this.serverOptions.webServerConfig.pagesType === 'app',\n pages: this.serverOptions.webServerConfig.pagesType === 'pages',\n }\n }\n\n protected getPagesManifest() {\n return {\n // keep same theme but server path doesn't need to be accurate\n [this.serverOptions.webServerConfig.pathname]:\n `server${this.serverOptions.webServerConfig.page}.js`,\n }\n }\n\n protected getAppPathsManifest() {\n const page = this.serverOptions.webServerConfig.page\n return {\n [this.serverOptions.webServerConfig.page]: `app${page}.js`,\n }\n }\n\n protected attachRequestMeta(\n req: WebNextRequest,\n parsedUrl: NextUrlWithParsedQuery\n ) {\n addRequestMeta(req, 'initQuery', { ...parsedUrl.query })\n }\n\n protected getPrerenderManifest() {\n return {\n version: -1 as any, // letting us know this doesn't conform to spec\n routes: {},\n dynamicRoutes: {},\n notFoundRoutes: [],\n preview: getEdgePreviewProps(),\n }\n }\n\n protected getNextFontManifest() {\n return this.serverOptions.webServerConfig.extendRenderOpts.nextFontManifest\n }\n\n protected handleCatchallRenderRequest: WebRouteHandler = async (\n req,\n res,\n parsedUrl\n ) => {\n let { pathname, query } = parsedUrl\n if (!pathname) {\n throw new Error('pathname is undefined')\n }\n\n // interpolate query information into page for dynamic route\n // so that rewritten paths are handled properly\n const normalizedPage = this.serverOptions.webServerConfig.pathname\n\n if (pathname !== normalizedPage) {\n pathname = normalizedPage\n\n if (isDynamicRoute(pathname)) {\n const routeRegex = getNamedRouteRegex(pathname, {\n prefixRouteKeys: false,\n })\n const dynamicRouteMatcher = getRouteMatcher(routeRegex)\n const defaultRouteMatches = dynamicRouteMatcher(\n pathname\n ) as NextParsedUrlQuery\n const paramsResult = normalizeDynamicRouteParams(\n query,\n routeRegex,\n defaultRouteMatches\n )\n const normalizedParams = paramsResult.hasValidParams\n ? paramsResult.params\n : query\n\n pathname = interpolateDynamicPath(\n pathname,\n normalizedParams,\n routeRegex\n )\n normalizeVercelUrl(req, Object.keys(routeRegex.routeKeys), routeRegex)\n }\n }\n\n // next.js core assumes page path without trailing slash\n pathname = removeTrailingSlash(pathname)\n\n if (this.i18nProvider) {\n const { detectedLocale } = await this.i18nProvider.analyze(pathname)\n if (detectedLocale) {\n addRequestMeta(req, 'locale', detectedLocale)\n }\n }\n\n const bubbleNoFallback = getRequestMeta(req, 'bubbleNoFallback')\n\n try {\n await this.render(req, res, pathname, query, parsedUrl, true)\n\n return true\n } catch (err) {\n if (err instanceof NoFallbackError && bubbleNoFallback) {\n return false\n }\n throw err\n }\n }\n\n protected renderHTML(\n req: WebNextRequest,\n res: WebNextResponse,\n pathname: string,\n query: NextParsedUrlQuery,\n renderOpts: LoadedRenderOpts\n ): Promise<RenderResult> {\n const { renderToHTML } = this.serverOptions.webServerConfig\n if (!renderToHTML) {\n throw new Error(\n 'Invariant: routeModule should be configured when rendering pages'\n )\n }\n\n // For edge runtime if the pathname hit as /_not-found entrypoint,\n // override the pathname to /404 for rendering\n if (pathname === UNDERSCORE_NOT_FOUND_ROUTE) {\n pathname = '/404'\n }\n return renderToHTML(\n req as any,\n res as any,\n pathname,\n query,\n // Edge runtime does not support ISR/PPR, so we don't need to pass in\n // the unknown params.\n null,\n Object.assign(renderOpts, {\n disableOptimizedLoading: true,\n runtime: 'experimental-edge',\n }),\n undefined,\n false,\n {\n buildId: this.serverOptions.buildId,\n }\n )\n }\n\n protected async sendRenderResult(\n _req: WebNextRequest,\n res: WebNextResponse,\n options: {\n result: RenderResult\n type: 'html' | 'json'\n generateEtags: boolean\n poweredByHeader: boolean\n revalidate: Revalidate | undefined\n expireTime: ExpireTime | undefined\n }\n ): Promise<void> {\n res.setHeader('X-Edge-Runtime', '1')\n\n // Add necessary headers.\n // @TODO: Share the isomorphic logic with server/send-payload.ts.\n if (options.poweredByHeader && options.type === 'html') {\n res.setHeader('X-Powered-By', 'Next.js')\n }\n\n if (!res.getHeader('Content-Type')) {\n res.setHeader(\n 'Content-Type',\n options.result.contentType\n ? options.result.contentType\n : options.type === 'json'\n ? 'application/json'\n : 'text/html; charset=utf-8'\n )\n }\n\n let promise: Promise<void> | undefined\n if (options.result.isDynamic) {\n promise = options.result.pipeTo(res.transformStream.writable)\n } else {\n const payload = options.result.toUnchunkedString()\n res.setHeader('Content-Length', String(byteLength(payload)))\n if (options.generateEtags) {\n res.setHeader('ETag', generateETag(payload))\n }\n res.body(payload)\n }\n\n res.send()\n\n // If we have a promise, wait for it to resolve.\n if (promise) await promise\n }\n\n protected async findPageComponents({\n page,\n query,\n params,\n url: _url,\n }: {\n page: string\n query: NextParsedUrlQuery\n params: Params | null\n isAppPath: boolean\n url?: string\n }) {\n const result = await this.serverOptions.webServerConfig.loadComponent(page)\n if (!result) return null\n\n return {\n query: {\n ...(query || {}),\n ...(params || {}),\n },\n components: result,\n }\n }\n\n // Below are methods that are not implemented by the web server as they are\n // handled by the upstream proxy (edge runtime or node server).\n\n protected async runApi() {\n // This web server does not need to handle API requests.\n return true\n }\n\n protected async handleApiRequest() {\n // Edge API requests are handled separately in minimal mode.\n return false\n }\n\n protected loadEnvConfig() {\n // The web server does not need to load the env config. This is done by the\n // runtime already.\n }\n\n protected getPublicDir() {\n // Public files are not handled by the web server.\n return ''\n }\n\n protected getHasStaticDir() {\n return false\n }\n\n protected getFontManifest() {\n return undefined\n }\n\n protected handleCompression() {\n // For the web server layer, compression is automatically handled by the\n // upstream proxy (edge runtime or node server) and we can simply skip here.\n }\n\n protected async handleUpgrade(): Promise<void> {\n // The web server does not support web sockets.\n }\n\n protected async getFallbackErrorComponents(\n _url?: string\n ): Promise<LoadComponentsReturnType | null> {\n // The web server does not need to handle fallback errors in production.\n return null\n }\n protected getRoutesManifest(): NormalizedRouteManifest | undefined {\n // The web server does not need to handle rewrite rules. This is done by the\n // upstream proxy (edge runtime or node server).\n return undefined\n }\n\n protected getMiddleware(): MiddlewareRoutingItem | undefined {\n // The web server does not need to handle middleware. This is done by the\n // upstream proxy (edge runtime or node server).\n return undefined\n }\n\n protected getFilesystemPaths() {\n return new Set<string>()\n }\n\n protected getinterceptionRoutePatterns(): RegExp[] {\n return (\n this.serverOptions.webServerConfig.interceptionRouteRewrites?.map(\n (rewrite) => new RegExp(buildCustomRoute('rewrite', rewrite).regex)\n ) ?? []\n )\n }\n\n protected async loadInstrumentationModule() {\n return await getEdgeInstrumentationModule()\n }\n\n protected async instrumentationOnRequestError(\n ...args: Parameters<ServerOnInstrumentationRequestError>\n ) {\n await super.instrumentationOnRequestError(...args)\n const err = args[0]\n\n if (\n process.env.NODE_ENV !== 'production' &&\n typeof __next_log_error__ === 'function'\n ) {\n __next_log_error__(err)\n } else {\n console.error(err)\n }\n }\n}\n"],"names":["byteLength","BaseServer","NoFallbackError","generateETag","addRequestMeta","getRequestMeta","WebResponseCache","removeTrailingSlash","isDynamicRoute","interpolateDynamicPath","normalizeVercelUrl","normalizeDynamicRouteParams","getNamedRouteRegex","getRouteMatcher","IncrementalCache","buildCustomRoute","UNDERSCORE_NOT_FOUND_ROUTE","getEdgeInstrumentationModule","getEdgePreviewProps","NextWebServer","constructor","options","handleCatchallRenderRequest","req","res","parsedUrl","pathname","query","Error","normalizedPage","serverOptions","webServerConfig","routeRegex","prefixRouteKeys","dynamicRouteMatcher","defaultRouteMatches","paramsResult","normalizedParams","hasValidParams","params","Object","keys","routeKeys","i18nProvider","detectedLocale","analyze","bubbleNoFallback","render","err","assign","renderOpts","extendRenderOpts","getIncrementalCache","requestHeaders","dev","requestProtocol","allowedRevalidateHeaderKeys","nextConfig","experimental","minimalMode","fetchCacheKeyPrefix","maxMemoryCacheSize","cacheMaxMemorySize","flushToDisk","CurCacheHandler","incrementalCacheHandler","getPrerenderManifest","getResponseCache","hasPage","page","getBuildId","buildId","getEnabledDirectories","app","pagesType","pages","getPagesManifest","getAppPathsManifest","attachRequestMeta","version","routes","dynamicRoutes","notFoundRoutes","preview","getNextFontManifest","nextFontManifest","renderHTML","renderToHTML","disableOptimizedLoading","runtime","undefined","sendRenderResult","_req","setHeader","poweredByHeader","type","getHeader","result","contentType","promise","isDynamic","pipeTo","transformStream","writable","payload","toUnchunkedString","String","generateEtags","body","send","findPageComponents","url","_url","loadComponent","components","runApi","handleApiRequest","loadEnvConfig","getPublicDir","getHasStaticDir","getFontManifest","handleCompression","handleUpgrade","getFallbackErrorComponents","getRoutesManifest","getMiddleware","getFilesystemPaths","Set","getinterceptionRoutePatterns","interceptionRouteRewrites","map","rewrite","RegExp","regex","loadInstrumentationModule","instrumentationOnRequestError","args","process","env","NODE_ENV","__next_log_error__","console","error"],"mappings":"AAcA,SAASA,UAAU,QAAQ,kBAAiB;AAC5C,OAAOC,cAAcC,eAAe,QAAQ,gBAAe;AAC3D,SAASC,YAAY,QAAQ,aAAY;AACzC,SAASC,cAAc,EAAEC,cAAc,QAAQ,iBAAgB;AAC/D,OAAOC,sBAAsB,uBAAsB;AACnD,SAASC,mBAAmB,QAAQ,mDAAkD;AACtF,SAASC,cAAc,QAAQ,6BAA4B;AAC3D,SACEC,sBAAsB,EACtBC,kBAAkB,EAClBC,2BAA2B,QACtB,iBAAgB;AACvB,SAASC,kBAAkB,QAAQ,yCAAwC;AAC3E,SAASC,eAAe,QAAQ,2CAA0C;AAC1E,SAASC,gBAAgB,QAAQ,0BAAyB;AAG1D,SAASC,gBAAgB,QAAQ,4BAA2B;AAC5D,SAASC,0BAA0B,QAAQ,mBAAkB;AAC7D,SAASC,4BAA4B,QAAQ,gBAAe;AAE5D,SAASC,mBAAmB,QAAQ,+BAA8B;AAsBlE,eAAe,MAAMC,sBAAsBlB;IAKzCmB,YAAYC,OAAyB,CAAE;QACrC,KAAK,CAACA,eAqFEC,8BAA+C,OACvDC,KACAC,KACAC;YAEA,IAAI,EAAEC,QAAQ,EAAEC,KAAK,EAAE,GAAGF;YAC1B,IAAI,CAACC,UAAU;gBACb,MAAM,qBAAkC,CAAlC,IAAIE,MAAM,0BAAV,qBAAA;2BAAA;gCAAA;gBAAiC;YACzC;YAEA,4DAA4D;YAC5D,+CAA+C;YAC/C,MAAMC,iBAAiB,IAAI,CAACC,aAAa,CAACC,eAAe,CAACL,QAAQ;YAElE,IAAIA,aAAaG,gBAAgB;gBAC/BH,WAAWG;gBAEX,IAAIrB,eAAekB,WAAW;oBAC5B,MAAMM,aAAapB,mBAAmBc,UAAU;wBAC9CO,iBAAiB;oBACnB;oBACA,MAAMC,sBAAsBrB,gBAAgBmB;oBAC5C,MAAMG,sBAAsBD,oBAC1BR;oBAEF,MAAMU,eAAezB,4BACnBgB,OACAK,YACAG;oBAEF,MAAME,mBAAmBD,aAAaE,cAAc,GAChDF,aAAaG,MAAM,GACnBZ;oBAEJD,WAAWjB,uBACTiB,UACAW,kBACAL;oBAEFtB,mBAAmBa,KAAKiB,OAAOC,IAAI,CAACT,WAAWU,SAAS,GAAGV;gBAC7D;YACF;YAEA,wDAAwD;YACxDN,WAAWnB,oBAAoBmB;YAE/B,IAAI,IAAI,CAACiB,YAAY,EAAE;gBACrB,MAAM,EAAEC,cAAc,EAAE,GAAG,MAAM,IAAI,CAACD,YAAY,CAACE,OAAO,CAACnB;gBAC3D,IAAIkB,gBAAgB;oBAClBxC,eAAemB,KAAK,UAAUqB;gBAChC;YACF;YAEA,MAAME,mBAAmBzC,eAAekB,KAAK;YAE7C,IAAI;gBACF,MAAM,IAAI,CAACwB,MAAM,CAACxB,KAAKC,KAAKE,UAAUC,OAAOF,WAAW;gBAExD,OAAO;YACT,EAAE,OAAOuB,KAAK;gBACZ,IAAIA,eAAe9C,mBAAmB4C,kBAAkB;oBACtD,OAAO;gBACT;gBACA,MAAME;YACR;QACF;QApJE,uBAAuB;QACvBR,OAAOS,MAAM,CAAC,IAAI,CAACC,UAAU,EAAE7B,QAAQU,eAAe,CAACoB,gBAAgB;IACzE;IAEA,MAAgBC,oBAAoB,EAClCC,cAAc,EAGf,EAAE;QACD,MAAMC,MAAM,CAAC,CAAC,IAAI,CAACJ,UAAU,CAACI,GAAG;QACjC,wCAAwC;QACxC,kDAAkD;QAClD,oBAAoB;QACpB,OAAO,IAAIxC,iBAAiB;YAC1BwC;YACAD;YACAE,iBAAiB;YACjBC,6BACE,IAAI,CAACC,UAAU,CAACC,YAAY,CAACF,2BAA2B;YAC1DG,aAAa,IAAI,CAACA,WAAW;YAC7BC,qBAAqB,IAAI,CAACH,UAAU,CAACC,YAAY,CAACE,mBAAmB;YACrEC,oBAAoB,IAAI,CAACJ,UAAU,CAACK,kBAAkB;YACtDC,aAAa;YACbC,iBACE,IAAI,CAAClC,aAAa,CAACC,eAAe,CAACkC,uBAAuB;YAC5DC,sBAAsB,IAAM,IAAI,CAACA,oBAAoB;QACvD;IACF;IACUC,mBAAmB;QAC3B,OAAO,IAAI7D,iBAAiB,IAAI,CAACqD,WAAW;IAC9C;IAEA,MAAgBS,QAAQC,IAAY,EAAE;QACpC,OAAOA,SAAS,IAAI,CAACvC,aAAa,CAACC,eAAe,CAACsC,IAAI;IACzD;IAEUC,aAAa;QACrB,OAAO,IAAI,CAACxC,aAAa,CAACyC,OAAO;IACnC;IAEUC,wBAAwB;QAChC,OAAO;YACLC,KAAK,IAAI,CAAC3C,aAAa,CAACC,eAAe,CAAC2C,SAAS,KAAK;YACtDC,OAAO,IAAI,CAAC7C,aAAa,CAACC,eAAe,CAAC2C,SAAS,KAAK;QAC1D;IACF;IAEUE,mBAAmB;QAC3B,OAAO;YACL,8DAA8D;YAC9D,CAAC,IAAI,CAAC9C,aAAa,CAACC,eAAe,CAACL,QAAQ,CAAC,EAC3C,CAAC,MAAM,EAAE,IAAI,CAACI,aAAa,CAACC,eAAe,CAACsC,IAAI,CAAC,GAAG,CAAC;QACzD;IACF;IAEUQ,sBAAsB;QAC9B,MAAMR,OAAO,IAAI,CAACvC,aAAa,CAACC,eAAe,CAACsC,IAAI;QACpD,OAAO;YACL,CAAC,IAAI,CAACvC,aAAa,CAACC,eAAe,CAACsC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAEA,KAAK,GAAG,CAAC;QAC5D;IACF;IAEUS,kBACRvD,GAAmB,EACnBE,SAAiC,EACjC;QACArB,eAAemB,KAAK,aAAa;YAAE,GAAGE,UAAUE,KAAK;QAAC;IACxD;IAEUuC,uBAAuB;QAC/B,OAAO;YACLa,SAAS,CAAC;YACVC,QAAQ,CAAC;YACTC,eAAe,CAAC;YAChBC,gBAAgB,EAAE;YAClBC,SAASjE;QACX;IACF;IAEUkE,sBAAsB;QAC9B,OAAO,IAAI,CAACtD,aAAa,CAACC,eAAe,CAACoB,gBAAgB,CAACkC,gBAAgB;IAC7E;IAqEUC,WACR/D,GAAmB,EACnBC,GAAoB,EACpBE,QAAgB,EAChBC,KAAyB,EACzBuB,UAA4B,EACL;QACvB,MAAM,EAAEqC,YAAY,EAAE,GAAG,IAAI,CAACzD,aAAa,CAACC,eAAe;QAC3D,IAAI,CAACwD,cAAc;YACjB,MAAM,qBAEL,CAFK,IAAI3D,MACR,qEADI,qBAAA;uBAAA;4BAAA;YAEN;QACF;QAEA,kEAAkE;QAClE,8CAA8C;QAC9C,IAAIF,aAAaV,4BAA4B;YAC3CU,WAAW;QACb;QACA,OAAO6D,aACLhE,KACAC,KACAE,UACAC,OACA,qEAAqE;QACrE,sBAAsB;QACtB,MACAa,OAAOS,MAAM,CAACC,YAAY;YACxBsC,yBAAyB;YACzBC,SAAS;QACX,IACAC,WACA,OACA;YACEnB,SAAS,IAAI,CAACzC,aAAa,CAACyC,OAAO;QACrC;IAEJ;IAEA,MAAgBoB,iBACdC,IAAoB,EACpBpE,GAAoB,EACpBH,OAOC,EACc;QACfG,IAAIqE,SAAS,CAAC,kBAAkB;QAEhC,yBAAyB;QACzB,iEAAiE;QACjE,IAAIxE,QAAQyE,eAAe,IAAIzE,QAAQ0E,IAAI,KAAK,QAAQ;YACtDvE,IAAIqE,SAAS,CAAC,gBAAgB;QAChC;QAEA,IAAI,CAACrE,IAAIwE,SAAS,CAAC,iBAAiB;YAClCxE,IAAIqE,SAAS,CACX,gBACAxE,QAAQ4E,MAAM,CAACC,WAAW,GACtB7E,QAAQ4E,MAAM,CAACC,WAAW,GAC1B7E,QAAQ0E,IAAI,KAAK,SACf,qBACA;QAEV;QAEA,IAAII;QACJ,IAAI9E,QAAQ4E,MAAM,CAACG,SAAS,EAAE;YAC5BD,UAAU9E,QAAQ4E,MAAM,CAACI,MAAM,CAAC7E,IAAI8E,eAAe,CAACC,QAAQ;QAC9D,OAAO;YACL,MAAMC,UAAUnF,QAAQ4E,MAAM,CAACQ,iBAAiB;YAChDjF,IAAIqE,SAAS,CAAC,kBAAkBa,OAAO1G,WAAWwG;YAClD,IAAInF,QAAQsF,aAAa,EAAE;gBACzBnF,IAAIqE,SAAS,CAAC,QAAQ1F,aAAaqG;YACrC;YACAhF,IAAIoF,IAAI,CAACJ;QACX;QAEAhF,IAAIqF,IAAI;QAER,gDAAgD;QAChD,IAAIV,SAAS,MAAMA;IACrB;IAEA,MAAgBW,mBAAmB,EACjCzC,IAAI,EACJ1C,KAAK,EACLY,MAAM,EACNwE,KAAKC,IAAI,EAOV,EAAE;QACD,MAAMf,SAAS,MAAM,IAAI,CAACnE,aAAa,CAACC,eAAe,CAACkF,aAAa,CAAC5C;QACtE,IAAI,CAAC4B,QAAQ,OAAO;QAEpB,OAAO;YACLtE,OAAO;gBACL,GAAIA,SAAS,CAAC,CAAC;gBACf,GAAIY,UAAU,CAAC,CAAC;YAClB;YACA2E,YAAYjB;QACd;IACF;IAEA,2EAA2E;IAC3E,+DAA+D;IAE/D,MAAgBkB,SAAS;QACvB,wDAAwD;QACxD,OAAO;IACT;IAEA,MAAgBC,mBAAmB;QACjC,4DAA4D;QAC5D,OAAO;IACT;IAEUC,gBAAgB;IACxB,2EAA2E;IAC3E,mBAAmB;IACrB;IAEUC,eAAe;QACvB,kDAAkD;QAClD,OAAO;IACT;IAEUC,kBAAkB;QAC1B,OAAO;IACT;IAEUC,kBAAkB;QAC1B,OAAO9B;IACT;IAEU+B,oBAAoB;IAC5B,wEAAwE;IACxE,4EAA4E;IAC9E;IAEA,MAAgBC,gBAA+B;IAC7C,+CAA+C;IACjD;IAEA,MAAgBC,2BACdX,IAAa,EAC6B;QAC1C,wEAAwE;QACxE,OAAO;IACT;IACUY,oBAAyD;QACjE,4EAA4E;QAC5E,gDAAgD;QAChD,OAAOlC;IACT;IAEUmC,gBAAmD;QAC3D,yEAAyE;QACzE,gDAAgD;QAChD,OAAOnC;IACT;IAEUoC,qBAAqB;QAC7B,OAAO,IAAIC;IACb;IAEUC,+BAAyC;YAE/C;QADF,OACE,EAAA,gEAAA,IAAI,CAAClG,aAAa,CAACC,eAAe,CAACkG,yBAAyB,qBAA5D,8DAA8DC,GAAG,CAC/D,CAACC,UAAY,IAAIC,OAAOrH,iBAAiB,WAAWoH,SAASE,KAAK,OAC/D,EAAE;IAEX;IAEA,MAAgBC,4BAA4B;QAC1C,OAAO,MAAMrH;IACf;IAEA,MAAgBsH,8BACd,GAAGC,IAAqD,EACxD;QACA,MAAM,KAAK,CAACD,iCAAiCC;QAC7C,MAAMxF,MAAMwF,IAAI,CAAC,EAAE;QAEnB,IACEC,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBACzB,OAAOC,uBAAuB,YAC9B;YACAA,mBAAmB5F;QACrB,OAAO;YACL6F,QAAQC,KAAK,CAAC9F;QAChB;IACF;AACF"}
@@ -305,7 +305,15 @@ async function exportPages(input) {
305
305
  } else {
306
306
  console.info(`Failed to build ${pageKey} (attempt ${attempt + 1} of ${maxAttempts}). Retrying again shortly.`);
307
307
  }
308
- await new Promise((r)=>setTimeout(r, Math.random() * 500));
308
+ // Exponential backoff with random jitter to avoid thundering herd on retries
309
+ const baseDelay = 500 // 500ms
310
+ ;
311
+ const maxDelay = 2000 // 2 seconds
312
+ ;
313
+ const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
314
+ const jitter = Math.random() * 0.3 * delay // Add up to 30% random jitter
315
+ ;
316
+ await new Promise((r)=>setTimeout(r, delay + jitter));
309
317
  }
310
318
  }
311
319
  attempt++;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/export/worker.ts"],"sourcesContent":["import type {\n ExportPagesInput,\n ExportPageInput,\n ExportPageResult,\n ExportRouteResult,\n WorkerRenderOpts,\n ExportPagesResult,\n} from './types'\n\nimport '../server/node-environment'\n\nprocess.env.NEXT_IS_EXPORT_WORKER = 'true'\n\nimport { extname, join, dirname, sep } from 'path'\nimport fs from 'fs/promises'\nimport { loadComponents } from '../server/load-components'\nimport { isDynamicRoute } from '../shared/lib/router/utils/is-dynamic'\nimport { normalizePagePath } from '../shared/lib/page-path/normalize-page-path'\nimport { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path'\nimport { trace } from '../trace'\nimport { setHttpClientAndAgentOptions } from '../server/setup-http-agent-env'\nimport isError from '../lib/is-error'\nimport { addRequestMeta } from '../server/request-meta'\nimport { normalizeAppPath } from '../shared/lib/router/utils/app-paths'\n\nimport { createRequestResponseMocks } from '../server/lib/mock-request'\nimport { isAppRouteRoute } from '../lib/is-app-route-route'\nimport { hasNextSupport } from '../server/ci-info'\nimport { exportAppRoute } from './routes/app-route'\nimport { exportAppPage, prospectiveRenderAppPage } from './routes/app-page'\nimport { exportPagesPage } from './routes/pages'\nimport { getParams } from './helpers/get-params'\nimport { createIncrementalCache } from './helpers/create-incremental-cache'\nimport { isPostpone } from '../server/lib/router-utils/is-postpone'\nimport { isDynamicUsageError } from './helpers/is-dynamic-usage-error'\nimport { isBailoutToCSRError } from '../shared/lib/lazy-dynamic/bailout-to-csr'\nimport {\n turborepoTraceAccess,\n TurborepoAccessTraceResult,\n} from '../build/turborepo-access-trace'\nimport type { Params } from '../server/request/params'\nimport {\n getFallbackRouteParams,\n type FallbackRouteParams,\n} from '../server/request/fallback-params'\nimport { needsExperimentalReact } from '../lib/needs-experimental-react'\nimport type { AppRouteRouteModule } from '../server/route-modules/app-route/module.compiled'\nimport { isStaticGenBailoutError } from '../client/components/static-generation-bailout'\nimport type { PagesRenderContext, PagesSharedContext } from '../server/render'\nimport type { AppSharedContext } from '../server/app-render/app-render'\nimport { MultiFileWriter } from '../lib/multi-file-writer'\n\nconst envConfig = require('../shared/lib/runtime-config.external')\n\n;(globalThis as any).__NEXT_DATA__ = {\n nextExport: true,\n}\n\nclass TimeoutError extends Error {\n code = 'NEXT_EXPORT_TIMEOUT_ERROR'\n}\n\nclass ExportPageError extends Error {\n code = 'NEXT_EXPORT_PAGE_ERROR'\n}\n\nasync function exportPageImpl(\n input: ExportPageInput,\n fileWriter: MultiFileWriter\n): Promise<ExportRouteResult | undefined> {\n const {\n path,\n pathMap,\n distDir,\n pagesDataDir,\n buildExport = false,\n serverRuntimeConfig,\n subFolders = false,\n optimizeCss,\n disableOptimizedLoading,\n debugOutput = false,\n enableExperimentalReact,\n ampValidatorPath,\n trailingSlash,\n sriEnabled,\n } = input\n\n if (enableExperimentalReact) {\n process.env.__NEXT_EXPERIMENTAL_REACT = 'true'\n }\n\n const {\n page,\n\n // The parameters that are currently unknown.\n _fallbackRouteParams = [],\n\n // Check if this is an `app/` page.\n _isAppDir: isAppDir = false,\n\n // Check if this should error when dynamic usage is detected.\n _isDynamicError: isDynamicError = false,\n\n // If this page supports partial prerendering, then we need to pass that to\n // the renderOpts.\n _isRoutePPREnabled: isRoutePPREnabled,\n\n // If this is a prospective render, we don't actually want to persist the\n // result, we just want to use it to error the build if there's a problem.\n _isProspectiveRender: isProspectiveRender = false,\n\n // Pull the original query out.\n query: originalQuery = {},\n } = pathMap\n\n const fallbackRouteParams: FallbackRouteParams | null =\n getFallbackRouteParams(_fallbackRouteParams)\n\n let query = { ...originalQuery }\n const pathname = normalizeAppPath(page)\n const isDynamic = isDynamicRoute(page)\n const outDir = isAppDir ? join(distDir, 'server/app') : input.outDir\n\n const filePath = normalizePagePath(path)\n const ampPath = `${filePath}.amp`\n let renderAmpPath = ampPath\n\n let updatedPath = pathMap._ssgPath || path\n let locale = pathMap._locale || input.renderOpts.locale\n\n if (input.renderOpts.locale) {\n const localePathResult = normalizeLocalePath(path, input.renderOpts.locales)\n\n if (localePathResult.detectedLocale) {\n updatedPath = localePathResult.pathname\n locale = localePathResult.detectedLocale\n\n if (locale === input.renderOpts.defaultLocale) {\n renderAmpPath = `${normalizePagePath(updatedPath)}.amp`\n }\n }\n }\n\n // We need to show a warning if they try to provide query values\n // for an auto-exported page since they won't be available\n const hasOrigQueryValues = Object.keys(originalQuery).length > 0\n\n // Check if the page is a specified dynamic route\n const { pathname: nonLocalizedPath } = normalizeLocalePath(\n path,\n input.renderOpts.locales\n )\n\n let params: Params | undefined\n\n if (isDynamic && page !== nonLocalizedPath) {\n const normalizedPage = isAppDir ? normalizeAppPath(page) : page\n\n params = getParams(normalizedPage, updatedPath)\n }\n\n const { req, res } = createRequestResponseMocks({ url: updatedPath })\n\n // If this is a status code page, then set the response code.\n for (const statusCode of [404, 500]) {\n if (\n [\n `/${statusCode}`,\n `/${statusCode}.html`,\n `/${statusCode}/index.html`,\n ].some((p) => p === updatedPath || `/${locale}${p}` === updatedPath)\n ) {\n res.statusCode = statusCode\n }\n }\n\n // Ensure that the URL has a trailing slash if it's configured.\n if (trailingSlash && !req.url?.endsWith('/')) {\n req.url += '/'\n }\n\n if (\n locale &&\n buildExport &&\n input.renderOpts.domainLocales &&\n input.renderOpts.domainLocales.some(\n (dl) => dl.defaultLocale === locale || dl.locales?.includes(locale || '')\n )\n ) {\n addRequestMeta(req, 'isLocaleDomain', true)\n }\n\n envConfig.setConfig({\n serverRuntimeConfig,\n publicRuntimeConfig: input.renderOpts.runtimeConfig,\n })\n\n const getHtmlFilename = (p: string) =>\n subFolders ? `${p}${sep}index.html` : `${p}.html`\n\n let htmlFilename = getHtmlFilename(filePath)\n\n // dynamic routes can provide invalid extensions e.g. /blog/[...slug] returns an\n // extension of `.slug]`\n const pageExt = isDynamic || isAppDir ? '' : extname(page)\n const pathExt = isDynamic || isAppDir ? '' : extname(path)\n\n // force output 404.html for backwards compat\n if (path === '/404.html') {\n htmlFilename = path\n }\n // Make sure page isn't a folder with a dot in the name e.g. `v1.2`\n else if (pageExt !== pathExt && pathExt !== '') {\n const isBuiltinPaths = ['/500', '/404'].some(\n (p) => p === path || p === path + '.html'\n )\n // If the ssg path has .html extension, and it's not builtin paths, use it directly\n // Otherwise, use that as the filename instead\n const isHtmlExtPath = !isBuiltinPaths && path.endsWith('.html')\n htmlFilename = isHtmlExtPath ? getHtmlFilename(path) : path\n } else if (path === '/') {\n // If the path is the root, just use index.html\n htmlFilename = 'index.html'\n }\n\n const baseDir = join(outDir, dirname(htmlFilename))\n let htmlFilepath = join(outDir, htmlFilename)\n\n await fs.mkdir(baseDir, { recursive: true })\n\n const components = await loadComponents({\n distDir,\n page,\n isAppPath: isAppDir,\n isDev: false,\n sriEnabled,\n })\n\n // Handle App Routes.\n if (isAppDir && isAppRouteRoute(page)) {\n return exportAppRoute(\n req,\n res,\n params,\n page,\n components.routeModule as AppRouteRouteModule,\n input.renderOpts.incrementalCache,\n input.renderOpts.cacheLifeProfiles,\n htmlFilepath,\n fileWriter,\n input.renderOpts.experimental,\n input.buildId\n )\n }\n\n const renderOpts: WorkerRenderOpts = {\n ...components,\n ...input.renderOpts,\n ampPath: renderAmpPath,\n params,\n optimizeCss,\n disableOptimizedLoading,\n locale,\n supportsDynamicResponse: false,\n experimental: {\n ...input.renderOpts.experimental,\n isRoutePPREnabled,\n },\n }\n\n if (hasNextSupport) {\n renderOpts.isRevalidate = true\n }\n\n // Handle App Pages\n if (isAppDir) {\n const sharedContext: AppSharedContext = {\n buildId: input.buildId,\n }\n\n // If this is a prospective render, don't return any metrics or revalidate\n // timings as we aren't persisting this render (it was only to error).\n if (isProspectiveRender) {\n return prospectiveRenderAppPage(\n req,\n res,\n page,\n pathname,\n query,\n fallbackRouteParams,\n renderOpts,\n sharedContext\n )\n }\n\n return exportAppPage(\n req,\n res,\n page,\n path,\n pathname,\n query,\n fallbackRouteParams,\n renderOpts,\n htmlFilepath,\n debugOutput,\n isDynamicError,\n fileWriter,\n sharedContext\n )\n }\n\n const sharedContext: PagesSharedContext = {\n buildId: input.buildId,\n deploymentId: input.renderOpts.deploymentId,\n customServer: undefined,\n }\n\n const renderContext: PagesRenderContext = {\n isFallback: pathMap._pagesFallback ?? false,\n isDraftMode: false,\n developmentNotFoundSourcePage: undefined,\n }\n\n return exportPagesPage(\n req,\n res,\n path,\n page,\n query,\n params,\n htmlFilepath,\n htmlFilename,\n ampPath,\n subFolders,\n outDir,\n ampValidatorPath,\n pagesDataDir,\n buildExport,\n isDynamic,\n sharedContext,\n renderContext,\n hasOrigQueryValues,\n renderOpts,\n components,\n fileWriter\n )\n}\n\nexport async function exportPages(\n input: ExportPagesInput\n): Promise<ExportPagesResult> {\n const {\n exportPathMap,\n paths,\n dir,\n distDir,\n outDir,\n cacheHandler,\n cacheMaxMemorySize,\n fetchCacheKeyPrefix,\n pagesDataDir,\n renderOpts,\n nextConfig,\n options,\n } = input\n\n // If the fetch cache was enabled, we need to create an incremental\n // cache instance for this page.\n const incrementalCache = await createIncrementalCache({\n cacheHandler,\n cacheMaxMemorySize,\n fetchCacheKeyPrefix,\n distDir,\n dir,\n // skip writing to disk in minimal mode for now, pending some\n // changes to better support it\n flushToDisk: !hasNextSupport,\n cacheHandlers: nextConfig.experimental.cacheHandlers,\n })\n\n renderOpts.incrementalCache = incrementalCache\n\n const maxConcurrency =\n nextConfig.experimental.staticGenerationMaxConcurrency ?? 8\n const results: ExportPagesResult = []\n\n const exportPageWithRetry = async (path: string, maxAttempts: number) => {\n const pathMap = exportPathMap[path]\n const { page } = exportPathMap[path]\n const pageKey = page !== path ? `${page}: ${path}` : path\n let attempt = 0\n let result\n\n while (attempt < maxAttempts) {\n try {\n result = await Promise.race<ExportPageResult | undefined>([\n exportPage({\n path,\n pathMap,\n distDir,\n outDir,\n pagesDataDir,\n renderOpts,\n ampValidatorPath:\n nextConfig.experimental.amp?.validator || undefined,\n trailingSlash: nextConfig.trailingSlash,\n serverRuntimeConfig: nextConfig.serverRuntimeConfig,\n subFolders: nextConfig.trailingSlash && !options.buildExport,\n buildExport: options.buildExport,\n optimizeCss: nextConfig.experimental.optimizeCss,\n disableOptimizedLoading:\n nextConfig.experimental.disableOptimizedLoading,\n parentSpanId: input.parentSpanId,\n httpAgentOptions: nextConfig.httpAgentOptions,\n debugOutput: options.debugOutput,\n enableExperimentalReact: needsExperimentalReact(nextConfig),\n sriEnabled: Boolean(nextConfig.experimental.sri?.algorithm),\n buildId: input.buildId,\n }),\n // If exporting the page takes longer than the timeout, reject the promise.\n new Promise((_, reject) => {\n setTimeout(() => {\n reject(new TimeoutError())\n }, nextConfig.staticPageGenerationTimeout * 1000)\n }),\n ])\n\n // If there was an error in the export, throw it immediately. In the catch block, we might retry the export,\n // or immediately fail the build, depending on user configuration. We might also continue on and attempt other pages.\n if (result && 'error' in result) {\n throw new ExportPageError()\n }\n\n // If the export succeeds, break out of the retry loop\n break\n } catch (err) {\n // The only error that should be caught here is an ExportError, as `exportPage` doesn't throw and instead returns an object with an `error` property.\n // This is an overly cautious check to ensure that we don't accidentally catch an unexpected error.\n if (!(err instanceof ExportPageError || err instanceof TimeoutError)) {\n throw err\n }\n\n if (err instanceof TimeoutError) {\n // If the export times out, we will restart the worker up to 3 times.\n maxAttempts = 3\n }\n\n // We've reached the maximum number of attempts\n if (attempt >= maxAttempts - 1) {\n // Log a message if we've reached the maximum number of attempts.\n // We only care to do this if maxAttempts was configured.\n if (maxAttempts > 1) {\n console.info(\n `Failed to build ${pageKey} after ${maxAttempts} attempts.`\n )\n }\n // If prerenderEarlyExit is enabled, we'll exit the build immediately.\n if (nextConfig.experimental.prerenderEarlyExit) {\n console.error(\n `Export encountered an error on ${pageKey}, exiting the build.`\n )\n process.exit(1)\n } else {\n // Otherwise, this is a no-op. The build will continue, and a summary of failed pages will be displayed at the end.\n }\n } else {\n // Otherwise, we have more attempts to make. Wait before retrying\n if (err instanceof TimeoutError) {\n console.info(\n `Failed to build ${pageKey} (attempt ${attempt + 1} of ${maxAttempts}) because it took more than ${nextConfig.staticPageGenerationTimeout} seconds. Retrying again shortly.`\n )\n } else {\n console.info(\n `Failed to build ${pageKey} (attempt ${attempt + 1} of ${maxAttempts}). Retrying again shortly.`\n )\n }\n await new Promise((r) => setTimeout(r, Math.random() * 500))\n }\n }\n\n attempt++\n }\n\n return { result, path, pageKey }\n }\n\n for (let i = 0; i < paths.length; i += maxConcurrency) {\n const subset = paths.slice(i, i + maxConcurrency)\n\n const subsetResults = await Promise.all(\n subset.map((path) =>\n exportPageWithRetry(\n path,\n nextConfig.experimental.staticGenerationRetryCount ?? 1\n )\n )\n )\n\n results.push(...subsetResults)\n }\n\n return results\n}\n\nasync function exportPage(\n input: ExportPageInput\n): Promise<ExportPageResult | undefined> {\n trace('export-page', input.parentSpanId).setAttribute('path', input.path)\n\n // Configure the http agent.\n setHttpClientAndAgentOptions({\n httpAgentOptions: input.httpAgentOptions,\n })\n\n const fileWriter = new MultiFileWriter({\n writeFile: (filePath, data) => fs.writeFile(filePath, data),\n mkdir: (dir) => fs.mkdir(dir, { recursive: true }),\n })\n\n const exportPageSpan = trace('export-page-worker', input.parentSpanId)\n\n const start = Date.now()\n\n const turborepoAccessTraceResult = new TurborepoAccessTraceResult()\n\n // Export the page.\n let result: ExportRouteResult | undefined\n try {\n result = await exportPageSpan.traceAsyncFn(() =>\n turborepoTraceAccess(\n () => exportPageImpl(input, fileWriter),\n turborepoAccessTraceResult\n )\n )\n\n // Wait for all the files to flush to disk.\n await fileWriter.wait()\n\n // If there was no result, then we can exit early.\n if (!result) return\n\n // If there was an error, then we can exit early.\n if ('error' in result) {\n return { error: result.error, duration: Date.now() - start }\n }\n } catch (err) {\n console.error(\n `Error occurred prerendering page \"${input.path}\". Read more: https://nextjs.org/docs/messages/prerender-error`\n )\n\n // bailoutToCSRError errors should not leak to the user as they are not actionable; they're\n // a framework signal\n if (!isBailoutToCSRError(err)) {\n // A static generation bailout error is a framework signal to fail static generation but\n // and will encode a reason in the error message. If there is a message, we'll print it.\n // Otherwise there's nothing to show as we don't want to leak an error internal error stack to the user.\n if (isStaticGenBailoutError(err)) {\n if (err.message) {\n console.error(`Error: ${err.message}`)\n }\n } else if (isError(err) && err.stack) {\n console.error(err.stack)\n } else {\n console.error(err)\n }\n }\n\n return { error: true, duration: Date.now() - start }\n }\n\n // Notify the parent process that we processed a page (used by the progress activity indicator)\n process.send?.([3, { type: 'activity' }])\n\n // Otherwise we can return the result.\n return {\n duration: Date.now() - start,\n ampValidations: result.ampValidations,\n revalidate: result.revalidate,\n metadata: result.metadata,\n ssgNotFound: result.ssgNotFound,\n hasEmptyPrelude: result.hasEmptyPrelude,\n hasPostponed: result.hasPostponed,\n turborepoAccessTraceResult: turborepoAccessTraceResult.serialize(),\n fetchMetrics: result.fetchMetrics,\n }\n}\n\nprocess.on('unhandledRejection', (err: unknown) => {\n // if it's a postpone error, it'll be handled later\n // when the postponed promise is actually awaited.\n if (isPostpone(err)) {\n return\n }\n\n // we don't want to log these errors\n if (isDynamicUsageError(err)) {\n return\n }\n\n console.error(err)\n})\n\nprocess.on('rejectionHandled', () => {\n // It is ok to await a Promise late in Next.js as it allows for better\n // prefetching patterns to avoid waterfalls. We ignore logging these.\n // We should've already errored in anyway unhandledRejection.\n})\n\nconst FATAL_UNHANDLED_NEXT_API_EXIT_CODE = 78\n\nprocess.on('uncaughtException', (err) => {\n if (isDynamicUsageError(err)) {\n console.error(\n 'A Next.js API that uses exceptions to signal framework behavior was uncaught. This suggests improper usage of a Next.js API. The original error is printed below and the build will now exit.'\n )\n console.error(err)\n process.exit(FATAL_UNHANDLED_NEXT_API_EXIT_CODE)\n } else {\n console.error(err)\n }\n})\n"],"names":["exportPages","process","env","NEXT_IS_EXPORT_WORKER","envConfig","require","globalThis","__NEXT_DATA__","nextExport","TimeoutError","Error","code","ExportPageError","exportPageImpl","input","fileWriter","req","path","pathMap","distDir","pagesDataDir","buildExport","serverRuntimeConfig","subFolders","optimizeCss","disableOptimizedLoading","debugOutput","enableExperimentalReact","ampValidatorPath","trailingSlash","sriEnabled","__NEXT_EXPERIMENTAL_REACT","page","_fallbackRouteParams","_isAppDir","isAppDir","_isDynamicError","isDynamicError","_isRoutePPREnabled","isRoutePPREnabled","_isProspectiveRender","isProspectiveRender","query","originalQuery","fallbackRouteParams","getFallbackRouteParams","pathname","normalizeAppPath","isDynamic","isDynamicRoute","outDir","join","filePath","normalizePagePath","ampPath","renderAmpPath","updatedPath","_ssgPath","locale","_locale","renderOpts","localePathResult","normalizeLocalePath","locales","detectedLocale","defaultLocale","hasOrigQueryValues","Object","keys","length","nonLocalizedPath","params","normalizedPage","getParams","res","createRequestResponseMocks","url","statusCode","some","p","endsWith","domainLocales","dl","includes","addRequestMeta","setConfig","publicRuntimeConfig","runtimeConfig","getHtmlFilename","sep","htmlFilename","pageExt","extname","pathExt","isBuiltinPaths","isHtmlExtPath","baseDir","dirname","htmlFilepath","fs","mkdir","recursive","components","loadComponents","isAppPath","isDev","isAppRouteRoute","exportAppRoute","routeModule","incrementalCache","cacheLifeProfiles","experimental","buildId","supportsDynamicResponse","hasNextSupport","isRevalidate","sharedContext","prospectiveRenderAppPage","exportAppPage","deploymentId","customServer","undefined","renderContext","isFallback","_pagesFallback","isDraftMode","developmentNotFoundSourcePage","exportPagesPage","exportPathMap","paths","dir","cacheHandler","cacheMaxMemorySize","fetchCacheKeyPrefix","nextConfig","options","createIncrementalCache","flushToDisk","cacheHandlers","maxConcurrency","staticGenerationMaxConcurrency","results","exportPageWithRetry","maxAttempts","pageKey","attempt","result","Promise","race","exportPage","amp","validator","parentSpanId","httpAgentOptions","needsExperimentalReact","Boolean","sri","algorithm","_","reject","setTimeout","staticPageGenerationTimeout","err","console","info","prerenderEarlyExit","error","exit","r","Math","random","i","subset","slice","subsetResults","all","map","staticGenerationRetryCount","push","trace","setAttribute","setHttpClientAndAgentOptions","MultiFileWriter","writeFile","data","exportPageSpan","start","Date","now","turborepoAccessTraceResult","TurborepoAccessTraceResult","traceAsyncFn","turborepoTraceAccess","wait","duration","isBailoutToCSRError","isStaticGenBailoutError","message","isError","stack","send","type","ampValidations","revalidate","metadata","ssgNotFound","hasEmptyPrelude","hasPostponed","serialize","fetchMetrics","on","isPostpone","isDynamicUsageError","FATAL_UNHANDLED_NEXT_API_EXIT_CODE"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/export/worker.ts"],"sourcesContent":["import type {\n ExportPagesInput,\n ExportPageInput,\n ExportPageResult,\n ExportRouteResult,\n WorkerRenderOpts,\n ExportPagesResult,\n} from './types'\n\nimport '../server/node-environment'\n\nprocess.env.NEXT_IS_EXPORT_WORKER = 'true'\n\nimport { extname, join, dirname, sep } from 'path'\nimport fs from 'fs/promises'\nimport { loadComponents } from '../server/load-components'\nimport { isDynamicRoute } from '../shared/lib/router/utils/is-dynamic'\nimport { normalizePagePath } from '../shared/lib/page-path/normalize-page-path'\nimport { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path'\nimport { trace } from '../trace'\nimport { setHttpClientAndAgentOptions } from '../server/setup-http-agent-env'\nimport isError from '../lib/is-error'\nimport { addRequestMeta } from '../server/request-meta'\nimport { normalizeAppPath } from '../shared/lib/router/utils/app-paths'\n\nimport { createRequestResponseMocks } from '../server/lib/mock-request'\nimport { isAppRouteRoute } from '../lib/is-app-route-route'\nimport { hasNextSupport } from '../server/ci-info'\nimport { exportAppRoute } from './routes/app-route'\nimport { exportAppPage, prospectiveRenderAppPage } from './routes/app-page'\nimport { exportPagesPage } from './routes/pages'\nimport { getParams } from './helpers/get-params'\nimport { createIncrementalCache } from './helpers/create-incremental-cache'\nimport { isPostpone } from '../server/lib/router-utils/is-postpone'\nimport { isDynamicUsageError } from './helpers/is-dynamic-usage-error'\nimport { isBailoutToCSRError } from '../shared/lib/lazy-dynamic/bailout-to-csr'\nimport {\n turborepoTraceAccess,\n TurborepoAccessTraceResult,\n} from '../build/turborepo-access-trace'\nimport type { Params } from '../server/request/params'\nimport {\n getFallbackRouteParams,\n type FallbackRouteParams,\n} from '../server/request/fallback-params'\nimport { needsExperimentalReact } from '../lib/needs-experimental-react'\nimport type { AppRouteRouteModule } from '../server/route-modules/app-route/module.compiled'\nimport { isStaticGenBailoutError } from '../client/components/static-generation-bailout'\nimport type { PagesRenderContext, PagesSharedContext } from '../server/render'\nimport type { AppSharedContext } from '../server/app-render/app-render'\nimport { MultiFileWriter } from '../lib/multi-file-writer'\n\nconst envConfig = require('../shared/lib/runtime-config.external')\n\n;(globalThis as any).__NEXT_DATA__ = {\n nextExport: true,\n}\n\nclass TimeoutError extends Error {\n code = 'NEXT_EXPORT_TIMEOUT_ERROR'\n}\n\nclass ExportPageError extends Error {\n code = 'NEXT_EXPORT_PAGE_ERROR'\n}\n\nasync function exportPageImpl(\n input: ExportPageInput,\n fileWriter: MultiFileWriter\n): Promise<ExportRouteResult | undefined> {\n const {\n path,\n pathMap,\n distDir,\n pagesDataDir,\n buildExport = false,\n serverRuntimeConfig,\n subFolders = false,\n optimizeCss,\n disableOptimizedLoading,\n debugOutput = false,\n enableExperimentalReact,\n ampValidatorPath,\n trailingSlash,\n sriEnabled,\n } = input\n\n if (enableExperimentalReact) {\n process.env.__NEXT_EXPERIMENTAL_REACT = 'true'\n }\n\n const {\n page,\n\n // The parameters that are currently unknown.\n _fallbackRouteParams = [],\n\n // Check if this is an `app/` page.\n _isAppDir: isAppDir = false,\n\n // Check if this should error when dynamic usage is detected.\n _isDynamicError: isDynamicError = false,\n\n // If this page supports partial prerendering, then we need to pass that to\n // the renderOpts.\n _isRoutePPREnabled: isRoutePPREnabled,\n\n // If this is a prospective render, we don't actually want to persist the\n // result, we just want to use it to error the build if there's a problem.\n _isProspectiveRender: isProspectiveRender = false,\n\n // Pull the original query out.\n query: originalQuery = {},\n } = pathMap\n\n const fallbackRouteParams: FallbackRouteParams | null =\n getFallbackRouteParams(_fallbackRouteParams)\n\n let query = { ...originalQuery }\n const pathname = normalizeAppPath(page)\n const isDynamic = isDynamicRoute(page)\n const outDir = isAppDir ? join(distDir, 'server/app') : input.outDir\n\n const filePath = normalizePagePath(path)\n const ampPath = `${filePath}.amp`\n let renderAmpPath = ampPath\n\n let updatedPath = pathMap._ssgPath || path\n let locale = pathMap._locale || input.renderOpts.locale\n\n if (input.renderOpts.locale) {\n const localePathResult = normalizeLocalePath(path, input.renderOpts.locales)\n\n if (localePathResult.detectedLocale) {\n updatedPath = localePathResult.pathname\n locale = localePathResult.detectedLocale\n\n if (locale === input.renderOpts.defaultLocale) {\n renderAmpPath = `${normalizePagePath(updatedPath)}.amp`\n }\n }\n }\n\n // We need to show a warning if they try to provide query values\n // for an auto-exported page since they won't be available\n const hasOrigQueryValues = Object.keys(originalQuery).length > 0\n\n // Check if the page is a specified dynamic route\n const { pathname: nonLocalizedPath } = normalizeLocalePath(\n path,\n input.renderOpts.locales\n )\n\n let params: Params | undefined\n\n if (isDynamic && page !== nonLocalizedPath) {\n const normalizedPage = isAppDir ? normalizeAppPath(page) : page\n\n params = getParams(normalizedPage, updatedPath)\n }\n\n const { req, res } = createRequestResponseMocks({ url: updatedPath })\n\n // If this is a status code page, then set the response code.\n for (const statusCode of [404, 500]) {\n if (\n [\n `/${statusCode}`,\n `/${statusCode}.html`,\n `/${statusCode}/index.html`,\n ].some((p) => p === updatedPath || `/${locale}${p}` === updatedPath)\n ) {\n res.statusCode = statusCode\n }\n }\n\n // Ensure that the URL has a trailing slash if it's configured.\n if (trailingSlash && !req.url?.endsWith('/')) {\n req.url += '/'\n }\n\n if (\n locale &&\n buildExport &&\n input.renderOpts.domainLocales &&\n input.renderOpts.domainLocales.some(\n (dl) => dl.defaultLocale === locale || dl.locales?.includes(locale || '')\n )\n ) {\n addRequestMeta(req, 'isLocaleDomain', true)\n }\n\n envConfig.setConfig({\n serverRuntimeConfig,\n publicRuntimeConfig: input.renderOpts.runtimeConfig,\n })\n\n const getHtmlFilename = (p: string) =>\n subFolders ? `${p}${sep}index.html` : `${p}.html`\n\n let htmlFilename = getHtmlFilename(filePath)\n\n // dynamic routes can provide invalid extensions e.g. /blog/[...slug] returns an\n // extension of `.slug]`\n const pageExt = isDynamic || isAppDir ? '' : extname(page)\n const pathExt = isDynamic || isAppDir ? '' : extname(path)\n\n // force output 404.html for backwards compat\n if (path === '/404.html') {\n htmlFilename = path\n }\n // Make sure page isn't a folder with a dot in the name e.g. `v1.2`\n else if (pageExt !== pathExt && pathExt !== '') {\n const isBuiltinPaths = ['/500', '/404'].some(\n (p) => p === path || p === path + '.html'\n )\n // If the ssg path has .html extension, and it's not builtin paths, use it directly\n // Otherwise, use that as the filename instead\n const isHtmlExtPath = !isBuiltinPaths && path.endsWith('.html')\n htmlFilename = isHtmlExtPath ? getHtmlFilename(path) : path\n } else if (path === '/') {\n // If the path is the root, just use index.html\n htmlFilename = 'index.html'\n }\n\n const baseDir = join(outDir, dirname(htmlFilename))\n let htmlFilepath = join(outDir, htmlFilename)\n\n await fs.mkdir(baseDir, { recursive: true })\n\n const components = await loadComponents({\n distDir,\n page,\n isAppPath: isAppDir,\n isDev: false,\n sriEnabled,\n })\n\n // Handle App Routes.\n if (isAppDir && isAppRouteRoute(page)) {\n return exportAppRoute(\n req,\n res,\n params,\n page,\n components.routeModule as AppRouteRouteModule,\n input.renderOpts.incrementalCache,\n input.renderOpts.cacheLifeProfiles,\n htmlFilepath,\n fileWriter,\n input.renderOpts.experimental,\n input.buildId\n )\n }\n\n const renderOpts: WorkerRenderOpts = {\n ...components,\n ...input.renderOpts,\n ampPath: renderAmpPath,\n params,\n optimizeCss,\n disableOptimizedLoading,\n locale,\n supportsDynamicResponse: false,\n experimental: {\n ...input.renderOpts.experimental,\n isRoutePPREnabled,\n },\n }\n\n if (hasNextSupport) {\n renderOpts.isRevalidate = true\n }\n\n // Handle App Pages\n if (isAppDir) {\n const sharedContext: AppSharedContext = {\n buildId: input.buildId,\n }\n\n // If this is a prospective render, don't return any metrics or revalidate\n // timings as we aren't persisting this render (it was only to error).\n if (isProspectiveRender) {\n return prospectiveRenderAppPage(\n req,\n res,\n page,\n pathname,\n query,\n fallbackRouteParams,\n renderOpts,\n sharedContext\n )\n }\n\n return exportAppPage(\n req,\n res,\n page,\n path,\n pathname,\n query,\n fallbackRouteParams,\n renderOpts,\n htmlFilepath,\n debugOutput,\n isDynamicError,\n fileWriter,\n sharedContext\n )\n }\n\n const sharedContext: PagesSharedContext = {\n buildId: input.buildId,\n deploymentId: input.renderOpts.deploymentId,\n customServer: undefined,\n }\n\n const renderContext: PagesRenderContext = {\n isFallback: pathMap._pagesFallback ?? false,\n isDraftMode: false,\n developmentNotFoundSourcePage: undefined,\n }\n\n return exportPagesPage(\n req,\n res,\n path,\n page,\n query,\n params,\n htmlFilepath,\n htmlFilename,\n ampPath,\n subFolders,\n outDir,\n ampValidatorPath,\n pagesDataDir,\n buildExport,\n isDynamic,\n sharedContext,\n renderContext,\n hasOrigQueryValues,\n renderOpts,\n components,\n fileWriter\n )\n}\n\nexport async function exportPages(\n input: ExportPagesInput\n): Promise<ExportPagesResult> {\n const {\n exportPathMap,\n paths,\n dir,\n distDir,\n outDir,\n cacheHandler,\n cacheMaxMemorySize,\n fetchCacheKeyPrefix,\n pagesDataDir,\n renderOpts,\n nextConfig,\n options,\n } = input\n\n // If the fetch cache was enabled, we need to create an incremental\n // cache instance for this page.\n const incrementalCache = await createIncrementalCache({\n cacheHandler,\n cacheMaxMemorySize,\n fetchCacheKeyPrefix,\n distDir,\n dir,\n // skip writing to disk in minimal mode for now, pending some\n // changes to better support it\n flushToDisk: !hasNextSupport,\n cacheHandlers: nextConfig.experimental.cacheHandlers,\n })\n\n renderOpts.incrementalCache = incrementalCache\n\n const maxConcurrency =\n nextConfig.experimental.staticGenerationMaxConcurrency ?? 8\n const results: ExportPagesResult = []\n\n const exportPageWithRetry = async (path: string, maxAttempts: number) => {\n const pathMap = exportPathMap[path]\n const { page } = exportPathMap[path]\n const pageKey = page !== path ? `${page}: ${path}` : path\n let attempt = 0\n let result\n\n while (attempt < maxAttempts) {\n try {\n result = await Promise.race<ExportPageResult | undefined>([\n exportPage({\n path,\n pathMap,\n distDir,\n outDir,\n pagesDataDir,\n renderOpts,\n ampValidatorPath:\n nextConfig.experimental.amp?.validator || undefined,\n trailingSlash: nextConfig.trailingSlash,\n serverRuntimeConfig: nextConfig.serverRuntimeConfig,\n subFolders: nextConfig.trailingSlash && !options.buildExport,\n buildExport: options.buildExport,\n optimizeCss: nextConfig.experimental.optimizeCss,\n disableOptimizedLoading:\n nextConfig.experimental.disableOptimizedLoading,\n parentSpanId: input.parentSpanId,\n httpAgentOptions: nextConfig.httpAgentOptions,\n debugOutput: options.debugOutput,\n enableExperimentalReact: needsExperimentalReact(nextConfig),\n sriEnabled: Boolean(nextConfig.experimental.sri?.algorithm),\n buildId: input.buildId,\n }),\n // If exporting the page takes longer than the timeout, reject the promise.\n new Promise((_, reject) => {\n setTimeout(() => {\n reject(new TimeoutError())\n }, nextConfig.staticPageGenerationTimeout * 1000)\n }),\n ])\n\n // If there was an error in the export, throw it immediately. In the catch block, we might retry the export,\n // or immediately fail the build, depending on user configuration. We might also continue on and attempt other pages.\n if (result && 'error' in result) {\n throw new ExportPageError()\n }\n\n // If the export succeeds, break out of the retry loop\n break\n } catch (err) {\n // The only error that should be caught here is an ExportError, as `exportPage` doesn't throw and instead returns an object with an `error` property.\n // This is an overly cautious check to ensure that we don't accidentally catch an unexpected error.\n if (!(err instanceof ExportPageError || err instanceof TimeoutError)) {\n throw err\n }\n\n if (err instanceof TimeoutError) {\n // If the export times out, we will restart the worker up to 3 times.\n maxAttempts = 3\n }\n\n // We've reached the maximum number of attempts\n if (attempt >= maxAttempts - 1) {\n // Log a message if we've reached the maximum number of attempts.\n // We only care to do this if maxAttempts was configured.\n if (maxAttempts > 1) {\n console.info(\n `Failed to build ${pageKey} after ${maxAttempts} attempts.`\n )\n }\n // If prerenderEarlyExit is enabled, we'll exit the build immediately.\n if (nextConfig.experimental.prerenderEarlyExit) {\n console.error(\n `Export encountered an error on ${pageKey}, exiting the build.`\n )\n process.exit(1)\n } else {\n // Otherwise, this is a no-op. The build will continue, and a summary of failed pages will be displayed at the end.\n }\n } else {\n // Otherwise, we have more attempts to make. Wait before retrying\n if (err instanceof TimeoutError) {\n console.info(\n `Failed to build ${pageKey} (attempt ${attempt + 1} of ${maxAttempts}) because it took more than ${nextConfig.staticPageGenerationTimeout} seconds. Retrying again shortly.`\n )\n } else {\n console.info(\n `Failed to build ${pageKey} (attempt ${attempt + 1} of ${maxAttempts}). Retrying again shortly.`\n )\n }\n\n // Exponential backoff with random jitter to avoid thundering herd on retries\n const baseDelay = 500 // 500ms\n const maxDelay = 2000 // 2 seconds\n const delay = Math.min(baseDelay * Math.pow(2, attempt), maxDelay)\n const jitter = Math.random() * 0.3 * delay // Add up to 30% random jitter\n await new Promise((r) => setTimeout(r, delay + jitter))\n }\n }\n\n attempt++\n }\n\n return { result, path, pageKey }\n }\n\n for (let i = 0; i < paths.length; i += maxConcurrency) {\n const subset = paths.slice(i, i + maxConcurrency)\n\n const subsetResults = await Promise.all(\n subset.map((path) =>\n exportPageWithRetry(\n path,\n nextConfig.experimental.staticGenerationRetryCount ?? 1\n )\n )\n )\n\n results.push(...subsetResults)\n }\n\n return results\n}\n\nasync function exportPage(\n input: ExportPageInput\n): Promise<ExportPageResult | undefined> {\n trace('export-page', input.parentSpanId).setAttribute('path', input.path)\n\n // Configure the http agent.\n setHttpClientAndAgentOptions({\n httpAgentOptions: input.httpAgentOptions,\n })\n\n const fileWriter = new MultiFileWriter({\n writeFile: (filePath, data) => fs.writeFile(filePath, data),\n mkdir: (dir) => fs.mkdir(dir, { recursive: true }),\n })\n\n const exportPageSpan = trace('export-page-worker', input.parentSpanId)\n\n const start = Date.now()\n\n const turborepoAccessTraceResult = new TurborepoAccessTraceResult()\n\n // Export the page.\n let result: ExportRouteResult | undefined\n try {\n result = await exportPageSpan.traceAsyncFn(() =>\n turborepoTraceAccess(\n () => exportPageImpl(input, fileWriter),\n turborepoAccessTraceResult\n )\n )\n\n // Wait for all the files to flush to disk.\n await fileWriter.wait()\n\n // If there was no result, then we can exit early.\n if (!result) return\n\n // If there was an error, then we can exit early.\n if ('error' in result) {\n return { error: result.error, duration: Date.now() - start }\n }\n } catch (err) {\n console.error(\n `Error occurred prerendering page \"${input.path}\". Read more: https://nextjs.org/docs/messages/prerender-error`\n )\n\n // bailoutToCSRError errors should not leak to the user as they are not actionable; they're\n // a framework signal\n if (!isBailoutToCSRError(err)) {\n // A static generation bailout error is a framework signal to fail static generation but\n // and will encode a reason in the error message. If there is a message, we'll print it.\n // Otherwise there's nothing to show as we don't want to leak an error internal error stack to the user.\n if (isStaticGenBailoutError(err)) {\n if (err.message) {\n console.error(`Error: ${err.message}`)\n }\n } else if (isError(err) && err.stack) {\n console.error(err.stack)\n } else {\n console.error(err)\n }\n }\n\n return { error: true, duration: Date.now() - start }\n }\n\n // Notify the parent process that we processed a page (used by the progress activity indicator)\n process.send?.([3, { type: 'activity' }])\n\n // Otherwise we can return the result.\n return {\n duration: Date.now() - start,\n ampValidations: result.ampValidations,\n revalidate: result.revalidate,\n metadata: result.metadata,\n ssgNotFound: result.ssgNotFound,\n hasEmptyPrelude: result.hasEmptyPrelude,\n hasPostponed: result.hasPostponed,\n turborepoAccessTraceResult: turborepoAccessTraceResult.serialize(),\n fetchMetrics: result.fetchMetrics,\n }\n}\n\nprocess.on('unhandledRejection', (err: unknown) => {\n // if it's a postpone error, it'll be handled later\n // when the postponed promise is actually awaited.\n if (isPostpone(err)) {\n return\n }\n\n // we don't want to log these errors\n if (isDynamicUsageError(err)) {\n return\n }\n\n console.error(err)\n})\n\nprocess.on('rejectionHandled', () => {\n // It is ok to await a Promise late in Next.js as it allows for better\n // prefetching patterns to avoid waterfalls. We ignore logging these.\n // We should've already errored in anyway unhandledRejection.\n})\n\nconst FATAL_UNHANDLED_NEXT_API_EXIT_CODE = 78\n\nprocess.on('uncaughtException', (err) => {\n if (isDynamicUsageError(err)) {\n console.error(\n 'A Next.js API that uses exceptions to signal framework behavior was uncaught. This suggests improper usage of a Next.js API. The original error is printed below and the build will now exit.'\n )\n console.error(err)\n process.exit(FATAL_UNHANDLED_NEXT_API_EXIT_CODE)\n } else {\n console.error(err)\n }\n})\n"],"names":["exportPages","process","env","NEXT_IS_EXPORT_WORKER","envConfig","require","globalThis","__NEXT_DATA__","nextExport","TimeoutError","Error","code","ExportPageError","exportPageImpl","input","fileWriter","req","path","pathMap","distDir","pagesDataDir","buildExport","serverRuntimeConfig","subFolders","optimizeCss","disableOptimizedLoading","debugOutput","enableExperimentalReact","ampValidatorPath","trailingSlash","sriEnabled","__NEXT_EXPERIMENTAL_REACT","page","_fallbackRouteParams","_isAppDir","isAppDir","_isDynamicError","isDynamicError","_isRoutePPREnabled","isRoutePPREnabled","_isProspectiveRender","isProspectiveRender","query","originalQuery","fallbackRouteParams","getFallbackRouteParams","pathname","normalizeAppPath","isDynamic","isDynamicRoute","outDir","join","filePath","normalizePagePath","ampPath","renderAmpPath","updatedPath","_ssgPath","locale","_locale","renderOpts","localePathResult","normalizeLocalePath","locales","detectedLocale","defaultLocale","hasOrigQueryValues","Object","keys","length","nonLocalizedPath","params","normalizedPage","getParams","res","createRequestResponseMocks","url","statusCode","some","p","endsWith","domainLocales","dl","includes","addRequestMeta","setConfig","publicRuntimeConfig","runtimeConfig","getHtmlFilename","sep","htmlFilename","pageExt","extname","pathExt","isBuiltinPaths","isHtmlExtPath","baseDir","dirname","htmlFilepath","fs","mkdir","recursive","components","loadComponents","isAppPath","isDev","isAppRouteRoute","exportAppRoute","routeModule","incrementalCache","cacheLifeProfiles","experimental","buildId","supportsDynamicResponse","hasNextSupport","isRevalidate","sharedContext","prospectiveRenderAppPage","exportAppPage","deploymentId","customServer","undefined","renderContext","isFallback","_pagesFallback","isDraftMode","developmentNotFoundSourcePage","exportPagesPage","exportPathMap","paths","dir","cacheHandler","cacheMaxMemorySize","fetchCacheKeyPrefix","nextConfig","options","createIncrementalCache","flushToDisk","cacheHandlers","maxConcurrency","staticGenerationMaxConcurrency","results","exportPageWithRetry","maxAttempts","pageKey","attempt","result","Promise","race","exportPage","amp","validator","parentSpanId","httpAgentOptions","needsExperimentalReact","Boolean","sri","algorithm","_","reject","setTimeout","staticPageGenerationTimeout","err","console","info","prerenderEarlyExit","error","exit","baseDelay","maxDelay","delay","Math","min","pow","jitter","random","r","i","subset","slice","subsetResults","all","map","staticGenerationRetryCount","push","trace","setAttribute","setHttpClientAndAgentOptions","MultiFileWriter","writeFile","data","exportPageSpan","start","Date","now","turborepoAccessTraceResult","TurborepoAccessTraceResult","traceAsyncFn","turborepoTraceAccess","wait","duration","isBailoutToCSRError","isStaticGenBailoutError","message","isError","stack","send","type","ampValidations","revalidate","metadata","ssgNotFound","hasEmptyPrelude","hasPostponed","serialize","fetchMetrics","on","isPostpone","isDynamicUsageError","FATAL_UNHANDLED_NEXT_API_EXIT_CODE"],"mappings":"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"}
@@ -90,7 +90,8 @@ const unsupportedTurbopackNextConfigOptions = [
90
90
  // This is used to force swc-loader to run regardless of finding Babel.
91
91
  'experimental.forceSwcTransforms',
92
92
  'experimental.fullySpecified',
93
- 'experimental.urlImports'
93
+ 'experimental.urlImports',
94
+ 'experimental.slowModuleDetection'
94
95
  ];
95
96
  // The following will need to be supported by `next build --turbopack`
96
97
  const unsupportedProductionSpecificTurbopackNextConfigOptions = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/turbopack-warning.ts"],"sourcesContent":["import type { NextConfig } from '../server/config-shared'\nimport path from 'path'\nimport loadConfig from '../server/config'\nimport * as Log from '../build/output/log'\nimport {\n PHASE_DEVELOPMENT_SERVER,\n PHASE_PRODUCTION_BUILD,\n} from '../shared/lib/constants'\n\nconst unsupportedTurbopackNextConfigOptions = [\n // is this supported?\n // 'amp',\n // 'experimental.amp',\n\n // Left to be implemented (priority)\n // 'experimental.clientRouterFilter',\n // 'experimental.optimizePackageImports',\n // 'compiler.emotion',\n // 'compiler.reactRemoveProperties',\n // 'compiler.relay',\n // 'compiler.removeConsole',\n // 'compiler.styledComponents',\n 'experimental.fetchCacheKeyPrefix',\n\n // Left to be implemented\n // 'excludeDefaultMomentLocales',\n // 'experimental.optimizeServerReact',\n 'experimental.clientRouterFilterAllowedRate',\n // 'experimental.serverMinification',\n // 'experimental.serverSourceMaps',\n\n 'experimental.allowedRevalidateHeaderKeys',\n 'experimental.extensionAlias',\n 'experimental.fallbackNodePolyfills',\n\n 'experimental.sri.algorithm',\n 'experimental.swcTraceProfiling',\n 'experimental.typedRoutes',\n\n // Left to be implemented (Might not be needed for Turbopack)\n 'experimental.craCompat',\n 'experimental.disablePostcssPresetEnv',\n 'experimental.esmExternals',\n // This is used to force swc-loader to run regardless of finding Babel.\n 'experimental.forceSwcTransforms',\n 'experimental.fullySpecified',\n 'experimental.urlImports',\n]\n\n// The following will need to be supported by `next build --turbopack`\nconst unsupportedProductionSpecificTurbopackNextConfigOptions: string[] = [\n // TODO: Support disabling sourcemaps, currently they're always enabled.\n // 'productionBrowserSourceMaps',\n]\n\n// check for babelrc, swc plugins\nexport async function validateTurboNextConfig({\n dir,\n isDev,\n}: {\n dir: string\n isDev?: boolean\n}) {\n const { getPkgManager } =\n require('../lib/helpers/get-pkg-manager') as typeof import('../lib/helpers/get-pkg-manager')\n const { getBabelConfigFile } =\n require('../build/get-babel-config-file') as typeof import('../build/get-babel-config-file')\n const { defaultConfig } =\n require('../server/config-shared') as typeof import('../server/config-shared')\n const { bold, cyan, red, underline } =\n require('../lib/picocolors') as typeof import('../lib/picocolors')\n const { interopDefault } =\n require('../lib/interop-default') as typeof import('../lib/interop-default')\n\n let unsupportedParts = ''\n let babelrc = await getBabelConfigFile(dir)\n if (babelrc) babelrc = path.basename(babelrc)\n\n let hasWebpackConfig = false\n let hasTurboConfig = false\n\n let unsupportedConfig: string[] = []\n let rawNextConfig: NextConfig = {}\n\n const phase = isDev ? PHASE_DEVELOPMENT_SERVER : PHASE_PRODUCTION_BUILD\n try {\n rawNextConfig = interopDefault(\n await loadConfig(phase, dir, {\n rawConfig: true,\n })\n ) as NextConfig\n\n if (typeof rawNextConfig === 'function') {\n rawNextConfig = (rawNextConfig as any)(phase, {\n defaultConfig,\n })\n }\n\n const flattenKeys = (obj: any, prefix: string = ''): string[] => {\n let keys: string[] = []\n\n for (const key in obj) {\n if (typeof obj?.[key] === 'undefined') {\n continue\n }\n\n const pre = prefix.length ? `${prefix}.` : ''\n\n if (\n typeof obj[key] === 'object' &&\n !Array.isArray(obj[key]) &&\n obj[key] !== null\n ) {\n keys = keys.concat(flattenKeys(obj[key], pre + key))\n } else {\n keys.push(pre + key)\n }\n }\n\n return keys\n }\n\n const getDeepValue = (obj: any, keys: string | string[]): any => {\n if (typeof keys === 'string') {\n keys = keys.split('.')\n }\n if (keys.length === 1) {\n return obj?.[keys?.[0]]\n }\n return getDeepValue(obj?.[keys?.[0]], keys.slice(1))\n }\n\n const customKeys = flattenKeys(rawNextConfig)\n\n let unsupportedKeys = isDev\n ? unsupportedTurbopackNextConfigOptions\n : [\n ...unsupportedTurbopackNextConfigOptions,\n ...unsupportedProductionSpecificTurbopackNextConfigOptions,\n ]\n\n for (const key of customKeys) {\n if (key.startsWith('webpack') && rawNextConfig.webpack) {\n hasWebpackConfig = true\n }\n if (key.startsWith('experimental.turbo')) {\n hasTurboConfig = true\n }\n\n let isUnsupported =\n unsupportedKeys.some(\n (unsupportedKey) =>\n // Either the key matches (or is a more specific subkey) of\n // unsupportedKey, or the key is the path to a specific subkey.\n // | key | unsupportedKey |\n // |---------|----------------|\n // | foo | foo |\n // | foo.bar | foo |\n // | foo | foo.bar |\n key.startsWith(unsupportedKey) ||\n unsupportedKey.startsWith(`${key}.`)\n ) &&\n getDeepValue(rawNextConfig, key) !== getDeepValue(defaultConfig, key)\n\n if (isUnsupported) {\n unsupportedConfig.push(key)\n }\n }\n } catch (e) {\n Log.error('Unexpected error occurred while checking config', e)\n }\n\n const feedbackMessage = `Learn more about Next.js and Turbopack: ${underline(\n 'https://nextjs.org/docs/architecture/turbopack'\n )}\\n`\n\n if (hasWebpackConfig && !hasTurboConfig) {\n Log.warn(\n `Webpack is configured while Turbopack is not, which may cause problems.`\n )\n Log.warn(\n `See instructions if you need to configure Turbopack:\\n https://nextjs.org/docs/app/api-reference/next-config-js/turbo\\n`\n )\n }\n\n if (babelrc) {\n unsupportedParts += `Babel detected (${cyan(\n babelrc\n )})\\n Babel is not yet supported. To use Turbopack at the moment,\\n you'll need to remove your usage of Babel.`\n }\n\n if (\n unsupportedConfig.length === 1 &&\n unsupportedConfig[0] === 'experimental.optimizePackageImports'\n ) {\n Log.warn(\n `'experimental.optimizePackageImports' is not yet supported by Turbopack and will be ignored.`\n )\n } else if (unsupportedConfig.length) {\n unsupportedParts += `\\n\\n- Unsupported Next.js configuration option(s) (${cyan(\n 'next.config.js'\n )})\\n To use Turbopack, remove the following configuration options:\\n${unsupportedConfig\n .map((name) => ` - ${red(name)}\\n`)\n .join('')}`\n }\n\n if (unsupportedParts) {\n const pkgManager = getPkgManager(dir)\n\n Log.error(\n `You are using configuration and/or tools that are not yet\\nsupported by Next.js with Turbopack:\\n${unsupportedParts}\\n\nIf you cannot make the changes above, but still want to try out\\nNext.js with Turbopack, create the Next.js playground app\\nby running the following commands:\n\n ${bold(\n cyan(\n `${\n pkgManager === 'npm'\n ? 'npx create-next-app'\n : `${pkgManager} create next-app`\n } --example with-turbopack with-turbopack-app`\n )\n )}\\n cd with-turbopack-app\\n ${pkgManager} run dev\n `\n )\n\n Log.warn(feedbackMessage)\n\n process.exit(1)\n }\n\n return rawNextConfig\n}\n"],"names":["validateTurboNextConfig","unsupportedTurbopackNextConfigOptions","unsupportedProductionSpecificTurbopackNextConfigOptions","dir","isDev","getPkgManager","require","getBabelConfigFile","defaultConfig","bold","cyan","red","underline","interopDefault","unsupportedParts","babelrc","path","basename","hasWebpackConfig","hasTurboConfig","unsupportedConfig","rawNextConfig","phase","PHASE_DEVELOPMENT_SERVER","PHASE_PRODUCTION_BUILD","loadConfig","rawConfig","flattenKeys","obj","prefix","keys","key","pre","length","Array","isArray","concat","push","getDeepValue","split","slice","customKeys","unsupportedKeys","startsWith","webpack","isUnsupported","some","unsupportedKey","e","Log","error","feedbackMessage","warn","map","name","join","pkgManager","process","exit"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/turbopack-warning.ts"],"sourcesContent":["import type { NextConfig } from '../server/config-shared'\nimport path from 'path'\nimport loadConfig from '../server/config'\nimport * as Log from '../build/output/log'\nimport {\n PHASE_DEVELOPMENT_SERVER,\n PHASE_PRODUCTION_BUILD,\n} from '../shared/lib/constants'\n\nconst unsupportedTurbopackNextConfigOptions = [\n // is this supported?\n // 'amp',\n // 'experimental.amp',\n\n // Left to be implemented (priority)\n // 'experimental.clientRouterFilter',\n // 'experimental.optimizePackageImports',\n // 'compiler.emotion',\n // 'compiler.reactRemoveProperties',\n // 'compiler.relay',\n // 'compiler.removeConsole',\n // 'compiler.styledComponents',\n 'experimental.fetchCacheKeyPrefix',\n\n // Left to be implemented\n // 'excludeDefaultMomentLocales',\n // 'experimental.optimizeServerReact',\n 'experimental.clientRouterFilterAllowedRate',\n // 'experimental.serverMinification',\n // 'experimental.serverSourceMaps',\n\n 'experimental.allowedRevalidateHeaderKeys',\n 'experimental.extensionAlias',\n 'experimental.fallbackNodePolyfills',\n\n 'experimental.sri.algorithm',\n 'experimental.swcTraceProfiling',\n 'experimental.typedRoutes',\n\n // Left to be implemented (Might not be needed for Turbopack)\n 'experimental.craCompat',\n 'experimental.disablePostcssPresetEnv',\n 'experimental.esmExternals',\n // This is used to force swc-loader to run regardless of finding Babel.\n 'experimental.forceSwcTransforms',\n 'experimental.fullySpecified',\n 'experimental.urlImports',\n 'experimental.slowModuleDetection',\n]\n\n// The following will need to be supported by `next build --turbopack`\nconst unsupportedProductionSpecificTurbopackNextConfigOptions: string[] = [\n // TODO: Support disabling sourcemaps, currently they're always enabled.\n // 'productionBrowserSourceMaps',\n]\n\n// check for babelrc, swc plugins\nexport async function validateTurboNextConfig({\n dir,\n isDev,\n}: {\n dir: string\n isDev?: boolean\n}) {\n const { getPkgManager } =\n require('../lib/helpers/get-pkg-manager') as typeof import('../lib/helpers/get-pkg-manager')\n const { getBabelConfigFile } =\n require('../build/get-babel-config-file') as typeof import('../build/get-babel-config-file')\n const { defaultConfig } =\n require('../server/config-shared') as typeof import('../server/config-shared')\n const { bold, cyan, red, underline } =\n require('../lib/picocolors') as typeof import('../lib/picocolors')\n const { interopDefault } =\n require('../lib/interop-default') as typeof import('../lib/interop-default')\n\n let unsupportedParts = ''\n let babelrc = await getBabelConfigFile(dir)\n if (babelrc) babelrc = path.basename(babelrc)\n\n let hasWebpackConfig = false\n let hasTurboConfig = false\n\n let unsupportedConfig: string[] = []\n let rawNextConfig: NextConfig = {}\n\n const phase = isDev ? PHASE_DEVELOPMENT_SERVER : PHASE_PRODUCTION_BUILD\n try {\n rawNextConfig = interopDefault(\n await loadConfig(phase, dir, {\n rawConfig: true,\n })\n ) as NextConfig\n\n if (typeof rawNextConfig === 'function') {\n rawNextConfig = (rawNextConfig as any)(phase, {\n defaultConfig,\n })\n }\n\n const flattenKeys = (obj: any, prefix: string = ''): string[] => {\n let keys: string[] = []\n\n for (const key in obj) {\n if (typeof obj?.[key] === 'undefined') {\n continue\n }\n\n const pre = prefix.length ? `${prefix}.` : ''\n\n if (\n typeof obj[key] === 'object' &&\n !Array.isArray(obj[key]) &&\n obj[key] !== null\n ) {\n keys = keys.concat(flattenKeys(obj[key], pre + key))\n } else {\n keys.push(pre + key)\n }\n }\n\n return keys\n }\n\n const getDeepValue = (obj: any, keys: string | string[]): any => {\n if (typeof keys === 'string') {\n keys = keys.split('.')\n }\n if (keys.length === 1) {\n return obj?.[keys?.[0]]\n }\n return getDeepValue(obj?.[keys?.[0]], keys.slice(1))\n }\n\n const customKeys = flattenKeys(rawNextConfig)\n\n let unsupportedKeys = isDev\n ? unsupportedTurbopackNextConfigOptions\n : [\n ...unsupportedTurbopackNextConfigOptions,\n ...unsupportedProductionSpecificTurbopackNextConfigOptions,\n ]\n\n for (const key of customKeys) {\n if (key.startsWith('webpack') && rawNextConfig.webpack) {\n hasWebpackConfig = true\n }\n if (key.startsWith('experimental.turbo')) {\n hasTurboConfig = true\n }\n\n let isUnsupported =\n unsupportedKeys.some(\n (unsupportedKey) =>\n // Either the key matches (or is a more specific subkey) of\n // unsupportedKey, or the key is the path to a specific subkey.\n // | key | unsupportedKey |\n // |---------|----------------|\n // | foo | foo |\n // | foo.bar | foo |\n // | foo | foo.bar |\n key.startsWith(unsupportedKey) ||\n unsupportedKey.startsWith(`${key}.`)\n ) &&\n getDeepValue(rawNextConfig, key) !== getDeepValue(defaultConfig, key)\n\n if (isUnsupported) {\n unsupportedConfig.push(key)\n }\n }\n } catch (e) {\n Log.error('Unexpected error occurred while checking config', e)\n }\n\n const feedbackMessage = `Learn more about Next.js and Turbopack: ${underline(\n 'https://nextjs.org/docs/architecture/turbopack'\n )}\\n`\n\n if (hasWebpackConfig && !hasTurboConfig) {\n Log.warn(\n `Webpack is configured while Turbopack is not, which may cause problems.`\n )\n Log.warn(\n `See instructions if you need to configure Turbopack:\\n https://nextjs.org/docs/app/api-reference/next-config-js/turbo\\n`\n )\n }\n\n if (babelrc) {\n unsupportedParts += `Babel detected (${cyan(\n babelrc\n )})\\n Babel is not yet supported. To use Turbopack at the moment,\\n you'll need to remove your usage of Babel.`\n }\n\n if (\n unsupportedConfig.length === 1 &&\n unsupportedConfig[0] === 'experimental.optimizePackageImports'\n ) {\n Log.warn(\n `'experimental.optimizePackageImports' is not yet supported by Turbopack and will be ignored.`\n )\n } else if (unsupportedConfig.length) {\n unsupportedParts += `\\n\\n- Unsupported Next.js configuration option(s) (${cyan(\n 'next.config.js'\n )})\\n To use Turbopack, remove the following configuration options:\\n${unsupportedConfig\n .map((name) => ` - ${red(name)}\\n`)\n .join('')}`\n }\n\n if (unsupportedParts) {\n const pkgManager = getPkgManager(dir)\n\n Log.error(\n `You are using configuration and/or tools that are not yet\\nsupported by Next.js with Turbopack:\\n${unsupportedParts}\\n\nIf you cannot make the changes above, but still want to try out\\nNext.js with Turbopack, create the Next.js playground app\\nby running the following commands:\n\n ${bold(\n cyan(\n `${\n pkgManager === 'npm'\n ? 'npx create-next-app'\n : `${pkgManager} create next-app`\n } --example with-turbopack with-turbopack-app`\n )\n )}\\n cd with-turbopack-app\\n ${pkgManager} run dev\n `\n )\n\n Log.warn(feedbackMessage)\n\n process.exit(1)\n }\n\n return rawNextConfig\n}\n"],"names":["validateTurboNextConfig","unsupportedTurbopackNextConfigOptions","unsupportedProductionSpecificTurbopackNextConfigOptions","dir","isDev","getPkgManager","require","getBabelConfigFile","defaultConfig","bold","cyan","red","underline","interopDefault","unsupportedParts","babelrc","path","basename","hasWebpackConfig","hasTurboConfig","unsupportedConfig","rawNextConfig","phase","PHASE_DEVELOPMENT_SERVER","PHASE_PRODUCTION_BUILD","loadConfig","rawConfig","flattenKeys","obj","prefix","keys","key","pre","length","Array","isArray","concat","push","getDeepValue","split","slice","customKeys","unsupportedKeys","startsWith","webpack","isUnsupported","some","unsupportedKey","e","Log","error","feedbackMessage","warn","map","name","join","pkgManager","process","exit"],"mappings":";;;;+BAyDsBA;;;eAAAA;;;6DAxDL;+DACM;6DACF;2BAId;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEP,MAAMC,wCAAwC;IAC5C,qBAAqB;IACrB,SAAS;IACT,sBAAsB;IAEtB,oCAAoC;IACpC,qCAAqC;IACrC,yCAAyC;IACzC,sBAAsB;IACtB,oCAAoC;IACpC,oBAAoB;IACpB,4BAA4B;IAC5B,+BAA+B;IAC/B;IAEA,yBAAyB;IACzB,iCAAiC;IACjC,sCAAsC;IACtC;IACA,qCAAqC;IACrC,mCAAmC;IAEnC;IACA;IACA;IAEA;IACA;IACA;IAEA,6DAA6D;IAC7D;IACA;IACA;IACA,uEAAuE;IACvE;IACA;IACA;IACA;CACD;AAED,sEAAsE;AACtE,MAAMC,0DAAoE,EAGzE;AAGM,eAAeF,wBAAwB,EAC5CG,GAAG,EACHC,KAAK,EAIN;IACC,MAAM,EAAEC,aAAa,EAAE,GACrBC,QAAQ;IACV,MAAM,EAAEC,kBAAkB,EAAE,GAC1BD,QAAQ;IACV,MAAM,EAAEE,aAAa,EAAE,GACrBF,QAAQ;IACV,MAAM,EAAEG,IAAI,EAAEC,IAAI,EAAEC,GAAG,EAAEC,SAAS,EAAE,GAClCN,QAAQ;IACV,MAAM,EAAEO,cAAc,EAAE,GACtBP,QAAQ;IAEV,IAAIQ,mBAAmB;IACvB,IAAIC,UAAU,MAAMR,mBAAmBJ;IACvC,IAAIY,SAASA,UAAUC,aAAI,CAACC,QAAQ,CAACF;IAErC,IAAIG,mBAAmB;IACvB,IAAIC,iBAAiB;IAErB,IAAIC,oBAA8B,EAAE;IACpC,IAAIC,gBAA4B,CAAC;IAEjC,MAAMC,QAAQlB,QAAQmB,mCAAwB,GAAGC,iCAAsB;IACvE,IAAI;QACFH,gBAAgBR,eACd,MAAMY,IAAAA,eAAU,EAACH,OAAOnB,KAAK;YAC3BuB,WAAW;QACb;QAGF,IAAI,OAAOL,kBAAkB,YAAY;YACvCA,gBAAgB,AAACA,cAAsBC,OAAO;gBAC5Cd;YACF;QACF;QAEA,MAAMmB,cAAc,CAACC,KAAUC,SAAiB,EAAE;YAChD,IAAIC,OAAiB,EAAE;YAEvB,IAAK,MAAMC,OAAOH,IAAK;gBACrB,IAAI,QAAOA,uBAAAA,GAAK,CAACG,IAAI,MAAK,aAAa;oBACrC;gBACF;gBAEA,MAAMC,MAAMH,OAAOI,MAAM,GAAG,GAAGJ,OAAO,CAAC,CAAC,GAAG;gBAE3C,IACE,OAAOD,GAAG,CAACG,IAAI,KAAK,YACpB,CAACG,MAAMC,OAAO,CAACP,GAAG,CAACG,IAAI,KACvBH,GAAG,CAACG,IAAI,KAAK,MACb;oBACAD,OAAOA,KAAKM,MAAM,CAACT,YAAYC,GAAG,CAACG,IAAI,EAAEC,MAAMD;gBACjD,OAAO;oBACLD,KAAKO,IAAI,CAACL,MAAMD;gBAClB;YACF;YAEA,OAAOD;QACT;QAEA,MAAMQ,eAAe,CAACV,KAAUE;YAC9B,IAAI,OAAOA,SAAS,UAAU;gBAC5BA,OAAOA,KAAKS,KAAK,CAAC;YACpB;YACA,IAAIT,KAAKG,MAAM,KAAK,GAAG;gBACrB,OAAOL,uBAAAA,GAAK,CAACE,wBAAAA,IAAM,CAAC,EAAE,CAAC;YACzB;YACA,OAAOQ,aAAaV,uBAAAA,GAAK,CAACE,wBAAAA,IAAM,CAAC,EAAE,CAAC,EAAEA,KAAKU,KAAK,CAAC;QACnD;QAEA,MAAMC,aAAad,YAAYN;QAE/B,IAAIqB,kBAAkBtC,QAClBH,wCACA;eACKA;eACAC;SACJ;QAEL,KAAK,MAAM6B,OAAOU,WAAY;YAC5B,IAAIV,IAAIY,UAAU,CAAC,cAActB,cAAcuB,OAAO,EAAE;gBACtD1B,mBAAmB;YACrB;YACA,IAAIa,IAAIY,UAAU,CAAC,uBAAuB;gBACxCxB,iBAAiB;YACnB;YAEA,IAAI0B,gBACFH,gBAAgBI,IAAI,CAClB,CAACC,iBACC,2DAA2D;gBAC3D,+DAA+D;gBAC/D,+BAA+B;gBAC/B,+BAA+B;gBAC/B,+BAA+B;gBAC/B,+BAA+B;gBAC/B,+BAA+B;gBAC/BhB,IAAIY,UAAU,CAACI,mBACfA,eAAeJ,UAAU,CAAC,GAAGZ,IAAI,CAAC,CAAC,MAEvCO,aAAajB,eAAeU,SAASO,aAAa9B,eAAeuB;YAEnE,IAAIc,eAAe;gBACjBzB,kBAAkBiB,IAAI,CAACN;YACzB;QACF;IACF,EAAE,OAAOiB,GAAG;QACVC,KAAIC,KAAK,CAAC,mDAAmDF;IAC/D;IAEA,MAAMG,kBAAkB,CAAC,wCAAwC,EAAEvC,UACjE,kDACA,EAAE,CAAC;IAEL,IAAIM,oBAAoB,CAACC,gBAAgB;QACvC8B,KAAIG,IAAI,CACN,CAAC,uEAAuE,CAAC;QAE3EH,KAAIG,IAAI,CACN,CAAC,wHAAwH,CAAC;IAE9H;IAEA,IAAIrC,SAAS;QACXD,oBAAoB,CAAC,gBAAgB,EAAEJ,KACrCK,SACA,8GAA8G,CAAC;IACnH;IAEA,IACEK,kBAAkBa,MAAM,KAAK,KAC7Bb,iBAAiB,CAAC,EAAE,KAAK,uCACzB;QACA6B,KAAIG,IAAI,CACN,CAAC,4FAA4F,CAAC;IAElG,OAAO,IAAIhC,kBAAkBa,MAAM,EAAE;QACnCnB,oBAAoB,CAAC,mDAAmD,EAAEJ,KACxE,kBACA,oEAAoE,EAAEU,kBACrEiC,GAAG,CAAC,CAACC,OAAS,CAAC,MAAM,EAAE3C,IAAI2C,MAAM,EAAE,CAAC,EACpCC,IAAI,CAAC,KAAK;IACf;IAEA,IAAIzC,kBAAkB;QACpB,MAAM0C,aAAanD,cAAcF;QAEjC8C,KAAIC,KAAK,CACP,CAAC,iGAAiG,EAAEpC,iBAAiB;;;EAGzH,EAAEL,KACAC,KACE,GACE8C,eAAe,QACX,wBACA,GAAGA,WAAW,gBAAgB,CAAC,CACpC,4CAA4C,CAAC,GAEhD,6BAA6B,EAAEA,WAAW;QACtC,CAAC;QAGLP,KAAIG,IAAI,CAACD;QAETM,QAAQC,IAAI,CAAC;IACf;IAEA,OAAOrC;AACT"}