@wular/pnext 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/README.md +11 -11
  2. package/bin/pnext +1 -1
  3. package/config/lint/base.js +7 -7
  4. package/config/ts/base.json +2 -4
  5. package/config/ts/react.json +2 -6
  6. package/package.json +23 -2
  7. package/reference/compat.md +1 -1
  8. package/reference/config.md +2 -2
  9. package/reference/css.md +13 -9
  10. package/reference/dev.md +1 -1
  11. package/reference/metadata.md +7 -7
  12. package/reference/navigation.md +35 -28
  13. package/reference/performance.md +70 -70
  14. package/reference/rendering.md +17 -17
  15. package/reference/routing.md +17 -17
  16. package/reference/typegen.md +12 -8
  17. package/src/api/cache.ts +36 -37
  18. package/src/api/client-cache.ts +2 -2
  19. package/src/api/client-navigation.ts +113 -109
  20. package/src/api/dynamic.tsx +58 -55
  21. package/src/api/link.tsx +49 -52
  22. package/src/api/navigation.ts +59 -58
  23. package/src/api/server.ts +152 -144
  24. package/src/api/suspense.ts +4 -4
  25. package/src/cli/adapters/vercel-warm.ts +126 -121
  26. package/src/cli/adapters/vercel.ts +437 -443
  27. package/src/cli/analyze.ts +333 -144
  28. package/src/cli/{named-bin.ts → boot/named-bin.ts} +37 -37
  29. package/src/cli/{boot-trace.ts → boot/trace.ts} +10 -10
  30. package/src/cli/build.ts +976 -978
  31. package/src/cli/create.ts +71 -63
  32. package/src/cli/dev.ts +116 -116
  33. package/src/cli/index.ts +88 -85
  34. package/src/cli/migrate/package-json.ts +73 -71
  35. package/src/cli/migrate/report.ts +32 -33
  36. package/src/cli/migrate/{index.ts → run.ts} +48 -49
  37. package/src/cli/migrate/scan.ts +46 -46
  38. package/src/cli/migrate/spinner.ts +9 -9
  39. package/src/cli/migrate/tsconfig.ts +35 -35
  40. package/src/cli/{server-entry.ts → serve/entry.ts} +57 -57
  41. package/src/cli/{request-pipeline.ts → serve/pipeline.ts} +386 -394
  42. package/src/cli/{serve-ui.ts → serve/ui.ts} +47 -47
  43. package/src/cli/start.ts +65 -66
  44. package/src/{typegen.ts → cli/typegen.ts} +59 -59
  45. package/src/client/build.ts +794 -768
  46. package/src/client/chunk-fold.ts +245 -240
  47. package/src/client/{paths.ts → chunk-name.ts} +6 -6
  48. package/src/client/entry.ts +162 -147
  49. package/src/client/prebuilt.ts +231 -223
  50. package/src/client/profile.ts +29 -29
  51. package/src/client/react-compiler.ts +20 -15
  52. package/src/client/{compat-surface.ts → react-tier.ts} +64 -64
  53. package/src/client/reference-stub.ts +51 -51
  54. package/src/client/reference.ts +19 -19
  55. package/src/{api → client}/router/events.ts +17 -17
  56. package/src/{api → client}/router/history.ts +16 -16
  57. package/src/{api → client}/router/hub.ts +52 -53
  58. package/src/{api/router.ts → client/router/index.ts} +61 -60
  59. package/src/{api → client}/router/policies.ts +24 -24
  60. package/src/{api → client}/router/runtime.ts +1988 -1992
  61. package/src/{api → client}/router/types.ts +93 -98
  62. package/src/compat/actions/client-plugin.ts +42 -43
  63. package/src/compat/actions/client-stub.ts +14 -14
  64. package/src/compat/actions/{action-client.ts → client.ts} +194 -193
  65. package/src/compat/actions/config.ts +63 -64
  66. package/src/compat/actions/detect.ts +68 -68
  67. package/src/compat/actions/discovery.ts +105 -105
  68. package/src/compat/actions/{action-dispatch.ts → dispatch.ts} +277 -274
  69. package/src/compat/actions/early-submit.ts +1 -1
  70. package/src/compat/actions/endpoint.ts +198 -198
  71. package/src/compat/actions/extensions.ts +811 -0
  72. package/src/compat/actions/flight.ts +23 -23
  73. package/src/compat/actions/form-state.ts +34 -34
  74. package/src/compat/actions/hoist.ts +382 -236
  75. package/src/compat/actions/ids.ts +7 -12
  76. package/src/compat/actions/index.ts +8 -8
  77. package/src/compat/actions/instances.ts +46 -46
  78. package/src/compat/actions/origin.ts +47 -48
  79. package/src/compat/actions/protocol.ts +22 -22
  80. package/src/compat/actions/registry.ts +19 -19
  81. package/src/compat/{misc/action-return.ts → actions/return.ts} +60 -57
  82. package/src/compat/actions/rewrite.ts +125 -125
  83. package/src/compat/actions/{action-router.ts → router.ts} +10 -10
  84. package/src/compat/actions/serve.ts +132 -136
  85. package/src/compat/actions/server-tag.ts +4 -4
  86. package/src/compat/actions/{action-shared.ts → shared.ts} +34 -34
  87. package/src/compat/actions/unrecognized-error.ts +4 -4
  88. package/src/compat/{index.ts → aliases.ts} +112 -109
  89. package/src/compat/bundler/bun-externals.ts +18 -18
  90. package/src/compat/bundler/cjs-exports.ts +271 -223
  91. package/src/compat/bundler/config.ts +116 -111
  92. package/src/compat/bundler/externals.ts +12 -12
  93. package/src/compat/bundler/import-meta-url.ts +19 -19
  94. package/src/compat/bundler/modularize-imports.ts +36 -33
  95. package/src/compat/bundler/new-url-asset.ts +22 -24
  96. package/src/compat/bundler/optimize-package-imports.ts +111 -107
  97. package/src/compat/bundler/polyfill.ts +28 -28
  98. package/src/compat/bundler/react-compiler.ts +35 -29
  99. package/src/compat/bundler/react-profiler.tsx +11 -11
  100. package/src/compat/bundler/relay-transform.ts +48 -47
  101. package/src/compat/bundler/require-context.ts +119 -113
  102. package/src/compat/bundler/resolve-extensions.ts +19 -19
  103. package/src/compat/bundler/source-cache.ts +25 -25
  104. package/src/compat/bundler/static-imports.ts +7 -7
  105. package/src/compat/bundler/symlink-imports.ts +46 -46
  106. package/src/compat/bundler/tsconfig-paths.ts +13 -15
  107. package/src/compat/bundler/wasm.ts +58 -60
  108. package/src/compat/bundler/webpack-loaders.ts +254 -241
  109. package/src/compat/bundler/worker.ts +101 -104
  110. package/src/compat/cache/build-flags.ts +29 -29
  111. package/src/compat/cache/build-prerender-errors.ts +40 -44
  112. package/src/compat/cache/custom-handler.ts +60 -53
  113. package/src/compat/cache/fetch-patch.ts +240 -240
  114. package/src/compat/cache/handler.ts +27 -31
  115. package/src/compat/cache/modern-handler.ts +148 -126
  116. package/src/compat/cache/resume-data-cache.ts +47 -45
  117. package/src/compat/cache/revalidate.ts +233 -232
  118. package/src/compat/cache/runtime-error.ts +35 -35
  119. package/src/compat/cache/use-cache-transform.ts +442 -417
  120. package/src/compat/cache/use-cache.ts +650 -614
  121. package/src/compat/cache-control.ts +140 -142
  122. package/src/compat/client/base-path.ts +21 -20
  123. package/src/compat/client/css-order.ts +18 -18
  124. package/src/compat/client/errors/bare-boundary.ts +11 -11
  125. package/src/compat/client/errors/control-flow.ts +23 -23
  126. package/src/compat/client/errors/error-boundary.ts +61 -61
  127. package/src/compat/client/errors/global-error.ts +101 -91
  128. package/src/compat/client/errors/install.ts +71 -72
  129. package/src/compat/client/errors/lazy.ts +23 -23
  130. package/src/compat/client/errors/primitive-throw.ts +47 -45
  131. package/src/compat/client/errors/soft-refresh.ts +4 -4
  132. package/src/compat/client/link-status.ts +33 -33
  133. package/src/compat/client/{nav-compat-runtime.ts → nav-runtime.ts} +20 -20
  134. package/src/compat/client/{nav-compat.ts → nav.ts} +12 -13
  135. package/src/compat/client/navigation-scroll.ts +63 -63
  136. package/src/compat/client/optimistic-routing.ts +93 -88
  137. package/src/compat/client/prefetch-cache.ts +23 -24
  138. package/src/compat/client/route-announcer.ts +35 -35
  139. package/src/compat/client/segment-cache-policy.ts +20 -20
  140. package/src/compat/client/segment-cache.ts +309 -315
  141. package/src/compat/client/segment-prefetch.ts +127 -132
  142. package/src/compat/client/trailing-slash.ts +5 -4
  143. package/src/compat/css/chunking.ts +113 -116
  144. package/src/compat/css/inline-css.ts +21 -21
  145. package/src/compat/css/lightningcss.ts +37 -38
  146. package/src/compat/css/modules.ts +161 -175
  147. package/src/compat/css/nonce.ts +7 -7
  148. package/src/compat/css/sass-plugin.ts +18 -21
  149. package/src/compat/css/sass.ts +150 -152
  150. package/src/compat/css/styled-jsx-runtime.ts +27 -27
  151. package/src/compat/css/styled-jsx.ts +21 -21
  152. package/src/compat/edge-runtime.ts +27 -27
  153. package/src/compat/{adapter → export}/build-complete.ts +72 -75
  154. package/src/compat/export/client.ts +29 -31
  155. package/src/compat/export/{index.ts → emit.ts} +111 -110
  156. package/src/compat/export/standalone.ts +62 -54
  157. package/src/compat/image-optimizer/cache.ts +51 -49
  158. package/src/compat/image-optimizer/detect.ts +52 -52
  159. package/src/compat/image-optimizer/{index.ts → optimize.ts} +189 -194
  160. package/src/compat/image-optimizer/source.ts +77 -80
  161. package/src/compat/lifecycle/after-scope.ts +26 -26
  162. package/src/compat/lifecycle/after.ts +48 -45
  163. package/src/compat/lifecycle/error-funnel.ts +98 -102
  164. package/src/compat/lifecycle/error-serialize.ts +30 -26
  165. package/src/compat/lifecycle/error-ui.ts +67 -32
  166. package/src/compat/lifecycle/instrumentation-client.ts +36 -38
  167. package/src/compat/lifecycle/instrumentation.ts +85 -85
  168. package/src/compat/lifecycle/node-console.ts +11 -11
  169. package/src/compat/lifecycle/testmode.ts +160 -132
  170. package/src/compat/mdx/compile.ts +60 -57
  171. package/src/compat/mdx/plugin.ts +11 -11
  172. package/src/compat/mdx/{next-mdx-stub.ts → stub.ts} +5 -5
  173. package/src/compat/{metadata-route-artifacts.ts → metadata-artifacts.ts} +195 -191
  174. package/src/compat/metadata.ts +75 -81
  175. package/src/compat/next/cache.ts +68 -69
  176. package/src/compat/next/canonical-url.ts +9 -9
  177. package/src/compat/next/client-cache.ts +19 -19
  178. package/src/compat/next/client-navigation.ts +112 -116
  179. package/src/compat/next/client-only.ts +1 -1
  180. package/src/compat/next/client-script.tsx +99 -93
  181. package/src/compat/next/client-server.ts +10 -10
  182. package/src/compat/next/config-loader.ts +176 -173
  183. package/src/compat/next/config.ts +7 -7
  184. package/src/compat/next/constants.cjs +6 -6
  185. package/src/compat/next/constants.ts +6 -6
  186. package/src/compat/next/custom-server.ts +26 -24
  187. package/src/compat/next/dist/client/components/app-router-headers.ts +21 -21
  188. package/src/compat/next/dist/server/app-render/work-unit-async-storage.external.cjs +3 -4
  189. package/src/compat/next/dist/server/web/spec-extension/revalidate.ts +1 -1
  190. package/src/compat/next/dist/server/web/spec-extension/unstable-cache.ts +1 -1
  191. package/src/compat/next/dist/server/web/spec-extension/unstable-no-store.ts +1 -1
  192. package/src/compat/next/dynamic.tsx +21 -18
  193. package/src/compat/next/error.tsx +52 -52
  194. package/src/compat/next/font/cache.ts +74 -74
  195. package/src/compat/next/font/google.ts +2 -2
  196. package/src/compat/next/font/index.ts +1 -1
  197. package/src/compat/next/font/local.ts +3 -3
  198. package/src/compat/next/font/runtime-client.ts +17 -15
  199. package/src/compat/next/font/runtime.ts +443 -408
  200. package/src/compat/next/font/shared.ts +120 -108
  201. package/src/compat/next/form.tsx +63 -63
  202. package/src/compat/next/head.tsx +2 -2
  203. package/src/compat/next/headers.ts +103 -95
  204. package/src/compat/next/image/client.tsx +220 -0
  205. package/src/compat/next/image/config.ts +56 -58
  206. package/src/compat/next/image/optimizer.ts +40 -36
  207. package/src/compat/next/image/patterns.ts +37 -40
  208. package/src/compat/next/{image-props.ts → image/props.ts} +208 -202
  209. package/src/compat/next/image/shared.ts +65 -57
  210. package/src/compat/next/image/static-metadata.ts +98 -107
  211. package/src/compat/next/image/validate.ts +79 -88
  212. package/src/compat/next/image.tsx +19 -23
  213. package/src/compat/next/index.ts +1 -1
  214. package/src/compat/next/legacy-image.tsx +59 -60
  215. package/src/compat/next/{link-validation-transform.ts → link-transform.ts} +95 -96
  216. package/src/compat/next/link.tsx +158 -158
  217. package/src/compat/next/navigation.cjs +12 -3
  218. package/src/compat/next/navigation.ts +48 -50
  219. package/src/compat/next/offline.ts +27 -27
  220. package/src/compat/next/og.ts +121 -124
  221. package/src/compat/next/preferred-region.ts +13 -14
  222. package/src/compat/next/redirects.ts +58 -56
  223. package/src/compat/next/resource-hints.ts +73 -76
  224. package/src/compat/next/rewrites.ts +130 -133
  225. package/src/compat/next/root-params.ts +45 -45
  226. package/src/compat/next/{optimistic-route-state.ts → route-state.ts} +52 -52
  227. package/src/compat/next/router.cjs +4 -2
  228. package/src/compat/next/router.ts +58 -61
  229. package/src/compat/next/script.tsx +108 -108
  230. package/src/compat/next/server-only.ts +1 -1
  231. package/src/compat/next/server.ts +19 -19
  232. package/src/compat/next/svgr.ts +18 -17
  233. package/src/compat/next/telemetry.ts +24 -24
  234. package/src/compat/next/{image-usage.ts → usage.ts} +70 -39
  235. package/src/compat/next/user-agent.ts +53 -49
  236. package/src/compat/next/web-vitals.ts +22 -24
  237. package/src/compat/otel/api.ts +41 -41
  238. package/src/compat/otel/client-trace-metadata.ts +25 -27
  239. package/src/compat/otel/fetch-span.ts +29 -29
  240. package/src/compat/otel/tracer.ts +331 -331
  241. package/src/compat/pages/api.ts +456 -0
  242. package/src/compat/pages/client-plugin.ts +36 -36
  243. package/src/compat/pages/router-state.ts +34 -34
  244. package/src/compat/pages/{index.ts → router.ts} +130 -135
  245. package/src/compat/ppr/io.ts +12 -12
  246. package/src/compat/ppr/missing-root-params.ts +34 -38
  247. package/src/compat/ppr/root-params-scan.ts +66 -66
  248. package/src/compat/ppr/root-params-transform.ts +24 -26
  249. package/src/compat/ppr/root-params.ts +30 -30
  250. package/src/compat/ppr/segment-config-incompat.ts +6 -7
  251. package/src/compat/protocol.ts +71 -70
  252. package/src/compat/react/action-state.ts +47 -48
  253. package/src/compat/react/client-lite.ts +15 -15
  254. package/src/compat/react/client.ts +4 -4
  255. package/src/compat/react/compiler-runtime.ts +11 -11
  256. package/src/compat/react/dom-client.ts +44 -44
  257. package/src/compat/react/dom-react-server.ts +10 -16
  258. package/src/compat/react/dom-server.ts +10 -10
  259. package/src/compat/react/dom.ts +52 -52
  260. package/src/compat/react/hooks-extra.ts +34 -35
  261. package/src/compat/react/parity.ts +64 -61
  262. package/src/compat/react/preact.ts +81 -82
  263. package/src/compat/react/react-server.ts +28 -28
  264. package/src/compat/react/router-shim.ts +1 -1
  265. package/src/compat/react/server-component-use.ts +8 -8
  266. package/src/compat/react/server-inserted-html.ts +30 -31
  267. package/src/compat/react/server.ts +53 -55
  268. package/src/compat/react/use.ts +32 -32
  269. package/src/compat/react/view-transition.ts +20 -20
  270. package/src/compat/register/actions.ts +35 -824
  271. package/src/compat/register/boot.ts +41 -41
  272. package/src/compat/register/build-tier.ts +5 -5
  273. package/src/compat/register/build.ts +74 -70
  274. package/src/compat/register/bundler.ts +161 -156
  275. package/src/compat/register/cache.ts +20 -20
  276. package/src/compat/register/client-errors.ts +3 -3
  277. package/src/compat/register/config.ts +6 -6
  278. package/src/compat/register/css-extras.ts +30 -34
  279. package/src/compat/register/edge-runtime.ts +3 -3
  280. package/src/compat/register/errors.ts +10 -12
  281. package/src/compat/register/export.ts +16 -16
  282. package/src/compat/register/font.ts +11 -11
  283. package/src/compat/register/hooks.ts +2 -2
  284. package/src/compat/register/image.ts +40 -40
  285. package/src/compat/register/index.ts +59 -62
  286. package/src/compat/register/instrumentation-client.ts +10 -10
  287. package/src/compat/register/lifecycle.ts +25 -28
  288. package/src/compat/register/mdx.ts +10 -10
  289. package/src/compat/register/middleware.ts +226 -16
  290. package/src/compat/register/otel.ts +80 -88
  291. package/src/compat/register/pages-api.ts +10 -463
  292. package/src/compat/register/ppr.ts +16 -16
  293. package/src/compat/register/protocol.ts +17 -18
  294. package/src/compat/register/proxy.ts +49 -51
  295. package/src/compat/register/render.ts +79 -76
  296. package/src/compat/register/routing.ts +162 -159
  297. package/src/compat/register/segment.ts +24 -1897
  298. package/src/compat/register/static-image.ts +3 -3
  299. package/src/compat/register/{misc.ts → taint.ts} +9 -9
  300. package/src/compat/register/typed-routes.ts +14 -14
  301. package/src/compat/register/{usecache.ts → use-cache.ts} +39 -39
  302. package/src/compat/register/validation.ts +18 -18
  303. package/src/compat/segment/loading-boundary.ts +43 -45
  304. package/src/compat/segment/page-slot.ts +69 -69
  305. package/src/compat/segment/serve.ts +1884 -0
  306. package/src/compat/segment/tree.ts +113 -112
  307. package/src/compat/segment/vary-key.ts +38 -38
  308. package/src/compat/segment/vary-params.ts +138 -142
  309. package/src/compat/static-params.ts +14 -12
  310. package/src/compat/tsconfig-defaults.ts +87 -91
  311. package/src/compat/typecheck/{index.ts → check.ts} +234 -212
  312. package/src/compat/typecheck/worker.ts +15 -12
  313. package/src/compat/typed-routes/{index.ts → generate.ts} +36 -36
  314. package/src/compat/typed-routes/manifest.ts +174 -170
  315. package/src/compat/typed-routes/typegen.ts +127 -110
  316. package/src/compat/validation/errors.ts +16 -19
  317. package/src/compat/validation/prerender-diagnostics.ts +521 -504
  318. package/src/compat/validation/{index.ts → validate.ts} +647 -648
  319. package/src/compat-bootstrap.ts +16 -16
  320. package/src/config.ts +69 -69
  321. package/src/css/build.ts +230 -227
  322. package/src/css/postcss.ts +79 -80
  323. package/src/css/worker.ts +14 -15
  324. package/src/dev/client-actions.ts +10 -10
  325. package/src/dev/client-chunk-store.ts +27 -27
  326. package/src/dev/{client-key-cache.ts → restart/client-key.ts} +76 -76
  327. package/src/dev/{restart-cache.ts → restart/enabled.ts} +1 -1
  328. package/src/dev/{global-css-cache.ts → restart/global-css.ts} +91 -83
  329. package/src/dev/{node-module-bundle-cache.ts → restart/node-modules.ts} +24 -24
  330. package/src/dev/{route-bundle-key-cache.ts → restart/route-bundle-key.ts} +53 -53
  331. package/src/dev/{route-facts-cache.ts → restart/route-facts.ts} +82 -82
  332. package/src/dev/server.ts +804 -820
  333. package/src/env.ts +46 -43
  334. package/src/extensions.ts +491 -478
  335. package/src/index.ts +8 -8
  336. package/src/internal.ts +20 -23
  337. package/src/{islands → render}/boundary-error.ts +3 -3
  338. package/src/render/hooks.ts +71 -71
  339. package/src/render/island-context.ts +14 -14
  340. package/src/render/metadata.ts +310 -310
  341. package/src/{ppr-postpone.ts → render/postpone.ts} +5 -5
  342. package/src/{ppr.ts → render/ppr.ts} +244 -245
  343. package/src/render/renderer.ts +2076 -2082
  344. package/src/render/resource-hints.ts +16 -17
  345. package/src/render/slots.tsx +224 -235
  346. package/src/{islands → render}/static-children.ts +9 -12
  347. package/src/{islands → render}/static-slots.ts +37 -37
  348. package/src/{cache/context.ts → request/cache.ts} +20 -20
  349. package/src/request/context.ts +107 -107
  350. package/src/{dynamic/source.ts → resolve/dynamic.ts} +139 -139
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +318 -296
  354. package/src/resolve/source-text.ts +37 -37
  355. package/src/{dynamic → resolve}/tree-shake.ts +132 -128
  356. package/src/routing/forwarded.ts +19 -19
  357. package/src/routing/handler.ts +84 -91
  358. package/src/routing/href.ts +69 -70
  359. package/src/routing/{metadata.ts → metadata-files.ts} +403 -401
  360. package/src/{proxy.ts → routing/proxy.ts} +306 -312
  361. package/src/routing/{request-runtime.ts → request-environment.ts} +10 -10
  362. package/src/routing/routes.ts +827 -815
  363. package/src/routing/slots.ts +164 -160
  364. package/src/runtime/loader.ts +952 -0
  365. package/src/{dev → runtime}/module-cache.ts +309 -287
  366. package/src/{dev → runtime}/module-generations.ts +9 -9
  367. package/src/{dev → runtime}/module-transform.ts +81 -72
  368. package/src/{dev/imports.ts → runtime/modules.ts} +934 -847
  369. package/src/runtime/{server.ts → vendor-build.ts} +848 -1696
  370. package/src/runtime/vendor.ts +425 -404
  371. package/src/styles.d.ts +9 -0
  372. package/src/types.ts +320 -335
  373. package/src/utils/ansi.ts +5 -5
  374. package/src/utils/{source.ts → code.ts} +15 -12
  375. package/src/utils/content-type.ts +3 -3
  376. package/src/utils/decode.ts +2 -2
  377. package/src/utils/dev-profile.ts +13 -13
  378. package/src/utils/error-log.ts +6 -6
  379. package/src/utils/esbuild.ts +18 -18
  380. package/src/utils/fs-cache.ts +13 -13
  381. package/src/utils/fs.ts +57 -49
  382. package/src/utils/html.ts +20 -24
  383. package/src/utils/native-require.ts +8 -8
  384. package/src/utils/serialize.ts +139 -146
  385. package/src/utils/verbose.ts +18 -18
  386. package/src/cli/analyze-print.ts +0 -181
  387. package/src/compat/middleware/manifest.ts +0 -210
  388. package/src/compat/next/image-client.tsx +0 -215
  389. package/src/compat/next/link-usage.ts +0 -29
  390. package/src/css/index.ts +0 -2
  391. package/src/render/index.ts +0 -1
  392. package/src/style-modules.d.ts +0 -9
@@ -7,66 +7,66 @@
7
7
  // - every local source file must still match the stat it was read at, so a font swapped while the
8
8
  // server was not running re-resolves and re-emits.
9
9
  // Nothing here is used by `pnext build`, which owns the directory it just wiped.
10
- import { existsSync, readFileSync, writeFileSync } from 'node:fs';
11
- import { mkdir, stat } from 'node:fs/promises';
12
- import { createHash } from 'node:crypto';
13
- import path from 'node:path';
14
- import type { ResolvedConfig } from '../../../config';
15
- import { restartCacheEnabled } from '../../../dev/restart-cache';
16
- import { writeFileAtomic } from '../../../utils/fs';
17
- import type { MetadataLink } from '../../../types';
10
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs'
11
+ import { mkdir, stat } from 'node:fs/promises'
12
+ import { createHash } from 'node:crypto'
13
+ import path from 'node:path'
14
+ import type { ResolvedConfig } from '../../../config'
15
+ import { restartCacheEnabled } from '../../../dev/restart/enabled'
16
+ import { writeFileAtomic } from '../../../utils/fs'
17
+ import type { MetadataLink } from '../../../types'
18
18
 
19
19
  export interface PersistableFont {
20
- css: string;
21
- preloads: MetadataLink[];
22
- usesFonts: boolean;
23
- files: string[];
20
+ css: string
21
+ preloads: MetadataLink[]
22
+ usesFonts: boolean
23
+ files: string[]
24
24
  /** Local font files the resolution read (google resolutions have none). */
25
- sources?: string[];
25
+ sources?: string[]
26
26
  }
27
27
 
28
28
  /** `[file, mtimeMs, size]` — a local source and the stat it was resolved at. */
29
- type SourceStat = [string, number, number];
29
+ type SourceStat = [string, number, number]
30
30
 
31
31
  interface Entry extends PersistableFont {
32
- sourceStats: SourceStat[];
32
+ sourceStats: SourceStat[]
33
33
  }
34
34
 
35
35
  interface IndexFile {
36
- version: number;
36
+ version: number
37
37
  /** Content hash of the font runtime, so an upgrade never serves its output. */
38
- runtime: string;
39
- fonts: Record<string, Entry>;
38
+ runtime: string
39
+ fonts: Record<string, Entry>
40
40
  }
41
41
 
42
42
  /** Bumped whenever a record's shape changes; an older index is simply ignored. */
43
- const INDEX_VERSION = 1;
43
+ const INDEX_VERSION = 1
44
44
 
45
45
  interface FontIndex {
46
- file: string;
47
- fonts: Map<string, Entry>;
48
- dirty: boolean;
49
- flush?: Timer;
46
+ file: string
47
+ fonts: Map<string, Entry>
48
+ dirty: boolean
49
+ flush?: Timer
50
50
  }
51
51
 
52
- const indexes = new Map<string, FontIndex>();
52
+ const indexes = new Map<string, FontIndex>()
53
53
 
54
54
  function fontIndex(config: ResolvedConfig): FontIndex {
55
- const file = path.join(config.outPath, 'cache', 'fonts', 'index.json');
56
- const existing = indexes.get(file);
57
- if (existing) return existing;
58
- const created: FontIndex = { file, fonts: readIndex(file), dirty: false };
59
- indexes.set(file, created);
55
+ const file = path.join(config.outPath, 'cache', 'fonts', 'index.json')
56
+ const existing = indexes.get(file)
57
+ if (existing) return existing
58
+ const created: FontIndex = { file, fonts: readIndex(file), dirty: false }
59
+ indexes.set(file, created)
60
60
  process.on('exit', () => {
61
- if (!created.dirty) return;
62
- created.dirty = false;
61
+ if (!created.dirty) return
62
+ created.dirty = false
63
63
  try {
64
- writeFileSync(created.file, serializeIndex(created.fonts));
64
+ writeFileSync(created.file, serializeIndex(created.fonts))
65
65
  } catch {
66
66
  // Best effort: a missing index only costs the next boot a re-resolve.
67
67
  }
68
- });
69
- return created;
68
+ })
69
+ return created
70
70
  }
71
71
 
72
72
  /** The recorded resolution for `key`, or undefined when it no longer describes disk. */
@@ -74,72 +74,72 @@ export async function persistedFont(
74
74
  config: ResolvedConfig,
75
75
  key: string,
76
76
  ): Promise<PersistableFont | undefined> {
77
- if (!restartCacheEnabled()) return undefined;
78
- const entry = fontIndex(config).fonts.get(key);
79
- if (!entry) return undefined;
80
- if (!entry.files.every(file => existsSync(file))) return undefined;
77
+ if (!restartCacheEnabled()) return undefined
78
+ const entry = fontIndex(config).fonts.get(key)
79
+ if (!entry) return undefined
80
+ if (!entry.files.every(file => existsSync(file))) return undefined
81
81
  const stats = await Promise.all(
82
82
  entry.sourceStats.map(async ([file, mtimeMs, size]) => {
83
- const current = await stat(file).catch(() => undefined);
84
- return current?.mtimeMs === mtimeMs && current.size === size;
83
+ const current = await stat(file).catch(() => undefined)
84
+ return current?.mtimeMs === mtimeMs && current.size === size
85
85
  }),
86
- );
87
- if (!stats.every(Boolean)) return undefined;
88
- return entry;
86
+ )
87
+ if (!stats.every(Boolean)) return undefined
88
+ return entry
89
89
  }
90
90
 
91
91
  /** Record a finished resolution. Failures are non-fatal — they cost a re-resolve. */
92
92
  export async function persistFont(config: ResolvedConfig, key: string, font: PersistableFont) {
93
- const index = fontIndex(config);
93
+ const index = fontIndex(config)
94
94
  const sourceStats = await Promise.all(
95
95
  (font.sources ?? []).map(async (file): Promise<SourceStat | undefined> => {
96
- const stats = await stat(file).catch(() => undefined);
97
- return stats ? [file, stats.mtimeMs, stats.size] : undefined;
96
+ const stats = await stat(file).catch(() => undefined)
97
+ return stats ? [file, stats.mtimeMs, stats.size] : undefined
98
98
  }),
99
- );
99
+ )
100
100
  // A source that vanished mid-resolve must not be recorded as validated.
101
- if (sourceStats.some(entry => entry === undefined)) return;
102
- index.fonts.set(key, { ...font, sourceStats: sourceStats as SourceStat[] });
103
- persist(index);
101
+ if (sourceStats.some(entry => entry === undefined)) return
102
+ index.fonts.set(key, { ...font, sourceStats: sourceStats as SourceStat[] })
103
+ persist(index)
104
104
  }
105
105
 
106
106
  function persist(index: FontIndex) {
107
- index.dirty = true;
108
- if (index.flush) return;
107
+ index.dirty = true
108
+ if (index.flush) return
109
109
  index.flush = setTimeout(async () => {
110
- index.flush = undefined;
111
- if (!index.dirty) return;
112
- const contents = serializeIndex(index.fonts);
110
+ index.flush = undefined
111
+ if (!index.dirty) return
112
+ const contents = serializeIndex(index.fonts)
113
113
  try {
114
- await mkdir(path.dirname(index.file), { recursive: true });
115
- await writeFileAtomic(index.file, contents);
116
- index.dirty = false;
114
+ await mkdir(path.dirname(index.file), { recursive: true })
115
+ await writeFileAtomic(index.file, contents)
116
+ index.dirty = false
117
117
  } catch {
118
118
  // A write that lost a race with a cache wipe must not look persisted.
119
119
  }
120
- }, 50);
120
+ }, 50)
121
121
  // NOT unref'd: under the dev server this timer never fired, so the index was never written and
122
122
  // every restart re-resolved every font over the network. The `exit` handler above still covers a
123
123
  // process exit inside the window.
124
124
  }
125
125
 
126
126
  function readIndex(file: string) {
127
- const fonts = new Map<string, Entry>();
128
- let parsed: IndexFile | undefined;
127
+ const fonts = new Map<string, Entry>()
128
+ let parsed: IndexFile | undefined
129
129
  try {
130
- parsed = JSON.parse(readFileSync(file, 'utf8')) as IndexFile;
130
+ parsed = JSON.parse(readFileSync(file, 'utf8')) as IndexFile
131
131
  } catch {
132
- return fonts;
132
+ return fonts
133
133
  }
134
134
  if (parsed?.version !== INDEX_VERSION || parsed.runtime !== runtimeFingerprint()) {
135
- return fonts;
135
+ return fonts
136
136
  }
137
137
  for (const [key, entry] of Object.entries(parsed.fonts ?? {})) {
138
138
  if (entry && Array.isArray(entry.files) && Array.isArray(entry.sourceStats)) {
139
- fonts.set(key, entry);
139
+ fonts.set(key, entry)
140
140
  }
141
141
  }
142
- return fonts;
142
+ return fonts
143
143
  }
144
144
 
145
145
  function serializeIndex(fonts: Map<string, Entry>) {
@@ -147,25 +147,25 @@ function serializeIndex(fonts: Map<string, Entry>) {
147
147
  version: INDEX_VERSION,
148
148
  runtime: runtimeFingerprint(),
149
149
  fonts: Object.fromEntries(fonts),
150
- } satisfies IndexFile);
150
+ } satisfies IndexFile)
151
151
  }
152
152
 
153
153
  // The CSS a resolution emits is shaped entirely by this directory's sources, so
154
154
  // editing the font runtime must retire its records the same way editing a font
155
155
  // does. Four small files, once per process.
156
- let fingerprint: string | undefined;
156
+ let fingerprint: string | undefined
157
157
 
158
158
  function runtimeFingerprint() {
159
- if (fingerprint !== undefined) return fingerprint;
160
- const hash = createHash('sha256');
159
+ if (fingerprint !== undefined) return fingerprint
160
+ const hash = createHash('sha256')
161
161
  for (const entry of ['runtime.ts', 'google.ts', 'local.ts', 'shared.ts']) {
162
- const file = new URL(entry, import.meta.url).pathname;
162
+ const file = new URL(entry, import.meta.url).pathname
163
163
  try {
164
- hash.update(`${entry}:${Bun.hash(readFileSync(file)).toString(36)}\0`);
164
+ hash.update(`${entry}:${Bun.hash(readFileSync(file)).toString(36)}\0`)
165
165
  } catch {
166
166
  // ignore unreadable entries
167
167
  }
168
168
  }
169
- fingerprint = hash.digest('hex').slice(0, 16);
170
- return fingerprint;
169
+ fingerprint = hash.digest('hex').slice(0, 16)
170
+ return fingerprint
171
171
  }
@@ -1,2 +1,2 @@
1
- export * from 'next-font/google';
2
- export type { FontDisplay, GoogleFontOptions, NextFont, NextFontWithVariable } from './runtime';
1
+ export * from 'next-font/google'
2
+ export type { FontDisplay, GoogleFontOptions, NextFont, NextFontWithVariable } from './runtime'
@@ -5,4 +5,4 @@ export type {
5
5
  LocalFontSource,
6
6
  NextFont,
7
7
  NextFontWithVariable,
8
- } from './runtime';
8
+ } from './runtime'
@@ -1,5 +1,5 @@
1
- import { localFont } from './runtime';
1
+ import { localFont } from './runtime'
2
2
 
3
- export type { LocalFontOptions, LocalFontSource, NextFont, NextFontWithVariable } from './runtime';
3
+ export type { LocalFontOptions, LocalFontSource, NextFont, NextFontWithVariable } from './runtime'
4
4
 
5
- export default localFont;
5
+ export default localFont
@@ -17,7 +17,7 @@ import {
17
17
  type GoogleFontOptions,
18
18
  type LocalFontOptions,
19
19
  type NextFontWithVariable,
20
- } from './shared';
20
+ } from './shared'
21
21
 
22
22
  export type {
23
23
  FontDisplay,
@@ -26,13 +26,13 @@ export type {
26
26
  LocalFontSource,
27
27
  NextFont,
28
28
  NextFontWithVariable,
29
- } from './shared';
29
+ } from './shared'
30
30
 
31
31
  function fontObject(naming: {
32
- className: string;
33
- variable: string;
34
- hasVariable: boolean;
35
- style: NextFontWithVariable['style'];
32
+ className: string
33
+ variable: string
34
+ hasVariable: boolean
35
+ style: NextFontWithVariable['style']
36
36
  }): NextFontWithVariable {
37
37
  // Plain data object: no registration side effects (the server already emitted
38
38
  // the CSS/assets). Client code reads className/variable/style off this. The
@@ -42,30 +42,32 @@ function fontObject(naming: {
42
42
  const font: NextFontWithVariable = {
43
43
  className: naming.className,
44
44
  style: naming.style,
45
- } as NextFontWithVariable;
46
- if (naming.hasVariable) font.variable = naming.variable;
47
- return font;
45
+ } as NextFontWithVariable
46
+ if (naming.hasVariable) font.variable = naming.variable
47
+ return font
48
48
  }
49
49
 
50
50
  export function googleFont(family: string) {
51
51
  return (options: GoogleFontOptions = {}): NextFontWithVariable =>
52
- fontObject(googleFontNaming(family, options));
52
+ fontObject(googleFontNaming(family, options))
53
53
  }
54
54
 
55
55
  export interface LocalFontLoader {
56
- (options: LocalFontOptions): NextFontWithVariable;
57
- withFile: typeof localFontWithFile;
56
+ (options: LocalFontOptions): NextFontWithVariable
57
+ withFile: typeof localFontWithFile
58
58
  }
59
59
 
60
60
  export function localFontWithFile(callerFile: string | undefined, family?: string) {
61
61
  return (options: LocalFontOptions): NextFontWithVariable =>
62
62
  fontObject({
63
63
  ...localFontNaming(callerFile, options),
64
- ...(family ? { fontFamily: family, style: fontStyle(family, options, options.fallback ?? []) } : {}),
65
- });
64
+ ...(family
65
+ ? { fontFamily: family, style: fontStyle(family, options, options.fallback ?? []) }
66
+ : {}),
67
+ })
66
68
  }
67
69
 
68
70
  export const localFont: LocalFontLoader = Object.assign(
69
71
  (options: LocalFontOptions) => localFontWithFile(undefined)(options),
70
72
  { withFile: localFontWithFile },
71
- );
73
+ )