@wular/pnext 0.0.3 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +11 -11
  2. package/bin/pnext +1 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +1 -1
  8. package/reference/config.md +2 -2
  9. package/reference/css.md +13 -9
  10. package/reference/dev.md +1 -1
  11. package/reference/metadata.md +7 -7
  12. package/reference/navigation.md +35 -28
  13. package/reference/performance.md +70 -70
  14. package/reference/rendering.md +17 -17
  15. package/reference/routing.md +17 -17
  16. package/reference/typegen.md +12 -8
  17. package/src/api/cache.ts +36 -37
  18. package/src/api/client-cache.ts +2 -2
  19. package/src/api/client-navigation.ts +113 -109
  20. package/src/api/dynamic.tsx +58 -55
  21. package/src/api/link.tsx +49 -52
  22. package/src/api/navigation.ts +59 -58
  23. package/src/api/server.ts +152 -144
  24. package/src/api/suspense.ts +4 -4
  25. package/src/cli/adapters/vercel-warm.ts +126 -121
  26. package/src/cli/adapters/vercel.ts +437 -443
  27. package/src/cli/analyze.ts +333 -144
  28. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  29. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  30. package/src/cli/build.ts +976 -978
  31. package/src/cli/create.ts +71 -63
  32. package/src/cli/dev.ts +116 -116
  33. package/src/cli/index.ts +88 -85
  34. package/src/cli/migrate/package-json.ts +73 -71
  35. package/src/cli/migrate/report.ts +32 -33
  36. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  37. package/src/cli/migrate/scan.ts +46 -46
  38. package/src/cli/migrate/spinner.ts +9 -9
  39. package/src/cli/migrate/tsconfig.ts +35 -35
  40. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  41. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  42. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  43. package/src/cli/start.ts +65 -66
  44. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  45. package/src/client/build.ts +794 -768
  46. package/src/client/chunk-fold.ts +245 -240
  47. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  48. package/src/client/entry.ts +162 -147
  49. package/src/client/prebuilt.ts +231 -223
  50. package/src/client/profile.ts +29 -29
  51. package/src/client/react-compiler.ts +20 -15
  52. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  53. package/src/client/reference-stub.ts +51 -51
  54. package/src/client/reference.ts +19 -19
  55. package/src/{api → client}/router/events.ts +17 -17
  56. package/src/{api → client}/router/history.ts +16 -16
  57. package/src/{api → client}/router/hub.ts +52 -53
  58. package/src/{api/router.ts → client/router/index.ts} +61 -60
  59. package/src/{api → client}/router/policies.ts +24 -24
  60. package/src/{api → client}/router/runtime.ts +1988 -1961
  61. package/src/{api → client}/router/types.ts +93 -98
  62. package/src/compat/actions/client-plugin.ts +42 -43
  63. package/src/compat/actions/client-stub.ts +14 -14
  64. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  65. package/src/compat/actions/config.ts +63 -64
  66. package/src/compat/actions/detect.ts +68 -68
  67. package/src/compat/actions/discovery.ts +105 -105
  68. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  69. package/src/compat/actions/early-submit.ts +1 -1
  70. package/src/compat/actions/endpoint.ts +198 -198
  71. package/src/compat/actions/extensions.ts +811 -0
  72. package/src/compat/actions/flight.ts +23 -23
  73. package/src/compat/actions/form-state.ts +34 -34
  74. package/src/compat/actions/hoist.ts +382 -236
  75. package/src/compat/actions/ids.ts +7 -12
  76. package/src/compat/actions/index.ts +8 -8
  77. package/src/compat/actions/instances.ts +46 -46
  78. package/src/compat/actions/origin.ts +47 -48
  79. package/src/compat/actions/protocol.ts +22 -22
  80. package/src/compat/actions/registry.ts +19 -19
  81. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  82. package/src/compat/actions/rewrite.ts +125 -125
  83. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  84. package/src/compat/actions/serve.ts +132 -136
  85. package/src/compat/actions/server-tag.ts +4 -4
  86. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  87. package/src/compat/actions/unrecognized-error.ts +4 -4
  88. package/src/compat/{index.ts → aliases.ts} +112 -109
  89. package/src/compat/bundler/bun-externals.ts +18 -18
  90. package/src/compat/bundler/cjs-exports.ts +271 -223
  91. package/src/compat/bundler/config.ts +116 -111
  92. package/src/compat/bundler/externals.ts +12 -12
  93. package/src/compat/bundler/import-meta-url.ts +19 -19
  94. package/src/compat/bundler/modularize-imports.ts +36 -33
  95. package/src/compat/bundler/new-url-asset.ts +22 -24
  96. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  97. package/src/compat/bundler/polyfill.ts +28 -28
  98. package/src/compat/bundler/react-compiler.ts +35 -29
  99. package/src/compat/bundler/react-profiler.tsx +11 -11
  100. package/src/compat/bundler/relay-transform.ts +48 -47
  101. package/src/compat/bundler/require-context.ts +119 -113
  102. package/src/compat/bundler/resolve-extensions.ts +19 -19
  103. package/src/compat/bundler/source-cache.ts +25 -25
  104. package/src/compat/bundler/static-imports.ts +7 -7
  105. package/src/compat/bundler/symlink-imports.ts +46 -46
  106. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  107. package/src/compat/bundler/wasm.ts +58 -60
  108. package/src/compat/bundler/webpack-loaders.ts +254 -241
  109. package/src/compat/bundler/worker.ts +101 -104
  110. package/src/compat/cache/build-flags.ts +29 -29
  111. package/src/compat/cache/build-prerender-errors.ts +40 -44
  112. package/src/compat/cache/custom-handler.ts +60 -53
  113. package/src/compat/cache/fetch-patch.ts +240 -240
  114. package/src/compat/cache/handler.ts +27 -31
  115. package/src/compat/cache/modern-handler.ts +148 -126
  116. package/src/compat/cache/resume-data-cache.ts +47 -45
  117. package/src/compat/cache/revalidate.ts +233 -232
  118. package/src/compat/cache/runtime-error.ts +35 -35
  119. package/src/compat/cache/use-cache-transform.ts +442 -417
  120. package/src/compat/cache/use-cache.ts +650 -614
  121. package/src/compat/cache-control.ts +140 -142
  122. package/src/compat/client/base-path.ts +21 -20
  123. package/src/compat/client/css-order.ts +18 -18
  124. package/src/compat/client/errors/bare-boundary.ts +11 -11
  125. package/src/compat/client/errors/control-flow.ts +23 -23
  126. package/src/compat/client/errors/error-boundary.ts +61 -61
  127. package/src/compat/client/errors/global-error.ts +101 -91
  128. package/src/compat/client/errors/install.ts +71 -72
  129. package/src/compat/client/errors/lazy.ts +23 -23
  130. package/src/compat/client/errors/primitive-throw.ts +47 -45
  131. package/src/compat/client/errors/soft-refresh.ts +4 -4
  132. package/src/compat/client/link-status.ts +33 -33
  133. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  134. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  135. package/src/compat/client/navigation-scroll.ts +63 -63
  136. package/src/compat/client/optimistic-routing.ts +93 -88
  137. package/src/compat/client/prefetch-cache.ts +23 -24
  138. package/src/compat/client/route-announcer.ts +35 -35
  139. package/src/compat/client/segment-cache-policy.ts +20 -20
  140. package/src/compat/client/segment-cache.ts +309 -315
  141. package/src/compat/client/segment-prefetch.ts +127 -132
  142. package/src/compat/client/trailing-slash.ts +5 -4
  143. package/src/compat/css/chunking.ts +113 -116
  144. package/src/compat/css/inline-css.ts +21 -21
  145. package/src/compat/css/lightningcss.ts +37 -38
  146. package/src/compat/css/modules.ts +161 -175
  147. package/src/compat/css/nonce.ts +7 -7
  148. package/src/compat/css/sass-plugin.ts +18 -21
  149. package/src/compat/css/sass.ts +150 -152
  150. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  151. package/src/compat/css/styled-jsx.ts +21 -21
  152. package/src/compat/edge-runtime.ts +27 -27
  153. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  154. package/src/compat/export/client.ts +29 -31
  155. package/src/compat/export/{index.ts → emit.ts} +111 -110
  156. package/src/compat/export/standalone.ts +62 -54
  157. package/src/compat/image-optimizer/cache.ts +51 -49
  158. package/src/compat/image-optimizer/detect.ts +52 -52
  159. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  160. package/src/compat/image-optimizer/source.ts +77 -80
  161. package/src/compat/lifecycle/after-scope.ts +26 -26
  162. package/src/compat/lifecycle/after.ts +48 -45
  163. package/src/compat/lifecycle/error-funnel.ts +98 -102
  164. package/src/compat/lifecycle/error-serialize.ts +30 -26
  165. package/src/compat/lifecycle/error-ui.ts +67 -32
  166. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  167. package/src/compat/lifecycle/instrumentation.ts +85 -85
  168. package/src/compat/lifecycle/node-console.ts +11 -11
  169. package/src/compat/lifecycle/testmode.ts +160 -132
  170. package/src/compat/mdx/compile.ts +60 -57
  171. package/src/compat/mdx/plugin.ts +11 -11
  172. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  173. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  174. package/src/compat/metadata.ts +75 -81
  175. package/src/compat/next/cache.ts +68 -69
  176. package/src/compat/next/canonical-url.ts +9 -9
  177. package/src/compat/next/client-cache.ts +19 -19
  178. package/src/compat/next/client-navigation.ts +112 -116
  179. package/src/compat/next/client-only.ts +1 -1
  180. package/src/compat/next/client-script.tsx +99 -93
  181. package/src/compat/next/client-server.ts +10 -10
  182. package/src/compat/next/config-loader.ts +176 -173
  183. package/src/compat/next/config.ts +7 -7
  184. package/src/compat/next/constants.cjs +6 -6
  185. package/src/compat/next/constants.ts +6 -6
  186. package/src/compat/next/custom-server.ts +26 -24
  187. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  188. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  189. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  190. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  191. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  192. package/src/compat/next/dynamic.tsx +21 -18
  193. package/src/compat/next/error.tsx +52 -52
  194. package/src/compat/next/font/cache.ts +74 -74
  195. package/src/compat/next/font/google.ts +2 -2
  196. package/src/compat/next/font/index.ts +1 -1
  197. package/src/compat/next/font/local.ts +3 -3
  198. package/src/compat/next/font/runtime-client.ts +17 -15
  199. package/src/compat/next/font/runtime.ts +443 -408
  200. package/src/compat/next/font/shared.ts +120 -108
  201. package/src/compat/next/form.tsx +63 -63
  202. package/src/compat/next/head.tsx +2 -2
  203. package/src/compat/next/headers.ts +103 -95
  204. package/src/compat/next/image/client.tsx +220 -0
  205. package/src/compat/next/image/config.ts +56 -58
  206. package/src/compat/next/image/optimizer.ts +40 -36
  207. package/src/compat/next/image/patterns.ts +37 -40
  208. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  209. package/src/compat/next/image/shared.ts +65 -57
  210. package/src/compat/next/image/static-metadata.ts +98 -107
  211. package/src/compat/next/image/validate.ts +79 -88
  212. package/src/compat/next/image.tsx +19 -23
  213. package/src/compat/next/index.ts +1 -1
  214. package/src/compat/next/legacy-image.tsx +59 -60
  215. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  216. package/src/compat/next/link.tsx +158 -158
  217. package/src/compat/next/navigation.cjs +12 -3
  218. package/src/compat/next/navigation.ts +48 -50
  219. package/src/compat/next/offline.ts +27 -27
  220. package/src/compat/next/og.ts +121 -124
  221. package/src/compat/next/preferred-region.ts +13 -14
  222. package/src/compat/next/redirects.ts +58 -56
  223. package/src/compat/next/resource-hints.ts +73 -76
  224. package/src/compat/next/rewrites.ts +130 -133
  225. package/src/compat/next/root-params.ts +45 -45
  226. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  227. package/src/compat/next/router.cjs +4 -2
  228. package/src/compat/next/router.ts +58 -61
  229. package/src/compat/next/script.tsx +108 -108
  230. package/src/compat/next/server-only.ts +1 -1
  231. package/src/compat/next/server.ts +19 -19
  232. package/src/compat/next/svgr.ts +18 -17
  233. package/src/compat/next/telemetry.ts +24 -24
  234. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  235. package/src/compat/next/user-agent.ts +53 -49
  236. package/src/compat/next/web-vitals.ts +22 -24
  237. package/src/compat/otel/api.ts +41 -41
  238. package/src/compat/otel/client-trace-metadata.ts +25 -27
  239. package/src/compat/otel/fetch-span.ts +29 -29
  240. package/src/compat/otel/tracer.ts +331 -331
  241. package/src/compat/pages/api.ts +456 -0
  242. package/src/compat/pages/client-plugin.ts +36 -36
  243. package/src/compat/pages/router-state.ts +34 -34
  244. package/src/compat/pages/{index.ts → router.ts} +130 -135
  245. package/src/compat/ppr/io.ts +12 -12
  246. package/src/compat/ppr/missing-root-params.ts +34 -38
  247. package/src/compat/ppr/root-params-scan.ts +66 -66
  248. package/src/compat/ppr/root-params-transform.ts +24 -26
  249. package/src/compat/ppr/root-params.ts +30 -30
  250. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  251. package/src/compat/protocol.ts +71 -70
  252. package/src/compat/react/action-state.ts +47 -48
  253. package/src/compat/react/client-lite.ts +15 -15
  254. package/src/compat/react/client.ts +4 -4
  255. package/src/compat/react/compiler-runtime.ts +11 -11
  256. package/src/compat/react/dom-client.ts +44 -44
  257. package/src/compat/react/dom-react-server.ts +10 -16
  258. package/src/compat/react/dom-server.ts +10 -10
  259. package/src/compat/react/dom.ts +52 -52
  260. package/src/compat/react/hooks-extra.ts +34 -35
  261. package/src/compat/react/parity.ts +64 -61
  262. package/src/compat/react/preact.ts +81 -82
  263. package/src/compat/react/react-server.ts +28 -28
  264. package/src/compat/react/router-shim.ts +1 -1
  265. package/src/compat/react/server-component-use.ts +8 -8
  266. package/src/compat/react/server-inserted-html.ts +30 -31
  267. package/src/compat/react/server.ts +53 -55
  268. package/src/compat/react/use.ts +32 -32
  269. package/src/compat/react/view-transition.ts +20 -20
  270. package/src/compat/register/actions.ts +35 -824
  271. package/src/compat/register/boot.ts +41 -41
  272. package/src/compat/register/build-tier.ts +5 -5
  273. package/src/compat/register/build.ts +74 -70
  274. package/src/compat/register/bundler.ts +161 -156
  275. package/src/compat/register/cache.ts +20 -20
  276. package/src/compat/register/client-errors.ts +3 -3
  277. package/src/compat/register/config.ts +6 -6
  278. package/src/compat/register/css-extras.ts +30 -34
  279. package/src/compat/register/edge-runtime.ts +3 -3
  280. package/src/compat/register/errors.ts +10 -12
  281. package/src/compat/register/export.ts +16 -16
  282. package/src/compat/register/font.ts +11 -11
  283. package/src/compat/register/hooks.ts +2 -2
  284. package/src/compat/register/image.ts +40 -40
  285. package/src/compat/register/index.ts +59 -62
  286. package/src/compat/register/instrumentation-client.ts +10 -10
  287. package/src/compat/register/lifecycle.ts +25 -28
  288. package/src/compat/register/mdx.ts +10 -10
  289. package/src/compat/register/middleware.ts +226 -16
  290. package/src/compat/register/otel.ts +80 -88
  291. package/src/compat/register/pages-api.ts +10 -463
  292. package/src/compat/register/ppr.ts +16 -16
  293. package/src/compat/register/protocol.ts +17 -18
  294. package/src/compat/register/proxy.ts +49 -51
  295. package/src/compat/register/render.ts +79 -76
  296. package/src/compat/register/routing.ts +162 -159
  297. package/src/compat/register/segment.ts +24 -1887
  298. package/src/compat/register/static-image.ts +3 -3
  299. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  300. package/src/compat/register/typed-routes.ts +14 -14
  301. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  302. package/src/compat/register/validation.ts +18 -18
  303. package/src/compat/segment/loading-boundary.ts +43 -45
  304. package/src/compat/segment/page-slot.ts +69 -69
  305. package/src/compat/segment/serve.ts +1884 -0
  306. package/src/compat/segment/tree.ts +113 -112
  307. package/src/compat/segment/vary-key.ts +38 -38
  308. package/src/compat/segment/vary-params.ts +138 -142
  309. package/src/compat/static-params.ts +14 -12
  310. package/src/compat/tsconfig-defaults.ts +87 -91
  311. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  312. package/src/compat/typecheck/worker.ts +15 -12
  313. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  314. package/src/compat/typed-routes/manifest.ts +174 -170
  315. package/src/compat/typed-routes/typegen.ts +127 -110
  316. package/src/compat/validation/errors.ts +16 -19
  317. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  318. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  319. package/src/compat-bootstrap.ts +16 -16
  320. package/src/config.ts +69 -69
  321. package/src/css/build.ts +230 -227
  322. package/src/css/postcss.ts +79 -80
  323. package/src/css/worker.ts +14 -15
  324. package/src/dev/client-actions.ts +10 -10
  325. package/src/dev/client-chunk-store.ts +27 -27
  326. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  327. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  328. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  329. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  330. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  331. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  332. package/src/dev/server.ts +804 -820
  333. package/src/env.ts +46 -43
  334. package/src/extensions.ts +491 -478
  335. package/src/index.ts +8 -8
  336. package/src/internal.ts +20 -23
  337. package/src/{islands → render}/boundary-error.ts +3 -3
  338. package/src/render/hooks.ts +71 -71
  339. package/src/render/island-context.ts +14 -14
  340. package/src/render/metadata.ts +310 -310
  341. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  342. package/src/{ppr.ts → render/ppr.ts} +244 -245
  343. package/src/render/renderer.ts +2076 -2082
  344. package/src/render/resource-hints.ts +16 -17
  345. package/src/render/slots.tsx +224 -235
  346. package/src/{islands → render}/static-children.ts +9 -12
  347. package/src/{islands → render}/static-slots.ts +37 -37
  348. package/src/{cache/context.ts → request/cache.ts} +20 -20
  349. package/src/request/context.ts +107 -107
  350. package/src/{dynamic/source.ts → resolve/dynamic.ts} +152 -143
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +442 -186
  354. package/src/resolve/source-text.ts +37 -37
  355. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  356. package/src/routing/forwarded.ts +19 -19
  357. package/src/routing/handler.ts +84 -91
  358. package/src/routing/href.ts +69 -70
  359. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  360. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  361. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  362. package/src/routing/routes.ts +833 -848
  363. package/src/routing/slots.ts +164 -160
  364. package/src/runtime/loader.ts +952 -0
  365. package/src/{dev → runtime}/module-cache.ts +309 -287
  366. package/src/{dev → runtime}/module-generations.ts +9 -9
  367. package/src/{dev → runtime}/module-transform.ts +81 -72
  368. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  369. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  370. package/src/runtime/vendor.ts +425 -404
  371. package/src/styles.d.ts +9 -0
  372. package/src/types.ts +320 -335
  373. package/src/utils/ansi.ts +5 -5
  374. package/src/utils/{source.ts → code.ts} +15 -12
  375. package/src/utils/content-type.ts +3 -3
  376. package/src/utils/decode.ts +2 -2
  377. package/src/utils/dev-profile.ts +13 -13
  378. package/src/utils/error-log.ts +6 -6
  379. package/src/utils/esbuild.ts +18 -18
  380. package/src/utils/fs-cache.ts +13 -13
  381. package/src/utils/fs.ts +57 -49
  382. package/src/utils/html.ts +20 -24
  383. package/src/utils/native-require.ts +8 -8
  384. package/src/utils/serialize.ts +139 -146
  385. package/src/utils/verbose.ts +18 -18
  386. package/src/cli/analyze-print.ts +0 -181
  387. package/src/compat/middleware/manifest.ts +0 -210
  388. package/src/compat/next/image-client.tsx +0 -215
  389. package/src/compat/next/link-usage.ts +0 -29
  390. package/src/css/index.ts +0 -2
  391. package/src/render/index.ts +0 -1
  392. package/src/style-modules.d.ts +0 -9
@@ -20,9 +20,9 @@ import {
20
20
  isRedirectError,
21
21
  isUnauthorizedError,
22
22
  type PNextRedirectError,
23
- } from '../../../api/navigation';
24
- import { isPostpone } from '../../../ppr-postpone';
25
- import { softNavigate } from '../../../api/router';
23
+ } from '../../../api/navigation'
24
+ import { isPostpone } from '../../../render/postpone'
25
+ import { softNavigate } from '../../../client/router'
26
26
 
27
27
  /** True for a Next control-flow error that a boundary must re-throw, not render. */
28
28
  export function isControlFlowError(error: unknown): boolean {
@@ -32,7 +32,7 @@ export function isControlFlowError(error: unknown): boolean {
32
32
  isForbiddenError(error) ||
33
33
  isUnauthorizedError(error) ||
34
34
  isPostpone(error)
35
- );
35
+ )
36
36
  }
37
37
 
38
38
  /**
@@ -42,8 +42,8 @@ export function isControlFlowError(error: unknown): boolean {
42
42
  */
43
43
  export function handleControlFlowError(error: unknown): boolean {
44
44
  if (isRedirectError(error)) {
45
- applyRedirect(error);
46
- return true;
45
+ applyRedirect(error)
46
+ return true
47
47
  }
48
48
  if (isNotFoundError(error) || isForbiddenError(error) || isUnauthorizedError(error)) {
49
49
  // Re-render the current URL server-side: the same control-flow call fires
@@ -52,41 +52,41 @@ export function handleControlFlowError(error: unknown): boolean {
52
52
  // avoids a jump. Fall back to a full reload if the soft-nav itself fails.
53
53
  if (process.browser || typeof window !== 'undefined') {
54
54
  void softNavigate(location.href, { replace: true, scroll: false }).catch(() => {
55
- location.reload();
56
- });
55
+ location.reload()
56
+ })
57
57
  }
58
- return true;
58
+ return true
59
59
  }
60
60
  if (isPostpone(error)) {
61
61
  // A postpone escaping to the client has nothing to resume against here; a
62
62
  // reload re-renders from the server. Treated as handled so it never lands
63
63
  // in an error boundary as a "real" error.
64
- if (process.browser || typeof window !== 'undefined') location.reload();
65
- return true;
64
+ if (process.browser || typeof window !== 'undefined') location.reload()
65
+ return true
66
66
  }
67
- return false;
67
+ return false
68
68
  }
69
69
 
70
70
  function applyRedirect(error: PNextRedirectError): void {
71
- if (!process.browser && typeof window === 'undefined') return;
72
- const target = error.location;
73
- let sameOrigin = false;
71
+ if (!process.browser && typeof window === 'undefined') return
72
+ const target = error.location
73
+ let sameOrigin = false
74
74
  try {
75
- sameOrigin = new URL(target, location.href).origin === location.origin;
75
+ sameOrigin = new URL(target, location.href).origin === location.origin
76
76
  } catch {
77
- sameOrigin = false;
77
+ sameOrigin = false
78
78
  }
79
- const replace = error.status === 303 || error.status === 307 || error.status === 308;
79
+ const replace = error.status === 303 || error.status === 307 || error.status === 308
80
80
  if (sameOrigin) {
81
81
  void softNavigate(target, { replace }).catch(() => {
82
- hardNavigate(target, replace);
83
- });
82
+ hardNavigate(target, replace)
83
+ })
84
84
  } else {
85
- hardNavigate(target, replace);
85
+ hardNavigate(target, replace)
86
86
  }
87
87
  }
88
88
 
89
89
  function hardNavigate(target: string, replace: boolean): void {
90
- if (replace) location.replace(target);
91
- else location.assign(target);
90
+ if (replace) location.replace(target)
91
+ else location.assign(target)
92
92
  }
@@ -16,10 +16,10 @@
16
16
  //
17
17
  // When no route error component is available the boundary mounts global-error.
18
18
 
19
- import { Component, h, type ComponentChildren, type ComponentType } from 'preact';
20
- import { isControlFlowError, handleControlFlowError } from './control-flow';
21
- import { isNotFoundError } from '../../../api/navigation';
22
- import { normalizeBoundaryError } from './primitive-throw';
19
+ import { Component, h, type ComponentChildren, type ComponentType } from 'preact'
20
+ import { isControlFlowError, handleControlFlowError } from './control-flow'
21
+ import { isNotFoundError } from '../../../api/navigation'
22
+ import { normalizeBoundaryError } from './primitive-throw'
23
23
 
24
24
  // ---------------------------------------------------------------------------
25
25
  // KNOWN GAP (preact core, not fully fixable from an options hook): a CLIENT
@@ -30,25 +30,25 @@ import { normalizeBoundaryError } from './primitive-throw';
30
30
  // ---------------------------------------------------------------------------
31
31
 
32
32
  export type RouteErrorComponent = ComponentType<{
33
- error: unknown;
34
- reset: () => void;
35
- unstable_retry?: () => void;
36
- }>;
37
- export type RouteNotFoundComponent = ComponentType<Record<string, never>>;
33
+ error: unknown
34
+ reset: () => void
35
+ unstable_retry?: () => void
36
+ }>
37
+ export type RouteNotFoundComponent = ComponentType<Record<string, never>>
38
38
 
39
39
  interface BoundaryProps {
40
40
  /** The route's nearest error.js component; when absent the boundary escalates. */
41
- errorComponent?: RouteErrorComponent;
42
- notFoundComponent?: RouteNotFoundComponent;
41
+ errorComponent?: RouteErrorComponent
42
+ notFoundComponent?: RouteNotFoundComponent
43
43
  /**
44
44
  * Next's default 404 UI, handed in by the generated runtime - and emitted by it ONLY when some route
45
45
  * can reach this fallback (no not-found.* of its own). An app whose boundary routes all have one
46
46
  * never ships error-ui.ts.
47
47
  */
48
- builtInNotFound?: RouteNotFoundComponent;
48
+ builtInNotFound?: RouteNotFoundComponent
49
49
  /** Soft-refresh invoked by reset() after clearing the error. */
50
- onReset?: () => void;
51
- children?: unknown;
50
+ onReset?: () => void
51
+ children?: unknown
52
52
  }
53
53
 
54
54
  interface BoundaryState {
@@ -56,9 +56,9 @@ interface BoundaryState {
56
56
  // `null`/a string reaches error.js unwrapped (Next passes the raw value on the
57
57
  // client channel), so `hasError` — NOT truthiness of `error` — gates rendering:
58
58
  // a falsy `undefined`/`null` throw is still a caught error, not "no error".
59
- error: unknown;
60
- hasError: boolean;
61
- notFound: boolean;
59
+ error: unknown
60
+ hasError: boolean
61
+ notFound: boolean
62
62
  }
63
63
 
64
64
  /**
@@ -67,9 +67,9 @@ interface BoundaryState {
67
67
  * is ever attached (digests are a server-error-only signal).
68
68
  */
69
69
  export function toClientError(value: unknown): Error {
70
- if (value instanceof Error) return value;
70
+ if (value instanceof Error) return value
71
71
  // `throw undefined` / `throw null` / `throw 'msg'` → message is String(value).
72
- return new Error(String(value));
72
+ return new Error(String(value))
73
73
  }
74
74
 
75
75
  // A boundary that catches (or escalates) a real error marks it here so the
@@ -77,47 +77,47 @@ export function toClientError(value: unknown): Error {
77
77
  // by the nearest-boundary path and must NOT also drive it to global-error.
78
78
  // WeakSet-keyed (only object throws are markable; a primitive throw that reaches
79
79
  // the window is treated as unhandled, matching "the boundary couldn't hold it").
80
- const handledErrors = new WeakSet<object>();
80
+ const handledErrors = new WeakSet<object>()
81
81
 
82
82
  export function markErrorHandled(error: unknown): void {
83
- if (error !== null && typeof error === 'object') handledErrors.add(error);
83
+ if (error !== null && typeof error === 'object') handledErrors.add(error)
84
84
  }
85
85
 
86
86
  export function wasErrorHandled(error: unknown): boolean {
87
- return error !== null && typeof error === 'object' && handledErrors.has(error);
87
+ return error !== null && typeof error === 'object' && handledErrors.has(error)
88
88
  }
89
89
 
90
90
  export class ClientErrorBoundary extends Component<BoundaryProps, BoundaryState> {
91
- state: BoundaryState = { error: null, hasError: false, notFound: false };
91
+ state: BoundaryState = { error: null, hasError: false, notFound: false }
92
92
 
93
93
  static getDerivedStateFromError(error: unknown): Partial<BoundaryState> {
94
- if (isNotFoundError(error)) return { notFound: true, hasError: false, error: null };
94
+ if (isNotFoundError(error)) return { notFound: true, hasError: false, error: null }
95
95
  // Control-flow errors must not be captured as state — let componentDidCatch
96
96
  // re-throw so they propagate past this boundary.
97
- if (isControlFlowError(error)) return {};
97
+ if (isControlFlowError(error)) return {}
98
98
  // Pass the RAW thrown value to error.js (no Error wrapping): a client
99
99
  // `throw undefined`/`null`/'msg' renders as `${error}` = 'undefined'/'null'/'msg'.
100
- return { error: normalizeBoundaryError(error), hasError: true };
100
+ return { error: normalizeBoundaryError(error), hasError: true }
101
101
  }
102
102
 
103
103
  componentDidCatch(error: unknown): void {
104
104
  if (isNotFoundError(error)) {
105
- markErrorHandled(error);
106
- return;
105
+ markErrorHandled(error)
106
+ return
107
107
  }
108
108
  if (isControlFlowError(error)) {
109
109
  // Re-throw past this boundary: React/Next semantics for control errors.
110
110
  // The install layer's window handler catches the propagated error and
111
111
  // performs the navigation; we still throw so no error UI renders here.
112
- handleControlFlowError(error);
113
- throw error;
112
+ handleControlFlowError(error)
113
+ throw error
114
114
  }
115
115
  // A real error the boundary can render (it has a local error.js): mark it so the window-listener
116
116
  // last resort ignores it. When there is NO errorComponent this boundary re-throws in render()
117
117
  // instead of rendering anything - leave the error UNMARKED so an outer VDOM boundary can still
118
118
  // catch it, and so the window-listener last resort recognizes a truly-uncaught error and mounts
119
119
  // global-error.
120
- if (this.props.errorComponent) markErrorHandled(error);
120
+ if (this.props.errorComponent) markErrorHandled(error)
121
121
  }
122
122
 
123
123
  /**
@@ -127,8 +127,8 @@ export class ClientErrorBoundary extends Component<BoundaryProps, BoundaryState>
127
127
  * holding one of those nodes (a click in flight, a test's element handle) loses it.
128
128
  */
129
129
  reset = (): void => {
130
- this.setState({ error: null, hasError: false, notFound: false });
131
- };
130
+ this.setState({ error: null, hasError: false, notFound: false })
131
+ }
132
132
 
133
133
  /**
134
134
  * Re-run the SERVER render, then re-render: recovers data-dependent failures. A CLIENT-component
@@ -138,59 +138,59 @@ export class ClientErrorBoundary extends Component<BoundaryProps, BoundaryState>
138
138
  * round trip.
139
139
  */
140
140
  unstable_retry = (): void => {
141
- const digest = (this.state.error as { digest?: unknown } | null)?.digest;
142
- this.setState({ error: null, hasError: false, notFound: false });
143
- if (typeof digest === 'string' && digest.length > 0) this.props.onReset?.();
144
- };
141
+ const digest = (this.state.error as { digest?: unknown } | null)?.digest
142
+ this.setState({ error: null, hasError: false, notFound: false })
143
+ if (typeof digest === 'string' && digest.length > 0) this.props.onReset?.()
144
+ }
145
145
 
146
146
  // A client-side notFound() that renders a LOCAL not-found.js has no server
147
147
  // round trip, so the `<meta name="robots" content="noindex">` the server
148
148
  // would emit for a not-found render is missing. Mirror it on the client:
149
149
  // inject the tag while the local boundary is showing, remove it on recovery.
150
- private addedNoindex = false;
150
+ private addedNoindex = false
151
151
 
152
152
  private syncNotFoundRobots(): void {
153
- if (typeof document === 'undefined') return;
154
- const shouldShow = this.state.notFound && Boolean(this.props.notFoundComponent);
153
+ if (typeof document === 'undefined') return
154
+ const shouldShow = this.state.notFound && Boolean(this.props.notFoundComponent)
155
155
  if (shouldShow && !this.addedNoindex) {
156
156
  // Don't stomp an existing robots tag (SSR/metadata already set one).
157
157
  if (!document.querySelector('meta[name="robots"]')) {
158
- const meta = document.createElement('meta');
159
- meta.setAttribute('name', 'robots');
160
- meta.setAttribute('content', 'noindex');
161
- meta.setAttribute('data-pnext-notfound-robots', '');
162
- document.head.appendChild(meta);
163
- this.addedNoindex = true;
158
+ const meta = document.createElement('meta')
159
+ meta.setAttribute('name', 'robots')
160
+ meta.setAttribute('content', 'noindex')
161
+ meta.setAttribute('data-pnext-notfound-robots', '')
162
+ document.head.appendChild(meta)
163
+ this.addedNoindex = true
164
164
  }
165
165
  } else if (!shouldShow && this.addedNoindex) {
166
- document.querySelector('meta[name="robots"][data-pnext-notfound-robots]')?.remove();
167
- this.addedNoindex = false;
166
+ document.querySelector('meta[name="robots"][data-pnext-notfound-robots]')?.remove()
167
+ this.addedNoindex = false
168
168
  }
169
169
  }
170
170
 
171
171
  componentDidMount(): void {
172
- this.syncNotFoundRobots();
172
+ this.syncNotFoundRobots()
173
173
  }
174
174
 
175
175
  componentDidUpdate(): void {
176
- this.syncNotFoundRobots();
176
+ this.syncNotFoundRobots()
177
177
  }
178
178
 
179
179
  componentWillUnmount(): void {
180
180
  if (this.addedNoindex) {
181
- document.querySelector('meta[name="robots"][data-pnext-notfound-robots]')?.remove();
182
- this.addedNoindex = false;
181
+ document.querySelector('meta[name="robots"][data-pnext-notfound-robots]')?.remove()
182
+ this.addedNoindex = false
183
183
  }
184
184
  }
185
185
 
186
186
  render(): ComponentChildren {
187
187
  if (this.state.notFound) {
188
- const NotFoundComponent = this.props.notFoundComponent ?? this.props.builtInNotFound;
189
- return NotFoundComponent ? h(NotFoundComponent, {}) : null;
188
+ const NotFoundComponent = this.props.notFoundComponent ?? this.props.builtInNotFound
189
+ return NotFoundComponent ? h(NotFoundComponent, {}) : null
190
190
  }
191
- if (!this.state.hasError) return this.props.children;
192
- const { error } = this.state;
193
- const ErrorComponent = this.props.errorComponent;
191
+ if (!this.state.hasError) return this.props.children
192
+ const { error } = this.state
193
+ const ErrorComponent = this.props.errorComponent
194
194
  if (!ErrorComponent) {
195
195
  // Preserve primitive throws for global-error.js directly (window `error`
196
196
  // loses raw null/undefined/string). Bubble Error objects to the next outer
@@ -198,11 +198,11 @@ export class ClientErrorBoundary extends Component<BoundaryProps, BoundaryState>
198
198
  if (error === null || typeof error !== 'object') {
199
199
  // global-error rides the deferred tier (see ./lazy) — a primitive throw
200
200
  // with no error.js is the one path that reaches it from a render.
201
- void import('./global-error').then(m => m.escalateToGlobalError(error));
202
- return null;
201
+ void import('./global-error').then(m => m.escalateToGlobalError(error))
202
+ return null
203
203
  }
204
- throw error as Error;
204
+ throw error as Error
205
205
  }
206
- return h(ErrorComponent, { error, reset: this.reset, unstable_retry: this.unstable_retry });
206
+ return h(ErrorComponent, { error, reset: this.reset, unstable_retry: this.unstable_retry })
207
207
  }
208
208
  }
@@ -11,21 +11,21 @@
11
11
  //
12
12
  // Client-escaped errors carry NO digest, so the built-in fallback shows the no-digest message.
13
13
 
14
- import { h, render, type ComponentType } from 'preact';
15
- import { softNavigate } from '../../../api/router';
14
+ import { h, render, type ComponentType } from 'preact'
15
+ import { softNavigate } from '../../../client/router'
16
16
 
17
- export type GlobalErrorComponent = ComponentType<{ error: unknown; reset: () => void }>;
17
+ export type GlobalErrorComponent = ComponentType<{ error: unknown; reset: () => void }>
18
18
 
19
- let globalErrorMounted = false;
19
+ let globalErrorMounted = false
20
20
 
21
21
  // The app-root global-error.js component, registered by installClientErrors so the in-tree
22
22
  // ClientErrorBoundary can escalate straight to it WITHOUT bouncing a re-throw through the window
23
23
  // `error` channel - that channel drops the value for a thrown undefined/null (the ErrorEvent's `.error`
24
24
  // is undefined), so a primitive escape would be lost.
25
- let registeredGlobalError: GlobalErrorComponent | undefined;
25
+ let registeredGlobalError: GlobalErrorComponent | undefined
26
26
 
27
27
  export function registerGlobalErrorComponent(component?: GlobalErrorComponent): void {
28
- registeredGlobalError = component;
28
+ registeredGlobalError = component
29
29
  }
30
30
 
31
31
  /**
@@ -35,35 +35,35 @@ export function registerGlobalErrorComponent(component?: GlobalErrorComponent):
35
35
  * global-error.js unwrapped, so `${error}` renders 'undefined'/'null').
36
36
  */
37
37
  export function escalateToGlobalError(error: unknown): void {
38
- mountGlobalError(error, registeredGlobalError);
38
+ mountGlobalError(error, registeredGlobalError)
39
39
  // A client error that escapes every route boundary is, to the page, an UNCAUGHT error: Next still
40
40
  // reports it to the window so window.onerror and Playwright's pageerror observe the original.
41
41
  // mountGlobalError swaps the document silently, so surface the throw explicitly here. Skip
42
42
  // primitive-sentinel escapes and anything non-Error - only a real Error carries a meaningful pageerror.
43
43
  if ((process.browser || typeof window !== 'undefined') && error instanceof Error) {
44
- reportUncaught(error);
44
+ reportUncaught(error)
45
45
  }
46
46
  }
47
47
 
48
48
  // Errors already surfaced via reportUncaught: the later natural unhandled
49
49
  // rejection of the same value is a duplicate and gets suppressed (install.ts).
50
- const reportedUncaught = new WeakSet<Error>();
50
+ const reportedUncaught = new WeakSet<Error>()
51
51
 
52
52
  export function wasReportedUncaught(error: unknown): boolean {
53
- return error instanceof Error && reportedUncaught.has(error);
53
+ return error instanceof Error && reportedUncaught.has(error)
54
54
  }
55
55
 
56
56
  // Report an escaped error to the window as an uncaught exception. Prefer the
57
57
  // standard `reportError`; fall back to a synthetic 'error' event for engines
58
58
  // without it. Wrapped so a reporting failure never masks the global-error UI.
59
59
  function reportUncaught(error: Error): void {
60
- reportedUncaught.add(error);
60
+ reportedUncaught.add(error)
61
61
  try {
62
62
  if (typeof reportError === 'function') {
63
- reportError(error);
64
- return;
63
+ reportError(error)
64
+ return
65
65
  }
66
- window.dispatchEvent(new ErrorEvent('error', { error, message: error.message }));
66
+ window.dispatchEvent(new ErrorEvent('error', { error, message: error.message }))
67
67
  } catch {
68
68
  // ignore — the global-error document is already shown.
69
69
  }
@@ -75,47 +75,47 @@ function reportUncaught(error: Error): void {
75
75
  * top-level replacement). A soft refresh via reset() clears the flag.
76
76
  */
77
77
  export function mountGlobalError(error: unknown, component?: GlobalErrorComponent): void {
78
- if (typeof document === 'undefined' || globalErrorMounted) return;
79
- globalErrorMounted = true;
78
+ if (typeof document === 'undefined' || globalErrorMounted) return
79
+ globalErrorMounted = true
80
80
 
81
- document.documentElement.id = '__next_error__';
82
- const root = document.createElement('div');
83
- document.body.replaceChildren(root);
81
+ document.documentElement.id = '__next_error__'
82
+ const root = document.createElement('div')
83
+ document.body.replaceChildren(root)
84
84
 
85
85
  const reset = () => {
86
- globalErrorMounted = false;
87
- render(null, root);
86
+ globalErrorMounted = false
87
+ render(null, root)
88
88
  // Re-render the current URL from the server (recovers server + client errors).
89
89
  void softNavigate(location.href, { replace: true, scroll: false }).catch(() => {
90
- location.reload();
91
- });
92
- };
90
+ location.reload()
91
+ })
92
+ }
93
93
 
94
94
  if (component) {
95
95
  try {
96
96
  // A user global-error.js owns the whole document (<html>/<body>); render its
97
97
  // subtree in place. If it THROWS during render, fall back to the built-in.
98
- render(h(component, { error, reset }), root);
99
- return;
98
+ render(h(component, { error, reset }), root)
99
+ return
100
100
  } catch {
101
- globalErrorMounted = true; // keep mounted; render the fallback below.
101
+ globalErrorMounted = true // keep mounted; render the fallback below.
102
102
  }
103
103
  }
104
104
 
105
- renderBuiltinFallback(root, error);
105
+ renderBuiltinFallback(root, error)
106
106
  }
107
107
 
108
108
  // Next's DefaultGlobalError document text/markup. A client-escaped error has no
109
109
  // digest, so it always shows the non-server "Reload to try again, or go back."
110
110
  // message and no ERROR <digest> footer.
111
111
  function renderBuiltinFallback(root: HTMLElement, error: unknown): void {
112
- const digest = (error as { digest?: unknown } | null | undefined)?.digest;
113
- const isServerError = typeof digest === 'string' && digest.length > 0;
112
+ const digest = (error as { digest?: unknown } | null | undefined)?.digest
113
+ const isServerError = typeof digest === 'string' && digest.length > 0
114
114
  const message = isServerError
115
115
  ? 'A server error occurred. Reload to try again.'
116
- : 'Reload to try again, or go back.';
116
+ : 'Reload to try again, or go back.'
117
117
 
118
- ensureThemeStyle();
118
+ ensureThemeStyle()
119
119
  Object.assign(root.style, {
120
120
  fontFamily:
121
121
  'system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji"',
@@ -123,29 +123,32 @@ function renderBuiltinFallback(root: HTMLElement, error: unknown): void {
123
123
  display: 'flex',
124
124
  alignItems: 'center',
125
125
  justifyContent: 'center',
126
- } as Partial<CSSStyleDeclaration>);
126
+ } as Partial<CSSStyleDeclaration>)
127
127
 
128
- const card = document.createElement('div');
128
+ const card = document.createElement('div')
129
129
  Object.assign(card.style, {
130
130
  marginTop: '-32px',
131
131
  maxWidth: '325px',
132
132
  padding: '32px 28px',
133
133
  textAlign: 'left',
134
- } as Partial<CSSStyleDeclaration>);
135
-
136
- const icon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
137
- icon.setAttribute('width', '32');
138
- icon.setAttribute('height', '32');
139
- icon.setAttribute('viewBox', '-0.2 -1.5 32 32');
140
- icon.setAttribute('fill', 'none');
141
- icon.style.marginBottom = '24px';
142
- const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
143
- path.setAttribute('d', 'M16.9328 0C18.0839.000116771 19.1334.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C.527541 29-.439628 27.4588.201371 26.1309L11.9973 1.69531C12.4979.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z');
144
- path.setAttribute('fill', 'var(--next-error-title)');
145
- icon.append(path);
146
-
147
- const title = document.createElement('h1');
148
- title.textContent = "This page couldn’t load";
134
+ } as Partial<CSSStyleDeclaration>)
135
+
136
+ const icon = document.createElementNS('http://www.w3.org/2000/svg', 'svg')
137
+ icon.setAttribute('width', '32')
138
+ icon.setAttribute('height', '32')
139
+ icon.setAttribute('viewBox', '-0.2 -1.5 32 32')
140
+ icon.setAttribute('fill', 'none')
141
+ icon.style.marginBottom = '24px'
142
+ const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')
143
+ path.setAttribute(
144
+ 'd',
145
+ 'M16.9328 0C18.0839.000116771 19.1334.658832 19.634 1.69531L31.4299 26.1309C32.0708 27.4588 31.1036 28.9999 29.6291 29H2.00215C.527541 29-.439628 27.4588.201371 26.1309L11.9973 1.69531C12.4979.658823 13.5474 7.75066e-05 14.6984 0H16.9328ZM3.59493 26H28.0363L16.9328 3H14.6984L3.59493 26ZM15.8156 19C16.9202 19.0001 17.8156 19.8955 17.8156 21C17.8156 22.1045 16.9202 22.9999 15.8156 23C14.7111 23 13.8156 22.1046 13.8156 21C13.8156 19.8954 14.7111 19 15.8156 19ZM17.3156 16.5H14.3156V8.5H17.3156V16.5Z',
146
+ )
147
+ path.setAttribute('fill', 'var(--next-error-title)')
148
+ icon.append(path)
149
+
150
+ const title = document.createElement('h1')
151
+ title.textContent = 'This page couldn’t load'
149
152
  Object.assign(title.style, {
150
153
  fontSize: '24px',
151
154
  fontWeight: '500',
@@ -153,50 +156,50 @@ function renderBuiltinFallback(root: HTMLElement, error: unknown): void {
153
156
  lineHeight: '32px',
154
157
  margin: '0 0 12px 0',
155
158
  color: 'var(--next-error-title)',
156
- } as Partial<CSSStyleDeclaration>);
159
+ } as Partial<CSSStyleDeclaration>)
157
160
 
158
- const body = document.createElement('p');
159
- body.textContent = message;
161
+ const body = document.createElement('p')
162
+ body.textContent = message
160
163
  Object.assign(body.style, {
161
164
  fontSize: '14px',
162
165
  fontWeight: '400',
163
166
  lineHeight: '21px',
164
167
  margin: '0 0 20px 0',
165
168
  color: 'var(--next-error-message)',
166
- } as Partial<CSSStyleDeclaration>);
169
+ } as Partial<CSSStyleDeclaration>)
167
170
 
168
- const buttonGroup = document.createElement('div');
169
- Object.assign(buttonGroup.style, { display: 'flex', gap: '8px', alignItems: 'center' });
170
- const reloadForm = document.createElement('form');
171
- reloadForm.style.margin = '0';
171
+ const buttonGroup = document.createElement('div')
172
+ Object.assign(buttonGroup.style, { display: 'flex', gap: '8px', alignItems: 'center' })
173
+ const reloadForm = document.createElement('form')
174
+ reloadForm.style.margin = '0'
172
175
  reloadForm.addEventListener('submit', event => {
173
- event.preventDefault();
174
- location.reload();
175
- });
176
- const reload = document.createElement('button');
177
- reload.type = 'submit';
178
- reload.textContent = 'Reload';
179
- Object.assign(reload.style, buttonStyle(false));
180
- reloadForm.append(reload);
181
- buttonGroup.append(reloadForm);
176
+ event.preventDefault()
177
+ location.reload()
178
+ })
179
+ const reload = document.createElement('button')
180
+ reload.type = 'submit'
181
+ reload.textContent = 'Reload'
182
+ Object.assign(reload.style, buttonStyle(false))
183
+ reloadForm.append(reload)
184
+ buttonGroup.append(reloadForm)
182
185
  if (!isServerError) {
183
- const back = document.createElement('button');
184
- back.type = 'button';
185
- back.textContent = 'Back';
186
- Object.assign(back.style, buttonStyle(true));
186
+ const back = document.createElement('button')
187
+ back.type = 'button'
188
+ back.textContent = 'Back'
189
+ Object.assign(back.style, buttonStyle(true))
187
190
  back.addEventListener('click', () => {
188
- if (window.history.length > 1) window.history.back();
189
- else window.location.href = '/';
190
- });
191
- buttonGroup.append(back);
191
+ if (window.history.length > 1) window.history.back()
192
+ else window.location.href = '/'
193
+ })
194
+ buttonGroup.append(back)
192
195
  }
193
- card.append(icon, title, body, buttonGroup);
194
- root.append(card);
196
+ card.append(icon, title, body, buttonGroup)
197
+ root.append(card)
195
198
  if (isServerError) {
196
199
  // Next's DefaultGlobalError digest footer (`ERROR <digest>`), fixed to the
197
200
  // bottom so operators can correlate the redacted UI with server logs.
198
- const footer = document.createElement('p');
199
- footer.textContent = `ERROR ${digest}`;
201
+ const footer = document.createElement('p')
202
+ footer.textContent = `ERROR ${digest}`
200
203
  Object.assign(footer.style, {
201
204
  position: 'fixed',
202
205
  bottom: '32px',
@@ -209,30 +212,37 @@ function renderBuiltinFallback(root: HTMLElement, error: unknown): void {
209
212
  fontWeight: '400',
210
213
  margin: '0',
211
214
  color: 'var(--next-error-digest)',
212
- } as Partial<CSSStyleDeclaration>);
213
- root.append(footer);
215
+ } as Partial<CSSStyleDeclaration>)
216
+ root.append(footer)
214
217
  }
215
- if (typeof document.title !== 'undefined') document.title = '500: This page couldn’t load';
218
+ if (typeof document.title !== 'undefined') document.title = '500: This page couldn’t load'
216
219
  }
217
220
 
218
221
  function buttonStyle(secondary: boolean): Partial<CSSStyleDeclaration> {
219
222
  return {
220
- display: 'inline-flex', alignItems: 'center', justifyContent: 'center', height: '32px',
221
- padding: '0 12px', fontSize: '14px', fontWeight: '500', lineHeight: '20px',
222
- borderRadius: '6px', cursor: 'pointer',
223
+ display: 'inline-flex',
224
+ alignItems: 'center',
225
+ justifyContent: 'center',
226
+ height: '32px',
227
+ padding: '0 12px',
228
+ fontSize: '14px',
229
+ fontWeight: '500',
230
+ lineHeight: '20px',
231
+ borderRadius: '6px',
232
+ cursor: 'pointer',
223
233
  color: secondary ? 'var(--next-error-btn-secondary-text)' : 'var(--next-error-btn-text)',
224
234
  background: secondary ? 'var(--next-error-btn-secondary-bg)' : 'var(--next-error-btn-bg)',
225
235
  border: secondary ? 'var(--next-error-btn-secondary-border)' : 'var(--next-error-btn-border)',
226
- };
236
+ }
227
237
  }
228
238
 
229
- const THEME_STYLE_ID = '__pnext_global_error_theme__';
239
+ const THEME_STYLE_ID = '__pnext_global_error_theme__'
230
240
 
231
241
  function ensureThemeStyle(): void {
232
- if (document.getElementById(THEME_STYLE_ID)) return;
233
- const style = document.createElement('style');
234
- style.id = THEME_STYLE_ID;
242
+ if (document.getElementById(THEME_STYLE_ID)) return
243
+ const style = document.createElement('style')
244
+ style.id = THEME_STYLE_ID
235
245
  style.textContent =
236
- ':root{--next-error-bg:#fff;--next-error-text:#171717;--next-error-title:#171717;--next-error-message:#171717;--next-error-digest:#666666;--next-error-btn-text:#fff;--next-error-btn-bg:#171717;--next-error-btn-border:none;--next-error-btn-secondary-text:#171717;--next-error-btn-secondary-bg:transparent;--next-error-btn-secondary-border:1px solid rgba(0,0,0,.08)}@media (prefers-color-scheme:dark){:root{--next-error-bg:#0a0a0a;--next-error-text:#ededed;--next-error-title:#ededed;--next-error-message:#ededed;--next-error-digest:#a0a0a0;--next-error-btn-text:#0a0a0a;--next-error-btn-bg:#ededed;--next-error-btn-border:none;--next-error-btn-secondary-text:#ededed;--next-error-btn-secondary-bg:transparent;--next-error-btn-secondary-border:1px solid rgba(255,255,255,.14)}}body{margin:0;color:var(--next-error-text);background:var(--next-error-bg);}';
237
- document.head.append(style);
246
+ ':root{--next-error-bg:#fff;--next-error-text:#171717;--next-error-title:#171717;--next-error-message:#171717;--next-error-digest:#666666;--next-error-btn-text:#fff;--next-error-btn-bg:#171717;--next-error-btn-border:none;--next-error-btn-secondary-text:#171717;--next-error-btn-secondary-bg:transparent;--next-error-btn-secondary-border:1px solid rgba(0,0,0,.08)}@media (prefers-color-scheme:dark){:root{--next-error-bg:#0a0a0a;--next-error-text:#ededed;--next-error-title:#ededed;--next-error-message:#ededed;--next-error-digest:#a0a0a0;--next-error-btn-text:#0a0a0a;--next-error-btn-bg:#ededed;--next-error-btn-border:none;--next-error-btn-secondary-text:#ededed;--next-error-btn-secondary-bg:transparent;--next-error-btn-secondary-border:1px solid rgba(255,255,255,.14)}}body{margin:0;color:var(--next-error-text);background:var(--next-error-bg);}'
247
+ document.head.append(style)
238
248
  }