@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,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,110 @@ 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
+ // Read the URL live each render so any render pairs the address bar with its params;
167
+ // state is only the re-render trigger (unchanged-URL broadcasts bail out).
168
+ const location = currentLocation()
169
+ const [, setLocationKey] = useState(() => locationSignature(location))
164
170
 
165
171
  useEffect(() => {
166
- patchHistory();
172
+ patchHistory()
167
173
  const listener = () =>
168
- setLocation(previous => {
169
- const next = currentLocation();
170
- return previous.pathname === next.pathname &&
171
- previous.search === next.search &&
172
- previous.hash === next.hash
173
- ? previous
174
- : next;
175
- });
176
- locationListeners().add(listener);
177
- window.addEventListener('popstate', listener);
174
+ setLocationKey(previous => {
175
+ const next = locationSignature(currentLocation())
176
+ return previous === next ? previous : next
177
+ })
178
+ locationListeners().add(listener)
179
+ window.addEventListener('popstate', listener)
178
180
  // Re-read once the listener is attached: the URL can move between the
179
181
  // render that captured it and this effect (a history traversal landing
180
182
  // while a swapped-in tree mounts), and nothing was listening for that one.
181
- listener();
183
+ listener()
182
184
  return () => {
183
- locationListeners().delete(listener);
184
- window.removeEventListener('popstate', listener);
185
- };
186
- }, []);
185
+ locationListeners().delete(listener)
186
+ window.removeEventListener('popstate', listener)
187
+ }
188
+ }, [])
187
189
 
188
- return location;
190
+ return location
191
+ }
192
+
193
+ function locationSignature(location: { pathname: string; search: string; hash: string }) {
194
+ return `${location.pathname}${location.search}${location.hash}`
189
195
  }
190
196
 
191
197
  function currentLocation() {
@@ -194,56 +200,57 @@ function currentLocation() {
194
200
  pathname: '/',
195
201
  search: '',
196
202
  hash: '',
197
- };
203
+ }
198
204
  }
199
205
  return {
200
206
  pathname: window.location.pathname,
201
207
  search: window.location.search,
202
208
  hash: window.location.hash,
203
- };
209
+ }
204
210
  }
205
211
 
206
212
  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;
213
+ if (!process.browser && typeof window === 'undefined') return {}
214
+ const state = (history.state as Record<string, unknown> | null) ?? {}
215
+ const routeState = window.__PNEXT_ROUTE__ ?? {}
216
+ const bfcacheId = typeof state.__pnextBfcacheId === 'string' ? state.__pnextBfcacheId : undefined
217
+ return bfcacheId ? ({ ...routeState, bfcacheId } as RouteState) : routeState
212
218
  }
213
219
 
214
220
  function navigate(url: string, mode: 'push' | 'replace', scroll = true) {
215
- if (blockJavascriptUrl(url)) return;
216
- const next = new URL(url, window.location.href);
221
+ if (blockJavascriptUrl(url)) return
222
+ const next = new URL(url, window.location.href)
217
223
  if (next.origin !== window.location.origin) {
218
- const holder = globalThis as { __pnextMpaNavigation?: number };
219
- holder.__pnextMpaNavigation = (holder.__pnextMpaNavigation ?? 0) + 1;
224
+ const holder = globalThis as { __pnextMpaNavigation?: number }
225
+ holder.__pnextMpaNavigation = (holder.__pnextMpaNavigation ?? 0) + 1
220
226
  requestAnimationFrame(() =>
221
227
  requestAnimationFrame(() => {
222
- if (mode === 'replace') window.location.replace(next.href);
223
- else window.location.assign(next.href);
228
+ if (mode === 'replace') window.location.replace(next.href)
229
+ else window.location.assign(next.href)
224
230
  }),
225
- );
226
- return;
231
+ )
232
+ return
227
233
  }
228
234
 
229
235
  if (next.pathname !== window.location.pathname || next.search !== window.location.search) {
230
- void softNavigate(next.href, { replace: mode === 'replace', scroll });
231
- return;
236
+ void softNavigate(next.href, { replace: mode === 'replace', scroll })
237
+ return
232
238
  }
233
239
 
234
- if (mode === 'replace') window.history.replaceState(history.state, '', next);
235
- else window.history.pushState(history.state, '', next);
236
- scheduleNavigationScroll(next, { scroll });
240
+ if (mode === 'replace') window.history.replaceState(history.state, '', next)
241
+ else window.history.pushState(history.state, '', next)
242
+ scheduleNavigationScroll(next, { scroll })
237
243
  }
238
244
 
239
245
  // Exported so compat's link-status can guarantee raw history.pushState /
240
246
  // replaceState calls broadcast a location change (ending a link's pending
241
247
  // state) even when no useLocation-based hook has mounted yet.
242
248
  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);
249
+ if ((!process.browser && typeof window === 'undefined') || window.__PNEXT_HISTORY_PATCHED__)
250
+ return
251
+ window.__PNEXT_HISTORY_PATCHED__ = true
252
+ const pushState = window.history.pushState.bind(window.history)
253
+ const replaceState = window.history.replaceState.bind(window.history)
247
254
 
248
255
  // Broadcast only when the URL actually changes. The router itself calls replaceState with the
249
256
  // CURRENT href for bookkeeping - including at the start of every soft navigation - and emitting for
@@ -254,26 +261,26 @@ export function patchHistory() {
254
261
  // document, so a later traversal is a location broadcast rather than a fetch-and-swap of a URL that
255
262
  // may not even exist on the server. Router-initiated calls already carry the keys.
256
263
  function copyInternalState(data: unknown): unknown {
257
- const current = (window.history.state as Record<string, unknown> | null) ?? {};
258
- const carried: Record<string, unknown> = {};
264
+ const current = (window.history.state as Record<string, unknown> | null) ?? {}
265
+ const carried: Record<string, unknown> = {}
259
266
  for (const key of Object.keys(current)) {
260
- if (key.startsWith('__pnext')) carried[key] = current[key];
267
+ if (key.startsWith('__pnext')) carried[key] = current[key]
261
268
  }
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 };
269
+ if (Object.keys(carried).length === 0) return data
270
+ const own = (data as Record<string, unknown> | null) ?? {}
271
+ if (Object.keys(own).some(key => key.startsWith('__pnext'))) return data
272
+ return { ...own, ...carried }
266
273
  }
267
274
  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
- };
275
+ const before = window.location.href
276
+ const result = pushState(copyInternalState(data), unused, url)
277
+ if (window.location.href !== before) emitLocationChange()
278
+ return result
279
+ }
273
280
  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
- };
281
+ const before = window.location.href
282
+ const result = replaceState(copyInternalState(data), unused, url)
283
+ if (window.location.href !== before) emitLocationChange()
284
+ return result
285
+ }
279
286
  }
@@ -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
  }