@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
@@ -1,19 +1,19 @@
1
- import path from 'node:path';
2
- import { type ResolvedConfig } from '../../config';
3
- import { setProxyExtensions, setProxyResponseProtocol } from '../../extensions';
4
- import { findProxyFiles, setProxyRewriteObserver } from '../../proxy';
5
- import { moduleExportNames } from '../../resolve/scan-facts';
6
- import { readText, toPosixPath } from '../../utils/fs';
7
- import { recordRewrite } from '../protocol';
8
- import { recordCanonicalUrl } from '../next/canonical-url';
9
- import { getNextConfig } from '../next/config-loader';
10
- import { activateTestProxy } from '../lifecycle/testmode';
1
+ import path from 'node:path'
2
+ import { type ResolvedConfig } from '../../config'
3
+ import { setProxyExtensions, setProxyResponseProtocol } from '../../extensions'
4
+ import { findProxyFiles, setProxyRewriteObserver } from '../../routing/proxy'
5
+ import { moduleExportNames } from '../../resolve/scan-facts'
6
+ import { readText, toPosixPath } from '../../utils/fs'
7
+ import { recordRewrite } from '../protocol'
8
+ import { recordCanonicalUrl } from '../next/canonical-url'
9
+ import { getNextConfig } from '../next/config-loader'
10
+ import { activateTestProxy } from '../lifecycle/testmode'
11
11
 
12
12
  export function registerProxyExtensions(_config: ResolvedConfig): void {
13
13
  setProxyResponseProtocol({
14
14
  nextHeader: 'x-middleware-next',
15
15
  rewriteHeader: 'x-middleware-rewrite',
16
- });
16
+ })
17
17
  setProxyExtensions({
18
18
  names: ['proxy', 'middleware'],
19
19
  validateFiles: validateNextProxyFiles,
@@ -22,88 +22,86 @@ export function registerProxyExtensions(_config: ResolvedConfig): void {
22
22
  locale: proxyLocale,
23
23
  onExternalRewrite: request => activateTestProxy(request.headers),
24
24
  clientMaxBodySize: proxyClientMaxBodySize,
25
- });
25
+ })
26
26
  // A same-origin middleware rewrite feeds the Next rewrite-tracking channel so
27
27
  // RSC responses carry x-nextjs-rewritten-path/query (identical to next.config
28
28
  // rewrites; the RSC-only emission gate lives in compat/protocol.ts). The
29
29
  // ORIGINAL url is stashed too so usePathname/useSearchParams stay canonical.
30
30
  setProxyRewriteObserver((from, to) => {
31
- recordCanonicalUrl(from);
32
- recordRewrite(from, to);
33
- });
31
+ recordCanonicalUrl(from)
32
+ recordRewrite(from, to)
33
+ })
34
34
  }
35
35
 
36
- const DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE = 10 * 1024 * 1024;
36
+ const DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE = 10 * 1024 * 1024
37
37
 
38
38
  // experimental.proxyClientMaxBodySize accepts bytes (2097152) or a size string
39
39
  // ('5mb'); experimental.middlewareClientMaxBodySize is the deprecated alias.
40
40
  function proxyClientMaxBodySize(): number {
41
- const experimental = (getNextConfig().experimental ?? {}) as Record<string, unknown>;
42
- const raw = experimental.proxyClientMaxBodySize ?? experimental.middlewareClientMaxBodySize;
43
- if (typeof raw === 'number' && raw > 0) return raw;
41
+ const experimental = (getNextConfig().experimental ?? {}) as Record<string, unknown>
42
+ const raw = experimental.proxyClientMaxBodySize ?? experimental.middlewareClientMaxBodySize
43
+ if (typeof raw === 'number' && raw > 0) return raw
44
44
  if (typeof raw === 'string') {
45
- const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i.exec(raw.trim());
45
+ const match = /^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/i.exec(raw.trim())
46
46
  if (match?.[1]) {
47
- const unit = (match[2] ?? 'b').toLowerCase();
47
+ const unit = (match[2] ?? 'b').toLowerCase()
48
48
  const multiplier =
49
- unit === 'gb' ? 1024 ** 3 : unit === 'mb' ? 1024 ** 2 : unit === 'kb' ? 1024 : 1;
50
- const bytes = Math.floor(Number(match[1]) * multiplier);
51
- if (bytes > 0) return bytes;
49
+ unit === 'gb' ? 1024 ** 3 : unit === 'mb' ? 1024 ** 2 : unit === 'kb' ? 1024 : 1
50
+ const bytes = Math.floor(Number(match[1]) * multiplier)
51
+ if (bytes > 0) return bytes
52
52
  }
53
53
  }
54
- return DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE;
54
+ return DEFAULT_PROXY_CLIENT_MAX_BODY_SIZE
55
55
  }
56
56
 
57
57
  function proxyLocale(url: URL): string {
58
- const i18n = getNextConfig().i18n as { locales?: unknown } | undefined;
59
- if (!Array.isArray(i18n?.locales)) return '';
60
- const locales = i18n.locales.filter((locale): locale is string => typeof locale === 'string');
61
- const dataLocale = /^\/_next\/data\/[^/]+\/([^/]+)(?:\/|$)/.exec(url.pathname)?.[1];
62
- const candidate = dataLocale ?? url.pathname.split('/')[1];
63
- return locales.find(locale => locale.toLowerCase() === candidate?.toLowerCase()) ?? '';
58
+ const i18n = getNextConfig().i18n as { locales?: unknown } | undefined
59
+ if (!Array.isArray(i18n?.locales)) return ''
60
+ const locales = i18n.locales.filter((locale): locale is string => typeof locale === 'string')
61
+ const dataLocale = /^\/_next\/data\/[^/]+\/([^/]+)(?:\/|$)/.exec(url.pathname)?.[1]
62
+ const candidate = dataLocale ?? url.pathname.split('/')[1]
63
+ return locales.find(locale => locale.toLowerCase() === candidate?.toLowerCase()) ?? ''
64
64
  }
65
65
 
66
66
  async function validateNextProxyFiles(config: ResolvedConfig) {
67
- const files = findProxyFiles(config, ['proxy', 'middleware']);
68
- const middleware = files.find(file => path.basename(file).startsWith('middleware.'));
69
- const proxy = files.find(file => path.basename(file).startsWith('proxy.'));
67
+ const files = findProxyFiles(config, ['proxy', 'middleware'])
68
+ const middleware = files.find(file => path.basename(file).startsWith('middleware.'))
69
+ const proxy = files.find(file => path.basename(file).startsWith('proxy.'))
70
70
  if (middleware && proxy) {
71
71
  throw new Error(
72
72
  `Both middleware file "${relativeProxyPath(config, middleware)}" and proxy file "${relativeProxyPath(config, proxy)}" are detected. Please use "${relativeProxyPath(config, proxy)}" only.`,
73
- );
73
+ )
74
74
  }
75
75
  if (middleware && !proxy) {
76
- console.warn(
77
- 'The "middleware" file convention is deprecated. Please use "proxy" instead.',
78
- );
76
+ console.warn('The "middleware" file convention is deprecated. Please use "proxy" instead.')
79
77
  }
80
- await Promise.all(files.map(file => validateNextProxyFile(config, file)));
78
+ await Promise.all(files.map(file => validateNextProxyFile(config, file)))
81
79
  }
82
80
 
83
81
  async function validateNextProxyFile(config: ResolvedConfig, file: string) {
84
- const source = await readText(file);
85
- const name = path.basename(file).split('.')[0];
86
- const exports = moduleExportNames(source, file);
82
+ const source = await readText(file)
83
+ const name = path.basename(file).split('.')[0]
84
+ const exports = moduleExportNames(source, file)
87
85
  const validExport =
88
86
  exports.includes('default') ||
89
- (name === 'proxy' ? exports.includes('proxy') : exports.includes('middleware'));
87
+ (name === 'proxy' ? exports.includes('proxy') : exports.includes('middleware'))
90
88
  if (!validExport) {
91
- throw new Error(proxyMissingExportError(config, file));
89
+ throw new Error(proxyMissingExportError(config, file))
92
90
  }
93
91
  if (name === 'proxy' && hasRuntimeConfig(source)) {
94
92
  throw new Error(
95
93
  `Route segment config is not allowed in Proxy file at "${relativeProxyPath(config, file)}". Proxy always runs on Node.js runtime. Learn more: https://nextjs.org/docs/messages/middleware-to-proxy`,
96
- );
94
+ )
97
95
  }
98
96
  }
99
97
 
100
98
  function proxyMissingExportError(config: ResolvedConfig, file: string) {
101
- const name = path.basename(file).split('.')[0] === 'middleware' ? 'middleware' : 'proxy';
99
+ const name = path.basename(file).split('.')[0] === 'middleware' ? 'middleware' : 'proxy'
102
100
  const migrationReason =
103
101
  name === 'proxy'
104
102
  ? "- You are migrating from `middleware` to `proxy`, but haven't updated the exported function.\n"
105
- : '';
106
- const target = name === 'proxy' ? 'proxy (previously called middleware)' : 'middleware';
103
+ : ''
104
+ const target = name === 'proxy' ? 'proxy (previously called middleware)' : 'middleware'
107
105
  return `The file "${relativeProxyPath(config, file)}" must export a function, either as a default export or as a named "${name}" export.
108
106
  This function is what Next.js runs for every request handled by this ${target}.
109
107
 
@@ -115,13 +113,13 @@ ${migrationReason}- The file exists but doesn't export a function.
115
113
  To fix it:
116
114
  - Ensure this file has either a default or "${name}" function export.
117
115
 
118
- Learn more: https://nextjs.org/docs/messages/middleware-to-proxy`;
116
+ Learn more: https://nextjs.org/docs/messages/middleware-to-proxy`
119
117
  }
120
118
 
121
119
  function hasRuntimeConfig(source: string) {
122
- return /\bexport\s+const\s+config\s*=/.test(source) && /\bruntime\s*:/.test(source);
120
+ return /\bexport\s+const\s+config\s*=/.test(source) && /\bruntime\s*:/.test(source)
123
121
  }
124
122
 
125
123
  function relativeProxyPath(config: ResolvedConfig, file: string) {
126
- return `./${toPosixPath(path.relative(config.root, file))}`;
124
+ return `./${toPosixPath(path.relative(config.root, file))}`
127
125
  }
@@ -16,12 +16,12 @@
16
16
  // serializeServerActionProp, collectRenderMeta and the server-action module tagging hooks are populated
17
17
  // by the actions and cache sub-registrars; this file owns the react and font/suspense hooks.
18
18
 
19
- import type { ResolvedConfig } from '../../config';
20
- import { onExtensionHostReset, setRenderExtensions } from '../../extensions';
21
- import { setReactCompatActive } from '../react/preact';
19
+ import type { ResolvedConfig } from '../../config'
20
+ import { onExtensionHostReset, setRenderExtensions } from '../../extensions'
21
+ import { setReactCompatActive } from '../react/preact'
22
22
 
23
23
  // preact's global vnode hook cannot be uninstalled, so it follows the host.
24
- onExtensionHostReset(() => setReactCompatActive(false));
24
+ onExtensionHostReset(() => setReactCompatActive(false))
25
25
  import {
26
26
  nextCompatEnabled,
27
27
  reactCompatEnabled,
@@ -31,72 +31,74 @@ import {
31
31
  setStaticParamsExtensions,
32
32
  setStreamRouteExtensions,
33
33
  setSuspenseExtensions,
34
- } from '../../render/hooks';
35
- import { withAssetPrefix } from '../../css';
36
- import { polyfillsChunkPath } from '../bundler/polyfill';
37
- import { nextRouterShimScript } from '../react/router-shim';
38
- import { renderPartytownHeadScripts } from '../next/script';
39
- import { ensureCompatSuspense, compatSuspenseType } from '../../compat';
40
- import { invokeServerComponentWithUse } from '../react/server-component-use';
41
- import { fontAssets, fontPreloadDomScript, prewarmFonts, runWithFontScope } from '../next/font/runtime';
34
+ } from '../../render/hooks'
35
+ import { withAssetPrefix } from '../../css/build'
36
+ import { polyfillsChunkPath } from '../bundler/polyfill'
37
+ import { nextRouterShimScript } from '../react/router-shim'
38
+ import { renderPartytownHeadScripts } from '../next/script'
39
+ import { ensureCompatSuspense, compatSuspenseType } from '../../compat/aliases'
40
+ import { invokeServerComponentWithUse } from '../react/server-component-use'
41
+ import {
42
+ fontAssets,
43
+ fontPreloadDomScript,
44
+ prewarmFonts,
45
+ runWithFontScope,
46
+ } from '../next/font/runtime'
42
47
  import {
43
48
  hasRuntimeMetadata,
44
49
  readNextModuleMetadata,
45
50
  readNextModuleViewport,
46
51
  shouldRenderMetadataInBody,
47
- } from '../metadata';
48
- import { aliasGenerateStaticParams } from '../static-params';
49
- import { getNextConfig } from '../next/config-loader';
50
- import {
51
- renderServerInsertedHTML,
52
- setServerInsertedHTMLScope,
53
- } from '../react/server-inserted-html';
54
- import { nextClientRouteState } from '../next/optimistic-route-state';
55
- import { earlySubmitCaptureScript } from '../actions/early-submit';
56
- import { getWorkUnit } from '../../request/context';
52
+ } from '../metadata'
53
+ import { aliasGenerateStaticParams } from '../static-params'
54
+ import { getNextConfig } from '../next/config-loader'
55
+ import { renderServerInsertedHTML, setServerInsertedHTMLScope } from '../react/server-inserted-html'
56
+ import { nextClientRouteState } from '../next/route-state'
57
+ import { earlySubmitCaptureScript } from '../actions/early-submit'
58
+ import { getWorkUnit } from '../../request/context'
57
59
  import {
58
60
  createVaryParamsAccumulator,
59
61
  createVaryingParams,
60
62
  createVaryingSearchParams,
61
63
  normalizeOptionalCatchAllParams,
62
- } from '../segment/vary-params';
63
- import type { VaryParamsTrackingContext } from '../../extensions';
64
+ } from '../segment/vary-params'
65
+ import type { VaryParamsTrackingContext } from '../../extensions'
64
66
 
65
67
  export function registerRenderExtensions(config: ResolvedConfig): void {
66
68
  // The react layer only matters when react/next compat is on. A next-only
67
69
  // predicate would miss react-compat-only apps (which still render server
68
70
  // components with use() and need the compat Suspense identity for streaming).
69
- if (!reactCompatEnabled(config)) return;
71
+ if (!reactCompatEnabled(config)) return
70
72
 
71
- setReactCompatActive(true);
73
+ setReactCompatActive(true)
72
74
 
73
75
  setServerInsertedHTMLScope(() => {
74
- const workUnit = getWorkUnit();
75
- if (!workUnit) return undefined;
76
- return (workUnit.compat ??= {});
77
- });
76
+ const workUnit = getWorkUnit()
77
+ if (!workUnit) return undefined
78
+ return (workUnit.compat ??= {})
79
+ })
78
80
 
79
81
  setRenderExtensions({
80
82
  wrapServerComponentInvoke: invokeServerComponentWithUse,
81
83
  genericErrorTitle: ({ dev }) => (dev ? undefined : 'This page couldn\u2019t load'),
82
- });
84
+ })
83
85
 
84
- setSuspenseExtensions({ ensureCompatSuspense, compatSuspenseType });
86
+ setSuspenseExtensions({ ensureCompatSuspense, compatSuspenseType })
85
87
 
86
88
  // next/font is a next-compat feature; a react-only app renders no fonts.
87
89
  if (nextCompatEnabled(config)) {
88
90
  setStreamRouteExtensions({
89
91
  canStreamRoute: canStreamNextRoute,
90
92
  inlineSuspenseStream: needsInlineSuspenseStream,
91
- });
93
+ })
92
94
  setMetadataExtensions({
93
95
  enabled: nextCompatEnabled,
94
96
  hasRuntimeMetadata,
95
97
  readModuleMetadata: readNextModuleMetadata,
96
98
  readModuleViewport: readNextModuleViewport,
97
99
  shouldRenderMetadataInBody,
98
- });
99
- setStaticParamsExtensions({ normalizeModule: aliasGenerateStaticParams });
100
+ })
101
+ setStaticParamsExtensions({ normalizeModule: aliasGenerateStaticParams })
100
102
  setRenderExtensions({
101
103
  clientRouteState: nextClientRouteState,
102
104
  trackVaryParams: trackRenderVaryParams,
@@ -104,17 +106,21 @@ export function registerRenderExtensions(config: ResolvedConfig): void {
104
106
  // island hosts and the page slot travel as comment pairs and the inline
105
107
  // bootstrap materializes them. Core ships the elements as final.
106
108
  islandCommentWireFormat: () => true,
107
- });
109
+ })
108
110
  setDocumentScriptExtensions({
109
111
  stylesheetPrecedence: cfg => (nextCompatEnabled(cfg) ? 'next' : undefined),
110
- });
111
- setFontExtensions({ runWithFontScope, collectFontAssets: fontAssets, prewarmFontAssets: prewarmFonts });
112
+ })
113
+ setFontExtensions({
114
+ runWithFontScope,
115
+ collectFontAssets: fontAssets,
116
+ prewarmFontAssets: prewarmFonts,
117
+ })
112
118
  setDocumentScriptExtensions({
113
119
  documentBodyScripts: cfg =>
114
120
  `${flightDataBootstrapScript()}${renderPartytownHeadScripts()}${basePathScript(cfg.basePath)}${trailingSlashScript(cfg.trailingSlash)}${skipTrailingSlashScript(cfg.skipTrailingSlashRedirect)}${staleTimesScript()}${segmentSchedulerScript()}${appShellsScript()}${optimisticRoutingScript()}${nextRouterShimScript()}<script>${earlySubmitCaptureScript()}</script>${fontPreloadDomScript()}`,
115
121
  documentHeadTags: () => `${polyfillsScript(config)}${renderServerInsertedHTML()}`,
116
122
  streamInsertedHTML: renderServerInsertedHTML,
117
- });
123
+ })
118
124
  }
119
125
  }
120
126
 
@@ -129,17 +135,17 @@ function trackRenderVaryParams<T extends Record<string, unknown>>(
129
135
  value: T,
130
136
  context: VaryParamsTrackingContext,
131
137
  ): T {
132
- const accumulator = createVaryParamsAccumulator(context.segment ?? 'page');
138
+ const accumulator = createVaryParamsAccumulator(context.segment ?? 'page')
133
139
  if (!accumulator) {
134
140
  // Segment-M2 deliverable 5: Next's params shape (an EMPTY optional catch-all
135
141
  // carries no key) applies to every render, not just tracked ones.
136
142
  return context.kind === 'searchParams'
137
143
  ? value
138
- : normalizeOptionalCatchAllParams(value, context.optionalCatchAllParam ?? null);
144
+ : normalizeOptionalCatchAllParams(value, context.optionalCatchAllParam ?? null)
139
145
  }
140
146
  return context.kind === 'searchParams'
141
147
  ? createVaryingSearchParams(accumulator, value)
142
- : createVaryingParams(accumulator, value, context.optionalCatchAllParam ?? null);
148
+ : createVaryingParams(accumulator, value, context.optionalCatchAllParam ?? null)
143
149
  }
144
150
 
145
151
  /**
@@ -150,7 +156,7 @@ function trackRenderVaryParams<T extends Record<string, unknown>>(
150
156
  * by construction.
151
157
  */
152
158
  function flightDataBootstrapScript(): string {
153
- return `<script>(self.__next_f=self.__next_f||[]).push([0])</script>`;
159
+ return `<script>(self.__next_f=self.__next_f||[]).push([0])</script>`
154
160
  }
155
161
 
156
162
  // Next emits a `<script noModule>` tag referencing the polyfills chunk in the
@@ -159,28 +165,27 @@ function flightDataBootstrapScript(): string {
159
165
  // written by the client build's static-chunk seam). assetPrefix is applied so a
160
166
  // CDN-hosted asset base still resolves.
161
167
  function polyfillsScript(config: ResolvedConfig): string {
162
- return `<script src="${withAssetPrefix(config, polyfillsChunkPath())}" noModule=""></script>`;
168
+ return `<script src="${withAssetPrefix(config, polyfillsChunkPath())}" noModule=""></script>`
163
169
  }
164
170
 
165
171
  function canStreamNextRoute(input: {
166
- config: ResolvedConfig;
167
- route: { client?: boolean; stream?: unknown };
172
+ config: ResolvedConfig
173
+ route: { client?: boolean; stream?: unknown }
168
174
  }) {
169
- if (!nextCompatEnabled(input.config)) return true;
175
+ if (!nextCompatEnabled(input.config)) return true
170
176
  // Whole-page client routes stream through a single Preact render, preserving
171
177
  // ancestor provider context across their Suspense boundaries.
172
- if (input.route.client) return true;
178
+ if (input.route.client) return true
173
179
  const stream = input.route.stream as
174
- | { hasLoadingBoundary?: boolean; ancestorClientReferences?: string[] }
175
- | undefined;
180
+ { hasLoadingBoundary?: boolean; ancestorClientReferences?: string[] } | undefined
176
181
  // No stream metadata means a non-page route (handlers never reach the page
177
182
  // renderer) — nothing to stream.
178
- if (!stream) return false;
183
+ if (!stream) return false
179
184
  // Out-of-order streaming isolates each Suspense boundary and drops client-provider context inherited
180
185
  // from ancestor layouts/templates. When no ancestor ships a client reference there is nothing to lose;
181
186
  // when one does, the route still streams through the single-render inline-suspense path, which keeps the
182
187
  // whole tree in one preact render so ancestor providers stay in scope.
183
- return true;
188
+ return true
184
189
  }
185
190
 
186
191
  // A route whose ancestor layouts/templates ship client references streams in
@@ -188,34 +193,34 @@ function canStreamNextRoute(input: {
188
193
  // replacement chunks rendered from a fresh root, which would drop the ancestor
189
194
  // islands' provider context around the boundary's content.
190
195
  function needsInlineSuspenseStream(input: {
191
- config: ResolvedConfig;
192
- route: { client?: boolean; stream?: unknown };
196
+ config: ResolvedConfig
197
+ route: { client?: boolean; stream?: unknown }
193
198
  }) {
194
- if (!nextCompatEnabled(input.config) || input.route.client) return false;
195
- const stream = input.route.stream as { ancestorClientReferences?: string[] } | undefined;
196
- return (stream?.ancestorClientReferences?.length ?? 0) > 0;
199
+ if (!nextCompatEnabled(input.config) || input.route.client) return false
200
+ const stream = input.route.stream as { ancestorClientReferences?: string[] } | undefined
201
+ return (stream?.ancestorClientReferences?.length ?? 0) > 0
197
202
  }
198
203
 
199
204
  // Inline script exposing experimental.staleTimes so the client prefetch cache
200
205
  // honors config overrides (defaults 30s dynamic / 300s static apply otherwise).
201
206
  function staleTimesScript(): string {
202
207
  const experimental = getNextConfig().experimental as
203
- | { staleTimes?: { dynamic?: number; static?: number } }
204
- | undefined;
205
- const staleTimes = experimental?.staleTimes;
206
- if (!staleTimes) return '';
207
- return `<script>window.__PNEXT_STALE_TIMES__=${JSON.stringify(staleTimes)};</script>`;
208
+ { staleTimes?: { dynamic?: number; static?: number } } | undefined
209
+ const staleTimes = experimental?.staleTimes
210
+ if (!staleTimes) return ''
211
+ return `<script>window.__PNEXT_STALE_TIMES__=${JSON.stringify(staleTimes)};</script>`
208
212
  }
209
213
 
210
214
  // The client prefetch bandwidth scheduler (concurrency limits + hover-reserved lanes) reproduces Next's
211
215
  // SEGMENT-CACHE scheduler, which only exists under cacheComponents. A classic prefetch app must fire all
212
216
  // visible prefetches without throttling - the app-client-cache full-prefetch tests clear their request
213
217
  // listener between two staggered prefetches and would see the delayed one land as an unexpected request.
218
+ // Core defaults to scheduling, so plain compat stamps an explicit `false` to opt out.
214
219
  function segmentSchedulerScript(): string {
215
- const config = getNextConfig() as { cacheComponents?: unknown };
220
+ const config = getNextConfig() as { cacheComponents?: unknown }
216
221
  return config.cacheComponents === true
217
222
  ? `<script>window.__PNEXT_SEGMENT_SCHEDULER__=true;</script>`
218
- : '';
223
+ : `<script>window.__PNEXT_SEGMENT_SCHEDULER__=false;</script>`
219
224
  }
220
225
 
221
226
  // `experimental.appShells`: the client fires a SECOND, param-stripped prefetch
@@ -223,10 +228,10 @@ function segmentSchedulerScript(): string {
223
228
  // client/segment-prefetch.ts). Strictly opt-in — without the flag the extra
224
229
  // request would break the request-count contracts of every other suite.
225
230
  function appShellsScript(): string {
226
- const experimental = getNextConfig().experimental as { appShells?: unknown } | undefined;
231
+ const experimental = getNextConfig().experimental as { appShells?: unknown } | undefined
227
232
  return experimental?.appShells === true
228
233
  ? `<script>window.__PNEXT_APP_SHELLS__=true;</script>`
229
- : '';
234
+ : ''
230
235
  }
231
236
 
232
237
  // `experimental.optimisticRouting` defaults ON, so this is an OPT-OUT marker:
@@ -234,12 +239,10 @@ function appShellsScript(): string {
234
239
  // segment cache then stops letting one URL's entry satisfy another URL's
235
240
  // PREFETCH (compat/client/segment-cache.ts). Navigation reuse is unaffected.
236
241
  function optimisticRoutingScript(): string {
237
- const experimental = getNextConfig().experimental as
238
- | { optimisticRouting?: unknown }
239
- | undefined;
242
+ const experimental = getNextConfig().experimental as { optimisticRouting?: unknown } | undefined
240
243
  return experimental?.optimisticRouting === false
241
244
  ? `<script>window.__PNEXT_NO_OPTIMISTIC_ROUTING__=true;</script>`
242
- : '';
245
+ : ''
243
246
  }
244
247
 
245
248
  /**
@@ -248,8 +251,8 @@ function optimisticRoutingScript(): string {
248
251
  * bare app keeps the global undefined, treated as ''.
249
252
  */
250
253
  function basePathScript(basePath: string): string {
251
- if (!basePath) return '';
252
- return `<script>window.__PNEXT_BASE_PATH__=${JSON.stringify(basePath)};</script>`;
254
+ if (!basePath) return ''
255
+ return `<script>window.__PNEXT_BASE_PATH__=${JSON.stringify(basePath)};</script>`
253
256
  }
254
257
 
255
258
  /**
@@ -258,11 +261,11 @@ function basePathScript(basePath: string): string {
258
261
  * global undefined, treated as false.
259
262
  */
260
263
  function skipTrailingSlashScript(skip: boolean | undefined): string {
261
- if (!skip) return '';
262
- return `<script>window.__PNEXT_SKIP_TRAILING_SLASH__=true;</script>`;
264
+ if (!skip) return ''
265
+ return `<script>window.__PNEXT_SKIP_TRAILING_SLASH__=true;</script>`
263
266
  }
264
267
 
265
268
  function trailingSlashScript(trailingSlash: boolean | undefined): string {
266
- if (trailingSlash !== true) return '';
267
- return `<script>window.__PNEXT_TRAILING_SLASH__=true;</script>`;
269
+ if (trailingSlash !== true) return ''
270
+ return `<script>window.__PNEXT_TRAILING_SLASH__=true;</script>`
268
271
  }