@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,55 +1,55 @@
1
- // Persisted route-bundle names - the restart half of dev/imports.ts' devRouteBundlePath. A route's
1
+ // Persisted route-bundle names - the restart half of runtime/modules.ts' devRouteBundlePath. A route's
2
2
  // bundle already lives at a content-addressed path, so a restart never has to rebuild it; deriving
3
3
  // that path did, by walking the whole source graph of the route and its layouts breadth-first, with
4
4
  // a stat round trip per level, on the first page of every restart. The sources cannot have moved
5
5
  // while nothing was watching them *unless* the file did, so this persists the walk's answer and
6
6
  // re-validates it with one flat stat per source.
7
7
  //
8
- // The same three-step ladder dev/client-key-cache.ts and dev/route-facts-cache.ts use:
8
+ // The same three-step ladder dev/restart/client-key.ts and dev/restart/route-facts.ts use:
9
9
  // stat matches -> reuse (the common case, and the only O(1) one)
10
10
  // stat moved -> read + hash; equal content still reuses the path
11
11
  // content differs -> discard, walk again, record the new answer
12
12
  // A missing source is a miss too, which is what keeps a deleted file from naming an artifact whose
13
13
  // edges are gone.
14
14
  //
15
- // One file PER ROUTE, not one index, for the reason route-facts-cache records: the source lists are
15
+ // One file PER ROUTE, not one index, for the reason restart/route-facts.ts records: the source lists are
16
16
  // large across the whole table and the first page only ever asks about the route it is serving.
17
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
18
- import { readFile, stat } from 'node:fs/promises';
19
- import path from 'node:path';
20
- import type { ResolvedConfig } from '../config';
17
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'
18
+ import { readFile, stat } from 'node:fs/promises'
19
+ import path from 'node:path'
20
+ import type { ResolvedConfig } from '../../config'
21
21
  import {
22
22
  DEV_SOURCE_MISSING,
23
23
  devTextSourceHash,
24
24
  isBinaryDevSource,
25
25
  type DevGraphSource,
26
- } from './module-cache';
27
- import { restartCacheEnabled } from './restart-cache';
26
+ } from '../../runtime/module-cache'
27
+ import { restartCacheEnabled } from './enabled'
28
28
 
29
29
  interface RecordFile {
30
- version: number;
30
+ version: number
31
31
  /** Hash of everything in the name that is not a walked source (see recordKey). */
32
- key: string;
32
+ key: string
33
33
  /** The named bundle path itself — the whole point of the record. */
34
- bundle: string;
35
- files: DevGraphSource[];
34
+ bundle: string
35
+ files: DevGraphSource[]
36
36
  }
37
37
 
38
38
  /** Bumped whenever a record's shape changes; an older record is simply ignored. */
39
- const RECORD_VERSION = 1;
39
+ const RECORD_VERSION = 1
40
40
 
41
- const hash = (value: string) => Bun.hash(value).toString(36);
41
+ const hash = (value: string) => Bun.hash(value).toString(36)
42
42
 
43
43
  /** Records written this process (by record file), so a repeat naming does not re-serialize. */
44
- const written = new Map<string, string>();
44
+ const written = new Map<string, string>()
45
45
 
46
46
  function enabled() {
47
47
  // eslint-disable-next-line turbo/no-undeclared-env-vars
48
- return restartCacheEnabled() && process.env.PNEXT_DEV_BUNDLE_KEY_CACHE !== '0';
48
+ return restartCacheEnabled() && process.env.PNEXT_DEV_BUNDLE_KEY_CACHE !== '0'
49
49
  }
50
50
 
51
51
  function recordFile(config: ResolvedConfig, routeId: string) {
52
- return path.join(config.outPath, 'cache', 'route-bundles', `${hash(routeId)}.json`);
52
+ return path.join(config.outPath, 'cache', 'route-bundles', `${hash(routeId)}.json`)
53
53
  }
54
54
 
55
55
  /**
@@ -58,7 +58,7 @@ function recordFile(config: ResolvedConfig, routeId: string) {
58
58
  * the record read as a miss instead of half-validating it.
59
59
  */
60
60
  function recordKey(graphKey: string, files: string[]) {
61
- return hash(`${RECORD_VERSION}\n${graphKey}\n${files.join('\0')}`);
61
+ return hash(`${RECORD_VERSION}\n${graphKey}\n${files.join('\0')}`)
62
62
  }
63
63
 
64
64
  /** The persisted bundle path when every source it was named for is unchanged. */
@@ -68,25 +68,25 @@ export async function cachedRouteBundlePath(
68
68
  graphKey: string,
69
69
  files: string[],
70
70
  ): Promise<string | undefined> {
71
- if (!enabled()) return undefined;
72
- const key = recordKey(graphKey, files);
73
- let record: RecordFile | undefined;
71
+ if (!enabled()) return undefined
72
+ const key = recordKey(graphKey, files)
73
+ let record: RecordFile | undefined
74
74
  try {
75
- record = JSON.parse(readFileSync(recordFile(config, routeId), 'utf8')) as RecordFile;
75
+ record = JSON.parse(readFileSync(recordFile(config, routeId), 'utf8')) as RecordFile
76
76
  } catch {
77
- return undefined;
77
+ return undefined
78
78
  }
79
- if (record?.version !== RECORD_VERSION || record.key !== key) return undefined;
80
- if (typeof record.bundle !== 'string' || !Array.isArray(record.files)) return undefined;
81
- const revalidated = await revalidate(record.files);
82
- if (!revalidated) return undefined;
79
+ if (record?.version !== RECORD_VERSION || record.key !== key) return undefined
80
+ if (typeof record.bundle !== 'string' || !Array.isArray(record.files)) return undefined
81
+ const revalidated = await revalidate(record.files)
82
+ if (!revalidated) return undefined
83
83
  // Only the stats moved (a touch, a checkout): keep the name, record the new
84
84
  // stats so the next boot takes the O(1) path again.
85
85
  if (revalidated !== record.files) {
86
- written.delete(recordFile(config, routeId));
87
- write(config, routeId, key, record.bundle, revalidated);
86
+ written.delete(recordFile(config, routeId))
87
+ write(config, routeId, key, record.bundle, revalidated)
88
88
  }
89
- return record.bundle;
89
+ return record.bundle
90
90
  }
91
91
 
92
92
  export function saveRouteBundlePath(
@@ -97,11 +97,11 @@ export function saveRouteBundlePath(
97
97
  bundle: string,
98
98
  sources: DevGraphSource[],
99
99
  ): void {
100
- if (!enabled()) return;
100
+ if (!enabled()) return
101
101
  // A source the walk could not read describes a tree that no longer exists;
102
102
  // the next boot walking again is the safe answer.
103
- if (sources.some(([, , , srcHash]) => srcHash === DEV_SOURCE_MISSING)) return;
104
- write(config, routeId, recordKey(graphKey, files), bundle, sources);
103
+ if (sources.some(([, , , srcHash]) => srcHash === DEV_SOURCE_MISSING)) return
104
+ write(config, routeId, recordKey(graphKey, files), bundle, sources)
105
105
  }
106
106
 
107
107
  function write(
@@ -111,18 +111,18 @@ function write(
111
111
  bundle: string,
112
112
  files: DevGraphSource[],
113
113
  ) {
114
- const file = recordFile(config, routeId);
115
- if (written.get(file) === bundle) return;
116
- written.set(file, bundle);
114
+ const file = recordFile(config, routeId)
115
+ if (written.get(file) === bundle) return
116
+ written.set(file, bundle)
117
117
  const contents = JSON.stringify({
118
118
  version: RECORD_VERSION,
119
119
  key,
120
120
  bundle,
121
121
  files,
122
- } satisfies RecordFile);
122
+ } satisfies RecordFile)
123
123
  try {
124
- mkdirSync(path.dirname(file), { recursive: true });
125
- writeFileSync(file, contents);
124
+ mkdirSync(path.dirname(file), { recursive: true })
125
+ writeFileSync(file, contents)
126
126
  } catch {
127
127
  // Best effort: a missing record only costs the next boot a walk.
128
128
  }
@@ -134,21 +134,21 @@ function write(
134
134
  * walk has to run again.
135
135
  */
136
136
  async function revalidate(files: DevGraphSource[]): Promise<DevGraphSource[] | undefined> {
137
- let moved = false;
137
+ let moved = false
138
138
  const checked = await Promise.all(
139
139
  files.map(async (entry): Promise<DevGraphSource | undefined> => {
140
- const [file, mtimeMs, size, srcHash] = entry;
141
- const stats = await stat(file).catch(() => undefined);
142
- if (!stats) return undefined;
143
- if (stats.mtimeMs === mtimeMs && stats.size === size) return entry;
140
+ const [file, mtimeMs, size, srcHash] = entry
141
+ const stats = await stat(file).catch(() => undefined)
142
+ if (!stats) return undefined
143
+ if (stats.mtimeMs === mtimeMs && stats.size === size) return entry
144
144
  // A binary source is hashed from its stat, so a moved stat IS a new hash.
145
- if (isBinaryDevSource(file)) return undefined;
146
- const source = await readFile(file, 'utf8').catch(() => undefined);
147
- if (source === undefined || devTextSourceHash(source) !== srcHash) return undefined;
148
- moved = true;
149
- return [file, stats.mtimeMs, stats.size, srcHash];
145
+ if (isBinaryDevSource(file)) return undefined
146
+ const source = await readFile(file, 'utf8').catch(() => undefined)
147
+ if (source === undefined || devTextSourceHash(source) !== srcHash) return undefined
148
+ moved = true
149
+ return [file, stats.mtimeMs, stats.size, srcHash]
150
150
  }),
151
- );
152
- if (checked.some(entry => entry === undefined)) return undefined;
153
- return moved ? (checked as DevGraphSource[]) : files;
151
+ )
152
+ if (checked.some(entry => entry === undefined)) return undefined
153
+ return moved ? (checked as DevGraphSource[]) : files
154
154
  }
@@ -5,7 +5,7 @@
5
5
  // cannot have moved while nothing was watching them *unless* the file did, so this persists the
6
6
  // walk's result next to the compiled cache and re-validates it with one stat per source.
7
7
  //
8
- // The same three-step ladder dev/client-key-cache.ts uses:
8
+ // The same three-step ladder dev/restart/client-key.ts uses:
9
9
  // stat matches -> reuse (the common case, and the only O(1) one)
10
10
  // stat moved -> read + hash; equal content still reuses the facts
11
11
  // content differs -> discard, walk again, record the new facts
@@ -13,27 +13,27 @@
13
13
  // One file PER ROUTE, not one index: the whole table is large and the first page only ever asks
14
14
  // about the route it is serving, so as a single index its JSON.parse landed, in full, on that
15
15
  // request and gave most of the walk back.
16
- import { mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';
17
- import path from 'node:path';
18
- import type { ResolvedConfig } from '../config';
19
- import { setRouteFactsStore, type RouteFacts, type RouteFactsStore } from '../routing/routes';
20
- import { restartCacheEnabled } from './restart-cache';
16
+ import { mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs'
17
+ import path from 'node:path'
18
+ import type { ResolvedConfig } from '../../config'
19
+ import { setRouteFactsStore, type RouteFacts, type RouteFactsStore } from '../../routing/routes'
20
+ import { restartCacheEnabled } from './enabled'
21
21
 
22
22
  /** `[file, mtimeMs, size, contentHash]` — the same record shape the key cache uses. */
23
- type SourceEntry = [string, number, number, string];
23
+ type SourceEntry = [string, number, number, string]
24
24
 
25
25
  interface RecordFile {
26
- version: number;
26
+ version: number
27
27
  /** Everything the facts depend on that is not a walked source (see cacheKey). */
28
- key: string;
29
- files: SourceEntry[];
30
- facts: RouteFacts;
28
+ key: string
29
+ files: SourceEntry[]
30
+ facts: RouteFacts
31
31
  }
32
32
 
33
33
  /** Bumped whenever a record's shape changes; an older record is simply ignored. */
34
- const RECORD_VERSION = 1;
34
+ const RECORD_VERSION = 1
35
35
 
36
- const hash = (value: string) => Bun.hash(value).toString(36);
36
+ const hash = (value: string) => Bun.hash(value).toString(36)
37
37
 
38
38
  /**
39
39
  * The facts of a route whose own sources did not move can still change when the
@@ -45,11 +45,11 @@ function cacheKey(config: ResolvedConfig): string | undefined {
45
45
  try {
46
46
  const shape = JSON.stringify(config, (_key, value: unknown) =>
47
47
  typeof value === 'function' ? '[fn]' : value,
48
- );
49
- return hash(`${RECORD_VERSION}\n${pnextBuildStamp()}\n${shape}`);
48
+ )
49
+ return hash(`${RECORD_VERSION}\n${pnextBuildStamp()}\n${shape}`)
50
50
  } catch {
51
51
  // A config that will not serialize (cycles, exotic values) simply opts out.
52
- return undefined;
52
+ return undefined
53
53
  }
54
54
  }
55
55
 
@@ -60,80 +60,80 @@ function cacheKey(config: ResolvedConfig): string | undefined {
60
60
  */
61
61
  function pnextBuildStamp() {
62
62
  try {
63
- const self = Bun.fileURLToPath(import.meta.url);
64
- const scanner = path.join(path.dirname(path.dirname(self)), 'routing', 'routes.ts');
65
- const info = statSync(scanner, { throwIfNoEntry: false });
66
- return info ? `${info.mtimeMs}:${info.size}` : self;
63
+ const self = Bun.fileURLToPath(import.meta.url)
64
+ const scanner = path.join(path.dirname(path.dirname(self)), 'routing', 'routes.ts')
65
+ const info = statSync(scanner, { throwIfNoEntry: false })
66
+ return info ? `${info.mtimeMs}:${info.size}` : self
67
67
  } catch {
68
- return 'unknown';
68
+ return 'unknown'
69
69
  }
70
70
  }
71
71
 
72
72
  interface FactsCache {
73
- dir: string;
74
- key: string;
73
+ dir: string
74
+ key: string
75
75
  /** Records written this process, so a repeat save does not re-serialize. */
76
- written: Set<string>;
76
+ written: Set<string>
77
77
  }
78
78
 
79
79
  export function installRouteFactsCache(config: ResolvedConfig) {
80
- if (!restartCacheEnabled()) return;
80
+ if (!restartCacheEnabled()) return
81
81
  // eslint-disable-next-line turbo/no-undeclared-env-vars
82
- if (process.env.PNEXT_DEV_FACTS_CACHE === '0') return;
83
- const key = cacheKey(config);
84
- if (!key) return;
82
+ if (process.env.PNEXT_DEV_FACTS_CACHE === '0') return
83
+ const key = cacheKey(config)
84
+ if (!key) return
85
85
  const cache: FactsCache = {
86
86
  dir: path.join(config.outPath, 'cache', 'route-facts'),
87
87
  key,
88
88
  written: new Set(),
89
- };
90
- setRouteFactsStore(createStore(cache));
89
+ }
90
+ setRouteFactsStore(createStore(cache))
91
91
  }
92
92
 
93
93
  function recordFile(cache: FactsCache, routeId: string) {
94
- return path.join(cache.dir, `${hash(routeId)}.json`);
94
+ return path.join(cache.dir, `${hash(routeId)}.json`)
95
95
  }
96
96
 
97
97
  function createStore(cache: FactsCache): RouteFactsStore {
98
98
  return {
99
99
  load(routeId) {
100
- const record = readRecord(cache, routeId);
100
+ const record = readRecord(cache, routeId)
101
101
  if (!record) {
102
- stats.misses += 1;
103
- return undefined;
102
+ stats.misses += 1
103
+ return undefined
104
104
  }
105
- const revalidated = revalidate(record.files);
105
+ const revalidated = revalidate(record.files)
106
106
  if (!revalidated) {
107
- stats.misses += 1;
108
- return undefined;
107
+ stats.misses += 1
108
+ return undefined
109
109
  }
110
- stats.hits += 1;
110
+ stats.hits += 1
111
111
  // Only the stats moved (a touch, a checkout): keep the facts, record the
112
112
  // new stats so the next boot takes the O(1) path again.
113
113
  if (revalidated !== record.files) {
114
- cache.written.delete(routeId);
115
- write(cache, routeId, revalidated, record.facts);
114
+ cache.written.delete(routeId)
115
+ write(cache, routeId, revalidated, record.facts)
116
116
  }
117
- return record.facts;
117
+ return record.facts
118
118
  },
119
119
  save(routeId, facts) {
120
- const files = factsSources(facts);
121
- if (!files) return;
122
- write(cache, routeId, files, facts);
120
+ const files = factsSources(facts)
121
+ if (!files) return
122
+ write(cache, routeId, files, facts)
123
123
  },
124
- };
124
+ }
125
125
  }
126
126
 
127
127
  function readRecord(cache: FactsCache, routeId: string): RecordFile | undefined {
128
- let parsed: RecordFile | undefined;
128
+ let parsed: RecordFile | undefined
129
129
  try {
130
- parsed = JSON.parse(readFileSync(recordFile(cache, routeId), 'utf8')) as RecordFile;
130
+ parsed = JSON.parse(readFileSync(recordFile(cache, routeId), 'utf8')) as RecordFile
131
131
  } catch {
132
- return undefined;
132
+ return undefined
133
133
  }
134
- if (parsed?.version !== RECORD_VERSION || parsed.key !== cache.key) return undefined;
135
- if (!parsed.facts || !Array.isArray(parsed.files)) return undefined;
136
- return parsed;
134
+ if (parsed?.version !== RECORD_VERSION || parsed.key !== cache.key) return undefined
135
+ if (!parsed.facts || !Array.isArray(parsed.files)) return undefined
136
+ return parsed
137
137
  }
138
138
 
139
139
  /**
@@ -142,17 +142,17 @@ function readRecord(cache: FactsCache, routeId: string): RecordFile | undefined
142
142
  * once per process per route.
143
143
  */
144
144
  function write(cache: FactsCache, routeId: string, files: SourceEntry[], facts: RouteFacts) {
145
- if (cache.written.has(routeId)) return;
146
- cache.written.add(routeId);
145
+ if (cache.written.has(routeId)) return
146
+ cache.written.add(routeId)
147
147
  const contents = JSON.stringify({
148
148
  version: RECORD_VERSION,
149
149
  key: cache.key,
150
150
  files,
151
151
  facts,
152
- } satisfies RecordFile);
152
+ } satisfies RecordFile)
153
153
  try {
154
- mkdirSync(cache.dir, { recursive: true });
155
- writeFileSync(recordFile(cache, routeId), contents);
154
+ mkdirSync(cache.dir, { recursive: true })
155
+ writeFileSync(recordFile(cache, routeId), contents)
156
156
  } catch {
157
157
  // Best effort: a missing record only costs the next boot a walk.
158
158
  }
@@ -164,25 +164,25 @@ function write(cache: FactsCache, routeId: string, files: SourceEntry[], facts:
164
164
  * answer.
165
165
  */
166
166
  function factsSources(facts: RouteFacts): SourceEntry[] | undefined {
167
- const entries: SourceEntry[] = [];
167
+ const entries: SourceEntry[] = []
168
168
  for (const file of facts.sourceFiles) {
169
- const entry = sourceEntry(file);
170
- if (!entry) return undefined;
171
- entries.push(entry);
169
+ const entry = sourceEntry(file)
170
+ if (!entry) return undefined
171
+ entries.push(entry)
172
172
  }
173
- return entries;
173
+ return entries
174
174
  }
175
175
 
176
176
  function sourceEntry(file: string): SourceEntry | undefined {
177
177
  try {
178
- const source = readFileSync(file, 'utf8');
178
+ const source = readFileSync(file, 'utf8')
179
179
  // Stat AFTER the read: a file that changes between the two records the
180
180
  // older stat, so the next boot re-hashes rather than trusting a stale one.
181
- const info = statSync(file, { throwIfNoEntry: false });
182
- if (!info) return undefined;
183
- return [file, info.mtimeMs, info.size, hash(source)];
181
+ const info = statSync(file, { throwIfNoEntry: false })
182
+ if (!info) return undefined
183
+ return [file, info.mtimeMs, info.size, hash(source)]
184
184
  } catch {
185
- return undefined;
185
+ return undefined
186
186
  }
187
187
  }
188
188
 
@@ -192,32 +192,32 @@ function sourceEntry(file: string): SourceEntry | undefined {
192
192
  * walk has to run again.
193
193
  */
194
194
  function revalidate(files: SourceEntry[]): SourceEntry[] | undefined {
195
- let moved = false;
196
- const checked: SourceEntry[] = [];
195
+ let moved = false
196
+ const checked: SourceEntry[] = []
197
197
  for (const entry of files) {
198
- const [file, mtimeMs, size, contentHash] = entry;
199
- const info = statSync(file, { throwIfNoEntry: false });
200
- if (!info) return undefined;
198
+ const [file, mtimeMs, size, contentHash] = entry
199
+ const info = statSync(file, { throwIfNoEntry: false })
200
+ if (!info) return undefined
201
201
  if (info.mtimeMs === mtimeMs && info.size === size) {
202
- checked.push(entry);
203
- continue;
202
+ checked.push(entry)
203
+ continue
204
204
  }
205
- let source: string;
205
+ let source: string
206
206
  try {
207
- source = readFileSync(file, 'utf8');
207
+ source = readFileSync(file, 'utf8')
208
208
  } catch {
209
- return undefined;
209
+ return undefined
210
210
  }
211
- if (hash(source) !== contentHash) return undefined;
212
- moved = true;
213
- checked.push([file, info.mtimeMs, info.size, contentHash]);
211
+ if (hash(source) !== contentHash) return undefined
212
+ moved = true
213
+ checked.push([file, info.mtimeMs, info.size, contentHash])
214
214
  }
215
- return moved ? checked : files;
215
+ return moved ? checked : files
216
216
  }
217
217
 
218
218
  /** Bisect seam: `PNEXT_DEV_FACTS_STATS=1` prints the hit/miss split at exit. */
219
- const stats = { hits: 0, misses: 0 };
219
+ const stats = { hits: 0, misses: 0 }
220
220
  // eslint-disable-next-line turbo/no-undeclared-env-vars
221
221
  if (process.env.PNEXT_DEV_FACTS_STATS === '1') {
222
- process.on('exit', () => console.log(`route-facts hits=${stats.hits} misses=${stats.misses}`));
222
+ process.on('exit', () => console.log(`route-facts hits=${stats.hits} misses=${stats.misses}`))
223
223
  }