@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
package/src/index.ts CHANGED
@@ -16,12 +16,12 @@ export type {
16
16
  ServerComponent,
17
17
  StaticParams,
18
18
  Viewport,
19
- } from './types';
20
- export type { PNextMetadataExport, PNextViewportExport } from './internal';
19
+ } from './types'
20
+ export type { PNextMetadataExport, PNextViewportExport } from './internal'
21
21
 
22
- export { Link } from './api/link';
23
- export { dynamic } from './api/dynamic';
24
- export { Suspense, type SuspenseProps } from './api/suspense';
22
+ export { Link } from './api/link'
23
+ export { dynamic } from './api/dynamic'
24
+ export { Suspense, type SuspenseProps } from './api/suspense'
25
25
  export {
26
26
  href,
27
27
  notFound,
@@ -29,6 +29,6 @@ export {
29
29
  PNextNotFoundError,
30
30
  PNextRedirectError,
31
31
  redirect,
32
- } from './api/navigation';
33
- export type { HrefOptions, RedirectOptions, RedirectStatus } from './api/navigation';
34
- export { NextResponse } from './api/server';
32
+ } from './api/navigation'
33
+ export type { HrefOptions, RedirectOptions, RedirectStatus } from './api/navigation'
34
+ export { NextResponse } from './api/server'
package/src/internal.ts CHANGED
@@ -6,38 +6,35 @@ import type {
6
6
  ServerComponent,
7
7
  StaticParams,
8
8
  Viewport,
9
- } from './types';
9
+ } from './types'
10
10
 
11
- export type PNextMetadataExport = Metadata | (() => Metadata | Promise<Metadata>);
12
- export type PNextViewportExport = Viewport | (() => Viewport | Promise<Viewport>);
11
+ export type PNextMetadataExport = Metadata | (() => Metadata | Promise<Metadata>)
12
+ export type PNextViewportExport = Viewport | (() => Viewport | Promise<Viewport>)
13
13
 
14
14
  export interface PNextPageModule<Route extends RoutePath> {
15
- default: ServerComponent<PageProps<Route>>;
16
- params?: () => StaticParams<Route>;
17
- metadata?: PNextMetadataExport;
18
- viewport?: PNextViewportExport;
15
+ default: ServerComponent<PageProps<Route>>
16
+ params?: () => StaticParams<Route>
17
+ metadata?: PNextMetadataExport
18
+ viewport?: PNextViewportExport
19
19
  }
20
20
 
21
21
  export interface PNextLayoutModule {
22
- default?: ServerComponent<LayoutProps>;
23
- metadata?: PNextMetadataExport;
24
- viewport?: PNextViewportExport;
22
+ default?: ServerComponent<LayoutProps>
23
+ metadata?: PNextMetadataExport
24
+ viewport?: PNextViewportExport
25
25
  }
26
26
 
27
27
  type NextHandler = {
28
- bivarianceHack(
29
- request: never,
30
- context: never,
31
- ): Response | Promise<Response>;
32
- }['bivarianceHack'];
28
+ bivarianceHack(request: never, context: never): Response | Promise<Response>
29
+ }['bivarianceHack']
33
30
 
34
31
  export interface PNextRouteHandlerModule<Route extends RoutePath> {
35
- GET?: NextHandler;
36
- POST?: NextHandler;
37
- PUT?: NextHandler;
38
- PATCH?: NextHandler;
39
- DELETE?: NextHandler;
40
- OPTIONS?: NextHandler;
41
- HEAD?: NextHandler;
42
- params?: () => StaticParams<Route>;
32
+ GET?: NextHandler
33
+ POST?: NextHandler
34
+ PUT?: NextHandler
35
+ PATCH?: NextHandler
36
+ DELETE?: NextHandler
37
+ OPTIONS?: NextHandler
38
+ HEAD?: NextHandler
39
+ params?: () => StaticParams<Route>
43
40
  }
@@ -3,6 +3,6 @@
3
3
  * boundary: the client entry turns it back into a throw at hydration, so the
4
4
  * island's own error boundary catches it.
5
5
  */
6
- export const ISLAND_BOUNDARY_ERROR_ELEMENT = 'pnext-boundary-error';
7
- export const ISLAND_BOUNDARY_ERROR_MESSAGE_ATTRIBUTE = 'data-pnext-error-message';
8
- export const ISLAND_BOUNDARY_ERROR_DIGEST_ATTRIBUTE = 'data-pnext-error-digest';
6
+ export const ISLAND_BOUNDARY_ERROR_ELEMENT = 'pnext-boundary-error'
7
+ export const ISLAND_BOUNDARY_ERROR_MESSAGE_ATTRIBUTE = 'data-pnext-error-message'
8
+ export const ISLAND_BOUNDARY_ERROR_DIGEST_ATTRIBUTE = 'data-pnext-error-digest'
@@ -10,25 +10,25 @@
10
10
  // inverted - core never imports compat. Types stay structural so core carries no type dependency on any
11
11
  // compat module.
12
12
 
13
- import type { ResolvedConfig } from '../config';
14
- import type { Metadata, MetadataLink, PageProps, Viewport } from '../types';
15
- import { restoreWithExtensionHost } from '../extensions';
13
+ import type { ResolvedConfig } from '../config'
14
+ import type { Metadata, MetadataLink, PageProps, Viewport } from '../types'
15
+ import { restoreWithExtensionHost } from '../extensions'
16
16
 
17
17
  // ---------------------------------------------------------------------------
18
18
  // Compat enablement gates (pure config reads; kept in core so render never
19
- // imports compat/index just to branch on the mode). MUST stay in sync with
20
- // compat/index.ts reactCompatEnabled / nextCompatEnabled and the inlined gate
19
+ // imports compat/aliases just to branch on the mode). MUST stay in sync with
20
+ // compat/aliases.ts reactCompatEnabled / nextCompatEnabled and the inlined gate
21
21
  // in compat-bootstrap.ts.
22
22
  // ---------------------------------------------------------------------------
23
23
 
24
24
  /** Next compat is on (server actions, next/* modules, authInterrupts). */
25
25
  export function nextCompatEnabled(config: ResolvedConfig): boolean {
26
- return Boolean(config.compat?.next);
26
+ return Boolean(config.compat?.next)
27
27
  }
28
28
 
29
29
  /** React compat is on (next implies react; react/react-dom aliasing, use() replay). */
30
30
  export function reactCompatEnabled(config: ResolvedConfig): boolean {
31
- return Boolean(config.compat?.next || config.compat?.react || config.compat?.reactCompiler);
31
+ return Boolean(config.compat?.next || config.compat?.react || config.compat?.reactCompiler)
32
32
  }
33
33
 
34
34
  // ---------------------------------------------------------------------------
@@ -38,8 +38,8 @@ export function reactCompatEnabled(config: ResolvedConfig): boolean {
38
38
 
39
39
  /** Resolved next/font CSS + preload links for a render (mirrors ResolvedFontAssets). */
40
40
  export interface RenderFontAssets {
41
- css: string;
42
- preloads: MetadataLink[];
41
+ css: string
42
+ preloads: MetadataLink[]
43
43
  }
44
44
 
45
45
  export interface FontExtensions {
@@ -48,7 +48,7 @@ export interface FontExtensions {
48
48
  * register their definitions. Compat installs the AsyncLocalStorage scope
49
49
  * (compat/next/font/runtime runWithFontScope). Default: run untouched.
50
50
  */
51
- runWithFontScope: <T>(callback: () => T) => T;
51
+ runWithFontScope: <T>(callback: () => T) => T
52
52
 
53
53
  /**
54
54
  * Emit the CSS + preload links for the fonts registered during the current
@@ -57,7 +57,7 @@ export interface FontExtensions {
57
57
  collectFontAssets: (
58
58
  config: ResolvedConfig,
59
59
  options: { dev?: boolean },
60
- ) => Promise<RenderFontAssets>;
60
+ ) => Promise<RenderFontAssets>
61
61
 
62
62
  /**
63
63
  * Resolve every font declared by modules loaded so far, without waiting for a render to register
@@ -65,21 +65,21 @@ export interface FontExtensions {
65
65
  * render, so it serializes behind everything. Called off the request's critical path, it lands in
66
66
  * the same memo the render reads. Default: none.
67
67
  */
68
- prewarmFontAssets: (config: ResolvedConfig, options: { dev?: boolean }) => Promise<void>;
68
+ prewarmFontAssets: (config: ResolvedConfig, options: { dev?: boolean }) => Promise<void>
69
69
  }
70
70
 
71
71
  const fontExtensions: FontExtensions = {
72
72
  runWithFontScope: callback => callback(),
73
73
  collectFontAssets: () => Promise.resolve({ css: '', preloads: [] }),
74
74
  prewarmFontAssets: () => Promise.resolve(),
75
- };
75
+ }
76
76
 
77
77
  export function getFontExtensions(): FontExtensions {
78
- return fontExtensions;
78
+ return fontExtensions
79
79
  }
80
80
 
81
81
  export function setFontExtensions(overrides: Partial<FontExtensions>): void {
82
- Object.assign(fontExtensions, overrides);
82
+ Object.assign(fontExtensions, overrides)
83
83
  }
84
84
 
85
85
  // Suspense identity - compat apps render React's Suspense (preact/compat), which streaming must recognize
@@ -91,29 +91,29 @@ export interface SuspenseExtensions {
91
91
  * Lazily resolve the compat Suspense component type (preact/compat) once, so the streaming tree walker can
92
92
  * treat it as a boundary. Default is a noop - core streaming uses its own Suspense marker only.
93
93
  */
94
- ensureCompatSuspense: (config: ResolvedConfig) => Promise<void>;
94
+ ensureCompatSuspense: (config: ResolvedConfig) => Promise<void>
95
95
  /** The resolved compat Suspense type, or undefined for a pure-core render. */
96
- compatSuspenseType: () => unknown;
96
+ compatSuspenseType: () => unknown
97
97
  }
98
98
 
99
99
  const suspenseExtensions: SuspenseExtensions = {
100
100
  ensureCompatSuspense: () => Promise.resolve(),
101
101
  compatSuspenseType: () => undefined,
102
- };
102
+ }
103
103
 
104
104
  export function getSuspenseExtensions(): SuspenseExtensions {
105
- return suspenseExtensions;
105
+ return suspenseExtensions
106
106
  }
107
107
 
108
108
  export function setSuspenseExtensions(overrides: Partial<SuspenseExtensions>): void {
109
- Object.assign(suspenseExtensions, overrides);
109
+ Object.assign(suspenseExtensions, overrides)
110
110
  }
111
111
 
112
112
  export interface StreamRouteExtensions {
113
113
  canStreamRoute: (input: {
114
- config: ResolvedConfig;
115
- route: { client?: boolean; stream?: unknown };
116
- }) => boolean;
114
+ config: ResolvedConfig
115
+ route: { client?: boolean; stream?: unknown }
116
+ }) => boolean
117
117
  /**
118
118
  * True when the route must stream through a SINGLE preact render (suspending
119
119
  * in place) rather than the out-of-order resolve walk, because an ancestor
@@ -121,88 +121,88 @@ export interface StreamRouteExtensions {
121
121
  * rendered replacement chunk would lose. See renderClientPageStreamShell.
122
122
  */
123
123
  inlineSuspenseStream: (input: {
124
- config: ResolvedConfig;
125
- route: { client?: boolean; stream?: unknown };
126
- }) => boolean;
124
+ config: ResolvedConfig
125
+ route: { client?: boolean; stream?: unknown }
126
+ }) => boolean
127
127
  }
128
128
 
129
129
  const streamRouteExtensions: StreamRouteExtensions = {
130
130
  canStreamRoute: () => true,
131
131
  inlineSuspenseStream: () => false,
132
- };
132
+ }
133
133
 
134
134
  export function getStreamRouteExtensions(): StreamRouteExtensions {
135
- return streamRouteExtensions;
135
+ return streamRouteExtensions
136
136
  }
137
137
 
138
138
  export function setStreamRouteExtensions(overrides: Partial<StreamRouteExtensions>): void {
139
- Object.assign(streamRouteExtensions, overrides);
139
+ Object.assign(streamRouteExtensions, overrides)
140
140
  }
141
141
 
142
142
  export interface StreamBoundaryExtensions {
143
- onStreamBoundaryError: (error: unknown) => void | Promise<void>;
143
+ onStreamBoundaryError: (error: unknown) => void | Promise<void>
144
144
  }
145
145
 
146
146
  const streamBoundaryExtensions: StreamBoundaryExtensions = {
147
147
  onStreamBoundaryError: () => undefined,
148
- };
148
+ }
149
149
 
150
150
  export function getStreamBoundaryExtensions(): StreamBoundaryExtensions {
151
- return streamBoundaryExtensions;
151
+ return streamBoundaryExtensions
152
152
  }
153
153
 
154
154
  export function setStreamBoundaryExtensions(overrides: Partial<StreamBoundaryExtensions>): void {
155
- Object.assign(streamBoundaryExtensions, overrides);
155
+ Object.assign(streamBoundaryExtensions, overrides)
156
156
  }
157
157
 
158
158
  export function reportStreamBoundaryError(error: unknown): void {
159
159
  try {
160
- const result = streamBoundaryExtensions.onStreamBoundaryError(error);
160
+ const result = streamBoundaryExtensions.onStreamBoundaryError(error)
161
161
  if (isThenable(result)) {
162
162
  void Promise.resolve(result).catch(reportError => {
163
- console.error('stream boundary error hook failed:', reportError);
164
- });
163
+ console.error('stream boundary error hook failed:', reportError)
164
+ })
165
165
  }
166
166
  } catch (reportError) {
167
- console.error('stream boundary error hook failed:', reportError);
167
+ console.error('stream boundary error hook failed:', reportError)
168
168
  }
169
169
  }
170
170
 
171
171
  function isThenable(value: unknown): value is PromiseLike<unknown> {
172
- return typeof (value as { then?: unknown } | null | undefined)?.then === 'function';
172
+ return typeof (value as { then?: unknown } | null | undefined)?.then === 'function'
173
173
  }
174
174
 
175
175
  // Metadata resolver - core handles static/build-time metadata. Compat registers request-time/streaming-
176
176
  // compatible metadata resolvers here without adding a core-to-compat import edge.
177
177
 
178
178
  export interface MetadataExtensions {
179
- enabled: (config: ResolvedConfig) => boolean;
180
- hasRuntimeMetadata: (module: Record<string, unknown>) => boolean;
179
+ enabled: (config: ResolvedConfig) => boolean
180
+ hasRuntimeMetadata: (module: Record<string, unknown>) => boolean
181
181
  readModuleMetadata: (
182
182
  module: Record<string, unknown>,
183
183
  props: PageProps,
184
184
  parent: Metadata,
185
185
  modulePath?: string,
186
- ) => Promise<Metadata | undefined>;
186
+ ) => Promise<Metadata | undefined>
187
187
  readModuleViewport: (
188
188
  module: Record<string, unknown>,
189
189
  props: PageProps,
190
- ) => Promise<Viewport | undefined>;
191
- shouldRenderMetadataInBody: (input: { config: ResolvedConfig; request?: Request }) => boolean;
190
+ ) => Promise<Viewport | undefined>
191
+ shouldRenderMetadataInBody: (input: { config: ResolvedConfig; request?: Request }) => boolean
192
192
  }
193
193
 
194
- const metadataExtensions: Partial<MetadataExtensions> = {};
194
+ const metadataExtensions: Partial<MetadataExtensions> = {}
195
195
 
196
196
  export function getMetadataExtensions(): Partial<MetadataExtensions> {
197
- return metadataExtensions;
197
+ return metadataExtensions
198
198
  }
199
199
 
200
200
  export function getActiveMetadataExtensions(config: ResolvedConfig): Partial<MetadataExtensions> {
201
- return metadataExtensions.enabled?.(config) ? metadataExtensions : {};
201
+ return metadataExtensions.enabled?.(config) ? metadataExtensions : {}
202
202
  }
203
203
 
204
204
  export function setMetadataExtensions(overrides: Partial<MetadataExtensions>): void {
205
- Object.assign(metadataExtensions, overrides);
205
+ Object.assign(metadataExtensions, overrides)
206
206
  }
207
207
 
208
208
  // ---------------------------------------------------------------------------
@@ -212,14 +212,14 @@ export function setMetadataExtensions(overrides: Partial<MetadataExtensions>): v
212
212
 
213
213
  export interface DocumentScriptExtensions {
214
214
  /** Optional precedence assigned to renderer-managed stylesheet links. */
215
- stylesheetPrecedence: (config: ResolvedConfig) => string | undefined;
215
+ stylesheetPrecedence: (config: ResolvedConfig) => string | undefined
216
216
 
217
217
  /**
218
218
  * Inline scripts compat injects near the end of the document body, before the
219
219
  * props/route/client scripts. Compat (react) returns Next's window.next router
220
220
  * shim. Default: '' (core injects no compat scripts).
221
221
  */
222
- documentBodyScripts: (config: ResolvedConfig) => string;
222
+ documentBodyScripts: (config: ResolvedConfig) => string
223
223
 
224
224
  /**
225
225
  * Inline tags compat injects into the document `<head>` once per document
@@ -229,23 +229,23 @@ export interface DocumentScriptExtensions {
229
229
  * (otel) composes clientTraceMetadata `<meta>` tags here. Default: '' (core
230
230
  * injects no compat head tags).
231
231
  */
232
- documentHeadTags?: (config: ResolvedConfig, ctx: { dynamic: boolean; rsc: boolean }) => string;
232
+ documentHeadTags?: (config: ResolvedConfig, ctx: { dynamic: boolean; rsc: boolean }) => string
233
233
 
234
234
  /** Tags collected after the document shell has flushed. */
235
- streamInsertedHTML?: () => string;
235
+ streamInsertedHTML?: () => string
236
236
  }
237
237
 
238
238
  const documentScriptExtensions: DocumentScriptExtensions = {
239
239
  stylesheetPrecedence: () => undefined,
240
240
  documentBodyScripts: () => '',
241
- };
241
+ }
242
242
 
243
243
  export function getDocumentScriptExtensions(): DocumentScriptExtensions {
244
- return documentScriptExtensions;
244
+ return documentScriptExtensions
245
245
  }
246
246
 
247
247
  export function setDocumentScriptExtensions(overrides: Partial<DocumentScriptExtensions>): void {
248
- Object.assign(documentScriptExtensions, overrides);
248
+ Object.assign(documentScriptExtensions, overrides)
249
249
  }
250
250
 
251
251
  // ---------------------------------------------------------------------------
@@ -254,7 +254,7 @@ export function setDocumentScriptExtensions(overrides: Partial<DocumentScriptExt
254
254
  // ---------------------------------------------------------------------------
255
255
 
256
256
  export interface StaticParamsExtensions {
257
- normalizeModule: (module: Record<string, unknown>) => Record<string, unknown>;
257
+ normalizeModule: (module: Record<string, unknown>) => Record<string, unknown>
258
258
  }
259
259
 
260
260
  const staticParamsExtensions: StaticParamsExtensions = {
@@ -262,14 +262,14 @@ const staticParamsExtensions: StaticParamsExtensions = {
262
262
  typeof module.params === 'function' || typeof module.generateStaticParams !== 'function'
263
263
  ? module
264
264
  : { ...module, params: module.generateStaticParams },
265
- };
265
+ }
266
266
 
267
267
  export function getStaticParamsExtensions(): StaticParamsExtensions {
268
- return staticParamsExtensions;
268
+ return staticParamsExtensions
269
269
  }
270
270
 
271
271
  export function setStaticParamsExtensions(overrides: Partial<StaticParamsExtensions>): void {
272
- Object.assign(staticParamsExtensions, overrides);
272
+ Object.assign(staticParamsExtensions, overrides)
273
273
  }
274
274
 
275
275
  // Server-action module tagging - when a server render imports a 'use server' module, compat tags each
@@ -287,7 +287,7 @@ export interface ActionModuleExtensions {
287
287
  tagActionModulesForRender: (
288
288
  config: ResolvedConfig,
289
289
  importModule: (file: string) => Promise<Record<string, unknown>>,
290
- ) => Promise<void>;
290
+ ) => Promise<void>
291
291
 
292
292
  /**
293
293
  * Tag the exports of a freshly imported module when it is a discovered action
@@ -298,20 +298,20 @@ export interface ActionModuleExtensions {
298
298
  config: ResolvedConfig,
299
299
  file: string,
300
300
  module: Record<string, unknown>,
301
- ) => void;
301
+ ) => void
302
302
  }
303
303
 
304
304
  const actionModuleExtensions: ActionModuleExtensions = {
305
305
  tagActionModulesForRender: () => Promise.resolve(),
306
306
  tagActionModuleExports: () => undefined,
307
- };
307
+ }
308
308
 
309
309
  export function getActionModuleExtensions(): ActionModuleExtensions {
310
- return actionModuleExtensions;
310
+ return actionModuleExtensions
311
311
  }
312
312
 
313
313
  export function setActionModuleExtensions(overrides: Partial<ActionModuleExtensions>): void {
314
- Object.assign(actionModuleExtensions, overrides);
314
+ Object.assign(actionModuleExtensions, overrides)
315
315
  }
316
316
 
317
317
  // Render span seam - compat (otel) wraps the render-body and route-resolution phases in OpenTelemetry
@@ -325,14 +325,14 @@ export interface RenderSpanExtensions {
325
325
  * `render route (app) <route>` span (`AppRender.getBodyResult`). `route` is
326
326
  * the route PATTERN. Default: run `fn` untouched.
327
327
  */
328
- withRenderBodySpan: <T>(route: string, fn: () => Promise<T>) => Promise<T>;
328
+ withRenderBodySpan: <T>(route: string, fn: () => Promise<T>) => Promise<T>
329
329
 
330
330
  /**
331
331
  * Wrap route-component resolution (page module import) so compat emits the
332
332
  * `resolve page components` span (`NextNodeServer.findPageComponents`,
333
333
  * sibling of the render-body span under the root). Default: run `fn`.
334
334
  */
335
- withFindPageComponentsSpan: <T>(route: string, fn: () => Promise<T>) => Promise<T>;
335
+ withFindPageComponentsSpan: <T>(route: string, fn: () => Promise<T>) => Promise<T>
336
336
 
337
337
  /**
338
338
  * Emit a cheap leaf `resolve segment modules` span
@@ -341,14 +341,14 @@ export interface RenderSpanExtensions {
341
341
  * `__PAGE__` for the leaf page or the dynamic/literal dir label for a layout.
342
342
  * Default: noop.
343
343
  */
344
- emitResolveSegmentSpan: (segment: string) => void;
344
+ emitResolveSegmentSpan: (segment: string) => void
345
345
 
346
346
  /**
347
347
  * Wrap a route-handler invocation so compat emits the
348
348
  * `executing api route (app) <route>` span (`AppRouteRouteHandlers.
349
349
  * runHandler`). `route` is the core route PATTERN. Default: run `fn`.
350
350
  */
351
- withRouteHandlerSpan: <T>(route: string, fn: () => Promise<T>) => Promise<T>;
351
+ withRouteHandlerSpan: <T>(route: string, fn: () => Promise<T>) => Promise<T>
352
352
  }
353
353
 
354
354
  const renderSpanExtensions: RenderSpanExtensions = {
@@ -356,14 +356,14 @@ const renderSpanExtensions: RenderSpanExtensions = {
356
356
  withFindPageComponentsSpan: (_route, fn) => fn(),
357
357
  emitResolveSegmentSpan: () => undefined,
358
358
  withRouteHandlerSpan: (_route, fn) => fn(),
359
- };
359
+ }
360
360
 
361
361
  export function getRenderSpanExtensions(): RenderSpanExtensions {
362
- return renderSpanExtensions;
362
+ return renderSpanExtensions
363
363
  }
364
364
 
365
365
  export function setRenderSpanExtensions(overrides: Partial<RenderSpanExtensions>): void {
366
- Object.assign(renderSpanExtensions, overrides);
366
+ Object.assign(renderSpanExtensions, overrides)
367
367
  }
368
368
 
369
369
  // Compat populates every registry above at the bootstrap seam, exactly as it
@@ -380,5 +380,5 @@ for (const registry of [
380
380
  actionModuleExtensions,
381
381
  renderSpanExtensions,
382
382
  ]) {
383
- restoreWithExtensionHost(registry);
383
+ restoreWithExtensionHost(registry)
384
384
  }
@@ -1,15 +1,15 @@
1
- import { createContext, type Context } from 'preact';
1
+ import { createContext, type Context } from 'preact'
2
2
 
3
3
  // Island SSR runs prebundled client chunks — a separate module graph with its own copy of this file, so
4
4
  // a plain createContext() would mint two identity-mismatched contexts. Resolve one shared instance.
5
5
  function sharedContext<T>(key: string, defaultValue: T): Context<T> {
6
- const registry = globalThis as typeof globalThis & Record<symbol, Context<unknown>>;
7
- const symbol = Symbol.for(key);
8
- const existing = registry[symbol];
9
- if (existing) return existing as Context<T>;
10
- const context = createContext<T>(defaultValue);
11
- registry[symbol] = context as Context<unknown>;
12
- return context;
6
+ const registry = globalThis as typeof globalThis & Record<symbol, Context<unknown>>
7
+ const symbol = Symbol.for(key)
8
+ const existing = registry[symbol]
9
+ if (existing) return existing as Context<T>
10
+ const context = createContext<T>(defaultValue)
11
+ registry[symbol] = context as Context<unknown>
12
+ return context
13
13
  }
14
14
 
15
15
  // ---------------------------------------------------------------------------
@@ -33,17 +33,17 @@ function sharedContext<T>(key: string, defaultValue: T): Context<T> {
33
33
 
34
34
  export interface LayoutSegmentSnapshot {
35
35
  /** Segments consumed AT or ABOVE the owning layout's directory. */
36
- depth: number;
36
+ depth: number
37
37
  /** Resolved URL segments below the owning layout (server-side truth). */
38
- segments: string[];
38
+ segments: string[]
39
39
  /** Resolved segments per parallel-route slot key (server-side truth). */
40
- slots: Record<string, string[]>;
40
+ slots: Record<string, string[]>
41
41
  }
42
42
 
43
43
  export const LayoutSegmentContext = sharedContext<LayoutSegmentSnapshot | null>(
44
44
  'pnext.layoutSegmentContext',
45
45
  null,
46
- );
46
+ )
47
47
 
48
48
  // Per-island params snapshot (CORE seam for compat useParams).
49
49
  //
@@ -57,9 +57,9 @@ export const LayoutSegmentContext = sharedContext<LayoutSegmentSnapshot | null>(
57
57
  // Kept in core (imports only `preact`) so both the renderer's SSR wrap and the entry's client mount
58
58
  // reference the SAME context object, exactly like LayoutSegmentContext above.
59
59
 
60
- export type RouteParamsSnapshot = Record<string, string | string[]>;
60
+ export type RouteParamsSnapshot = Record<string, string | string[]>
61
61
 
62
62
  export const RouteParamsContext = sharedContext<RouteParamsSnapshot | null>(
63
63
  'pnext.routeParamsContext',
64
64
  null,
65
- );
65
+ )