@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,28 +1,28 @@
1
- import { options, type ComponentType, type VNode } from 'preact';
2
- import { wrapComponentForPrimitiveThrows } from '../client/errors/primitive-throw';
1
+ import { options, type ComponentType, type VNode } from 'preact'
2
+ import { wrapComponentForPrimitiveThrows } from '../client/errors/primitive-throw'
3
3
 
4
- const reactForwardRefSymbol = Symbol.for('react.forward_ref');
5
- const react19RefCompatInstalled = Symbol.for('pnext.react19-ref-compat-installed');
6
- const reactTextSeparatorSymbol = Symbol.for('pnext.react-text-separator');
4
+ const reactForwardRefSymbol = Symbol.for('react.forward_ref')
5
+ const react19RefCompatInstalled = Symbol.for('pnext.react19-ref-compat-installed')
6
+ const reactTextSeparatorSymbol = Symbol.for('pnext.react-text-separator')
7
7
 
8
8
  type PNextPreactOptions = typeof options & {
9
- [react19RefCompatInstalled]?: true;
10
- };
9
+ [react19RefCompatInstalled]?: true
10
+ }
11
11
 
12
12
  type RefCompatibleComponent = ComponentType<Record<string, unknown>> & {
13
- $$typeof?: symbol;
14
- prototype?: { render?: unknown };
15
- };
13
+ $$typeof?: symbol
14
+ prototype?: { render?: unknown }
15
+ }
16
16
 
17
17
  // preact's `options.vnode` is process-global and cannot be uninstalled, so its BEHAVIOR follows the
18
18
  // active extension host instead: one server process can serve a compat app and then a pure-core one, and
19
19
  // the core app must not inherit React parity it never asked for. Defaults to on - importing this module
20
20
  // IS compat being wired, and the client never resets.
21
- let reactCompatActive = true;
21
+ let reactCompatActive = true
22
22
 
23
23
  /** Enable/disable the react-compat vnode parity pass (see reactCompatActive). */
24
24
  export function setReactCompatActive(active: boolean): void {
25
- reactCompatActive = active;
25
+ reactCompatActive = active
26
26
  }
27
27
 
28
28
  // Suspense-dependent parity (thenable children, async client components) needs preact/compat, which a
@@ -30,29 +30,29 @@ export function setReactCompatActive(active: boolean): void {
30
30
  // the slot empty and its bundle drops preact/compat entirely. Two phases: async-component wrapping must
31
31
  // see the raw component (before primitive-throw wraps it); thenable children run after.
32
32
  interface SuspenseParity {
33
- beforeThrowSafety(vnode: VNode): void;
34
- afterThrowSafety(vnode: VNode): void;
33
+ beforeThrowSafety(vnode: VNode): void
34
+ afterThrowSafety(vnode: VNode): void
35
35
  }
36
36
 
37
- let suspenseParity: SuspenseParity | undefined;
37
+ let suspenseParity: SuspenseParity | undefined
38
38
 
39
39
  export function setSuspenseParity(pass: SuspenseParity): void {
40
- suspenseParity = pass;
40
+ suspenseParity = pass
41
41
  }
42
42
 
43
- const pnextOptions = options as PNextPreactOptions;
43
+ const pnextOptions = options as PNextPreactOptions
44
44
  if (!pnextOptions[react19RefCompatInstalled]) {
45
- const previousVNode = options.vnode?.bind(options);
45
+ const previousVNode = options.vnode?.bind(options)
46
46
  options.vnode = vnode => {
47
- previousVNode?.(vnode);
48
- if (!reactCompatActive) return;
49
- applyReact19RefProp(vnode);
50
- suspenseParity?.beforeThrowSafety(vnode);
51
- applyPrimitiveThrowSafety(vnode);
52
- suspenseParity?.afterThrowSafety(vnode);
53
- applyReactTextSeparators(vnode);
54
- };
55
- pnextOptions[react19RefCompatInstalled] = true;
47
+ previousVNode?.(vnode)
48
+ if (!reactCompatActive) return
49
+ applyReact19RefProp(vnode)
50
+ suspenseParity?.beforeThrowSafety(vnode)
51
+ applyPrimitiveThrowSafety(vnode)
52
+ suspenseParity?.afterThrowSafety(vnode)
53
+ applyReactTextSeparators(vnode)
54
+ }
55
+ pnextOptions[react19RefCompatInstalled] = true
56
56
 
57
57
  // Effect scheduling parity with React: preact/hooks flushes passive effects
58
58
  // via requestAnimationFrame + setTimeout(35) (afterNextFrame), both governed
@@ -64,16 +64,16 @@ if (!pnextOptions[react19RefCompatInstalled]) {
64
64
  // Route the flush through a MessageChannel task so effect timing is
65
65
  // clock-independent, like React's.
66
66
  if ((process.browser || typeof window !== 'undefined') && typeof MessageChannel !== 'undefined') {
67
- const queue: (() => void)[] = [];
68
- const channel = new MessageChannel();
67
+ const queue: (() => void)[] = []
68
+ const channel = new MessageChannel()
69
69
  channel.port1.onmessage = () => {
70
- for (const callback of queue.splice(0)) callback();
71
- };
72
- (options as { requestAnimationFrame?: (cb: () => void) => void }).requestAnimationFrame =
70
+ for (const callback of queue.splice(0)) callback()
71
+ }
72
+ ;(options as { requestAnimationFrame?: (cb: () => void) => void }).requestAnimationFrame =
73
73
  callback => {
74
- queue.push(callback);
75
- channel.port2.postMessage(null);
76
- };
74
+ queue.push(callback)
75
+ channel.port2.postMessage(null)
76
+ }
77
77
  }
78
78
  }
79
79
 
@@ -81,31 +81,31 @@ function applyReactTextSeparators(vnode: VNode) {
81
81
  // Server-only. `process.browser` is a client-bundle define (true) and
82
82
  // undefined on the server, so this body folds out of browser builds; the
83
83
  // `typeof window` twin keeps the runtime check for unbundled consumers.
84
- if (process.browser || typeof window !== 'undefined') return;
85
- const props = vnode.props as Record<string, unknown>;
86
- const children = props.children;
87
- if (!Array.isArray(children) || children.length < 2) return;
88
- const values = children as unknown[];
89
-
90
- const separated: unknown[] = [];
91
- let changed = false;
84
+ if (process.browser || typeof window !== 'undefined') return
85
+ const props = vnode.props as Record<string, unknown>
86
+ const children = props.children
87
+ if (!Array.isArray(children) || children.length < 2) return
88
+ const values = children as unknown[]
89
+
90
+ const separated: unknown[] = []
91
+ let changed = false
92
92
  for (let index = 0; index < values.length; index += 1) {
93
- const child = values[index];
94
- separated.push(child);
95
- if (!mayRenderText(child) || !mayRenderText(values[index + 1])) continue;
93
+ const child = values[index]
94
+ separated.push(child)
95
+ if (!mayRenderText(child) || !mayRenderText(values[index + 1])) continue
96
96
  separated.push({
97
97
  type: reactTextSeparatorSymbol,
98
98
  props: { UNSTABLE_comment: ' ' },
99
- });
100
- changed = true;
99
+ })
100
+ changed = true
101
101
  }
102
- if (changed) props.children = separated;
102
+ if (changed) props.children = separated
103
103
  }
104
104
 
105
105
  function mayRenderText(value: unknown) {
106
- if (typeof value === 'string' || typeof value === 'number') return true;
107
- if (!value || typeof value !== 'object' || !('type' in value)) return false;
108
- return typeof (value as VNode).type !== 'string';
106
+ if (typeof value === 'string' || typeof value === 'number') return true
107
+ if (!value || typeof value !== 'object' || !('type' in value)) return false
108
+ return typeof (value as VNode).type !== 'string'
109
109
  }
110
110
 
111
111
  function applyPrimitiveThrowSafety(vnode: VNode) {
@@ -113,16 +113,19 @@ function applyPrimitiveThrowSafety(vnode: VNode) {
113
113
  // suspense check during real preact diffing. The server's resolveServerTree is a custom RSC-style tree
114
114
  // walker, not preact's diff - it never hits that crash, and wrapping component references there risks
115
115
  // losing the symbol-keyed metadata resolveServerTree branches on.
116
- if (!process.browser && typeof window === 'undefined') return;
117
- if (typeof vnode.type !== 'function') return;
118
- vnode.type = wrapComponentForPrimitiveThrows(vnode.type);
116
+ if (!process.browser && typeof window === 'undefined') return
117
+ if (typeof vnode.type !== 'function') return
118
+ vnode.type = wrapComponentForPrimitiveThrows(vnode.type)
119
119
  }
120
120
 
121
121
  function applyReact19RefProp(vnode: VNode) {
122
- if (!vnode.ref || typeof vnode.type !== 'function') return;
123
- const component = vnode.type as RefCompatibleComponent;
124
- if (component.prototype?.render || component.$$typeof === reactForwardRefSymbol) return;
125
-
126
- vnode.props = { ...(vnode.props as Record<string, unknown>), ref: vnode.ref } as unknown as typeof vnode.props;
127
- vnode.ref = null;
122
+ if (!vnode.ref || typeof vnode.type !== 'function') return
123
+ const component = vnode.type as RefCompatibleComponent
124
+ if (component.prototype?.render || component.$$typeof === reactForwardRefSymbol) return
125
+
126
+ vnode.props = {
127
+ ...(vnode.props as Record<string, unknown>),
128
+ ref: vnode.ref,
129
+ } as unknown as typeof vnode.props
130
+ vnode.ref = null
128
131
  }
@@ -1,9 +1,9 @@
1
- import ReactCompat from 'preact/compat';
2
- import { type ComponentChildren, type ComponentType, type VNode } from 'preact';
3
- import { setSuspenseParity } from './parity';
4
- import { use } from './use';
5
- import { useActionState } from './action-state';
6
- import { useOptimistic, useTransition } from './hooks-extra';
1
+ import ReactCompat from 'preact/compat'
2
+ import { type ComponentChildren, type ComponentType, type VNode } from 'preact'
3
+ import { setSuspenseParity } from './parity'
4
+ import { use } from './use'
5
+ import { useActionState } from './action-state'
6
+ import { useOptimistic, useTransition } from './hooks-extra'
7
7
 
8
8
  // Full react shim: preact/compat plus the React 19 surface. The vnode parity pass lives in ./parity
9
9
  // (compat-free, shared with the lite client shim); the suspense-dependent parity below registers into
@@ -12,22 +12,22 @@ import { useOptimistic, useTransition } from './hooks-extra';
12
12
  setSuspenseParity({
13
13
  beforeThrowSafety: applyAsyncClientComponent,
14
14
  afterThrowSafety: applyThenableChildren,
15
- });
15
+ })
16
16
 
17
- export { setReactCompatActive } from './parity';
18
- export { use, withUseThenableState, type UseThenableState } from './use';
17
+ export { setReactCompatActive } from './parity'
18
+ export { use, withUseThenableState, type UseThenableState } from './use'
19
19
  export {
20
20
  useActionState,
21
21
  consumeActionStateOverride,
22
22
  type FormStateDispatchMeta,
23
- } from './action-state';
24
- export { useOptimistic, useTransition } from './hooks-extra';
23
+ } from './action-state'
24
+ export { useOptimistic, useTransition } from './hooks-extra'
25
25
 
26
26
  function applyThenableChildren(vnode: VNode) {
27
- const props = vnode.props as Record<string, unknown>;
28
- const children = props.children;
29
- const resolved = thenableChildren(children);
30
- if (resolved !== children) props.children = resolved;
27
+ const props = vnode.props as Record<string, unknown>
28
+ const children = props.children
29
+ const resolved = thenableChildren(children)
30
+ if (resolved !== children) props.children = resolved
31
31
  }
32
32
 
33
33
  function thenableChildren(value: unknown): unknown {
@@ -38,98 +38,97 @@ function thenableChildren(value: unknown): unknown {
38
38
  ReactCompat.createElement(ThenableChild, {
39
39
  value: value as PromiseLike<ComponentChildren>,
40
40
  }),
41
- );
41
+ )
42
42
  }
43
- if (!Array.isArray(value)) return value;
44
- let changed = false;
43
+ if (!Array.isArray(value)) return value
44
+ let changed = false
45
45
  const children = value.map(child => {
46
- const resolved = thenableChildren(child);
47
- if (resolved !== child) changed = true;
48
- return resolved;
49
- });
50
- return changed ? children : value;
46
+ const resolved = thenableChildren(child)
47
+ if (resolved !== child) changed = true
48
+ return resolved
49
+ })
50
+ return changed ? children : value
51
51
  }
52
52
 
53
53
  function ThenableChild({ value }: { value: PromiseLike<ComponentChildren> }) {
54
- return use(value);
54
+ return use(value)
55
55
  }
56
56
 
57
57
  const asyncClientComponents = new WeakMap<
58
58
  ComponentType<Record<string, unknown>>,
59
59
  ComponentType<Record<string, unknown>>
60
- >();
60
+ >()
61
61
 
62
62
  function applyAsyncClientComponent(vnode: VNode) {
63
- if ((!process.browser && typeof window === 'undefined') || typeof vnode.type !== 'function') return;
64
- const component = vnode.type as ComponentType<Record<string, unknown>>;
65
- if (component.constructor.name !== 'AsyncFunction') return;
66
- const renderComponent = component as (props: Record<string, unknown>) => ComponentChildren;
67
- let wrapper = asyncClientComponents.get(component);
63
+ if ((!process.browser && typeof window === 'undefined') || typeof vnode.type !== 'function')
64
+ return
65
+ const component = vnode.type as ComponentType<Record<string, unknown>>
66
+ if (component.constructor.name !== 'AsyncFunction') return
67
+ const renderComponent = component as (props: Record<string, unknown>) => ComponentChildren
68
+ let wrapper = asyncClientComponents.get(component)
68
69
  if (!wrapper) {
69
70
  wrapper = props => {
70
- const [result] = ReactCompat.useState(() =>
71
- Promise.resolve(renderComponent(props)),
72
- );
71
+ const [result] = ReactCompat.useState(() => Promise.resolve(renderComponent(props)))
73
72
  return ReactCompat.createElement(
74
73
  ReactCompat.Suspense,
75
74
  { fallback: null },
76
75
  ReactCompat.createElement(ThenableChild, { value: result }),
77
- );
78
- };
79
- asyncClientComponents.set(component, wrapper);
76
+ )
77
+ }
78
+ asyncClientComponents.set(component, wrapper)
80
79
  }
81
- vnode.type = wrapper;
80
+ vnode.type = wrapper
82
81
  }
83
82
 
84
83
  // React 19 APIs preact/compat lacks - use(), useActionState, useOptimistic (imported above) - must ALSO
85
84
  // live on the default export: app code does `import React from 'react'; React.use(...)`, not only named
86
85
  // imports. server.ts spreads this default into ReactServer, so the augmentation covers both layers.
87
- export default Object.assign(ReactCompat, { use, useActionState, useOptimistic, useTransition });
86
+ export default Object.assign(ReactCompat, { use, useActionState, useOptimistic, useTransition })
88
87
 
89
- export const Children = ReactCompat.Children;
90
- export const Component = ReactCompat.Component;
91
- export const Fragment = ReactCompat.Fragment;
92
- export const PureComponent = ReactCompat.PureComponent;
93
- export const StrictMode = ReactCompat.StrictMode;
94
- export const Suspense = ReactCompat.Suspense;
95
- export const SuspenseList = ReactCompat.SuspenseList;
96
- export const cloneElement = ReactCompat.cloneElement;
97
- export const createContext = ReactCompat.createContext;
98
- export const createElement = ReactCompat.createElement;
99
- export const createFactory = ReactCompat.createFactory;
100
- export const createPortal = ReactCompat.createPortal;
101
- export const createRef = ReactCompat.createRef;
102
- export const findDOMNode = ReactCompat.findDOMNode;
103
- export const flushSync = ReactCompat.flushSync;
104
- export const forwardRef = ReactCompat.forwardRef;
105
- export const hydrate = ReactCompat.hydrate;
106
- export const isFragment = ReactCompat.isFragment;
107
- export const isMemo = ReactCompat.isMemo;
108
- export const isValidElement = ReactCompat.isValidElement;
88
+ export const Children = ReactCompat.Children
89
+ export const Component = ReactCompat.Component
90
+ export const Fragment = ReactCompat.Fragment
91
+ export const PureComponent = ReactCompat.PureComponent
92
+ export const StrictMode = ReactCompat.StrictMode
93
+ export const Suspense = ReactCompat.Suspense
94
+ export const SuspenseList = ReactCompat.SuspenseList
95
+ export const cloneElement = ReactCompat.cloneElement
96
+ export const createContext = ReactCompat.createContext
97
+ export const createElement = ReactCompat.createElement
98
+ export const createFactory = ReactCompat.createFactory
99
+ export const createPortal = ReactCompat.createPortal
100
+ export const createRef = ReactCompat.createRef
101
+ export const findDOMNode = ReactCompat.findDOMNode
102
+ export const flushSync = ReactCompat.flushSync
103
+ export const forwardRef = ReactCompat.forwardRef
104
+ export const hydrate = ReactCompat.hydrate
105
+ export const isFragment = ReactCompat.isFragment
106
+ export const isMemo = ReactCompat.isMemo
107
+ export const isValidElement = ReactCompat.isValidElement
109
108
  // preact's lazy returns a bare function with no react.lazy $$typeof; tag it so
110
109
  // validation (e.g. <Link legacyBehavior>) can recognize lazy components.
111
110
  export const lazy: typeof ReactCompat.lazy = loader => {
112
- const component = ReactCompat.lazy(loader);
113
- (component as unknown as Record<symbol, boolean>)[Symbol.for('pnext.lazy')] = true;
114
- return component;
115
- };
116
- export const memo = ReactCompat.memo;
117
- export const render = ReactCompat.render;
118
- export const startTransition = ReactCompat.startTransition;
119
- export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode;
120
- export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates;
121
- export const useCallback = ReactCompat.useCallback;
122
- export const useContext = ReactCompat.useContext;
123
- export const useDebugValue = ReactCompat.useDebugValue;
124
- export const useDeferredValue = ReactCompat.useDeferredValue;
125
- export const useEffect = ReactCompat.useEffect;
126
- export const useId = ReactCompat.useId;
127
- export const useImperativeHandle = ReactCompat.useImperativeHandle;
128
- export const useInsertionEffect = ReactCompat.useInsertionEffect;
129
- export const useLayoutEffect = ReactCompat.useLayoutEffect;
130
- export const useMemo = ReactCompat.useMemo;
131
- export const useReducer = ReactCompat.useReducer;
132
- export const useRef = ReactCompat.useRef;
133
- export const useState = ReactCompat.useState;
134
- export const useSyncExternalStore = ReactCompat.useSyncExternalStore;
135
- export const version = ReactCompat.version;
111
+ const component = ReactCompat.lazy(loader)
112
+ ;(component as unknown as Record<symbol, boolean>)[Symbol.for('pnext.lazy')] = true
113
+ return component
114
+ }
115
+ export const memo = ReactCompat.memo
116
+ export const render = ReactCompat.render
117
+ export const startTransition = ReactCompat.startTransition
118
+ export const unmountComponentAtNode = ReactCompat.unmountComponentAtNode
119
+ export const unstable_batchedUpdates = ReactCompat.unstable_batchedUpdates
120
+ export const useCallback = ReactCompat.useCallback
121
+ export const useContext = ReactCompat.useContext
122
+ export const useDebugValue = ReactCompat.useDebugValue
123
+ export const useDeferredValue = ReactCompat.useDeferredValue
124
+ export const useEffect = ReactCompat.useEffect
125
+ export const useId = ReactCompat.useId
126
+ export const useImperativeHandle = ReactCompat.useImperativeHandle
127
+ export const useInsertionEffect = ReactCompat.useInsertionEffect
128
+ export const useLayoutEffect = ReactCompat.useLayoutEffect
129
+ export const useMemo = ReactCompat.useMemo
130
+ export const useReducer = ReactCompat.useReducer
131
+ export const useRef = ReactCompat.useRef
132
+ export const useState = ReactCompat.useState
133
+ export const useSyncExternalStore = ReactCompat.useSyncExternalStore
134
+ export const version = ReactCompat.version
@@ -41,44 +41,44 @@ export {
41
41
  useActionState,
42
42
  useOptimistic,
43
43
  version,
44
- } from './preact';
45
- export { cache } from '../../api/cache';
44
+ } from './preact'
45
+ export { cache } from '../../api/cache'
46
46
 
47
- import { ViewTransition, addTransitionType } from './view-transition';
48
- export { ViewTransition, addTransitionType };
47
+ import { ViewTransition, addTransitionType } from './view-transition'
48
+ export { ViewTransition, addTransitionType }
49
49
 
50
- import { currentPrerenderScope } from '../../ppr';
51
- import { currentCacheSignal } from '../../cache/context';
50
+ import { currentPrerenderScope } from '../../render/ppr'
51
+ import { currentCacheSignal } from '../../request/cache'
52
52
 
53
53
  // React.cacheSignal(): the AbortSignal for the current render. During a build
54
54
  // prerender it is the prerender scope's signal; during a request/dynamic render
55
55
  // it is the cache scope's. Null outside any render. Slow cache components bound
56
56
  // their polling on it (see cache-components ppr-partial-hydration).
57
57
  export function cacheSignal(): AbortSignal | null {
58
- const prerender = currentPrerenderScope();
59
- if (prerender) return prerender.signal;
60
- return currentCacheSignal();
58
+ const prerender = currentPrerenderScope()
59
+ if (prerender) return prerender.signal
60
+ return currentCacheSignal()
61
61
  }
62
62
 
63
- import ReactCompat from './preact';
64
- import { cache as serverCache } from '../../api/cache';
63
+ import ReactCompat from './preact'
64
+ import { cache as serverCache } from '../../api/cache'
65
65
 
66
66
  const ReactServer = { ...ReactCompat } as typeof ReactCompat & {
67
- cache: typeof serverCache;
68
- cacheSignal: typeof cacheSignal;
69
- };
70
- delete (ReactServer as { useState?: unknown }).useState;
71
- delete (ReactServer as { useEffect?: unknown }).useEffect;
72
- delete (ReactServer as { useLayoutEffect?: unknown }).useLayoutEffect;
73
- delete (ReactServer as { useInsertionEffect?: unknown }).useInsertionEffect;
74
- delete (ReactServer as { useImperativeHandle?: unknown }).useImperativeHandle;
75
- delete (ReactServer as { useReducer?: unknown }).useReducer;
76
- delete (ReactServer as { useRef?: unknown }).useRef;
77
- delete (ReactServer as { useDeferredValue?: unknown }).useDeferredValue;
78
- delete (ReactServer as { useTransition?: unknown }).useTransition;
79
- delete (ReactServer as { useSyncExternalStore?: unknown }).useSyncExternalStore;
80
- ReactServer.cache = serverCache;
81
- ReactServer.cacheSignal = cacheSignal;
82
- Object.assign(ReactServer, { ViewTransition, addTransitionType });
67
+ cache: typeof serverCache
68
+ cacheSignal: typeof cacheSignal
69
+ }
70
+ delete (ReactServer as { useState?: unknown }).useState
71
+ delete (ReactServer as { useEffect?: unknown }).useEffect
72
+ delete (ReactServer as { useLayoutEffect?: unknown }).useLayoutEffect
73
+ delete (ReactServer as { useInsertionEffect?: unknown }).useInsertionEffect
74
+ delete (ReactServer as { useImperativeHandle?: unknown }).useImperativeHandle
75
+ delete (ReactServer as { useReducer?: unknown }).useReducer
76
+ delete (ReactServer as { useRef?: unknown }).useRef
77
+ delete (ReactServer as { useDeferredValue?: unknown }).useDeferredValue
78
+ delete (ReactServer as { useTransition?: unknown }).useTransition
79
+ delete (ReactServer as { useSyncExternalStore?: unknown }).useSyncExternalStore
80
+ ReactServer.cache = serverCache
81
+ ReactServer.cacheSignal = cacheSignal
82
+ Object.assign(ReactServer, { ViewTransition, addTransitionType })
83
83
 
84
- export default ReactServer;
84
+ export default ReactServer
@@ -22,5 +22,5 @@ export function nextRouterShimScript(): string {
22
22
  'r.replace=r.replace||function(href){location.replace(String(href));return Promise.resolve(true)};' +
23
23
  'r.prefetch=r.prefetch||function(){return Promise.resolve(null)};' +
24
24
  '})();</script>'
25
- );
25
+ )
26
26
  }
@@ -15,14 +15,14 @@
15
15
  // Registered onto renderExtensions.wrapServerComponentInvoke; a pure-core app keeps the pass-through
16
16
  // default and never loads this module.
17
17
 
18
- import { withUseThenableState, type UseThenableState } from './preact';
18
+ import { withUseThenableState, type UseThenableState } from './preact'
19
19
 
20
20
  function isThenable(value: unknown): value is PromiseLike<unknown> {
21
21
  return (
22
22
  value != null &&
23
23
  (typeof value === 'object' || typeof value === 'function') &&
24
24
  typeof (value as PromiseLike<unknown>).then === 'function'
25
- );
25
+ )
26
26
  }
27
27
 
28
28
  /**
@@ -31,18 +31,18 @@ function isThenable(value: unknown): value is PromiseLike<unknown> {
31
31
  * thenable state; async components (and plain returns) pass through.
32
32
  */
33
33
  export function invokeServerComponentWithUse<T>(invoke: () => T): T {
34
- const state: UseThenableState = { thenables: [] };
34
+ const state: UseThenableState = { thenables: [] }
35
35
 
36
36
  const attempt = (): T => {
37
37
  try {
38
- return withUseThenableState(state, invoke);
38
+ return withUseThenableState(state, invoke)
39
39
  } catch (error) {
40
40
  // A pending use() thenable suspends the component: await it, then replay
41
41
  // with the same state so the settled thenable resolves in place.
42
- if (isThenable(error)) return Promise.resolve(error).then(attempt, attempt) as T;
43
- throw error;
42
+ if (isThenable(error)) return Promise.resolve(error).then(attempt, attempt) as T
43
+ throw error
44
44
  }
45
- };
45
+ }
46
46
 
47
- return attempt();
47
+ return attempt()
48
48
  }
@@ -13,46 +13,45 @@
13
13
  // renderServerInsertedHTML() renders each callback's vnode to a string and concatenates it. CSS-in-JS
14
14
  // registries clear their emitted rules per call.
15
15
 
16
- import { h, Fragment } from 'preact';
17
- import type { ComponentChildren, VNode } from 'preact';
18
- import renderToString from 'preact-render-to-string';
16
+ import { h, Fragment } from 'preact'
17
+ import type { ComponentChildren, VNode } from 'preact'
18
+ import renderToString from 'preact-render-to-string'
19
19
 
20
- type InsertCallback = () => ComponentChildren;
20
+ type InsertCallback = () => ComponentChildren
21
21
 
22
22
  interface Holder {
23
- __PNEXT_SERVER_INSERTED_HTML__?: InsertCallback[];
23
+ __PNEXT_SERVER_INSERTED_HTML__?: InsertCallback[]
24
24
  }
25
25
 
26
- const collectorKey = Symbol.for('pnext.serverInsertedHTML');
27
- type RequestScopeGetter = () => Record<PropertyKey, unknown> | undefined;
26
+ const collectorKey = Symbol.for('pnext.serverInsertedHTML')
27
+ type RequestScopeGetter = () => Record<PropertyKey, unknown> | undefined
28
28
  // globalThis-anchored: the prebundled server entry inlines its own copy of this module.
29
- const SCOPE_GETTER_KEY = Symbol.for('pnext.serverInsertedHTMLScope');
29
+ const SCOPE_GETTER_KEY = Symbol.for('pnext.serverInsertedHTMLScope')
30
30
 
31
31
  export function setServerInsertedHTMLScope(getter: RequestScopeGetter): void {
32
- (globalThis as Record<PropertyKey, unknown>)[SCOPE_GETTER_KEY] = getter;
32
+ ;(globalThis as Record<PropertyKey, unknown>)[SCOPE_GETTER_KEY] = getter
33
33
  }
34
34
 
35
35
  function requestScope(): Record<PropertyKey, unknown> | undefined {
36
36
  const getter = (globalThis as Record<PropertyKey, unknown>)[SCOPE_GETTER_KEY] as
37
- | RequestScopeGetter
38
- | undefined;
39
- return getter?.();
37
+ RequestScopeGetter | undefined
38
+ return getter?.()
40
39
  }
41
40
 
42
41
  function collector(): { callbacks: InsertCallback[]; scoped: boolean } {
43
- const scope = requestScope();
42
+ const scope = requestScope()
44
43
  if (scope) {
45
44
  return {
46
45
  callbacks: (scope[collectorKey] ??= []) as InsertCallback[],
47
46
  scoped: true,
48
- };
47
+ }
49
48
  }
50
- const holder = globalThis as Holder;
51
- holder.__PNEXT_SERVER_INSERTED_HTML__ ??= [];
52
- return { callbacks: holder.__PNEXT_SERVER_INSERTED_HTML__, scoped: false };
49
+ const holder = globalThis as Holder
50
+ holder.__PNEXT_SERVER_INSERTED_HTML__ ??= []
51
+ return { callbacks: holder.__PNEXT_SERVER_INSERTED_HTML__, scoped: false }
53
52
  }
54
53
 
55
- const isServer = typeof document === 'undefined';
54
+ const isServer = typeof document === 'undefined'
56
55
 
57
56
  /**
58
57
  * Register HTML to be inserted into the server-rendered document. The callback returns JSX (typically
@@ -60,8 +59,8 @@ const isServer = typeof document === 'undefined';
60
59
  * already carries the styles and the CSS-in-JS runtime rehydrates them itself.
61
60
  */
62
61
  export function useServerInsertedHTML(callback: InsertCallback): void {
63
- if (!isServer) return;
64
- collector().callbacks.push(callback);
62
+ if (!isServer) return
63
+ collector().callbacks.push(callback)
65
64
  }
66
65
 
67
66
  /**
@@ -69,26 +68,26 @@ export function useServerInsertedHTML(callback: InsertCallback): void {
69
68
  * for later stream flushes; the non-request fallback is cleared after one use.
70
69
  */
71
70
  export function renderServerInsertedHTML(): string {
72
- const { callbacks, scoped } = collector();
73
- if (!scoped) (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = [];
74
- if (callbacks.length === 0) return '';
71
+ const { callbacks, scoped } = collector()
72
+ if (!scoped) (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = []
73
+ if (callbacks.length === 0) return ''
75
74
 
76
- const parts: string[] = [];
75
+ const parts: string[] = []
77
76
  for (const callback of callbacks) {
78
77
  try {
79
- const node = callback();
80
- if (node == null || node === false) continue;
81
- parts.push(renderToString(h(Fragment, null, node as VNode)));
78
+ const node = callback()
79
+ if (node == null || node === false) continue
80
+ parts.push(renderToString(h(Fragment, null, node as VNode)))
82
81
  } catch {
83
82
  // A registry that throws during flush is skipped, not fatal.
84
83
  }
85
84
  }
86
- return parts.join('');
85
+ return parts.join('')
87
86
  }
88
87
 
89
88
  /** Discard any registered callbacks without rendering (error / reset paths). */
90
89
  export function clearServerInsertedHTML(): void {
91
- const scope = requestScope();
92
- if (scope) scope[collectorKey] = [];
93
- else (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = [];
90
+ const scope = requestScope()
91
+ if (scope) scope[collectorKey] = []
92
+ else (globalThis as Holder).__PNEXT_SERVER_INSERTED_HTML__ = []
94
93
  }