@wular/pnext 0.0.1

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 (371) hide show
  1. package/README.md +153 -0
  2. package/bin/pnext +67 -0
  3. package/config/lint/base.js +48 -0
  4. package/config/ts/base.json +26 -0
  5. package/config/ts/react.json +13 -0
  6. package/package.json +70 -0
  7. package/reference/compat.md +63 -0
  8. package/reference/config.md +120 -0
  9. package/reference/css.md +58 -0
  10. package/reference/dev.md +69 -0
  11. package/reference/env.md +40 -0
  12. package/reference/metadata.md +86 -0
  13. package/reference/navigation.md +149 -0
  14. package/reference/overview.md +35 -0
  15. package/reference/performance.md +97 -0
  16. package/reference/rendering.md +127 -0
  17. package/reference/routing.md +167 -0
  18. package/reference/typegen.md +64 -0
  19. package/src/api/cache.ts +80 -0
  20. package/src/api/client-cache.ts +9 -0
  21. package/src/api/client-navigation.ts +279 -0
  22. package/src/api/dynamic.tsx +102 -0
  23. package/src/api/link.tsx +119 -0
  24. package/src/api/navigation.ts +198 -0
  25. package/src/api/router/events.ts +53 -0
  26. package/src/api/router/history.ts +70 -0
  27. package/src/api/router/hub.ts +194 -0
  28. package/src/api/router/policies.ts +107 -0
  29. package/src/api/router/runtime.ts +5238 -0
  30. package/src/api/router/types.ts +299 -0
  31. package/src/api/router.ts +167 -0
  32. package/src/api/server.ts +323 -0
  33. package/src/api/suspense.ts +16 -0
  34. package/src/cache/context.ts +61 -0
  35. package/src/cli/adapters/vercel-warm.ts +375 -0
  36. package/src/cli/adapters/vercel.ts +1310 -0
  37. package/src/cli/analyze-print.ts +181 -0
  38. package/src/cli/analyze.ts +328 -0
  39. package/src/cli/boot-trace.ts +29 -0
  40. package/src/cli/build.ts +3114 -0
  41. package/src/cli/dev.ts +276 -0
  42. package/src/cli/index.ts +196 -0
  43. package/src/cli/named-bin.ts +119 -0
  44. package/src/cli/serve-ui.ts +160 -0
  45. package/src/cli/start.ts +1425 -0
  46. package/src/client/build.ts +2136 -0
  47. package/src/client/chunk-fold.ts +526 -0
  48. package/src/client/entry.ts +1525 -0
  49. package/src/client/paths.ts +22 -0
  50. package/src/client/prebuilt.ts +621 -0
  51. package/src/client/profile.ts +75 -0
  52. package/src/client/react-compiler.ts +94 -0
  53. package/src/client/reference-stub.ts +145 -0
  54. package/src/client/reference.ts +47 -0
  55. package/src/compat/actions/action-client.ts +531 -0
  56. package/src/compat/actions/action-dispatch.ts +676 -0
  57. package/src/compat/actions/action-router.ts +40 -0
  58. package/src/compat/actions/action-shared.ts +95 -0
  59. package/src/compat/actions/client-plugin.ts +135 -0
  60. package/src/compat/actions/client-stub.ts +65 -0
  61. package/src/compat/actions/config.ts +164 -0
  62. package/src/compat/actions/detect.ts +208 -0
  63. package/src/compat/actions/discovery.ts +244 -0
  64. package/src/compat/actions/early-submit.ts +40 -0
  65. package/src/compat/actions/endpoint.ts +602 -0
  66. package/src/compat/actions/flight.ts +52 -0
  67. package/src/compat/actions/form-state.ts +73 -0
  68. package/src/compat/actions/hoist.ts +485 -0
  69. package/src/compat/actions/ids.ts +39 -0
  70. package/src/compat/actions/index.ts +41 -0
  71. package/src/compat/actions/instances.ts +144 -0
  72. package/src/compat/actions/origin.ts +109 -0
  73. package/src/compat/actions/protocol.ts +125 -0
  74. package/src/compat/actions/registry.ts +74 -0
  75. package/src/compat/actions/rewrite.ts +282 -0
  76. package/src/compat/actions/serve.ts +414 -0
  77. package/src/compat/actions/server-tag.ts +21 -0
  78. package/src/compat/actions/unrecognized-error.ts +30 -0
  79. package/src/compat/adapter/build-complete.ts +257 -0
  80. package/src/compat/bundler/bun-externals.ts +53 -0
  81. package/src/compat/bundler/cjs-exports.ts +542 -0
  82. package/src/compat/bundler/config.ts +363 -0
  83. package/src/compat/bundler/externals.ts +34 -0
  84. package/src/compat/bundler/import-meta-url.ts +60 -0
  85. package/src/compat/bundler/modularize-imports.ts +119 -0
  86. package/src/compat/bundler/new-url-asset.ts +87 -0
  87. package/src/compat/bundler/optimize-package-imports.ts +273 -0
  88. package/src/compat/bundler/polyfill.ts +88 -0
  89. package/src/compat/bundler/react-compiler.ts +61 -0
  90. package/src/compat/bundler/react-profiler.tsx +25 -0
  91. package/src/compat/bundler/relay-transform.ts +116 -0
  92. package/src/compat/bundler/require-context.ts +281 -0
  93. package/src/compat/bundler/resolve-extensions.ts +75 -0
  94. package/src/compat/bundler/source-cache.ts +61 -0
  95. package/src/compat/bundler/static-imports.ts +25 -0
  96. package/src/compat/bundler/symlink-imports.ts +119 -0
  97. package/src/compat/bundler/tsconfig-paths.ts +50 -0
  98. package/src/compat/bundler/wasm.ts +153 -0
  99. package/src/compat/bundler/webpack-loaders.ts +685 -0
  100. package/src/compat/bundler/worker.ts +278 -0
  101. package/src/compat/cache/build-flags.ts +81 -0
  102. package/src/compat/cache/build-prerender-errors.ts +163 -0
  103. package/src/compat/cache/custom-handler.ts +159 -0
  104. package/src/compat/cache/fetch-patch.ts +745 -0
  105. package/src/compat/cache/handler.ts +100 -0
  106. package/src/compat/cache/modern-handler.ts +275 -0
  107. package/src/compat/cache/resume-data-cache.ts +143 -0
  108. package/src/compat/cache/revalidate.ts +759 -0
  109. package/src/compat/cache/runtime-error.ts +124 -0
  110. package/src/compat/cache/use-cache-transform.ts +961 -0
  111. package/src/compat/cache/use-cache.ts +1695 -0
  112. package/src/compat/cache-control.ts +269 -0
  113. package/src/compat/client/base-path.ts +64 -0
  114. package/src/compat/client/css-order.ts +36 -0
  115. package/src/compat/client/errors/control-flow.ts +92 -0
  116. package/src/compat/client/errors/error-boundary.ts +222 -0
  117. package/src/compat/client/errors/global-error.ts +238 -0
  118. package/src/compat/client/errors/install.ts +217 -0
  119. package/src/compat/client/errors/lazy.ts +53 -0
  120. package/src/compat/client/errors/primitive-throw.ts +126 -0
  121. package/src/compat/client/errors/soft-refresh.ts +14 -0
  122. package/src/compat/client/link-status.ts +86 -0
  123. package/src/compat/client/nav-compat-runtime.ts +57 -0
  124. package/src/compat/client/nav-compat.ts +42 -0
  125. package/src/compat/client/navigation-scroll.ts +154 -0
  126. package/src/compat/client/optimistic-routing.ts +206 -0
  127. package/src/compat/client/prefetch-cache.ts +111 -0
  128. package/src/compat/client/route-announcer.ts +72 -0
  129. package/src/compat/client/segment-cache-policy.ts +159 -0
  130. package/src/compat/client/segment-cache.ts +1077 -0
  131. package/src/compat/client/segment-prefetch.ts +375 -0
  132. package/src/compat/client/trailing-slash.ts +24 -0
  133. package/src/compat/css/chunking.ts +254 -0
  134. package/src/compat/css/inline-css.ts +73 -0
  135. package/src/compat/css/lightningcss.ts +90 -0
  136. package/src/compat/css/modules.ts +373 -0
  137. package/src/compat/css/nonce.ts +30 -0
  138. package/src/compat/css/sass-plugin.ts +65 -0
  139. package/src/compat/css/sass.ts +392 -0
  140. package/src/compat/css/styled-jsx-runtime.ts +80 -0
  141. package/src/compat/css/styled-jsx.ts +49 -0
  142. package/src/compat/edge-runtime.ts +71 -0
  143. package/src/compat/export/client.ts +112 -0
  144. package/src/compat/export/index.ts +272 -0
  145. package/src/compat/export/standalone.ts +207 -0
  146. package/src/compat/image-optimizer/cache.ts +119 -0
  147. package/src/compat/image-optimizer/detect.ts +143 -0
  148. package/src/compat/image-optimizer/index.ts +601 -0
  149. package/src/compat/image-optimizer/source.ts +243 -0
  150. package/src/compat/index.ts +458 -0
  151. package/src/compat/lifecycle/after-scope.ts +86 -0
  152. package/src/compat/lifecycle/after.ts +173 -0
  153. package/src/compat/lifecycle/error-funnel.ts +306 -0
  154. package/src/compat/lifecycle/error-serialize.ts +87 -0
  155. package/src/compat/lifecycle/error-ui.ts +167 -0
  156. package/src/compat/lifecycle/instrumentation-client.ts +138 -0
  157. package/src/compat/lifecycle/instrumentation.ts +277 -0
  158. package/src/compat/lifecycle/node-console.ts +19 -0
  159. package/src/compat/lifecycle/testmode.ts +263 -0
  160. package/src/compat/mdx/compile.ts +219 -0
  161. package/src/compat/mdx/next-mdx-stub.ts +46 -0
  162. package/src/compat/mdx/plugin.ts +37 -0
  163. package/src/compat/metadata-route-artifacts.ts +458 -0
  164. package/src/compat/metadata.ts +295 -0
  165. package/src/compat/middleware/manifest.ts +210 -0
  166. package/src/compat/misc/action-return.ts +173 -0
  167. package/src/compat/next/cache.ts +211 -0
  168. package/src/compat/next/canonical-url.ts +35 -0
  169. package/src/compat/next/client-cache.ts +57 -0
  170. package/src/compat/next/client-navigation.ts +313 -0
  171. package/src/compat/next/client-only.ts +3 -0
  172. package/src/compat/next/client-script.tsx +215 -0
  173. package/src/compat/next/client-server.ts +39 -0
  174. package/src/compat/next/config-loader.ts +569 -0
  175. package/src/compat/next/config.ts +29 -0
  176. package/src/compat/next/constants.cjs +6 -0
  177. package/src/compat/next/constants.ts +6 -0
  178. package/src/compat/next/custom-server.ts +236 -0
  179. package/src/compat/next/dist/client/components/app-router-headers.ts +32 -0
  180. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +38 -0
  181. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -0
  182. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -0
  183. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -0
  184. package/src/compat/next/dynamic.tsx +46 -0
  185. package/src/compat/next/error.tsx +148 -0
  186. package/src/compat/next/font/cache.ts +171 -0
  187. package/src/compat/next/font/google.ts +2 -0
  188. package/src/compat/next/font/index.ts +8 -0
  189. package/src/compat/next/font/local.ts +5 -0
  190. package/src/compat/next/font/runtime-client.ts +71 -0
  191. package/src/compat/next/font/runtime.ts +974 -0
  192. package/src/compat/next/font/shared.ts +281 -0
  193. package/src/compat/next/form.tsx +156 -0
  194. package/src/compat/next/head.tsx +10 -0
  195. package/src/compat/next/headers.ts +247 -0
  196. package/src/compat/next/image/config.ts +196 -0
  197. package/src/compat/next/image/optimizer.ts +96 -0
  198. package/src/compat/next/image/patterns.ts +103 -0
  199. package/src/compat/next/image/shared.ts +141 -0
  200. package/src/compat/next/image/static-metadata.ts +283 -0
  201. package/src/compat/next/image/validate.ts +269 -0
  202. package/src/compat/next/image-client.tsx +215 -0
  203. package/src/compat/next/image-props.ts +575 -0
  204. package/src/compat/next/image-usage.ts +102 -0
  205. package/src/compat/next/image.tsx +56 -0
  206. package/src/compat/next/index.ts +1 -0
  207. package/src/compat/next/legacy-image.tsx +97 -0
  208. package/src/compat/next/link-usage.ts +29 -0
  209. package/src/compat/next/link-validation-transform.ts +200 -0
  210. package/src/compat/next/link.tsx +466 -0
  211. package/src/compat/next/navigation.cjs +21 -0
  212. package/src/compat/next/navigation.ts +188 -0
  213. package/src/compat/next/offline.ts +51 -0
  214. package/src/compat/next/og.ts +324 -0
  215. package/src/compat/next/optimistic-route-state.ts +188 -0
  216. package/src/compat/next/preferred-region.ts +39 -0
  217. package/src/compat/next/redirects.ts +131 -0
  218. package/src/compat/next/resource-hints.ts +136 -0
  219. package/src/compat/next/rewrites.ts +350 -0
  220. package/src/compat/next/root-params.ts +142 -0
  221. package/src/compat/next/router.cjs +49 -0
  222. package/src/compat/next/router.ts +143 -0
  223. package/src/compat/next/script.tsx +355 -0
  224. package/src/compat/next/server-only.ts +3 -0
  225. package/src/compat/next/server.ts +28 -0
  226. package/src/compat/next/svgr.ts +58 -0
  227. package/src/compat/next/telemetry.ts +77 -0
  228. package/src/compat/next/user-agent.ts +100 -0
  229. package/src/compat/next/web-vitals.ts +56 -0
  230. package/src/compat/otel/api.ts +95 -0
  231. package/src/compat/otel/client-trace-metadata.ts +71 -0
  232. package/src/compat/otel/fetch-span.ts +77 -0
  233. package/src/compat/otel/tracer.ts +944 -0
  234. package/src/compat/pages/client-plugin.ts +108 -0
  235. package/src/compat/pages/index.ts +527 -0
  236. package/src/compat/pages/router-state.ts +94 -0
  237. package/src/compat/ppr/io.ts +38 -0
  238. package/src/compat/ppr/missing-root-params.ts +105 -0
  239. package/src/compat/ppr/root-params-scan.ts +164 -0
  240. package/src/compat/ppr/root-params-transform.ts +75 -0
  241. package/src/compat/ppr/root-params.ts +129 -0
  242. package/src/compat/ppr/segment-config-incompat.ts +34 -0
  243. package/src/compat/protocol.ts +202 -0
  244. package/src/compat/react/client.ts +59 -0
  245. package/src/compat/react/compiler-runtime.ts +60 -0
  246. package/src/compat/react/dom-client.ts +115 -0
  247. package/src/compat/react/dom-react-server.ts +20 -0
  248. package/src/compat/react/dom-server.ts +40 -0
  249. package/src/compat/react/dom.ts +154 -0
  250. package/src/compat/react/preact.ts +522 -0
  251. package/src/compat/react/react-server.ts +84 -0
  252. package/src/compat/react/router-shim.ts +26 -0
  253. package/src/compat/react/server-component-use.ts +48 -0
  254. package/src/compat/react/server-inserted-html.ts +87 -0
  255. package/src/compat/react/server.ts +156 -0
  256. package/src/compat/react/view-transition.ts +60 -0
  257. package/src/compat/register/actions.ts +875 -0
  258. package/src/compat/register/boot.ts +141 -0
  259. package/src/compat/register/build-tier.ts +11 -0
  260. package/src/compat/register/build.ts +182 -0
  261. package/src/compat/register/bundler.ts +587 -0
  262. package/src/compat/register/cache.ts +85 -0
  263. package/src/compat/register/client-errors.ts +18 -0
  264. package/src/compat/register/config.ts +17 -0
  265. package/src/compat/register/css-extras.ts +120 -0
  266. package/src/compat/register/edge-runtime.ts +6 -0
  267. package/src/compat/register/errors.ts +46 -0
  268. package/src/compat/register/export.ts +23 -0
  269. package/src/compat/register/font.ts +36 -0
  270. package/src/compat/register/hooks.ts +34 -0
  271. package/src/compat/register/image.ts +133 -0
  272. package/src/compat/register/index.ts +111 -0
  273. package/src/compat/register/instrumentation-client.ts +35 -0
  274. package/src/compat/register/lifecycle.ts +86 -0
  275. package/src/compat/register/mdx.ts +48 -0
  276. package/src/compat/register/middleware.ts +36 -0
  277. package/src/compat/register/misc.ts +44 -0
  278. package/src/compat/register/otel.ts +288 -0
  279. package/src/compat/register/pages-api.ts +473 -0
  280. package/src/compat/register/ppr.ts +56 -0
  281. package/src/compat/register/protocol.ts +57 -0
  282. package/src/compat/register/proxy.ts +127 -0
  283. package/src/compat/register/render.ts +268 -0
  284. package/src/compat/register/routing.ts +410 -0
  285. package/src/compat/register/segment.ts +1903 -0
  286. package/src/compat/register/static-image.ts +21 -0
  287. package/src/compat/register/typed-routes.ts +35 -0
  288. package/src/compat/register/usecache.ts +131 -0
  289. package/src/compat/register/validation.ts +56 -0
  290. package/src/compat/segment/loading-boundary.ts +113 -0
  291. package/src/compat/segment/page-slot.ts +200 -0
  292. package/src/compat/segment/tree.ts +481 -0
  293. package/src/compat/segment/vary-key.ts +102 -0
  294. package/src/compat/segment/vary-params.ts +551 -0
  295. package/src/compat/static-params.ts +33 -0
  296. package/src/compat/tsconfig-defaults.ts +301 -0
  297. package/src/compat/typecheck/index.ts +1481 -0
  298. package/src/compat/typecheck/worker.ts +26 -0
  299. package/src/compat/typed-routes/index.ts +92 -0
  300. package/src/compat/typed-routes/manifest.ts +356 -0
  301. package/src/compat/typed-routes/typegen.ts +566 -0
  302. package/src/compat/validation/errors.ts +159 -0
  303. package/src/compat/validation/index.ts +1770 -0
  304. package/src/compat/validation/prerender-diagnostics.ts +1508 -0
  305. package/src/compat-bootstrap.ts +67 -0
  306. package/src/config.ts +218 -0
  307. package/src/css/build.ts +697 -0
  308. package/src/css/index.ts +2 -0
  309. package/src/css/postcss.ts +236 -0
  310. package/src/css/worker.ts +34 -0
  311. package/src/dev/client-actions.ts +35 -0
  312. package/src/dev/client-chunk-store.ts +92 -0
  313. package/src/dev/client-key-cache.ts +178 -0
  314. package/src/dev/global-css-cache.ts +212 -0
  315. package/src/dev/imports.ts +2430 -0
  316. package/src/dev/module-cache.ts +721 -0
  317. package/src/dev/module-generations.ts +38 -0
  318. package/src/dev/module-transform.ts +188 -0
  319. package/src/dev/node-module-bundle-cache.ts +63 -0
  320. package/src/dev/restart-cache.ts +10 -0
  321. package/src/dev/route-bundle-key-cache.ts +154 -0
  322. package/src/dev/route-facts-cache.ts +223 -0
  323. package/src/dev/server.ts +1710 -0
  324. package/src/dynamic/source.ts +307 -0
  325. package/src/dynamic/tree-shake.ts +262 -0
  326. package/src/env.ts +92 -0
  327. package/src/extensions.ts +1898 -0
  328. package/src/index.ts +34 -0
  329. package/src/internal.ts +43 -0
  330. package/src/islands/boundary-error.ts +8 -0
  331. package/src/islands/static-children.ts +37 -0
  332. package/src/islands/static-slots.ts +106 -0
  333. package/src/ppr-postpone.ts +24 -0
  334. package/src/ppr.ts +784 -0
  335. package/src/proxy.ts +752 -0
  336. package/src/render/hooks.ts +384 -0
  337. package/src/render/index.ts +1 -0
  338. package/src/render/island-context.ts +47 -0
  339. package/src/render/metadata.ts +857 -0
  340. package/src/render/renderer.ts +7391 -0
  341. package/src/render/resource-hints.ts +44 -0
  342. package/src/render/slots.tsx +679 -0
  343. package/src/request/context.ts +396 -0
  344. package/src/resolve/engine.ts +219 -0
  345. package/src/resolve/imports.ts +1104 -0
  346. package/src/resolve/scan-facts.ts +474 -0
  347. package/src/resolve/source-text.ts +86 -0
  348. package/src/routing/forwarded.ts +41 -0
  349. package/src/routing/handler.ts +271 -0
  350. package/src/routing/href.ts +203 -0
  351. package/src/routing/metadata.ts +1018 -0
  352. package/src/routing/request-runtime.ts +43 -0
  353. package/src/routing/routes.ts +2560 -0
  354. package/src/routing/slots.ts +432 -0
  355. package/src/runtime/server.ts +3453 -0
  356. package/src/runtime/vendor.ts +1160 -0
  357. package/src/style-modules.d.ts +9 -0
  358. package/src/typegen.ts +151 -0
  359. package/src/types.ts +725 -0
  360. package/src/utils/ansi.ts +9 -0
  361. package/src/utils/content-type.ts +31 -0
  362. package/src/utils/decode.ts +7 -0
  363. package/src/utils/dev-profile.ts +31 -0
  364. package/src/utils/error-log.ts +29 -0
  365. package/src/utils/fs-cache.ts +31 -0
  366. package/src/utils/fs.ts +119 -0
  367. package/src/utils/html.ts +46 -0
  368. package/src/utils/serialize.ts +378 -0
  369. package/src/utils/source.ts +35 -0
  370. package/src/utils/verbose.ts +39 -0
  371. package/tsconfig.json +10 -0
@@ -0,0 +1,299 @@
1
+ // Shared shapes of the client router: fetched pages, navigation options, the
2
+ // parallel-route nav state, and the entry-module handles the router imports.
3
+ export interface PrefetchedPage {
4
+ html: string;
5
+ finalUrl: string;
6
+ ok: boolean;
7
+ /** `x-nextjs-stale-time` from the response (seconds), when the server sent it. */
8
+ staleTimeSeconds?: number;
9
+ /** Complete body segment was emitted from a prerendered route artifact. */
10
+ segmentPrerendered?: boolean;
11
+ /**
12
+ * A partial-prefetch response: only the static shell, dynamic continuation
13
+ * cut server-side (`x-nextjs-postponed` on a prefetch fetch). Contributes its
14
+ * loading shell to the shell cache but must never commit as a document.
15
+ */
16
+ shellOnly?: boolean;
17
+ /**
18
+ * This response arrived as a FRAMED segment payload and has already been filed with the per-segment
19
+ * policy. A prefetch that came back as a whole document instead - a route the server does not serve
20
+ * segments for, or a segment-unaware server - is recorded from its markup once it settles, so the
21
+ * per-segment cache is fed by ordinary link prefetches either way.
22
+ */
23
+ segmentRecorded?: boolean;
24
+ /**
25
+ * This SHELL response published no vary set, so how much of this URL it covers is UNKNOWN - the
26
+ * route's baked fallback shell, rendered with every param hanging. It paints like any other shell,
27
+ * but it is not this URL's own prefetched data: the params-dependent content behind its boundary
28
+ * has never been fetched, so the URL's prefetch stays only as fresh as the dynamic window. A shell
29
+ * that DOES publish its vary set is exact about its coverage and keeps the static window.
30
+ */
31
+ varyCoverageUnknown?: boolean;
32
+ }
33
+
34
+ export interface LoadingShellPrediction {
35
+ html: string;
36
+ route: {
37
+ // Bracket-free colon form (`/:slug*`); `catchAllOptional` distinguishes an
38
+ // optional catch-all so it survives being written back to __PNEXT_ROUTE__.
39
+ route: string;
40
+ params: Record<string, string | string[]>;
41
+ catchAllOptional?: boolean;
42
+ };
43
+ prefetch?: 'shell' | 'eager';
44
+ /**
45
+ * The predicted 'shell' route is RUNTIME-prefetched (request-sampled): its
46
+ * shell content is derived from the sampled URL's params, so it is NOT shared
47
+ * across the route's other URLs the way a static partial shell is.
48
+ */
49
+ runtimePrefetch?: boolean;
50
+ }
51
+
52
+ export interface NavigationScrollOptions {
53
+ pop?: boolean;
54
+ scroll?: boolean;
55
+ }
56
+
57
+ export type NavigationScrollAction = (url: URL, options: NavigationScrollOptions) => void;
58
+ export type StylesheetReconciler = (incoming: Document) => void;
59
+
60
+ export type LoadingShellPredictionPolicy = (
61
+ url: URL,
62
+ shells: ReadonlyMap<string, string>,
63
+ ) => LoadingShellPrediction | undefined;
64
+
65
+ export interface PrefetchOptions {
66
+ /** Link element that triggered the prefetch; receives lifecycle events. */
67
+ element?: Element;
68
+ /** Public router.prefetch should match Next and throw for unparseable URLs. */
69
+ strict?: boolean;
70
+ /** `prefetch={true}` full-page prefetch — reuses for the static window. */
71
+ full?: boolean;
72
+ /**
73
+ * Hover/touch/focus intent: the prefetch rides the scheduler's reserved
74
+ * Intent lane (most-recently-hovered link starts immediately, ahead of
75
+ * queued viewport prefetches).
76
+ */
77
+ intent?: boolean;
78
+ /**
79
+ * unstable_dynamicOnHover upgrade: when the route's static shell is already
80
+ * cached, ask the server for the dynamic continuation only (the response
81
+ * must not re-send static content the client already holds) and merge it
82
+ * into the cached shell.
83
+ */
84
+ hoverResume?: boolean;
85
+ /** Called once when this prefetch is invalidated. */
86
+ onInvalidate?: () => void;
87
+ /**
88
+ * Seed the prefetch for the URL the browser is ALREADY on. Next embeds a runtime-prefetch stream in
89
+ * the initial HTML of an allow-runtime route; pnext asks the server for the same payload instead,
90
+ * which means prefetching the current URL - the one case the same-URL guards must not elide.
91
+ */
92
+ currentUrl?: boolean;
93
+ }
94
+
95
+ export interface SoftNavigateOptions extends NavigationScrollOptions {
96
+ replace?: boolean;
97
+ /** Parallel-route state to send instead of the current document's (popstate). */
98
+ navState?: DocumentNavState;
99
+ /** Restore this document without fetching (popstate to a cached entry). */
100
+ cachedPage?: PrefetchedPage;
101
+ /** router.refresh()/revalidation surface: bypass caches, fetch fresh (internal). */
102
+ refreshLike?: boolean;
103
+ /**
104
+ * A same-URL LINK click: refresh the PAGE segments only. It takes the refresh-like path (no loading
105
+ * flash, caches evicted, no new history entry) but KEEPS the live layout segments, so the request
106
+ * may skip shared layouts exactly like any other navigation.
107
+ */
108
+ pageRefresh?: boolean;
109
+ /**
110
+ * Remount everything the incoming document renders - no client-page preservation. An error
111
+ * boundary's reset() refreshes precisely to throw the failed tree away, so keeping it alive would
112
+ * replay the error.
113
+ */
114
+ remount?: boolean;
115
+ /**
116
+ * The incoming document is freshly rendered server data that supersedes the live tree (the response
117
+ * to a revalidating action, or the document a post-action redirect landed on): take ALL of its
118
+ * server segments instead of grafting the live layouts over them, or the write would be invisible.
119
+ * Island preservation is unaffected - useActionState must survive.
120
+ */
121
+ freshSegments?: boolean;
122
+ }
123
+
124
+ /** Mirrors NavState in src/types.ts (kept local: this file ships to browsers). */
125
+ export interface DocumentNavState {
126
+ children?: string;
127
+ /** Search string the children tree rendered with (refetch-URL semantics). */
128
+ childrenSearch?: string;
129
+ /** Slot dir -> source URL (`path` or `path?query`) its content rendered from. */
130
+ slots?: Record<string, string>;
131
+ /**
132
+ * The document is an interception HOST render (server-stamped): the URL is the intercepted target
133
+ * but the children tree kept rendering the host page. Such a render is host-bound - never
134
+ * origin-agnostic, never a direct target render.
135
+ */
136
+ hostRender?: boolean;
137
+ }
138
+
139
+ export interface ActiveEntry {
140
+ /** `keepRoots`: live island roots the next document reuses — do not unmount. */
141
+ unmount?: (keepRoots?: Set<Element>) => void;
142
+ }
143
+
144
+ /** Mount container of a whole-page client route (element or marker-range proxy). */
145
+ export interface ClientPageRoot {
146
+ isConnected?: boolean;
147
+ /** Page-slot comment anchors when the entry dissolved `div#pnext-page`. */
148
+ __pnextAnchors?: [Comment, Comment];
149
+ }
150
+
151
+ export interface EntryModule {
152
+ mountRoute?: () => Promise<unknown> | void;
153
+ }
154
+
155
+ declare global {
156
+ interface Window {
157
+ __PNEXT_ROUTER_INSTALLED__?: boolean;
158
+ __PNEXT_ROUTER_IMPORTS__?: number;
159
+ __PNEXT_ACTIVE_ENTRY__?: ActiveEntry;
160
+ /** The entry's guarded remount hook — mounts only what a prior pass missed. */
161
+ __PNEXT_MOUNT_ISLANDS__?: () => unknown;
162
+ /**
163
+ * The container a whole-page `'use client'` route is mounted on. A real
164
+ * `#pnext-page` element in a nested/segment context; otherwise the virtual
165
+ * container the entry builds over the dissolved page's comment anchors
166
+ * (carried on `__pnextAnchors`). See matchPreservedClientPage.
167
+ */
168
+ __PNEXT_CLIENT_PAGE_ROOT__?: ClientPageRoot;
169
+ __PNEXT_LOCATION_LISTENERS__?: Set<() => void>;
170
+ next?: {
171
+ router?: {
172
+ push?: (href: string) => Promise<void>;
173
+ replace?: (href: string) => Promise<void>;
174
+ prefetch?: (href: string) => Promise<PrefetchedPage | null>;
175
+ };
176
+ };
177
+ }
178
+ }
179
+
180
+
181
+ export interface SegmentCacheRecord {
182
+ /** Requested pathname (percent-encoding preserved). */
183
+ pathname: string;
184
+ /** Requested query string (leading `?` included, `_rsc` still present). */
185
+ search: string;
186
+ /** Segment request key the response answered (`/_index`, `/_head`, …). */
187
+ segmentPath: string;
188
+ /**
189
+ * Wire shape of `body`: a framed segment payload (a prefetch response) or a
190
+ * whole HTML document (a navigation response / the hard-loaded page). The
191
+ * policy decodes its vary metadata differently for each.
192
+ */
193
+ kind?: 'segment' | 'document';
194
+ /** The raw segment payload text, for the policy's own decoding. */
195
+ body: string;
196
+ /** The payload the router committed for this segment. */
197
+ html: string;
198
+ /** Reuse window in milliseconds. */
199
+ staleTimeMs: number;
200
+ /** True when the payload is a whole document, not a truncated shell. */
201
+ complete: boolean;
202
+ /** True when the bytes are a pure function of the URL (a prerender). */
203
+ static: boolean;
204
+ /** True when the payload came from a runtime (request-sampled) prefetch. */
205
+ runtime: boolean;
206
+ }
207
+
208
+ export interface SegmentCacheLookup {
209
+ pathname: string;
210
+ search: string;
211
+ segmentPath: string;
212
+ }
213
+
214
+ export interface SegmentCacheHit {
215
+ html: string;
216
+ /** True when this hit may commit a navigation with no network request. */
217
+ networkFree: boolean;
218
+ /**
219
+ * True when a PREFETCH of this URL has nothing left to fetch. Weaker than
220
+ * `networkFree`: a shell shared across params satisfies the prefetch (its
221
+ * static half is already cached) while the NAVIGATION still fetches the
222
+ * dynamic remainder. Absent (older policies) reads as `networkFree`.
223
+ */
224
+ prefetchSatisfied?: boolean;
225
+ }
226
+
227
+ export interface SegmentCachePolicy {
228
+ record: (input: SegmentCacheRecord) => void;
229
+ take: (input: SegmentCacheLookup) => SegmentCacheHit | null;
230
+ /**
231
+ * The route pattern (colon form) the server resolved `pathname` to, or null
232
+ * when this exact pathname was never answered. The route-tree cache uses it
233
+ * as its static-sibling guard.
234
+ */
235
+ routeFor?: (pathname: string) => string | null;
236
+ /** True when the colon-form `route` pattern covers `pathname`. */
237
+ matchesRoute?: (route: string, pathname: string) => boolean;
238
+ /**
239
+ * The cached bytes a PREFETCH of this segment would re-fetch verbatim: a DIFFERENT URL's entry whose
240
+ * published vary set covers this one. Weaker than `take` - the entry may be a postponed shell, so it
241
+ * never commits - but it is byte-identical by the server's own assertion, so the request is skipped.
242
+ */
243
+ prefetchCovered?: (input: SegmentCacheLookup) => { html: string } | null;
244
+ /**
245
+ * w9-segment-split: the PAGE frame is cached but the LAYOUT frame is not,
246
+ * so only `/_layout` has to come off the network.
247
+ */
248
+ needsLayoutFrameOnly?: (input: { pathname: string; search: string }) => boolean;
249
+ /**
250
+ * Join a `/_layout` response with this URL's cached PAGE frame into the whole
251
+ * document. Null when the two cannot be proven to line up.
252
+ */
253
+ composeLayoutFrame?: (input: {
254
+ pathname: string;
255
+ search: string;
256
+ layoutHtml: string;
257
+ }) => string | null;
258
+ /**
259
+ * True when a RUNTIME-prefetched page frame already covers this URL. Such a route's layout is not
260
+ * statically prefetchable (only the page opted into allow-runtime), so a page-frame hit leaves the
261
+ * prefetch with nothing to fetch - the layout arrives with the navigation's dynamic stage.
262
+ */
263
+ runtimePageFrameSatisfied?: (input: { pathname: string; search: string }) => boolean;
264
+ /**
265
+ * w9-segment-split (G2): this URL's LAYOUT chain is already cached (or, for a
266
+ * same-URL navigation, already on screen), so the navigation may fetch the
267
+ * `/_page` frame alone. `sameUrl` is what authorises the live document's own
268
+ * layout as the frame.
269
+ */
270
+ needsPageFrameOnly?: (input: {
271
+ pathname: string;
272
+ search: string;
273
+ sameUrl: boolean;
274
+ }) => boolean;
275
+ /**
276
+ * Splice a `/_page` response into that cached layout frame. Null means the
277
+ * two could not be proven to line up — the caller fetches the whole document.
278
+ */
279
+ composePageFrame?: (input: {
280
+ pathname: string;
281
+ search: string;
282
+ sameUrl: boolean;
283
+ pageHtml: string;
284
+ }) => string | null;
285
+ /**
286
+ * File the LAYOUT frame of a committed whole document, so a later same-URL
287
+ * navigation can refresh the page segments without re-fetching the layouts.
288
+ */
289
+ recordDocumentLayout?: (input: {
290
+ pathname: string;
291
+ search: string;
292
+ html: string;
293
+ staleTimeMs: number;
294
+ }) => void;
295
+ /** A same-URL navigation refreshes page segments only. */
296
+ evictPageSegments: () => void;
297
+ /** A revalidation invalidates every segment entry. */
298
+ clear: () => void;
299
+ }
@@ -0,0 +1,167 @@
1
+ // First-paint router hub. Generated client entries import this module, so every byte it statically
2
+ // reaches is on the critical path of every route: keep it to link interception, history events and
3
+ // the seams compat registers into, all of which live in ./router/hub. The navigation runtime itself
4
+ // sits behind ./router/runtime and is import()ed on idle into its own chunk.
5
+ //
6
+ // Everything routed through this file is a facade over that chunk. That is the point: a static
7
+ // import of softNavigate anywhere in core or compat would otherwise pull the whole runtime back into
8
+ // first paint. State BOTH tiers touch lives in ./router/hub and is imported by both, so a setter
9
+ // called before the chunk lands is not replayed - it is already in place when the runtime reads it.
10
+ // Chunk membership is decided per module, so each seam is its own module.
11
+ import {
12
+ linkClickTarget,
13
+ locationKey,
14
+ resolveSoftUrl,
15
+ routerState,
16
+ takeDeferredInstalls,
17
+ } from './router/hub';
18
+ import type { LinkClickTarget } from './router/hub';
19
+ import type { PrefetchOptions, SoftNavigateOptions } from './router/types';
20
+
21
+ export {
22
+ blockJavascriptUrl,
23
+ isJavascriptUrl,
24
+ registerDeferredInstall,
25
+ routerImportActive,
26
+ setBlockedJavascriptUrlReporter,
27
+ setSoftNavBoundary,
28
+ } from './router/hub';
29
+ // NOTE: ./router/policies, ./router/history and ./router/events are deliberately NOT re-exported
30
+ // here. esbuild assigns a chunk per set-of-reaching-entries, computed on the module graph, so a
31
+ // re-export edge from this file lands any of them in the first-paint chunk even though every symbol
32
+ // tree-shakes away. Their consumers import them directly.
33
+ export type {
34
+ LoadingShellPrediction,
35
+ NavigationScrollAction,
36
+ NavigationScrollOptions,
37
+ PrefetchedPage,
38
+ SegmentCacheHit,
39
+ SegmentCacheLookup,
40
+ SegmentCachePolicy,
41
+ SegmentCacheRecord,
42
+ StylesheetReconciler,
43
+ } from './router/types';
44
+
45
+ type RouterRuntime = typeof import('./router/runtime');
46
+
47
+ let runtime: Promise<RouterRuntime> | undefined;
48
+
49
+ /**
50
+ * Load (once) and run against the idle tier. Every facade export chains off
51
+ * this single promise, so calls keep their relative order even when the first
52
+ * of them arrives before the chunk does.
53
+ */
54
+ function withRouter<T>(use: (module: RouterRuntime) => T): Promise<Awaited<T>> {
55
+ // Deferred installers land with the runtime chunk, before anything reads a
56
+ // policy. Drained inside the chain (not at call time) so an installer any
57
+ // entry registers after the first facade call still runs.
58
+ runtime ??= import('./router/runtime').then(async module => {
59
+ await Promise.all(takeDeferredInstalls().map(install => install()));
60
+ return module;
61
+ });
62
+ return runtime.then(use) as Promise<Awaited<T>>;
63
+ }
64
+
65
+ export function softNavigate(href: string, options?: SoftNavigateOptions) {
66
+ return withRouter(module => module.softNavigate(href, options));
67
+ }
68
+
69
+ export function prefetchRoute(href: string, options?: PrefetchOptions) {
70
+ // Resolved here, not behind the import: `strict` (router.prefetch) reports an unusable href by
71
+ // THROWING at the call site, and a URL this router cannot soft-navigate is a miss that never needs
72
+ // the runtime. The throw is spelled out here rather than in the hub because the hub is a chunk
73
+ // shared with the runtime. Only an unparseable href throws - a cross-origin or out-of-basePath one
74
+ // is a silent miss.
75
+ const url = resolveSoftUrl(href);
76
+ if (!url) {
77
+ if (options?.strict) {
78
+ try {
79
+ new URL(href, location.href);
80
+ } catch {
81
+ throw new Error(`Cannot prefetch '${href}' because it cannot be converted to a URL.`);
82
+ }
83
+ }
84
+ return Promise.resolve(null);
85
+ }
86
+ return withRouter(module => module.prefetchRoute(url.href, options));
87
+ }
88
+
89
+ export function evictClientRouterCache(options?: { rearmVisiblePrefetches?: boolean }) {
90
+ return withRouter(module => module.evictClientRouterCache(options));
91
+ }
92
+
93
+ export function rearmVisiblePrefetches() {
94
+ return withRouter(module => module.rearmVisiblePrefetches());
95
+ }
96
+
97
+ // A click intercepted before the runtime lands waits for it. The wait is
98
+ // bounded: a chunk that never arrives (offline, a failed deploy) must still
99
+ // navigate, so the queued click falls back to a real browser navigation rather
100
+ // than leaving the user on a dead link.
101
+ const QUEUED_CLICK_TIMEOUT_MS = 3_000;
102
+
103
+ let pendingClicks: LinkClickTarget[] = [];
104
+ let pendingPop = false;
105
+ let installedFull = false;
106
+ let hardNavTimer: ReturnType<typeof setTimeout> | undefined;
107
+
108
+ function hubLinkClick(event: MouseEvent) {
109
+ const target = linkClickTarget(event);
110
+ if (!target) return;
111
+ event.preventDefault();
112
+ pendingClicks.push(target);
113
+ hardNavTimer ??= setTimeout(() => {
114
+ const queued = pendingClicks[0];
115
+ if (queued) location.href = queued.url.href;
116
+ }, QUEUED_CLICK_TIMEOUT_MS);
117
+ void loadRuntime();
118
+ }
119
+
120
+ // The browser has already committed the traversal (URL and history state are
121
+ // the target's). Record it and let the installed handler run it as an ordinary
122
+ // popstate; broadcasting here would move `observedLocationKey` and make that
123
+ // handler read the traversal as a shallow one that needs no document.
124
+ function hubPopState() {
125
+ pendingPop = true;
126
+ void loadRuntime();
127
+ }
128
+
129
+ function loadRuntime() {
130
+ return withRouter(module => {
131
+ if (!installedFull) {
132
+ installedFull = true;
133
+ document.removeEventListener('click', hubLinkClick);
134
+ window.removeEventListener('popstate', hubPopState);
135
+ module.installRouterFull();
136
+ }
137
+ clearTimeout(hardNavTimer);
138
+ hardNavTimer = undefined;
139
+ const clicks = pendingClicks;
140
+ pendingClicks = [];
141
+ for (const click of clicks) module.commitLinkNavigation(click);
142
+ if (pendingPop) {
143
+ pendingPop = false;
144
+ module.onPopState();
145
+ }
146
+ });
147
+ }
148
+
149
+ function whenIdle(run: () => void) {
150
+ if (typeof requestIdleCallback === 'function') requestIdleCallback(() => run(), { timeout: 1000 });
151
+ else setTimeout(run, 1);
152
+ }
153
+
154
+ export function installRouter() {
155
+ if ((!process.browser && typeof window === 'undefined') || window.__PNEXT_ROUTER_INSTALLED__) return;
156
+ window.__PNEXT_ROUTER_INSTALLED__ = true;
157
+ if ('scrollRestoration' in history) history.scrollRestoration = 'manual';
158
+ // Seed the bfcache departing key with the hard-loaded route so the first
159
+ // navigation away stashes this route's island state under the right key.
160
+ // `locationKey()` IS `bfRouteKey(location.pathname, location.search)` — the
161
+ // hub's own definition — and it is already on the first-paint graph.
162
+ routerState.activeRouteKey = locationKey();
163
+
164
+ document.addEventListener('click', hubLinkClick);
165
+ window.addEventListener('popstate', hubPopState);
166
+ whenIdle(() => void loadRuntime());
167
+ }