@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,4 +1,4 @@
1
- import { AsyncLocalStorage } from 'node:async_hooks';
1
+ import { AsyncLocalStorage } from 'node:async_hooks'
2
2
  import {
3
3
  cacheComponents,
4
4
  hangingPromise,
@@ -6,8 +6,8 @@ import {
6
6
  isRuntimePrefetchPrerender,
7
7
  markRuntimeApiOnAwait,
8
8
  PostponeError,
9
- } from '../ppr';
10
- import type { NextRequest, RouteParamValue } from '../types';
9
+ } from '../render/ppr'
10
+ import type { NextRequest, RouteParamValue } from '../types'
11
11
 
12
12
  // Request work-unit store (CORE seam for compat after()/onRequestError).
13
13
  //
@@ -21,56 +21,56 @@ import type { NextRequest, RouteParamValue } from '../types';
21
21
  // proxying on top of these accessors. Core only owns the store and the flush.
22
22
 
23
23
  /** The lifecycle phase the request is currently executing in. */
24
- export type WorkUnitPhase = 'render' | 'action' | 'handler' | 'middleware' | 'after';
24
+ export type WorkUnitPhase = 'render' | 'action' | 'handler' | 'middleware' | 'after'
25
25
 
26
26
  /** How the matched route is being served — set by the responding call site. */
27
- export type WorkUnitRouteKind = 'html' | 'data' | 'static-asset' | 'route-handler';
27
+ export type WorkUnitRouteKind = 'html' | 'data' | 'static-asset' | 'route-handler'
28
28
 
29
29
  /** Per-request work unit carrying phase + the after-task queue. */
30
30
  export interface WorkUnit {
31
- phase: WorkUnitPhase;
31
+ phase: WorkUnitPhase
32
32
  /** Tasks queued via queueAfterTask, drained once on response close. */
33
- afterTasks: (() => unknown)[];
33
+ afterTasks: (() => unknown)[]
34
34
  /** Guard so the after-queue flushes exactly once across all close paths. */
35
- flushed: boolean;
35
+ flushed: boolean
36
36
  /** How the response is being produced (set by the responding call site). */
37
- routeKind?: WorkUnitRouteKind;
37
+ routeKind?: WorkUnitRouteKind
38
38
  /** Caching disposition of the matched route, when known. */
39
- routeMode?: 'static' | 'isr' | 'dynamic';
39
+ routeMode?: 'static' | 'isr' | 'dynamic'
40
40
  /** Opaque hints for response finalizers. */
41
- responseHints?: Record<string, unknown>;
41
+ responseHints?: Record<string, unknown>
42
42
  /**
43
43
  * Opaque compat scratch space keyed by well-known symbols (testmode proxy
44
44
  * info, onRequestError dedupe flag). Core never reads these; it only carries
45
45
  * the store across the request lifecycle. Kept off the typed surface so core
46
46
  * grows no dependency on compat.
47
47
  */
48
- compat?: Record<symbol, unknown>;
48
+ compat?: Record<symbol, unknown>
49
49
  }
50
50
 
51
51
  // Anchored on globalThis (like requestStorage below) so compiled compat
52
52
  // bundles that inline their own copy of this module still observe the same
53
53
  // per-request work unit — canonical-URL recording happens in core while its
54
54
  // readers (pages-router SSR state, navigation hooks) run from built bundles.
55
- const WORK_UNIT_STORAGE = Symbol.for('pnext.workUnitStorage');
55
+ const WORK_UNIT_STORAGE = Symbol.for('pnext.workUnitStorage')
56
56
  const workUnitStorage = ((globalThis as Record<PropertyKey, unknown>)[WORK_UNIT_STORAGE] ??=
57
- new AsyncLocalStorage<WorkUnit>()) as AsyncLocalStorage<WorkUnit>;
57
+ new AsyncLocalStorage<WorkUnit>()) as AsyncLocalStorage<WorkUnit>
58
58
 
59
59
  /** Run `callback` inside a fresh request work unit (start/dev per-request scope). */
60
60
  export function runWithWorkUnit<T>(phase: WorkUnitPhase, callback: () => T): T {
61
- const unit: WorkUnit = { phase, afterTasks: [], flushed: false };
62
- return workUnitStorage.run(unit, callback);
61
+ const unit: WorkUnit = { phase, afterTasks: [], flushed: false }
62
+ return workUnitStorage.run(unit, callback)
63
63
  }
64
64
 
65
65
  /** The active request work unit, or undefined outside a request scope. */
66
66
  export function getWorkUnit(): WorkUnit | undefined {
67
- return workUnitStorage.getStore();
67
+ return workUnitStorage.getStore()
68
68
  }
69
69
 
70
70
  /** Set the current work-unit phase (compat toggles render/action/handler/...). */
71
71
  export function setPhase(phase: WorkUnitPhase): void {
72
- const unit = workUnitStorage.getStore();
73
- if (unit) unit.phase = phase;
72
+ const unit = workUnitStorage.getStore()
73
+ if (unit) unit.phase = phase
74
74
  }
75
75
 
76
76
  /** Record how the current request is being served (drives finalizers + funnel). */
@@ -79,11 +79,11 @@ export function setWorkUnitRoute(
79
79
  routeMode?: WorkUnit['routeMode'],
80
80
  responseHints?: Record<string, unknown>,
81
81
  ): void {
82
- const unit = workUnitStorage.getStore();
83
- if (!unit) return;
84
- unit.routeKind = routeKind;
85
- if (routeMode) unit.routeMode = routeMode;
86
- if (responseHints) unit.responseHints = responseHints;
82
+ const unit = workUnitStorage.getStore()
83
+ if (!unit) return
84
+ unit.routeKind = routeKind
85
+ if (routeMode) unit.routeMode = routeMode
86
+ if (responseHints) unit.responseHints = responseHints
87
87
  }
88
88
 
89
89
  /**
@@ -91,10 +91,10 @@ export function setWorkUnitRoute(
91
91
  * work unit is active. Compat's after() delegates here; core never enqueues.
92
92
  */
93
93
  export function queueAfterTask(task: () => unknown): boolean {
94
- const unit = workUnitStorage.getStore();
95
- if (!unit) return false;
96
- unit.afterTasks.push(task);
97
- return true;
94
+ const unit = workUnitStorage.getStore()
95
+ if (!unit) return false
96
+ unit.afterTasks.push(task)
97
+ return true
98
98
  }
99
99
 
100
100
  /**
@@ -104,9 +104,9 @@ export function queueAfterTask(task: () => unknown): boolean {
104
104
  * multiple close paths (stream end / redirect / abort / error).
105
105
  */
106
106
  export function flushWorkUnit(unit: WorkUnit | undefined = workUnitStorage.getStore()): void {
107
- if (!unit || unit.flushed) return;
108
- unit.flushed = true;
109
- if (unit.afterTasks.length === 0) return;
107
+ if (!unit || unit.flushed) return
108
+ unit.flushed = true
109
+ if (unit.afterTasks.length === 0) return
110
110
  // Drain under a SHALLOW COPY carrying `phase: 'after'` rather than mutating
111
111
  // the shared unit. The flush is detached and async, so setting `phase` on the
112
112
  // unit itself leaked: every later render seen under that unit (the build/PPR
@@ -115,36 +115,36 @@ export function flushWorkUnit(unit: WorkUnit | undefined = workUnitStorage.getSt
115
115
  // after()". Every other field stays shared by reference; only the phase and
116
116
  // the queue diverge, and nested after() enqueues onto the copy's queue via
117
117
  // the store, which is exactly what this loop drains.
118
- const afterUnit: WorkUnit = { ...unit, phase: 'after' };
118
+ const afterUnit: WorkUnit = { ...unit, phase: 'after' }
119
119
  const flushing = workUnitStorage.run(afterUnit, async () => {
120
120
  while (afterUnit.afterTasks.length) {
121
- const tasks = afterUnit.afterTasks;
122
- afterUnit.afterTasks = [];
121
+ const tasks = afterUnit.afterTasks
122
+ afterUnit.afterTasks = []
123
123
  for (const task of tasks) {
124
124
  try {
125
- await task();
125
+ await task()
126
126
  } catch (error) {
127
- console.error('after() task failed:', error);
127
+ console.error('after() task failed:', error)
128
128
  }
129
129
  }
130
130
  }
131
- });
132
- pendingFlushes.add(flushing);
133
- void flushing.finally(() => pendingFlushes.delete(flushing));
131
+ })
132
+ pendingFlushes.add(flushing)
133
+ void flushing.finally(() => pendingFlushes.delete(flushing))
134
134
  }
135
135
 
136
- const pendingFlushes = new Set<Promise<void>>();
136
+ const pendingFlushes = new Set<Promise<void>>()
137
137
 
138
138
  /**
139
139
  * Await all in-flight after-queue flushes (graceful shutdown). Bounded by
140
140
  * timeoutMs so a hung after() task can't block process exit.
141
141
  */
142
142
  export async function drainWorkUnits(timeoutMs = 10_000): Promise<void> {
143
- if (pendingFlushes.size === 0) return;
143
+ if (pendingFlushes.size === 0) return
144
144
  await Promise.race([
145
145
  Promise.allSettled([...pendingFlushes]),
146
146
  new Promise(resolve => setTimeout(resolve, timeoutMs)),
147
- ]);
147
+ ])
148
148
  }
149
149
 
150
150
  /**
@@ -158,52 +158,52 @@ export function flushWorkUnitOnClose(
158
158
  unit: WorkUnit | undefined,
159
159
  signal?: AbortSignal,
160
160
  ): Response {
161
- if (!unit) return response;
162
- if (signal) signal.addEventListener('abort', () => flushWorkUnit(unit), { once: true });
161
+ if (!unit) return response
162
+ if (signal) signal.addEventListener('abort', () => flushWorkUnit(unit), { once: true })
163
163
  if (!response.body) {
164
- flushWorkUnit(unit);
165
- return response;
164
+ flushWorkUnit(unit)
165
+ return response
166
166
  }
167
167
  // An explicit Content-Length means the body is fully buffered upstream (image
168
168
  // optimizer, static files) — nothing can enqueue after-tasks while it drains.
169
169
  // Re-wrapping it in a close-observing stream would switch the transfer to
170
170
  // chunked and drop the Content-Length header; flush immediately instead.
171
171
  if (response.headers.has('content-length')) {
172
- flushWorkUnit(unit);
173
- return response;
172
+ flushWorkUnit(unit)
173
+ return response
174
174
  }
175
175
  const observed = response.body.pipeThrough(
176
176
  new TransformStream({
177
177
  transform(chunk, controller) {
178
- controller.enqueue(chunk);
178
+ controller.enqueue(chunk)
179
179
  },
180
180
  flush() {
181
- flushWorkUnit(unit);
181
+ flushWorkUnit(unit)
182
182
  },
183
183
  }),
184
- );
184
+ )
185
185
  return new Response(observed, {
186
186
  status: response.status,
187
187
  statusText: response.statusText,
188
188
  headers: response.headers,
189
- });
189
+ })
190
190
  }
191
191
 
192
192
  interface RequestScope {
193
- request: NextRequest;
194
- params: Record<string, RouteParamValue>;
193
+ request: NextRequest
194
+ params: Record<string, RouteParamValue>
195
195
  /** Work registered via after() from 'next/server', flushed once the request callback settles. */
196
- afterCallbacks?: (() => unknown)[];
196
+ afterCallbacks?: (() => unknown)[]
197
197
  /** Optional response-headers channel render/handler paths may provide (e.g. draftMode set-cookie). */
198
- responseHeaders?: Headers;
198
+ responseHeaders?: Headers
199
199
  }
200
200
 
201
- const REQUEST_STORAGE = Symbol.for('pnext.requestStorage');
201
+ const REQUEST_STORAGE = Symbol.for('pnext.requestStorage')
202
202
  const requestStorage = ((globalThis as Record<PropertyKey, unknown>)[REQUEST_STORAGE] ??=
203
- new AsyncLocalStorage<RequestScope>()) as AsyncLocalStorage<RequestScope>;
203
+ new AsyncLocalStorage<RequestScope>()) as AsyncLocalStorage<RequestScope>
204
204
 
205
205
  export function currentRequest() {
206
- return requestStorage.getStore()?.request;
206
+ return requestStorage.getStore()?.request
207
207
  }
208
208
 
209
209
  // Work-unit store bridge for the deep-internal shim
@@ -217,29 +217,29 @@ export function currentRequest() {
217
217
  // The store is NEVER undefined: callers do `getStore().type` during build prerenders as well as live
218
218
  // requests. `prerender-runtime` mirrors Next's runtime-prefetch work unit; `prerender` covers any other
219
219
  // prerender scope, including the fallback when no request scope exists.
220
- const WORK_UNIT_EXTERNAL = Symbol.for('pnext.workUnitExternal');
220
+ const WORK_UNIT_EXTERNAL = Symbol.for('pnext.workUnitExternal')
221
221
 
222
222
  interface WorkUnitExternalStore {
223
- type: 'request' | 'prerender' | 'prerender-runtime';
224
- cookies: unknown;
225
- headers: Headers;
223
+ type: 'request' | 'prerender' | 'prerender-runtime'
224
+ cookies: unknown
225
+ headers: Headers
226
226
  }
227
227
 
228
228
  function workUnitExternalStore(): WorkUnitExternalStore {
229
- const request = currentRequest();
229
+ const request = currentRequest()
230
230
  const type = isRuntimePrefetchPrerender()
231
231
  ? 'prerender-runtime'
232
232
  : isPrerendering() || !request
233
233
  ? 'prerender'
234
- : 'request';
234
+ : 'request'
235
235
  return {
236
236
  type,
237
237
  cookies: request?.cookies,
238
238
  headers: request?.headers ?? new Headers(),
239
- };
239
+ }
240
240
  }
241
241
 
242
- (globalThis as Record<PropertyKey, unknown>)[WORK_UNIT_EXTERNAL] = workUnitExternalStore;
242
+ ;(globalThis as Record<PropertyKey, unknown>)[WORK_UNIT_EXTERNAL] = workUnitExternalStore
243
243
 
244
244
  /**
245
245
  * Capture the current request scope (if any) and return a wrapper that re-runs a function inside it.
@@ -249,13 +249,13 @@ function workUnitExternalStore(): WorkUnitExternalStore {
249
249
  * throws - matching Next's phase semantics.
250
250
  */
251
251
  export function captureRequestScope(): <T>(fn: () => T) => T {
252
- const scope = requestStorage.getStore();
253
- if (!scope) return fn => fn();
254
- return fn => requestStorage.run(scope, fn);
252
+ const scope = requestStorage.getStore()
253
+ if (!scope) return fn => fn()
254
+ return fn => requestStorage.run(scope, fn)
255
255
  }
256
256
 
257
257
  export function currentParams() {
258
- return requestStorage.getStore()?.params ?? {};
258
+ return requestStorage.getStore()?.params ?? {}
259
259
  }
260
260
 
261
261
  export function runWithRequest<T>(
@@ -264,28 +264,28 @@ export function runWithRequest<T>(
264
264
  params: Record<string, RouteParamValue> = {},
265
265
  extras: { responseHeaders?: Headers } = {},
266
266
  ): T {
267
- if (!request) return callback();
267
+ if (!request) return callback()
268
268
  const scope: RequestScope = {
269
269
  request,
270
270
  params,
271
271
  afterCallbacks: [],
272
272
  responseHeaders: extras.responseHeaders,
273
- };
274
- const result = requestStorage.run(scope, callback);
273
+ }
274
+ const result = requestStorage.run(scope, callback)
275
275
  if (isThenable(result)) {
276
276
  return (result as PromiseLike<unknown>).then(
277
277
  value => {
278
- void flushAfterCallbacks(scope);
279
- return value;
278
+ void flushAfterCallbacks(scope)
279
+ return value
280
280
  },
281
281
  error => {
282
- void flushAfterCallbacks(scope);
283
- throw error;
282
+ void flushAfterCallbacks(scope)
283
+ throw error
284
284
  },
285
- ) as T;
285
+ ) as T
286
286
  }
287
- void flushAfterCallbacks(scope);
288
- return result;
287
+ void flushAfterCallbacks(scope)
288
+ return result
289
289
  }
290
290
 
291
291
  /**
@@ -293,33 +293,33 @@ export function runWithRequest<T>(
293
293
  * settles. Returns false when no request scope is active.
294
294
  */
295
295
  export function registerAfterCallback(callback: () => unknown): boolean {
296
- const scope = requestStorage.getStore();
297
- if (!scope) return false;
298
- (scope.afterCallbacks ??= []).push(callback);
299
- return true;
296
+ const scope = requestStorage.getStore()
297
+ if (!scope) return false
298
+ ;(scope.afterCallbacks ??= []).push(callback)
299
+ return true
300
300
  }
301
301
 
302
302
  /** Response-headers channel for the active request scope, when a caller provided one. */
303
303
  export function currentResponseHeaders(): Headers | undefined {
304
- return requestStorage.getStore()?.responseHeaders;
304
+ return requestStorage.getStore()?.responseHeaders
305
305
  }
306
306
 
307
307
  async function flushAfterCallbacks(scope: RequestScope) {
308
308
  while (scope.afterCallbacks?.length) {
309
- const callbacks = scope.afterCallbacks;
310
- scope.afterCallbacks = [];
309
+ const callbacks = scope.afterCallbacks
310
+ scope.afterCallbacks = []
311
311
  for (const callback of callbacks) {
312
312
  try {
313
- await requestStorage.run(scope, callback);
313
+ await requestStorage.run(scope, callback)
314
314
  } catch (error) {
315
- console.error('after() callback failed:', error);
315
+ console.error('after() callback failed:', error)
316
316
  }
317
317
  }
318
318
  }
319
319
  }
320
320
 
321
321
  function isThenable(value: unknown): value is PromiseLike<unknown> {
322
- return typeof (value as { then?: unknown } | null | undefined)?.then === 'function';
322
+ return typeof (value as { then?: unknown } | null | undefined)?.then === 'function'
323
323
  }
324
324
 
325
325
  /**
@@ -331,39 +331,39 @@ function isThenable(value: unknown): value is PromiseLike<unknown> {
331
331
  * the same flag, and module-level rather than ALS-scoped because the calls it
332
332
  * looks for run outside the render's async context by definition.
333
333
  */
334
- const BAILOUT_PROBE = Symbol.for('pnext.dynamicBailoutProbe');
334
+ const BAILOUT_PROBE = Symbol.for('pnext.dynamicBailoutProbe')
335
335
 
336
336
  export function beginDynamicBailoutProbe(route: string): void {
337
- (globalThis as Record<PropertyKey, unknown>)[BAILOUT_PROBE] = route;
337
+ ;(globalThis as Record<PropertyKey, unknown>)[BAILOUT_PROBE] = route
338
338
  }
339
339
 
340
340
  export function endDynamicBailoutProbe(): void {
341
- delete (globalThis as Record<PropertyKey, unknown>)[BAILOUT_PROBE];
341
+ delete (globalThis as Record<PropertyKey, unknown>)[BAILOUT_PROBE]
342
342
  }
343
343
 
344
344
  function dynamicBailoutRoute(): string | undefined {
345
- const route = (globalThis as Record<PropertyKey, unknown>)[BAILOUT_PROBE];
346
- return typeof route === 'string' ? route : undefined;
345
+ const route = (globalThis as Record<PropertyKey, unknown>)[BAILOUT_PROBE]
346
+ return typeof route === 'string' ? route : undefined
347
347
  }
348
348
 
349
349
  export function requireRequest(api: string) {
350
- const probeRoute = dynamicBailoutRoute();
350
+ const probeRoute = dynamicBailoutRoute()
351
351
  if (probeRoute !== undefined) {
352
352
  const error = new Error(
353
353
  `Route ${probeRoute} couldn't be rendered statically because it used \`${api.replace(/\(\)$/, '')}\`. ` +
354
354
  `See more info here: https://nextjs.org/docs/messages/dynamic-server-error`,
355
- );
356
- error.name = 'DynamicServerError';
357
- throw error;
355
+ )
356
+ error.name = 'DynamicServerError'
357
+ throw error
358
358
  }
359
- const request = currentRequest();
359
+ const request = currentRequest()
360
360
  if (!request) {
361
361
  // In a partial prerender, request access marks the surrounding Suspense
362
362
  // boundary as a dynamic hole rather than failing the build.
363
- if (isPrerendering()) throw new PostponeError(api);
364
- throw new Error(`${api} can only be used while rendering a dynamic PNext request.`);
363
+ if (isPrerendering()) throw new PostponeError(api)
364
+ throw new Error(`${api} can only be used while rendering a dynamic PNext request.`)
365
365
  }
366
- return request;
366
+ return request
367
367
  }
368
368
 
369
369
  /**
@@ -386,11 +386,11 @@ export function requestApiPromise<T>(api: string, produce: () => T): Promise<T>
386
386
  // Awaiting the resolved value arms the sync-IO abort: anything the render
387
387
  // computes with Date.now() & co. AFTER a runtime API resolved belongs to
388
388
  // the navigation, not the prefetch (see runWithRuntimePrefetchSyncIoAbort).
389
- return markRuntimeApiOnAwait(Promise.resolve(produce()));
389
+ return markRuntimeApiOnAwait(Promise.resolve(produce()))
390
390
  }
391
- return hangingPromise<T>(api);
391
+ return hangingPromise<T>(api)
392
392
  }
393
393
  // Legacy PPR (experimental_ppr, cacheComponents off): keep the call-site
394
394
  // throw so the existing shell path postpones exactly as before.
395
- return Promise.resolve(produce());
395
+ return Promise.resolve(produce())
396
396
  }