@wular/pnext 0.0.3 → 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 -1961
  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 -1887
  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} +152 -143
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +442 -186
  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 +833 -848
  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,23 +1,23 @@
1
- import { useEffect, useState } from 'preact/hooks';
2
- import { ReadonlyURLSearchParams, type HrefOptions } from './navigation';
3
- import { blockJavascriptUrl, prefetchRoute, softNavigate } from './router';
4
- import { seedHistoryEntry } from './router/history';
1
+ import { useEffect, useState } from 'preact/hooks'
2
+ import { ReadonlyURLSearchParams, type HrefOptions } from './navigation'
3
+ import { blockJavascriptUrl, prefetchRoute, softNavigate } from '../client/router'
4
+ import { seedHistoryEntry } from '../client/router/history'
5
5
  import {
6
6
  emitLocationChange,
7
7
  locationListeners,
8
8
  scheduleNavigationScroll,
9
- } from './router/events';
10
- import { routeHref } from '../routing/href';
11
- import type { RouteParams, RouteParamValue, RoutePath } from '../types';
9
+ } from '../client/router/events'
10
+ import { routeHref } from '../routing/href'
11
+ import type { RouteParams, RouteParamValue, RoutePath } from '../types'
12
12
 
13
13
  export type NavigateOptions<Route extends RoutePath> = HrefOptions<Route> & {
14
- scroll?: boolean;
15
- };
14
+ scroll?: boolean
15
+ }
16
16
 
17
17
  export type PrefetchOptions<Route extends RoutePath> = HrefOptions<Route> & {
18
- kind?: 'auto' | 'full';
19
- onInvalidate?: () => void;
20
- };
18
+ kind?: 'auto' | 'full'
19
+ onInvalidate?: () => void
20
+ }
21
21
 
22
22
  export interface PNextRouter {
23
23
  push<Route extends RoutePath>(
@@ -25,42 +25,42 @@ export interface PNextRouter {
25
25
  ...options: RouteParams<Route> extends Record<string, never>
26
26
  ? [options?: NavigateOptions<Route>]
27
27
  : [options: NavigateOptions<Route>]
28
- ): void;
28
+ ): void
29
29
  replace<Route extends RoutePath>(
30
30
  route: Route,
31
31
  ...options: RouteParams<Route> extends Record<string, never>
32
32
  ? [options?: NavigateOptions<Route>]
33
33
  : [options: NavigateOptions<Route>]
34
- ): void;
34
+ ): void
35
35
  prefetch<Route extends RoutePath>(
36
36
  route: Route,
37
37
  ...options: RouteParams<Route> extends Record<string, never>
38
38
  ? [options?: PrefetchOptions<Route>]
39
39
  : [options: PrefetchOptions<Route>]
40
- ): void;
41
- refresh(): void;
42
- back(): void;
43
- forward(): void;
44
- bfcacheId: string;
40
+ ): void
41
+ refresh(): void
42
+ back(): void
43
+ forward(): void
44
+ bfcacheId: string
45
45
  }
46
46
 
47
- export { ReadonlyURLSearchParams };
47
+ export { ReadonlyURLSearchParams }
48
48
 
49
49
  export interface CurrentRoute<Route extends RoutePath = RoutePath> {
50
- route: Route | null;
51
- pathname: string;
52
- params: RouteParams<Route>;
53
- searchParams: ReadonlyURLSearchParams;
50
+ route: Route | null
51
+ pathname: string
52
+ params: RouteParams<Route>
53
+ searchParams: ReadonlyURLSearchParams
54
54
  }
55
55
 
56
56
  interface RouteState {
57
- route?: string;
58
- params?: Record<string, RouteParamValue>;
59
- catchAllOptional?: boolean;
60
- staticChildren?: string[];
61
- bfcacheId?: string;
57
+ route?: string
58
+ params?: Record<string, RouteParamValue>
59
+ catchAllOptional?: boolean
60
+ staticChildren?: string[]
61
+ bfcacheId?: string
62
62
  /** `prefetch = 'allow-runtime'`: this route's shell is request-sampled. */
63
- runtimePrefetch?: boolean;
63
+ runtimePrefetch?: boolean
64
64
  }
65
65
 
66
66
  /**
@@ -70,17 +70,17 @@ interface RouteState {
70
70
  * pattern (`/[teamSlug]/[...slug]`), so convert back at the API boundary.
71
71
  */
72
72
  function bracketRoutePattern(state: RouteState): string | null {
73
- const route = state.route;
74
- if (route == null) return null;
73
+ const route = state.route
74
+ if (route == null) return null
75
75
  return route
76
76
  .replace(/:([\w$]+)\*/g, state.catchAllOptional ? '[[...$1]]' : '[...$1]')
77
- .replace(/:([\w$]+)/g, '[$1]');
77
+ .replace(/:([\w$]+)/g, '[$1]')
78
78
  }
79
79
 
80
80
  declare global {
81
81
  interface Window {
82
- __PNEXT_ROUTE__?: RouteState;
83
- __PNEXT_HISTORY_PATCHED__?: boolean;
82
+ __PNEXT_ROUTE__?: RouteState
83
+ __PNEXT_HISTORY_PATCHED__?: boolean
84
84
  }
85
85
  }
86
86
 
@@ -88,104 +88,107 @@ declare global {
88
88
  // `bfcacheId` below reads them, and `patchHistory` carries them onto an app-level pushState. Seeding
89
89
  // here rather than in the hub's installRouter keeps a page whose client graph never touches router
90
90
  // state from paying for them.
91
- seedHistoryEntry();
91
+ seedHistoryEntry()
92
92
 
93
93
  export function useRouter(): PNextRouter {
94
- return router;
94
+ return router
95
95
  }
96
96
 
97
97
  const router: PNextRouter = {
98
98
  push(route, ...[options]) {
99
- navigate(routerHref(route, options), 'push', options?.scroll);
99
+ navigate(routerHref(route, options), 'push', options?.scroll)
100
100
  },
101
101
  replace(route, ...[options]) {
102
- navigate(routerHref(route, options), 'replace', options?.scroll);
102
+ navigate(routerHref(route, options), 'replace', options?.scroll)
103
103
  },
104
104
  prefetch(route, ...[options]) {
105
105
  void prefetchRoute(routerHref(route, options), {
106
106
  strict: true,
107
107
  full: options?.kind === 'full',
108
108
  onInvalidate: options?.onInvalidate,
109
- });
109
+ })
110
110
  },
111
111
  refresh() {
112
- void softNavigate(window.location.href, { replace: true, scroll: false });
112
+ void softNavigate(window.location.href, { replace: true, scroll: false })
113
113
  },
114
114
  back() {
115
- window.history.back();
115
+ window.history.back()
116
116
  },
117
117
  forward() {
118
- window.history.forward();
118
+ window.history.forward()
119
119
  },
120
120
  get bfcacheId() {
121
- return routeState().bfcacheId ?? '';
121
+ return routeState().bfcacheId ?? ''
122
122
  },
123
- };
123
+ }
124
124
 
125
- function routerHref<Route extends RoutePath>(route: Route, options: HrefOptions<Route> | undefined) {
126
- return hasHrefParts(options) ? routeHref(route, options) : String(route);
125
+ function routerHref<Route extends RoutePath>(
126
+ route: Route,
127
+ options: HrefOptions<Route> | undefined,
128
+ ) {
129
+ return hasHrefParts(options) ? routeHref(route, options) : String(route)
127
130
  }
128
131
 
129
132
  function hasHrefParts<Route extends RoutePath>(
130
133
  options: HrefOptions<Route> | undefined,
131
134
  ): options is HrefOptions<Route> {
132
- return Boolean(options && ('params' in options || 'search' in options || 'hash' in options));
135
+ return Boolean(options && ('params' in options || 'search' in options || 'hash' in options))
133
136
  }
134
137
 
135
138
  export function usePathname() {
136
- return useLocation().pathname;
139
+ return useLocation().pathname
137
140
  }
138
141
 
139
142
  export function useSearchParams(): ReadonlyURLSearchParams {
140
- return new ReadonlyURLSearchParams(useLocation().search);
143
+ return new ReadonlyURLSearchParams(useLocation().search)
141
144
  }
142
145
 
143
146
  export function useParams<Route extends RoutePath = RoutePath>() {
144
- useLocation();
145
- return (routeState().params ?? {}) as RouteParams<Route>;
147
+ useLocation()
148
+ return (routeState().params ?? {}) as RouteParams<Route>
146
149
  }
147
150
 
148
151
  export function useRoute<Route extends RoutePath = RoutePath>(): CurrentRoute<Route> {
149
- const location = useLocation();
152
+ const location = useLocation()
150
153
  return {
151
154
  route: bracketRoutePattern(routeState()) as Route | null,
152
155
  pathname: location.pathname,
153
156
  params: (routeState().params ?? {}) as RouteParams<Route>,
154
157
  searchParams: new ReadonlyURLSearchParams(location.search),
155
- };
158
+ }
156
159
  }
157
160
 
158
161
  export function useLinkStatus() {
159
- return { pending: false };
162
+ return { pending: false }
160
163
  }
161
164
 
162
165
  function useLocation() {
163
- const [location, setLocation] = useState(() => currentLocation());
166
+ const [location, setLocation] = useState(() => currentLocation())
164
167
 
165
168
  useEffect(() => {
166
- patchHistory();
169
+ patchHistory()
167
170
  const listener = () =>
168
171
  setLocation(previous => {
169
- const next = currentLocation();
172
+ const next = currentLocation()
170
173
  return previous.pathname === next.pathname &&
171
174
  previous.search === next.search &&
172
175
  previous.hash === next.hash
173
176
  ? previous
174
- : next;
175
- });
176
- locationListeners().add(listener);
177
- window.addEventListener('popstate', listener);
177
+ : next
178
+ })
179
+ locationListeners().add(listener)
180
+ window.addEventListener('popstate', listener)
178
181
  // Re-read once the listener is attached: the URL can move between the
179
182
  // render that captured it and this effect (a history traversal landing
180
183
  // while a swapped-in tree mounts), and nothing was listening for that one.
181
- listener();
184
+ listener()
182
185
  return () => {
183
- locationListeners().delete(listener);
184
- window.removeEventListener('popstate', listener);
185
- };
186
- }, []);
186
+ locationListeners().delete(listener)
187
+ window.removeEventListener('popstate', listener)
188
+ }
189
+ }, [])
187
190
 
188
- return location;
191
+ return location
189
192
  }
190
193
 
191
194
  function currentLocation() {
@@ -194,56 +197,57 @@ function currentLocation() {
194
197
  pathname: '/',
195
198
  search: '',
196
199
  hash: '',
197
- };
200
+ }
198
201
  }
199
202
  return {
200
203
  pathname: window.location.pathname,
201
204
  search: window.location.search,
202
205
  hash: window.location.hash,
203
- };
206
+ }
204
207
  }
205
208
 
206
209
  function routeState() {
207
- if (!process.browser && typeof window === 'undefined') return {};
208
- const state = (history.state as Record<string, unknown> | null) ?? {};
209
- const routeState = window.__PNEXT_ROUTE__ ?? {};
210
- const bfcacheId = typeof state.__pnextBfcacheId === 'string' ? state.__pnextBfcacheId : undefined;
211
- return bfcacheId ? ({ ...routeState, bfcacheId } as RouteState) : routeState;
210
+ if (!process.browser && typeof window === 'undefined') return {}
211
+ const state = (history.state as Record<string, unknown> | null) ?? {}
212
+ const routeState = window.__PNEXT_ROUTE__ ?? {}
213
+ const bfcacheId = typeof state.__pnextBfcacheId === 'string' ? state.__pnextBfcacheId : undefined
214
+ return bfcacheId ? ({ ...routeState, bfcacheId } as RouteState) : routeState
212
215
  }
213
216
 
214
217
  function navigate(url: string, mode: 'push' | 'replace', scroll = true) {
215
- if (blockJavascriptUrl(url)) return;
216
- const next = new URL(url, window.location.href);
218
+ if (blockJavascriptUrl(url)) return
219
+ const next = new URL(url, window.location.href)
217
220
  if (next.origin !== window.location.origin) {
218
- const holder = globalThis as { __pnextMpaNavigation?: number };
219
- holder.__pnextMpaNavigation = (holder.__pnextMpaNavigation ?? 0) + 1;
221
+ const holder = globalThis as { __pnextMpaNavigation?: number }
222
+ holder.__pnextMpaNavigation = (holder.__pnextMpaNavigation ?? 0) + 1
220
223
  requestAnimationFrame(() =>
221
224
  requestAnimationFrame(() => {
222
- if (mode === 'replace') window.location.replace(next.href);
223
- else window.location.assign(next.href);
225
+ if (mode === 'replace') window.location.replace(next.href)
226
+ else window.location.assign(next.href)
224
227
  }),
225
- );
226
- return;
228
+ )
229
+ return
227
230
  }
228
231
 
229
232
  if (next.pathname !== window.location.pathname || next.search !== window.location.search) {
230
- void softNavigate(next.href, { replace: mode === 'replace', scroll });
231
- return;
233
+ void softNavigate(next.href, { replace: mode === 'replace', scroll })
234
+ return
232
235
  }
233
236
 
234
- if (mode === 'replace') window.history.replaceState(history.state, '', next);
235
- else window.history.pushState(history.state, '', next);
236
- scheduleNavigationScroll(next, { scroll });
237
+ if (mode === 'replace') window.history.replaceState(history.state, '', next)
238
+ else window.history.pushState(history.state, '', next)
239
+ scheduleNavigationScroll(next, { scroll })
237
240
  }
238
241
 
239
242
  // Exported so compat's link-status can guarantee raw history.pushState /
240
243
  // replaceState calls broadcast a location change (ending a link's pending
241
244
  // state) even when no useLocation-based hook has mounted yet.
242
245
  export function patchHistory() {
243
- if ((!process.browser && typeof window === 'undefined') || window.__PNEXT_HISTORY_PATCHED__) return;
244
- window.__PNEXT_HISTORY_PATCHED__ = true;
245
- const pushState = window.history.pushState.bind(window.history);
246
- const replaceState = window.history.replaceState.bind(window.history);
246
+ if ((!process.browser && typeof window === 'undefined') || window.__PNEXT_HISTORY_PATCHED__)
247
+ return
248
+ window.__PNEXT_HISTORY_PATCHED__ = true
249
+ const pushState = window.history.pushState.bind(window.history)
250
+ const replaceState = window.history.replaceState.bind(window.history)
247
251
 
248
252
  // Broadcast only when the URL actually changes. The router itself calls replaceState with the
249
253
  // CURRENT href for bookkeeping - including at the start of every soft navigation - and emitting for
@@ -254,26 +258,26 @@ export function patchHistory() {
254
258
  // document, so a later traversal is a location broadcast rather than a fetch-and-swap of a URL that
255
259
  // may not even exist on the server. Router-initiated calls already carry the keys.
256
260
  function copyInternalState(data: unknown): unknown {
257
- const current = (window.history.state as Record<string, unknown> | null) ?? {};
258
- const carried: Record<string, unknown> = {};
261
+ const current = (window.history.state as Record<string, unknown> | null) ?? {}
262
+ const carried: Record<string, unknown> = {}
259
263
  for (const key of Object.keys(current)) {
260
- if (key.startsWith('__pnext')) carried[key] = current[key];
264
+ if (key.startsWith('__pnext')) carried[key] = current[key]
261
265
  }
262
- if (Object.keys(carried).length === 0) return data;
263
- const own = (data as Record<string, unknown> | null) ?? {};
264
- if (Object.keys(own).some(key => key.startsWith('__pnext'))) return data;
265
- return { ...own, ...carried };
266
+ if (Object.keys(carried).length === 0) return data
267
+ const own = (data as Record<string, unknown> | null) ?? {}
268
+ if (Object.keys(own).some(key => key.startsWith('__pnext'))) return data
269
+ return { ...own, ...carried }
266
270
  }
267
271
  window.history.pushState = function patchedPushState(data, unused, url) {
268
- const before = window.location.href;
269
- const result = pushState(copyInternalState(data), unused, url);
270
- if (window.location.href !== before) emitLocationChange();
271
- return result;
272
- };
272
+ const before = window.location.href
273
+ const result = pushState(copyInternalState(data), unused, url)
274
+ if (window.location.href !== before) emitLocationChange()
275
+ return result
276
+ }
273
277
  window.history.replaceState = function patchedReplaceState(data, unused, url) {
274
- const before = window.location.href;
275
- const result = replaceState(copyInternalState(data), unused, url);
276
- if (window.location.href !== before) emitLocationChange();
277
- return result;
278
- };
278
+ const before = window.location.href
279
+ const result = replaceState(copyInternalState(data), unused, url)
280
+ if (window.location.href !== before) emitLocationChange()
281
+ return result
282
+ }
279
283
  }
@@ -1,26 +1,26 @@
1
- import { h, type ComponentType } from 'preact';
2
- import { useEffect, useRef, useState } from 'preact/hooks';
1
+ import { h, type ComponentType } from 'preact'
2
+ import { useEffect, useRef, useState } from 'preact/hooks'
3
3
 
4
- export type DynamicModule<Props> = ComponentType<Props> | { default: ComponentType<Props> };
5
- export type DynamicLoader<Props> = string | (() => Promise<DynamicModule<Props>>);
6
- export const dynamicReferenceSymbol = Symbol.for('pnext.dynamic');
4
+ export type DynamicModule<Props> = ComponentType<Props> | { default: ComponentType<Props> }
5
+ export type DynamicLoader<Props> = string | (() => Promise<DynamicModule<Props>>)
6
+ export const dynamicReferenceSymbol = Symbol.for('pnext.dynamic')
7
7
 
8
8
  export interface DynamicTarget {
9
- file: string;
10
- exportName: string;
9
+ file: string
10
+ exportName: string
11
11
  }
12
12
 
13
13
  export interface DynamicReference<Props extends object = object> {
14
- load: () => Promise<ComponentType<Props>>;
15
- target?: DynamicTarget;
14
+ load: () => Promise<ComponentType<Props>>
15
+ target?: DynamicTarget
16
16
  }
17
17
 
18
18
  export interface DynamicOptions<Props> {
19
- loading?: ComponentType<Props>;
20
- load?: 'render' | 'visible';
21
- rootMargin?: string;
22
- ssr?: boolean;
23
- threshold?: number | number[];
19
+ loading?: ComponentType<Props>
20
+ load?: 'render' | 'visible'
21
+ rootMargin?: string
22
+ ssr?: boolean
23
+ threshold?: number | number[]
24
24
  }
25
25
 
26
26
  export function dynamic<Props extends object = object>(
@@ -30,73 +30,76 @@ export function dynamic<Props extends object = object>(
30
30
  // never passes this.
31
31
  target?: DynamicTarget,
32
32
  ) {
33
- let loaded: ComponentType<Props> | null = null;
34
- let pending: Promise<ComponentType<Props>> | null = null;
35
- const loadModule = typeof loader === 'string'
36
- ? () => {
37
- throw new Error(`dynamic(${JSON.stringify(loader)}) was not compiled by PNext.`);
38
- }
39
- : loader;
33
+ let loaded: ComponentType<Props> | null = null
34
+ let pending: Promise<ComponentType<Props>> | null = null
35
+ const loadModule =
36
+ typeof loader === 'string'
37
+ ? () => {
38
+ throw new Error(`dynamic(${JSON.stringify(loader)}) was not compiled by PNext.`)
39
+ }
40
+ : loader
40
41
 
41
42
  const load = () => {
42
43
  pending ??= Promise.resolve(loadModule()).then(module => {
43
- loaded = typeof module === 'function' ? module : module.default;
44
- return loaded;
45
- });
46
- return pending;
47
- };
44
+ loaded = typeof module === 'function' ? module : module.default
45
+ return loaded
46
+ })
47
+ return pending
48
+ }
48
49
 
49
50
  function DynamicComponent(props: Props) {
50
- const [Component, setComponent] = useState<ComponentType<Props> | null>(() => loaded);
51
- const [shouldLoad, setShouldLoad] = useState(() => options.load !== 'visible');
52
- const visibleRef = useRef<HTMLDivElement>(null);
51
+ const [Component, setComponent] = useState<ComponentType<Props> | null>(() => loaded)
52
+ const [shouldLoad, setShouldLoad] = useState(() => options.load !== 'visible')
53
+ const visibleRef = useRef<HTMLDivElement>(null)
53
54
 
54
55
  useEffect(() => {
55
- if (Component || shouldLoad) return;
56
- const node = visibleRef.current;
56
+ if (Component || shouldLoad) return
57
+ const node = visibleRef.current
57
58
  if (!node || typeof IntersectionObserver === 'undefined') {
58
- setShouldLoad(true);
59
- return;
59
+ setShouldLoad(true)
60
+ return
60
61
  }
61
62
 
62
63
  const observer = new IntersectionObserver(
63
64
  entries => {
64
- if (!entries.some(entry => entry.isIntersecting)) return;
65
- observer.disconnect();
66
- setShouldLoad(true);
65
+ if (!entries.some(entry => entry.isIntersecting)) return
66
+ observer.disconnect()
67
+ setShouldLoad(true)
67
68
  },
68
69
  {
69
70
  rootMargin: options.rootMargin,
70
71
  threshold: options.threshold,
71
72
  },
72
- );
73
+ )
73
74
 
74
- observer.observe(node);
75
- return () => observer.disconnect();
76
- }, [Component, shouldLoad]);
75
+ observer.observe(node)
76
+ return () => observer.disconnect()
77
+ }, [Component, shouldLoad])
77
78
 
78
79
  useEffect(() => {
79
- if (Component || !shouldLoad) return;
80
- let cancelled = false;
80
+ if (Component || !shouldLoad) return
81
+ let cancelled = false
81
82
  void load().then(next => {
82
- if (!cancelled) setComponent(() => next);
83
- });
83
+ if (!cancelled) setComponent(() => next)
84
+ })
84
85
  return () => {
85
- cancelled = true;
86
- };
87
- }, [Component, shouldLoad]);
86
+ cancelled = true
87
+ }
88
+ }, [Component, shouldLoad])
88
89
 
89
- if (Component) return h(Component, props);
90
- const Loading = options.loading;
90
+ if (Component) return h(Component, props)
91
+ const Loading = options.loading
91
92
  if (options.load === 'visible') {
92
- return h('div', { ref: visibleRef }, Loading ? h(Loading, props) : null);
93
+ return h('div', { ref: visibleRef }, Loading ? h(Loading, props) : null)
93
94
  }
94
- return Loading ? h(Loading, props) : null;
95
+ return Loading ? h(Loading, props) : null
95
96
  }
96
97
 
97
- (DynamicComponent as typeof DynamicComponent & {
98
- [dynamicReferenceSymbol]: DynamicReference<Props>;
99
- })[dynamicReferenceSymbol] = { load, target };
98
+ ;(
99
+ DynamicComponent as typeof DynamicComponent & {
100
+ [dynamicReferenceSymbol]: DynamicReference<Props>
101
+ }
102
+ )[dynamicReferenceSymbol] = { load, target }
100
103
 
101
- return DynamicComponent;
104
+ return DynamicComponent
102
105
  }