@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,194 @@
1
+ // FIRST-PAINT TIER. Every byte here is in every route entry's static graph, so this module holds
2
+ // only what a click must decide before the navigation runtime lands (link eligibility, soft-URL
3
+ // resolution) and the mutable state both tiers share. The runtime lives behind ./runtime (idle
4
+ // chunk), and because both tiers import THIS module, a seam registered during first paint is already
5
+ // in place when the runtime reads it - nothing is replayed.
6
+ //
7
+ // A symbol only the runtime touches must live in a SEPARATE module even though it would tree-shake
8
+ // out of an entry: this module is a chunk SHARED with the runtime chunk, so anything the runtime
9
+ // imports from here is kept in the first-paint chunk regardless. ./policies, ./history, ./events and
10
+ // the bfcache route key all ride the idle chunk for that reason.
11
+ import type { EntryModule } from './types';
12
+
13
+ // Router-wide mutable state SHARED BY BOTH TIERS. Every field here is committed by more than one
14
+ // region (install, soft nav, popstate), so it lives on one record: a module-level `let` can only be
15
+ // reassigned inside the module that declares it. State only the runtime touches stays in ./runtime.
16
+
17
+ export const routerState = {
18
+ // pathname+search of the URL the router last observed. A popstate that leaves both unchanged is a
19
+ // same-document FRAGMENT traversal - Chrome fires popstate, not just hashchange, for those - and
20
+ // treating one as a history traversal would refetch and swap the body, remounting the live tree
21
+ // under the user's feet.
22
+ observedLocationKey: locationKey(),
23
+ // The route key (pathname+search) of the currently committed navigation, used
24
+ // as the departing key on popstate (where `location` already points at the
25
+ // target). Seeded on router init and updated at each committed navigation.
26
+ activeRouteKey: undefined as string | undefined,
27
+ // The entry id whose document is currently on screen. A traversal to that
28
+ // same id — an app-level shallow pushState now carries the id forward — needs
29
+ // no fetch and no swap: the DOM already is this entry's.
30
+ renderedEntryId: undefined as string | undefined,
31
+ };
32
+
33
+ export function locationKey() {
34
+ return typeof location === 'undefined' ? '' : location.pathname + location.search;
35
+ }
36
+
37
+ // Installers that only the navigation runtime ever observes — compat's policy
38
+ // seams (segment cache, prefetch windows, scroll, stylesheet order). Registering
39
+ // one costs first paint a closure holding an `import()`; the facade runs them
40
+ // while the runtime chunk loads, so a policy is in place before the first fetch.
41
+ const deferredInstalls: (() => unknown)[] = [];
42
+
43
+ export function registerDeferredInstall(install: () => unknown): void {
44
+ deferredInstalls.push(install);
45
+ }
46
+
47
+ export function takeDeferredInstalls(): (() => unknown)[] {
48
+ return deferredInstalls.splice(0);
49
+ }
50
+
51
+ // Compat-registered policy seams FIRST PAINT ITSELF READS. The rest (prefetch
52
+ // windows, loading shells, segment cache, export documents) never runs before a
53
+ // navigation, so they live in ./policies and ride the runtime chunk.
54
+
55
+ // `javascript:` URLs are a navigation-time XSS vector; the router refuses them
56
+ // at every entry point. The generic block lives in core; the user-facing
57
+ // message is framework-specific, so compat supplies a reporter/thrower.
58
+ export let blockedJsUrlReporter: ((url: string) => void) | undefined;
59
+
60
+ export function setBlockedJavascriptUrlReporter(reporter: (url: string) => void) {
61
+ blockedJsUrlReporter = reporter;
62
+ }
63
+
64
+ // basePath boundary: under a configured basePath a same-origin URL OUTSIDE the
65
+ // basePath (a `basePath:false` target) must hard-navigate, not soft-swap. The
66
+ // check is a next.config concern, so compat registers it; pure core returns
67
+ // false (every same-origin URL stays soft-navigable).
68
+ export let softNavBoundary: ((url: URL) => boolean) | undefined;
69
+
70
+ /** Register the compat soft-nav boundary predicate (true → hard navigate). */
71
+ export function setSoftNavBoundary(predicate: (url: URL) => boolean) {
72
+ softNavBoundary = predicate;
73
+ }
74
+
75
+ export function isJavascriptUrl(href: string) {
76
+ // eslint-disable-next-line no-control-regex
77
+ return /^[\u0000-\u0020]*javascript:/i.test(href);
78
+ }
79
+
80
+ /** True when the URL was a blocked javascript: URL (caller must not navigate). */
81
+ export function blockJavascriptUrl(href: string): boolean {
82
+ if (!isJavascriptUrl(href)) return false;
83
+ if (blockedJsUrlReporter) blockedJsUrlReporter(href);
84
+ else if (process.browser || typeof window !== 'undefined') {
85
+ window.dispatchEvent(new CustomEvent('pnext:blocked-javascript-url', { detail: href }));
86
+ }
87
+ return true;
88
+ }
89
+
90
+ // Whether a href is soft-navigable at all — the one navigation decision the
91
+ // first-paint hub has to make synchronously, before the router chunk lands.
92
+
93
+ export function resolveSoftUrl(href: string) {
94
+ let url: URL;
95
+ try {
96
+ url = new URL(href, location.href);
97
+ } catch {
98
+ return null;
99
+ }
100
+ if (url.origin !== location.origin) return null;
101
+ // Under a configured basePath, a same-origin URL that falls OUTSIDE the
102
+ // basePath (a `basePath:false` target) is not part of the app — it must be a
103
+ // real browser navigation, not a soft swap. Pure core / no-basePath: never
104
+ // outside (predicate returns false), so behavior is unchanged.
105
+ if (softNavBoundary?.(url)) return null;
106
+ return url;
107
+ }
108
+
109
+ // The synchronous half of link interception: everything a click's default
110
+ // action must be decided on before the router chunk can be awaited (modifier
111
+ // keys, target/download, javascript: block, same-origin resolution). The hub
112
+ // runs this at first paint and queues the result; the installed router runs it
113
+ // and commits immediately.
114
+
115
+ export interface LinkClickTarget {
116
+ link: HTMLAnchorElement;
117
+ url: URL;
118
+ replace: boolean;
119
+ scroll: boolean;
120
+ }
121
+
122
+ export function linkFromEvent(event: Event) {
123
+ const target = event.target;
124
+ if (!(target instanceof Element)) return null;
125
+ return target.closest<HTMLAnchorElement>('a[data-pnext-link]');
126
+ }
127
+
128
+ /**
129
+ * The navigation a click asks for, or null when the browser should keep the
130
+ * click. Preventing the default action is the caller's job EXCEPT for the two
131
+ * cases resolved entirely here: a blocked `javascript:` URL and a `replace`
132
+ * link pointing outside the app (both return null having acted).
133
+ */
134
+ export function linkClickTarget(event: MouseEvent): LinkClickTarget | null {
135
+ if (event.defaultPrevented) return null;
136
+ if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey)
137
+ return null;
138
+ const link = linkFromEvent(event);
139
+ if (!link) return null;
140
+ if (link.target && link.target !== '_self') return null;
141
+ if (link.hasAttribute('download')) return null;
142
+ const href = link.getAttribute('data-pnext-blocked-href') ?? link.getAttribute('href');
143
+ if (!href) return null;
144
+ // Refuse javascript: URLs before the browser can run them (the anchor's
145
+ // default action is cancellable from this bubble-phase listener).
146
+ if (blockJavascriptUrl(href)) {
147
+ event.preventDefault();
148
+ return null;
149
+ }
150
+ const replace = link.getAttribute('data-pnext-replace') === 'true';
151
+ const url = resolveSoftUrl(href);
152
+ if (!url) {
153
+ if (replace) {
154
+ event.preventDefault();
155
+ window.location.replace(href);
156
+ }
157
+ return null;
158
+ }
159
+ return { link, url, replace, scroll: link.getAttribute('data-pnext-scroll') !== 'false' };
160
+ }
161
+
162
+ // Route entry modules: the cache of imported entries plus the guard that keeps
163
+ // a router-triggered import from auto-mounting into the live document.
164
+
165
+ export const entryModuleCache = new Map<string, EntryModule>();
166
+
167
+ // The document's own entry module registers itself at boot. Without this, the first history
168
+ // traversal back to the hard-loaded route pays a real import() - one task yield - and a test reading
169
+ // the DOM right after history.back() catches the DEPARTING page. With every step of the cached-entry
170
+ // restore microtask-only, the commit lands before any post-traversal task can read.
171
+ if (process.browser || typeof window !== 'undefined') {
172
+ (
173
+ window as unknown as {
174
+ __PNEXT_REGISTER_ENTRY__?: (src: string, module: EntryModule) => void;
175
+ }
176
+ ).__PNEXT_REGISTER_ENTRY__ = (src, module) => {
177
+ const href = entryModuleHref(src);
178
+ if (!entryModuleCache.has(href)) entryModuleCache.set(href, module);
179
+ };
180
+ }
181
+
182
+ // Entries auto-mount when the browser loads them as the document's module
183
+ // script. When this router imports an entry (prefetch warmup or navigation)
184
+ // the DOM they'd mount into is not this document's, so they must not. The
185
+ // counter is only ever non-zero while a router-triggered import is in flight,
186
+ // and hard document loads can never overlap one.
187
+ export function routerImportActive() {
188
+ return (window.__PNEXT_ROUTER_IMPORTS__ ?? 0) > 0;
189
+ }
190
+
191
+ export function entryModuleHref(src: string) {
192
+ return new URL(src, location.href).href;
193
+ }
194
+
@@ -0,0 +1,107 @@
1
+ // IDLE-TIER POLICY SEAMS. Compat registers Next-shaped policies for prefetch windows, loading
2
+ // shells, stylesheet order, the segment cache and export-mode documents; core keeps a flat-TTL
3
+ // default for each. Every one is WRITTEN by compat's deferred installer and READ only inside
4
+ // ./runtime, so this module belongs to neither entry's static graph - it rides the runtime chunk.
5
+ // Seams first paint itself reads stay in ./hub.
6
+ import type {
7
+ LoadingShellPredictionPolicy,
8
+ SegmentCachePolicy,
9
+ StylesheetReconciler,
10
+ } from './types';
11
+
12
+ // Fallback reuse window when compat did not register a staleTime policy (pure
13
+ // core has no static/dynamic split).
14
+ export const PREFETCH_TTL_MS = 30_000;
15
+
16
+ // The static/dynamic staleTime split + experimental.staleTimes override are Next
17
+ // semantics; the policy lives in compat (compat/client/prefetch-cache) and is
18
+ // registered here so core keeps its flat-TTL default when no compat is present.
19
+ export interface PrefetchStaleContext {
20
+ /** Value of `x-nextjs-stale-time` on the prefetch response (seconds), if any. */
21
+ headerStaleTimeSeconds?: number;
22
+ /** True for a full-page (prefetch={true}) prefetch — uses the static window. */
23
+ prefetchFull?: boolean;
24
+ /**
25
+ * The payload is STATIC (a prerender: bytes are a pure function of the URL). Such a route reports
26
+ * its own staleness, which is authoritative - it must not be widened to the configured static
27
+ * window, or a cached static stage outlives the data it was built from.
28
+ */
29
+ static?: boolean;
30
+ /**
31
+ * The payload came from a RUNTIME (request-sampled) prefetch: cookies/headers
32
+ * holes filled at prefetch time. Never static content, so it reuses for the
33
+ * dynamic window at most.
34
+ */
35
+ runtime?: boolean;
36
+ /**
37
+ * A NAVIGATION document of an `allow-runtime` route. Its stale-time header
38
+ * reports the route's public cache window; the request-sampled content it
39
+ * carries is only good for the runtime-prefetch threshold (compat caps it).
40
+ */
41
+ runtimeDocument?: boolean;
42
+ }
43
+ export let prefetchStaleTimePolicy: ((ctx: PrefetchStaleContext) => number) | undefined;
44
+
45
+ /** Register the compat prefetch-staleTime policy (ms). */
46
+ export function setPrefetchStaleTimePolicy(policy: (ctx: PrefetchStaleContext) => number) {
47
+ prefetchStaleTimePolicy = policy;
48
+ }
49
+
50
+ export function prefetchStaleTimeMs(ctx: PrefetchStaleContext): number {
51
+ return prefetchStaleTimePolicy?.(ctx) ?? PREFETCH_TTL_MS;
52
+ }
53
+
54
+ // The loading-shell reuse window (Next's STATIC staleTime: the cached loading
55
+ // boundary of a route outlives its dynamic data). Compat registers the
56
+ // configured static window; core falls back to the flat TTL.
57
+ export let shellStaleTimePolicy: (() => number) | undefined;
58
+ export let loadingShellPredictionPolicy: LoadingShellPredictionPolicy | undefined;
59
+ export let stylesheetReconciler: StylesheetReconciler | undefined;
60
+ export let revalidationPrefetchDelayMs = 0;
61
+
62
+ /** Register the compat loading-shell staleTime (ms) — Next's static window. */
63
+ export function setShellStaleTimePolicy(policy: () => number) {
64
+ shellStaleTimePolicy = policy;
65
+ }
66
+
67
+ /** Register framework-specific matching for cached loading shells. */
68
+ export function setLoadingShellPredictionPolicy(policy: LoadingShellPredictionPolicy) {
69
+ loadingShellPredictionPolicy = policy;
70
+ }
71
+
72
+ /** Register framework-specific stylesheet ordering after a document swap. */
73
+ export function setStylesheetReconciler(reconciler: StylesheetReconciler | undefined) {
74
+ stylesheetReconciler = reconciler;
75
+ }
76
+
77
+ /** Register a framework-specific delay before invalidated prefetches retry. */
78
+ export function setRevalidationPrefetchDelay(delayMs: number) {
79
+ revalidationPrefetchDelayMs = Math.max(0, delayMs);
80
+ }
81
+
82
+ export function shellStaleTimeMs(): number {
83
+ return shellStaleTimePolicy?.() ?? PREFETCH_TTL_MS;
84
+ }
85
+
86
+ // Export-mode document source. An exported build has no server to negotiate with, so its documents
87
+ // come from flat artifacts written beside each page. Registered by compat, and ONLY when the running
88
+ // document came out of an export; once registered it replaces the server protocol wholesale, so a
89
+ // null result is a miss, not a fallback.
90
+ type ExportDocumentFetcher = (
91
+ href: string,
92
+ init: RequestInit,
93
+ prefetch: boolean,
94
+ ) => Promise<{ html: string; finalUrl: string } | null>;
95
+ export let exportDocumentFetcher: ExportDocumentFetcher | undefined;
96
+
97
+ /** Register the compat `output: 'export'` document fetcher. */
98
+ export function setExportDocumentFetcher(fetcher: ExportDocumentFetcher) {
99
+ exportDocumentFetcher = fetcher;
100
+ }
101
+
102
+ // Next's segment cache (compat/client/segment-cache).
103
+ export let segmentCachePolicy: SegmentCachePolicy | undefined;
104
+
105
+ export function setSegmentCachePolicy(policy: SegmentCachePolicy): void {
106
+ segmentCachePolicy = policy;
107
+ }