@wular/pnext 0.0.4 → 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 -1992
  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 -1897
  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} +139 -139
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +318 -296
  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 +827 -815
  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,473 +1,20 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { Writable } from 'node:stream';
3
- import path from 'node:path';
4
- import type { ResolvedConfig } from '../../config';
5
- import { nextCompatEnabled } from '../../compat';
6
- import { devServerModuleHref } from '../../dev/imports';
7
- import { pagesApiBundleTargetForRuntime } from '../../runtime/server';
8
- import {
9
- getRequestExtensions,
10
- registerRequestInterceptors,
11
- registerRevalidateBypassToken,
12
- type RequestInterceptor,
13
- } from '../../extensions';
14
- import { getRequestRuntime } from '../../routing/request-runtime';
15
- import { selectRouteForRequest } from '../../routing/routes';
16
- import { serverBundleTargetForRuntime } from '../../runtime/server';
17
- import { setWorkUnitRoute } from '../../request/context';
18
- import { canonicalUrlHref } from '../next/canonical-url';
19
- import { markPathRevalidated, normalizeRevalidatePath } from '../cache/revalidate';
20
- import { withPagesApiHandlerSpan } from '../otel/tracer';
21
- import { toNextRequest } from '../../api/server';
1
+ // Pages-router API/data serving registration (COMPAT - may import core freely).
2
+ // The implementation (Node req/res shims, API-route and data-fetch dispatch)
3
+ // lives in ../pages/api; this module just wires it into the extension registries.
22
4
 
23
- type PagesApiHandler = (req: unknown, res: PagesApiResponse) => Promise<unknown>;
24
-
25
- interface PagesApiModule {
26
- default?: PagesApiHandler;
27
- }
28
-
29
- interface PagesApiResponse {
30
- statusCode: number;
31
- on(event: 'close' | 'error', listener: (...args: unknown[]) => void): PagesApiResponse;
32
- write(
33
- chunk: unknown,
34
- encoding?: BufferEncoding,
35
- callback?: () => void,
36
- ): boolean;
37
- setHeader(name: string, value: string | number | readonly string[]): PagesApiResponse;
38
- getHeader(name: string): string | null;
39
- status(code: number): PagesApiResponse;
40
- json(value: unknown): PagesApiResponse;
41
- send(value?: unknown): PagesApiResponse;
42
- end(value?: unknown): PagesApiResponse;
43
- revalidate(path: string): Promise<void>;
44
- }
45
-
46
- const pageExtensions = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'mts'];
5
+ import type { ResolvedConfig } from '../../config'
6
+ import { nextCompatEnabled } from '../../compat/aliases'
7
+ import { registerRequestInterceptors, registerRevalidateBypassToken } from '../../extensions'
8
+ import { PREVIEW_MODE_ID, pagesApiInterceptor, pagesDataInterceptor } from '../pages/api'
47
9
 
48
10
  export function registerPagesApiExtensions(config: ResolvedConfig): void {
49
- if (!nextCompatEnabled(config)) return;
11
+ if (!nextCompatEnabled(config)) return
50
12
  // Registered after the action/rewrite interceptors (register.ts order), so a
51
13
  // data request rewritten by middleware or next.config lands here with its
52
14
  // destination URL already resolved.
53
- registerRequestInterceptors(pagesApiInterceptor, pagesDataInterceptor);
15
+ registerRequestInterceptors(pagesApiInterceptor, pagesDataInterceptor)
54
16
  // The preview-mode id written into prerender-manifest.json: requests carrying
55
17
  // it in x-prerender-revalidate are on-demand revalidations (middleware skip +
56
18
  // x-nextjs-cache: REVALIDATED — see cli/start.ts).
57
- registerRevalidateBypassToken(() => PREVIEW_MODE_ID);
58
- }
59
-
60
- const PREVIEW_MODE_ID = 'pnext-preview-id';
61
-
62
- /**
63
- * Pages-router data protocol (`/_next/data/<id>/<page>.json`, normalized to the page path by cli/start.ts
64
- * with the `x-nextjs-data` marker): serve the page's data-fetch result as Next's data JSON -
65
- * `{ pageProps }` from getServerSideProps/getStaticProps of the materialized pages route - instead of
66
- * rendering HTML. When the request was rewritten, `x-nextjs-matched-path` reports the destination the
67
- * data was served from, which the pages client router uses to resolve the rewrite.
68
- */
69
- const pagesDataInterceptor: RequestInterceptor = async request => {
70
- if (request.headers.get('x-nextjs-data') !== '1') return undefined;
71
- const method = request.method.toUpperCase();
72
- if (method !== 'GET' && method !== 'HEAD') return undefined;
73
- const runtime = getRequestRuntime();
74
- if (!runtime) return undefined;
75
- const url = new URL(request.url);
76
- // Un-normalized data URLs (skipMiddlewareUrlNormalize without a middleware
77
- // rewrite) never match a route here; header-only marker requests for
78
- // document paths fall through to the HTML render.
79
- if (url.pathname.startsWith('/_next/')) return undefined;
80
-
81
- const selection = selectRouteForRequest(runtime.routes, url.pathname);
82
- if (selection?.route.kind !== 'page') {
83
- return dataResponse({ notFound: true }, 404, url);
84
- }
85
- const route = selection.route;
86
- if (!isMaterializedPagesRoute(route.file)) return undefined;
87
-
88
- const module = (await import(
89
- await devServerModuleHref(
90
- runtime.config,
91
- route.file,
92
- runtime.dev ? (runtime.devImportVersion ?? 'dev') : 'build',
93
- {
94
- conditionTarget: serverBundleTargetForRuntime(route.segmentConfig?.runtime),
95
- },
96
- )
97
- )) as PagesDataModule;
98
-
99
- setWorkUnitRoute('data', 'dynamic');
100
- const params = selection.params ?? {};
101
- const query = { ...Object.fromEntries(url.searchParams), ...params };
102
- if (typeof module.getServerSideProps === 'function') {
103
- const result = await module.getServerSideProps({
104
- params,
105
- query,
106
- req: pagesDataRequestShim(request, url),
107
- res: pagesDataResponseShim(),
108
- resolvedUrl: `${url.pathname}${url.search}`,
109
- preview: false,
110
- previewData: undefined,
111
- });
112
- return pagesDataResult(result, url);
113
- }
114
- if (typeof module.getStaticProps === 'function') {
115
- const result = await module.getStaticProps({ params });
116
- return pagesDataResult(result, url, true);
117
- }
118
- return dataResponse({ pageProps: {} }, 200, url);
119
- };
120
-
121
- interface PagesDataFnResult {
122
- props?: Record<string, unknown>;
123
- notFound?: boolean;
124
- redirect?: { destination: string; permanent?: boolean; statusCode?: number };
125
- }
126
-
127
- interface PagesDataModule {
128
- getServerSideProps?: (context: Record<string, unknown>) => Promise<PagesDataFnResult> | PagesDataFnResult;
129
- getStaticProps?: (context: Record<string, unknown>) => Promise<PagesDataFnResult> | PagesDataFnResult;
130
- }
131
-
132
- function pagesDataResult(result: PagesDataFnResult | undefined, url: URL, ssg = false): Response {
133
- if (result?.notFound) return dataResponse({ notFound: true }, 404, url);
134
- if (result?.redirect) {
135
- const status =
136
- result.redirect.statusCode ?? (result.redirect.permanent ? 308 : 307);
137
- return dataResponse(
138
- {
139
- pageProps: {
140
- __N_REDIRECT: result.redirect.destination,
141
- __N_REDIRECT_STATUS: status,
142
- },
143
- },
144
- 200,
145
- url,
146
- );
147
- }
148
- return dataResponse(
149
- { pageProps: result?.props ?? {}, ...(ssg ? { __N_SSG: true } : { __N_SSP: true }) },
150
- 200,
151
- url,
152
- );
153
- }
154
-
155
- function dataResponse(body: Record<string, unknown>, status: number, url: URL): Response {
156
- const headers = new Headers({ 'content-type': 'application/json; charset=utf-8' });
157
- // A rewrite happened when the canonical (as-requested, post-normalization)
158
- // pathname differs from the URL the route was matched on.
159
- const canonical = canonicalUrlHref();
160
- if (canonical && new URL(canonical).pathname !== url.pathname) {
161
- headers.set('x-nextjs-matched-path', url.pathname);
162
- }
163
- return new Response(JSON.stringify(body), { status, headers });
164
- }
165
-
166
- // The materialized hybrid app hosts BOTH routers; only pages wrappers
167
- // re-export from source-pages/, so sniff the (tiny, generated) wrapper body —
168
- // app routes must never serve _next/data.
169
- function isMaterializedPagesRoute(file: string): boolean {
170
- if (!file.split(path.sep).join('/').includes('pnext-pages-compat/')) return false;
171
- try {
172
- return readFileSync(file, 'utf8').includes('source-pages/');
173
- } catch {
174
- return false;
175
- }
176
- }
177
-
178
- function pagesDataRequestShim(request: Request, url: URL) {
179
- return {
180
- method: request.method,
181
- url: `${url.pathname}${url.search}`,
182
- headers: Object.fromEntries(request.headers),
183
- cookies: cookiesFromHeader(request.headers.get('cookie')),
184
- };
185
- }
186
-
187
- function pagesDataResponseShim() {
188
- const headers = new Headers();
189
- let statusCode = 200;
190
- return {
191
- get statusCode() {
192
- return statusCode;
193
- },
194
- set statusCode(value: number) {
195
- statusCode = value;
196
- },
197
- setHeader(name: string, value: string | number | readonly string[]) {
198
- headers.set(name, Array.isArray(value) ? value.join(', ') : String(value));
199
- return this;
200
- },
201
- getHeader(name: string) {
202
- return headers.get(name);
203
- },
204
- removeHeader(name: string) {
205
- headers.delete(name);
206
- },
207
- };
208
- }
209
-
210
- const pagesApiInterceptor: RequestInterceptor = async (request, { config }) => {
211
- const url = new URL(request.url);
212
- const file = pagesApiFile(config.root, url.pathname);
213
- if (!file) return undefined;
214
- const imported = (await import(
215
- await devServerModuleHref(config, file, 'build', {
216
- conditionTarget: pagesApiBundleTargetForRuntime(apiRuntime(file)),
217
- }),
218
- )) as PagesApiModule;
219
- if (typeof imported.default !== 'function') return undefined;
220
-
221
- const responder = createPagesApiResponse(request);
222
- // Edge-runtime pages API handlers receive the real NextRequest (signal,
223
- // nextUrl, text() — Request prototype getters a spread would lose); node
224
- // handlers get the IncomingMessage-shaped shim.
225
- const handlerRequest =
226
- apiRuntime(file) === 'edge' ? toNextRequest(request) : createPagesApiRequest(request, url);
227
- const finished = withPagesApiHandlerSpan(url.pathname, () =>
228
- Promise.resolve(imported.default!(handlerRequest, responder.res)),
229
- ).catch(error => responder.fail(error));
230
- // A handler that starts writing (res.write / pipeline) streams: the response returns at the first write
231
- // and the body flows through until end or disconnect - a client disconnect destroys `res`, surfacing as
232
- // its 'close' event, which is Node pages-API cancellation semantics. A handler that only buffers
233
- // resolves on completion exactly as before.
234
- const outcome = await Promise.race([
235
- responder.started.then(() => STREAM_STARTED),
236
- finished,
237
- ]);
238
- if (outcome !== STREAM_STARTED) {
239
- if (outcome instanceof Response) return outcome;
240
- return responder.response(outcome);
241
- }
242
- return responder.streamResponse();
243
- };
244
-
245
- const STREAM_STARTED = Symbol('pnext.pagesApiStreamStarted');
246
-
247
- function pagesApiFile(root: string, pathname: string): string | undefined {
248
- if (pathname !== '/api' && !pathname.startsWith('/api/')) return undefined;
249
- let relative: string;
250
- try {
251
- relative = decodeURIComponent(pathname === '/api' ? 'index' : pathname.slice('/api/'.length));
252
- } catch {
253
- return undefined;
254
- }
255
- const baseDir = path.join(root, 'pages', 'api');
256
- const base = path.resolve(baseDir, relative);
257
- if (base !== baseDir && !base.startsWith(`${baseDir}${path.sep}`)) return undefined;
258
- for (const ext of pageExtensions) {
259
- const file = `${base}.${ext}`;
260
- if (existsSync(file)) return file;
261
- const index = path.join(base, `index.${ext}`);
262
- if (existsSync(index)) return index;
263
- }
264
- return undefined;
265
- }
266
-
267
- function apiRuntime(file: string): string | undefined {
268
- return /\bruntime\b\s*[:=]\s*(['"`])(?:edge|experimental-edge)\1/.test(
269
- readFileSync(file, 'utf8'),
270
- )
271
- ? 'edge'
272
- : undefined;
273
- }
274
-
275
- function createPagesApiRequest(request: Request, url: URL) {
276
- const nextRequest = toNextRequest(request);
277
- return {
278
- ...nextRequest,
279
- method: request.method,
280
- url: `${url.pathname}${url.search}`,
281
- headers: Object.fromEntries(request.headers),
282
- query: Object.fromEntries(url.searchParams),
283
- cookies: cookiesFromHeader(request.headers.get('cookie')),
284
- nextUrl: nextRequest.nextUrl,
285
- text() {
286
- return request.text();
287
- },
288
- json() {
289
- return request.json();
290
- },
291
- };
292
- }
293
-
294
- function createPagesApiResponse(request: Request) {
295
- const headers = new Headers();
296
- let statusCode = 200;
297
- let sent = false;
298
- let body: BodyInit | null = null;
299
- let started = false;
300
- let notifyStarted: () => void = () => undefined;
301
- const startedPromise = new Promise<void>(resolve => {
302
- notifyStarted = resolve;
303
- });
304
-
305
- let controller: ReadableStreamDefaultController<Uint8Array> | undefined;
306
- const streamBody = new ReadableStream<Uint8Array>({
307
- start(c) {
308
- controller = c;
309
- },
310
- // The client disconnected mid-stream: destroy the res so the handler
311
- // observes it as the response closing (Node pages-API semantics —
312
- // `res.on('close', ...)` aborts its inner stream).
313
- cancel() {
314
- writable.destroy();
315
- },
316
- });
317
- const start = () => {
318
- if (!started) {
319
- started = true;
320
- notifyStarted();
321
- }
322
- };
323
- const enqueue = (chunk: unknown) => {
324
- const value = normalizeWriteChunk(chunk);
325
- if (value === '') return;
326
- try {
327
- controller?.enqueue(typeof value === 'string' ? new TextEncoder().encode(value) : new Uint8Array(value));
328
- } catch {
329
- // Stream already closed/cancelled — drop the late chunk.
330
- }
331
- };
332
- // A REAL Writable: `stream.pipeline(source, res)` and event listeners need a
333
- // genuine EventEmitter/stream destination, not a duck-typed object.
334
- const writable = new Writable({
335
- write(chunk, _encoding, callback) {
336
- start();
337
- enqueue(chunk);
338
- callback();
339
- },
340
- final(callback) {
341
- // Only a stream that actually wrote flags the streaming path: a plain
342
- // res.end(value) is a BUFFERED response (its body rides `body`, not the
343
- // stream) and must resolve through the handler-completion race.
344
- try {
345
- controller?.close();
346
- } catch {
347
- // Already closed.
348
- }
349
- callback();
350
- },
351
- destroy(error, callback) {
352
- try {
353
- controller?.close();
354
- } catch {
355
- // Already closed.
356
- }
357
- callback(error ?? null);
358
- },
359
- });
360
- request.signal?.addEventListener?.('abort', () => writable.destroy(), { once: true });
361
-
362
- const api = {
363
- setHeader(name: string, value: string | number | readonly string[]) {
364
- headers.set(name, Array.isArray(value) ? value.join(', ') : String(value));
365
- return res;
366
- },
367
- getHeader(name: string) {
368
- return headers.get(name);
369
- },
370
- removeHeader(name: string) {
371
- headers.delete(name);
372
- },
373
- status(code: number) {
374
- statusCode = code;
375
- return res;
376
- },
377
- json(value: unknown) {
378
- if (!headers.has('content-type')) headers.set('content-type', 'application/json; charset=utf-8');
379
- body = JSON.stringify(value);
380
- sent = true;
381
- return res;
382
- },
383
- send(value?: unknown) {
384
- body = bodyFromValue(value, headers);
385
- sent = true;
386
- return res;
387
- },
388
- end(value?: unknown) {
389
- if (!sent) {
390
- body = bodyFromValue(value, headers);
391
- sent = true;
392
- }
393
- if (value !== undefined && value !== null && started) {
394
- // Mid-stream end(chunk): flush the tail through the stream.
395
- enqueue(value);
396
- }
397
- (Writable.prototype.end as (this: Writable) => Writable).call(writable);
398
- return res;
399
- },
400
- async revalidate(pathname: string) {
401
- markPathRevalidated(pathname);
402
- await getRequestExtensions().onDemandRevalidatePath(normalizeRevalidatePath(pathname));
403
- },
404
- };
405
- const res = Object.assign(writable, api) as unknown as PagesApiResponse;
406
- Object.defineProperty(res, 'statusCode', {
407
- get: () => statusCode,
408
- set: (value: number) => {
409
- statusCode = value;
410
- },
411
- });
412
-
413
- return {
414
- res,
415
- started: startedPromise,
416
- fail(error: unknown): never | undefined {
417
- if (!started) throw error;
418
- try {
419
- controller?.error(error);
420
- } catch {
421
- // Stream already settled.
422
- }
423
- return undefined;
424
- },
425
- streamResponse() {
426
- // Null-body statuses (204/304) must not carry a body stream.
427
- if (statusCode === 204 || statusCode === 304) {
428
- return new Response(null, { status: statusCode, headers });
429
- }
430
- return new Response(streamBody, { status: statusCode, headers });
431
- },
432
- response(result: unknown) {
433
- if (result !== undefined && !sent) body = bodyFromValue(result, headers);
434
- return new Response(statusCode === 204 || statusCode === 304 ? null : body, {
435
- status: statusCode,
436
- headers,
437
- });
438
- },
439
- };
440
- }
441
-
442
- function normalizeWriteChunk(
443
- chunk: unknown,
444
- ) {
445
- if (chunk === null || chunk === undefined) return '';
446
- if (typeof chunk === 'string') return chunk;
447
- if (chunk instanceof ArrayBuffer) return Buffer.from(chunk);
448
- if (ArrayBuffer.isView(chunk)) return Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength);
449
- if (typeof chunk === 'number' || typeof chunk === 'boolean' || typeof chunk === 'bigint') {
450
- return String(chunk);
451
- }
452
- return JSON.stringify(chunk) ?? '';
453
- }
454
-
455
- function bodyFromValue(value: unknown, headers: Headers): BodyInit | null {
456
- if (value === undefined || value === null) return null;
457
- if (typeof value === 'string' || value instanceof Blob || value instanceof ArrayBuffer) return value;
458
- if (value instanceof Uint8Array && value.buffer instanceof ArrayBuffer) {
459
- return value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength);
460
- }
461
- if (!headers.has('content-type')) headers.set('content-type', 'application/json; charset=utf-8');
462
- return JSON.stringify(value);
463
- }
464
-
465
- function cookiesFromHeader(header: string | null): Record<string, string> {
466
- if (!header) return {};
467
- return Object.fromEntries(
468
- header
469
- .split(';')
470
- .map(part => part.trim().split('='))
471
- .filter((parts): parts is [string, string] => parts.length === 2 && parts[0] !== ''),
472
- );
19
+ registerRevalidateBypassToken(() => PREVIEW_MODE_ID)
473
20
  }
@@ -7,28 +7,28 @@
7
7
  // route, and switches request APIs (cookies/headers/connection/params/searchParams/io) to hanging
8
8
  // promises that postpone at the first await inside a boundary. Idempotent.
9
9
 
10
- import type { ResolvedConfig } from '../../config';
11
- import { nextCompatEnabled } from '../../compat';
12
- import { onExtensionHostReset, registerBuildSteps, registerUsageDetectors } from '../../extensions';
13
- import type { RouteManifestEntry } from '../../types';
14
- import { cacheComponents } from '../../ppr';
15
- import { validateRootParamsProvided } from '../ppr/missing-root-params';
10
+ import type { ResolvedConfig } from '../../config'
11
+ import { nextCompatEnabled } from '../../compat/aliases'
12
+ import { onExtensionHostReset, registerBuildSteps, registerUsageDetectors } from '../../extensions'
13
+ import type { RouteManifestEntry } from '../../types'
14
+ import { cacheComponents } from '../../render/ppr'
15
+ import { validateRootParamsProvided } from '../ppr/missing-root-params'
16
16
 
17
- let registered = false;
17
+ let registered = false
18
18
  // Host-scoped guard: a fresh host must be registered into again.
19
- onExtensionHostReset(() => (registered = false));
19
+ onExtensionHostReset(() => (registered = false))
20
20
 
21
21
  export function registerPprExtensions(config: ResolvedConfig): void {
22
- if (registered) return;
23
- if (!nextCompatEnabled(config)) return;
24
- registered = true;
22
+ if (registered) return
23
+ if (!nextCompatEnabled(config)) return
24
+ registered = true
25
25
 
26
26
  // The core cacheComponents flag is NOT set here: registration is a process
27
27
  // one-shot, so it is derived per config load in next/config-loader's
28
28
  // setNextConfig() instead.
29
29
 
30
30
  // next/root-params named imports -> default-Proxy member reads: run by the
31
- // next/font pre-transform (compat/index.ts), which is registered for the same
31
+ // next/font pre-transform (compat/aliases.ts), which is registered for the same
32
32
  // `compat.next` apps and fires ahead of the static-import alias rewrite. A
33
33
  // second registration here would only ever re-scan an already-rewritten
34
34
  // source, so this file registers none.
@@ -41,16 +41,16 @@ export function registerPprExtensions(config: ResolvedConfig): void {
41
41
  cacheComponents() &&
42
42
  /\bio\s*\(\s*\)/.test(source) &&
43
43
  (source.includes('next/server') || source.includes('next/cache')),
44
- );
44
+ )
45
45
 
46
46
  // cacheComponents build guard: a root param (a dynamic segment at/above a
47
47
  // root layout) with no generateStaticParams value is a hard build error. The
48
48
  // registry is process-global, so re-check enablement per build (a later
49
49
  // pure-core buildProject in the same process must not run this).
50
50
  registerBuildSteps(async ctx => {
51
- if (!cacheComponents()) return;
51
+ if (!cacheComponents()) return
52
52
  await ctx.log.step('validate root params', () =>
53
53
  validateRootParamsProvided(ctx.config, ctx.routes as RouteManifestEntry[]),
54
- );
55
- });
54
+ )
55
+ })
56
56
  }
@@ -2,15 +2,15 @@
2
2
  // appends the compat responseFinalizers (Vary merge, x-nextjs-rewritten-path/query) into the core
3
3
  // registry. No-op when compat.next is off.
4
4
 
5
- import type { ResolvedConfig } from '../../config';
5
+ import type { ResolvedConfig } from '../../config'
6
6
  import {
7
7
  registerRequestInterceptors,
8
8
  registerResponseFinalizers,
9
9
  setRouterProtocolExtensions,
10
- } from '../../extensions';
11
- import { cacheControlFinalizers } from '../cache-control';
12
- import { protocolFinalizers, protocolInterceptors } from '../protocol';
13
- import { registerResourceHintFinalizer } from '../next/resource-hints';
10
+ } from '../../extensions'
11
+ import { cacheControlFinalizers } from '../cache-control'
12
+ import { protocolFinalizers, protocolInterceptors } from '../protocol'
13
+ import { registerResourceHintFinalizer } from '../next/resource-hints'
14
14
 
15
15
  /**
16
16
  * The router-state-tree validation interceptor, registered on its own so the
@@ -19,7 +19,7 @@ import { registerResourceHintFinalizer } from '../next/resource-hints';
19
19
  * of them answers it.
20
20
  */
21
21
  export function registerProtocolRequestValidation(config: ResolvedConfig): void {
22
- registerRequestInterceptors(...protocolInterceptors(config));
22
+ registerRequestInterceptors(...protocolInterceptors(config))
23
23
  }
24
24
 
25
25
  export function registerProtocolExtensions(config: ResolvedConfig): void {
@@ -31,27 +31,26 @@ export function registerProtocolExtensions(config: ResolvedConfig): void {
31
31
  // (`prefetch={true}`, which Next issues WITHOUT the prefetch header) is a complete fetch - neither is
32
32
  // shell-only.
33
33
  shellOnlyRequest: (request, route) => {
34
- if (request.method.toUpperCase() !== 'GET') return false;
35
- if (request.headers.get('rsc') !== '1') return false;
36
- if (request.headers.get('next-router-prefetch') !== '1') return false;
34
+ if (request.method.toUpperCase() !== 'GET') return false
35
+ if (request.headers.get('rsc') !== '1') return false
36
+ if (request.headers.get('next-router-prefetch') !== '1') return false
37
37
  const segmentConfig = route.segmentConfig as
38
- | { prefetch?: unknown; dynamic?: unknown }
39
- | undefined;
38
+ { prefetch?: unknown; dynamic?: unknown } | undefined
40
39
  if (
41
40
  segmentConfig?.prefetch === 'allow-runtime' ||
42
41
  segmentConfig?.prefetch === 'unstable_eager'
43
42
  ) {
44
- return false;
43
+ return false
45
44
  }
46
45
  // Static-capable content belongs in a prefetch (Next inlines static
47
46
  // data — and lazy-static persistence must never cache a truncated
48
47
  // body). Only a truly dynamic render, or a PPR shell with holes, is cut
49
48
  // at the shell.
50
- if (route.mode !== 'dynamic' && !route.ppr) return false;
51
- if (segmentConfig?.dynamic === 'force-static') return false;
52
- return true;
49
+ if (route.mode !== 'dynamic' && !route.ppr) return false
50
+ if (segmentConfig?.dynamic === 'force-static') return false
51
+ return true
53
52
  },
54
- });
55
- registerResponseFinalizers(...protocolFinalizers(config), ...cacheControlFinalizers(config));
56
- registerResourceHintFinalizer();
53
+ })
54
+ registerResponseFinalizers(...protocolFinalizers(config), ...cacheControlFinalizers(config))
55
+ registerResourceHintFinalizer()
57
56
  }