@wular/pnext 0.0.4 → 0.0.7

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 (395) hide show
  1. package/README.md +22 -16
  2. package/bin/pnext +6 -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 +87 -22
  8. package/reference/config.md +40 -93
  9. package/reference/css.md +42 -33
  10. package/reference/dev.md +26 -33
  11. package/reference/env.md +18 -20
  12. package/reference/getting-started.md +132 -0
  13. package/reference/metadata.md +31 -46
  14. package/reference/navigation.md +65 -105
  15. package/reference/performance.md +21 -142
  16. package/reference/rendering.md +78 -75
  17. package/reference/routing.md +97 -107
  18. package/reference/typegen.md +27 -29
  19. package/src/api/cache.ts +36 -37
  20. package/src/api/client-cache.ts +2 -2
  21. package/src/api/client-navigation.ts +121 -114
  22. package/src/api/dynamic.tsx +58 -55
  23. package/src/api/link.tsx +52 -53
  24. package/src/api/navigation.ts +59 -58
  25. package/src/api/server.ts +152 -144
  26. package/src/api/suspense.ts +4 -4
  27. package/src/cli/adapters/vercel-warm.ts +126 -121
  28. package/src/cli/adapters/vercel.ts +437 -443
  29. package/src/cli/analyze.ts +333 -144
  30. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  31. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  32. package/src/cli/build.ts +976 -978
  33. package/src/cli/create.ts +72 -64
  34. package/src/cli/dev.ts +116 -116
  35. package/src/cli/index.ts +94 -85
  36. package/src/cli/migrate/package-json.ts +73 -71
  37. package/src/cli/migrate/report.ts +32 -33
  38. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  39. package/src/cli/migrate/scan.ts +46 -46
  40. package/src/cli/migrate/spinner.ts +9 -9
  41. package/src/cli/migrate/tsconfig.ts +35 -35
  42. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  43. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  44. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  45. package/src/cli/start.ts +65 -66
  46. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  47. package/src/client/build.ts +802 -768
  48. package/src/client/chunk-fold.ts +245 -240
  49. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  50. package/src/client/entry.ts +162 -147
  51. package/src/client/prebuilt.ts +231 -223
  52. package/src/client/profile.ts +29 -29
  53. package/src/client/react-compiler.ts +20 -15
  54. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  55. package/src/client/reference-stub.ts +51 -51
  56. package/src/client/reference.ts +19 -19
  57. package/src/{api → client}/router/events.ts +32 -17
  58. package/src/{api → client}/router/history.ts +16 -16
  59. package/src/{api → client}/router/hub.ts +52 -53
  60. package/src/{api/router.ts → client/router/index.ts} +61 -60
  61. package/src/{api → client}/router/policies.ts +24 -24
  62. package/src/{api → client}/router/runtime.ts +2022 -1995
  63. package/src/{api → client}/router/types.ts +98 -98
  64. package/src/compat/actions/client-plugin.ts +42 -43
  65. package/src/compat/actions/client-stub.ts +14 -14
  66. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  67. package/src/compat/actions/config.ts +63 -64
  68. package/src/compat/actions/detect.ts +68 -68
  69. package/src/compat/actions/discovery.ts +105 -105
  70. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  71. package/src/compat/actions/early-submit.ts +1 -1
  72. package/src/compat/actions/endpoint.ts +198 -198
  73. package/src/compat/actions/extensions.ts +811 -0
  74. package/src/compat/actions/flight.ts +23 -23
  75. package/src/compat/actions/form-state.ts +34 -34
  76. package/src/compat/actions/hoist.ts +382 -236
  77. package/src/compat/actions/ids.ts +7 -12
  78. package/src/compat/actions/index.ts +8 -8
  79. package/src/compat/actions/instances.ts +46 -46
  80. package/src/compat/actions/origin.ts +47 -48
  81. package/src/compat/actions/protocol.ts +22 -22
  82. package/src/compat/actions/registry.ts +19 -19
  83. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  84. package/src/compat/actions/rewrite.ts +125 -125
  85. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  86. package/src/compat/actions/serve.ts +132 -136
  87. package/src/compat/actions/server-tag.ts +4 -4
  88. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  89. package/src/compat/actions/unrecognized-error.ts +4 -4
  90. package/src/compat/{index.ts → aliases.ts} +112 -109
  91. package/src/compat/bundler/bun-externals.ts +18 -18
  92. package/src/compat/bundler/cjs-exports.ts +271 -223
  93. package/src/compat/bundler/config.ts +116 -111
  94. package/src/compat/bundler/externals.ts +12 -12
  95. package/src/compat/bundler/import-meta-url.ts +19 -19
  96. package/src/compat/bundler/modularize-imports.ts +36 -33
  97. package/src/compat/bundler/new-url-asset.ts +22 -24
  98. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  99. package/src/compat/bundler/polyfill.ts +28 -28
  100. package/src/compat/bundler/react-compiler.ts +35 -29
  101. package/src/compat/bundler/react-profiler.tsx +11 -11
  102. package/src/compat/bundler/relay-transform.ts +48 -47
  103. package/src/compat/bundler/require-context.ts +119 -113
  104. package/src/compat/bundler/resolve-extensions.ts +19 -19
  105. package/src/compat/bundler/source-cache.ts +25 -25
  106. package/src/compat/bundler/static-imports.ts +7 -7
  107. package/src/compat/bundler/symlink-imports.ts +46 -46
  108. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  109. package/src/compat/bundler/wasm.ts +58 -60
  110. package/src/compat/bundler/webpack-loaders.ts +254 -241
  111. package/src/compat/bundler/worker.ts +101 -104
  112. package/src/compat/cache/build-flags.ts +29 -29
  113. package/src/compat/cache/build-prerender-errors.ts +40 -44
  114. package/src/compat/cache/custom-handler.ts +60 -53
  115. package/src/compat/cache/fetch-patch.ts +240 -240
  116. package/src/compat/cache/handler.ts +27 -31
  117. package/src/compat/cache/modern-handler.ts +148 -126
  118. package/src/compat/cache/resume-data-cache.ts +47 -45
  119. package/src/compat/cache/revalidate.ts +233 -232
  120. package/src/compat/cache/runtime-error.ts +35 -35
  121. package/src/compat/cache/use-cache-transform.ts +442 -417
  122. package/src/compat/cache/use-cache.ts +650 -614
  123. package/src/compat/cache-control.ts +140 -142
  124. package/src/compat/client/base-path.ts +21 -20
  125. package/src/compat/client/css-order.ts +18 -18
  126. package/src/compat/client/errors/bare-boundary.ts +11 -11
  127. package/src/compat/client/errors/control-flow.ts +23 -23
  128. package/src/compat/client/errors/error-boundary.ts +61 -61
  129. package/src/compat/client/errors/global-error.ts +101 -91
  130. package/src/compat/client/errors/install.ts +71 -72
  131. package/src/compat/client/errors/lazy.ts +23 -23
  132. package/src/compat/client/errors/primitive-throw.ts +47 -45
  133. package/src/compat/client/errors/soft-refresh.ts +4 -4
  134. package/src/compat/client/link-status.ts +33 -33
  135. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  136. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  137. package/src/compat/client/navigation-scroll.ts +63 -63
  138. package/src/compat/client/optimistic-routing.ts +93 -88
  139. package/src/compat/client/prefetch-cache.ts +23 -24
  140. package/src/compat/client/route-announcer.ts +35 -35
  141. package/src/compat/client/segment-cache-policy.ts +20 -20
  142. package/src/compat/client/segment-cache.ts +309 -315
  143. package/src/compat/client/segment-prefetch.ts +127 -132
  144. package/src/compat/client/trailing-slash.ts +5 -4
  145. package/src/compat/css/chunking.ts +113 -116
  146. package/src/compat/css/inline-css.ts +21 -21
  147. package/src/compat/css/lightningcss.ts +37 -38
  148. package/src/compat/css/modules.ts +161 -175
  149. package/src/compat/css/nonce.ts +7 -7
  150. package/src/compat/css/sass-plugin.ts +18 -21
  151. package/src/compat/css/sass.ts +150 -152
  152. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  153. package/src/compat/css/styled-jsx.ts +21 -21
  154. package/src/compat/edge-runtime.ts +27 -27
  155. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  156. package/src/compat/export/client.ts +29 -31
  157. package/src/compat/export/{index.ts → emit.ts} +111 -110
  158. package/src/compat/export/standalone.ts +62 -54
  159. package/src/compat/image-optimizer/cache.ts +51 -49
  160. package/src/compat/image-optimizer/detect.ts +52 -52
  161. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  162. package/src/compat/image-optimizer/source.ts +77 -80
  163. package/src/compat/lifecycle/after-scope.ts +26 -26
  164. package/src/compat/lifecycle/after.ts +48 -45
  165. package/src/compat/lifecycle/error-funnel.ts +98 -102
  166. package/src/compat/lifecycle/error-serialize.ts +30 -26
  167. package/src/compat/lifecycle/error-ui.ts +67 -32
  168. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  169. package/src/compat/lifecycle/instrumentation.ts +85 -85
  170. package/src/compat/lifecycle/node-console.ts +11 -11
  171. package/src/compat/lifecycle/testmode.ts +160 -132
  172. package/src/compat/mdx/compile.ts +60 -57
  173. package/src/compat/mdx/plugin.ts +11 -11
  174. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  175. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  176. package/src/compat/metadata.ts +75 -81
  177. package/src/compat/next/cache.ts +68 -69
  178. package/src/compat/next/canonical-url.ts +9 -9
  179. package/src/compat/next/client-cache.ts +19 -19
  180. package/src/compat/next/client-navigation.ts +112 -116
  181. package/src/compat/next/client-only.ts +1 -1
  182. package/src/compat/next/client-script.tsx +99 -93
  183. package/src/compat/next/client-server.ts +10 -10
  184. package/src/compat/next/config-loader.ts +176 -173
  185. package/src/compat/next/config.ts +7 -7
  186. package/src/compat/next/constants.cjs +6 -6
  187. package/src/compat/next/constants.ts +6 -6
  188. package/src/compat/next/custom-server.ts +26 -24
  189. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  190. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  191. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  192. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  193. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  194. package/src/compat/next/dynamic.tsx +21 -18
  195. package/src/compat/next/error.tsx +52 -52
  196. package/src/compat/next/font/cache.ts +74 -74
  197. package/src/compat/next/font/google.ts +2 -2
  198. package/src/compat/next/font/index.ts +1 -1
  199. package/src/compat/next/font/local.ts +3 -3
  200. package/src/compat/next/font/runtime-client.ts +17 -15
  201. package/src/compat/next/font/runtime.ts +443 -408
  202. package/src/compat/next/font/shared.ts +120 -108
  203. package/src/compat/next/form.tsx +63 -63
  204. package/src/compat/next/head.tsx +2 -2
  205. package/src/compat/next/headers.ts +103 -95
  206. package/src/compat/next/image/client.tsx +220 -0
  207. package/src/compat/next/image/config.ts +56 -58
  208. package/src/compat/next/image/optimizer.ts +40 -36
  209. package/src/compat/next/image/patterns.ts +37 -40
  210. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  211. package/src/compat/next/image/shared.ts +65 -57
  212. package/src/compat/next/image/static-metadata.ts +98 -107
  213. package/src/compat/next/image/validate.ts +79 -88
  214. package/src/compat/next/image.tsx +19 -23
  215. package/src/compat/next/index.ts +1 -1
  216. package/src/compat/next/legacy-image.tsx +59 -60
  217. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  218. package/src/compat/next/link.tsx +158 -158
  219. package/src/compat/next/navigation.cjs +12 -3
  220. package/src/compat/next/navigation.ts +48 -50
  221. package/src/compat/next/offline.ts +27 -27
  222. package/src/compat/next/og.ts +121 -124
  223. package/src/compat/next/preferred-region.ts +13 -14
  224. package/src/compat/next/redirects.ts +58 -56
  225. package/src/compat/next/resource-hints.ts +73 -76
  226. package/src/compat/next/rewrites.ts +130 -133
  227. package/src/compat/next/root-params.ts +45 -45
  228. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  229. package/src/compat/next/router.cjs +4 -2
  230. package/src/compat/next/router.ts +58 -61
  231. package/src/compat/next/script.tsx +108 -108
  232. package/src/compat/next/server-only.ts +1 -1
  233. package/src/compat/next/server.ts +19 -19
  234. package/src/compat/next/svgr.ts +18 -17
  235. package/src/compat/next/telemetry.ts +24 -24
  236. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  237. package/src/compat/next/user-agent.ts +53 -49
  238. package/src/compat/next/web-vitals.ts +22 -24
  239. package/src/compat/otel/api.ts +41 -41
  240. package/src/compat/otel/client-trace-metadata.ts +25 -27
  241. package/src/compat/otel/fetch-span.ts +29 -29
  242. package/src/compat/otel/tracer.ts +331 -331
  243. package/src/compat/pages/api.ts +456 -0
  244. package/src/compat/pages/client-plugin.ts +36 -36
  245. package/src/compat/pages/router-state.ts +34 -34
  246. package/src/compat/pages/{index.ts → router.ts} +130 -135
  247. package/src/compat/ppr/io.ts +12 -12
  248. package/src/compat/ppr/missing-root-params.ts +34 -38
  249. package/src/compat/ppr/root-params-scan.ts +66 -66
  250. package/src/compat/ppr/root-params-transform.ts +24 -26
  251. package/src/compat/ppr/root-params.ts +30 -30
  252. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  253. package/src/compat/protocol.ts +71 -70
  254. package/src/compat/react/action-state.ts +47 -48
  255. package/src/compat/react/client-lite.ts +15 -15
  256. package/src/compat/react/client.ts +4 -4
  257. package/src/compat/react/compiler-runtime.ts +11 -11
  258. package/src/compat/react/dom-client.ts +44 -44
  259. package/src/compat/react/dom-react-server.ts +10 -16
  260. package/src/compat/react/dom-server.ts +10 -10
  261. package/src/compat/react/dom.ts +52 -52
  262. package/src/compat/react/hooks-extra.ts +34 -35
  263. package/src/compat/react/parity.ts +64 -61
  264. package/src/compat/react/preact.ts +81 -82
  265. package/src/compat/react/react-server.ts +28 -28
  266. package/src/compat/react/router-shim.ts +1 -1
  267. package/src/compat/react/server-component-use.ts +8 -8
  268. package/src/compat/react/server-inserted-html.ts +30 -31
  269. package/src/compat/react/server.ts +53 -55
  270. package/src/compat/react/use.ts +32 -32
  271. package/src/compat/react/view-transition.ts +20 -20
  272. package/src/compat/register/actions.ts +35 -824
  273. package/src/compat/register/boot.ts +41 -41
  274. package/src/compat/register/build-tier.ts +5 -5
  275. package/src/compat/register/build.ts +74 -70
  276. package/src/compat/register/bundler.ts +161 -156
  277. package/src/compat/register/cache.ts +20 -20
  278. package/src/compat/register/client-errors.ts +3 -3
  279. package/src/compat/register/config.ts +6 -6
  280. package/src/compat/register/css-extras.ts +30 -34
  281. package/src/compat/register/edge-runtime.ts +3 -3
  282. package/src/compat/register/errors.ts +10 -12
  283. package/src/compat/register/export.ts +16 -16
  284. package/src/compat/register/font.ts +11 -11
  285. package/src/compat/register/hooks.ts +2 -2
  286. package/src/compat/register/image.ts +40 -40
  287. package/src/compat/register/index.ts +59 -62
  288. package/src/compat/register/instrumentation-client.ts +10 -10
  289. package/src/compat/register/lifecycle.ts +25 -28
  290. package/src/compat/register/mdx.ts +10 -10
  291. package/src/compat/register/middleware.ts +226 -16
  292. package/src/compat/register/otel.ts +80 -88
  293. package/src/compat/register/pages-api.ts +10 -463
  294. package/src/compat/register/ppr.ts +16 -16
  295. package/src/compat/register/protocol.ts +17 -18
  296. package/src/compat/register/proxy.ts +49 -51
  297. package/src/compat/register/render.ts +79 -76
  298. package/src/compat/register/routing.ts +162 -159
  299. package/src/compat/register/segment.ts +24 -1897
  300. package/src/compat/register/static-image.ts +3 -3
  301. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  302. package/src/compat/register/typed-routes.ts +14 -14
  303. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  304. package/src/compat/register/validation.ts +18 -18
  305. package/src/compat/segment/loading-boundary.ts +43 -45
  306. package/src/compat/segment/page-slot.ts +69 -69
  307. package/src/compat/segment/serve.ts +1884 -0
  308. package/src/compat/segment/tree.ts +113 -112
  309. package/src/compat/segment/vary-key.ts +38 -38
  310. package/src/compat/segment/vary-params.ts +138 -142
  311. package/src/compat/static-params.ts +14 -12
  312. package/src/compat/tsconfig-defaults.ts +87 -91
  313. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  314. package/src/compat/typecheck/worker.ts +15 -12
  315. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  316. package/src/compat/typed-routes/manifest.ts +174 -170
  317. package/src/compat/typed-routes/typegen.ts +127 -110
  318. package/src/compat/validation/errors.ts +16 -19
  319. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  320. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  321. package/src/compat-bootstrap.ts +16 -16
  322. package/src/config.ts +86 -69
  323. package/src/css/build.ts +230 -227
  324. package/src/css/postcss.ts +79 -80
  325. package/src/css/worker.ts +14 -15
  326. package/src/dev/client-actions.ts +10 -10
  327. package/src/dev/client-chunk-store.ts +27 -27
  328. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  329. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  330. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  331. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  332. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  333. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  334. package/src/dev/server.ts +804 -820
  335. package/src/env.ts +46 -43
  336. package/src/extensions.ts +491 -478
  337. package/src/index.ts +8 -8
  338. package/src/internal.ts +20 -23
  339. package/src/{islands → render}/boundary-error.ts +3 -3
  340. package/src/render/hooks.ts +71 -71
  341. package/src/render/island-context.ts +14 -14
  342. package/src/render/metadata.ts +310 -310
  343. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  344. package/src/{ppr.ts → render/ppr.ts} +244 -245
  345. package/src/render/renderer.ts +2087 -2082
  346. package/src/render/resource-hints.ts +16 -17
  347. package/src/render/slots.tsx +224 -235
  348. package/src/{islands → render}/static-children.ts +9 -12
  349. package/src/{islands → render}/static-slots.ts +37 -37
  350. package/src/{cache/context.ts → request/cache.ts} +20 -20
  351. package/src/request/context.ts +107 -107
  352. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  353. package/src/resolve/engine.ts +90 -77
  354. package/src/resolve/imports.ts +475 -463
  355. package/src/resolve/scan-facts.ts +318 -296
  356. package/src/resolve/source-text.ts +37 -37
  357. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  358. package/src/routing/forwarded.ts +19 -19
  359. package/src/routing/handler.ts +84 -91
  360. package/src/routing/href.ts +87 -70
  361. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  362. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  363. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  364. package/src/routing/routes.ts +827 -815
  365. package/src/routing/slots.ts +164 -160
  366. package/src/runtime/loader.ts +954 -0
  367. package/src/{dev → runtime}/module-cache.ts +309 -287
  368. package/src/{dev → runtime}/module-generations.ts +9 -9
  369. package/src/{dev → runtime}/module-transform.ts +81 -72
  370. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  371. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  372. package/src/runtime/vendor.ts +428 -406
  373. package/src/styles.d.ts +9 -0
  374. package/src/types.ts +324 -335
  375. package/src/utils/ansi.ts +5 -5
  376. package/src/utils/{source.ts → code.ts} +15 -12
  377. package/src/utils/content-type.ts +3 -3
  378. package/src/utils/decode.ts +2 -2
  379. package/src/utils/dev-profile.ts +13 -13
  380. package/src/utils/error-log.ts +6 -6
  381. package/src/utils/esbuild.ts +18 -18
  382. package/src/utils/fs-cache.ts +13 -13
  383. package/src/utils/fs.ts +57 -49
  384. package/src/utils/html.ts +20 -24
  385. package/src/utils/native-require.ts +8 -8
  386. package/src/utils/serialize.ts +139 -146
  387. package/src/utils/verbose.ts +18 -18
  388. package/reference/overview.md +0 -35
  389. package/src/cli/analyze-print.ts +0 -181
  390. package/src/compat/middleware/manifest.ts +0 -210
  391. package/src/compat/next/image-client.tsx +0 -215
  392. package/src/compat/next/link-usage.ts +0 -29
  393. package/src/css/index.ts +0 -2
  394. package/src/render/index.ts +0 -1
  395. 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
  }