@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,4 +1,4 @@
1
- // Persisted client cache keys - the restart half of dev/module-cache.ts. A route's client bundle
1
+ // Persisted client cache keys - the restart half of runtime/module-cache.ts. A route's client bundle
2
2
  // already lives in a content-keyed out-dir, so a restart never has to rebuild it; deriving that key
3
3
  // did, by walking every source the route's client graph reaches and hashing the bytes. The bytes
4
4
  // cannot have moved while nothing was watching them *unless* the file did, so this persists the
@@ -10,66 +10,66 @@
10
10
  // content differs -> full walk, new key, new out-dir
11
11
  // so an edit made while the server was not running invalidates, and a touch that changed nothing
12
12
  // does not.
13
- import { readFileSync, writeFileSync } from 'node:fs';
14
- import { mkdir, readFile, stat } from 'node:fs/promises';
15
- import path from 'node:path';
13
+ import { readFileSync, writeFileSync } from 'node:fs'
14
+ import { mkdir, readFile, stat } from 'node:fs/promises'
15
+ import path from 'node:path'
16
16
  import {
17
17
  clientCacheKeyParts,
18
18
  clientCacheStaticHash,
19
19
  clientSourceHash,
20
20
  type ClientCacheSource,
21
- } from '../client/build';
22
- import type { ResolvedConfig } from '../config';
23
- import type { RouteManifestEntry } from '../types';
24
- import { writeFileAtomic } from '../utils/fs';
25
- import { restartCacheEnabled } from './restart-cache';
21
+ } from '../../client/build'
22
+ import type { ResolvedConfig } from '../../config'
23
+ import type { RouteManifestEntry } from '../../types'
24
+ import { writeFileAtomic } from '../../utils/fs'
25
+ import { restartCacheEnabled } from './enabled'
26
26
 
27
27
  /** `[file, mtimeMs, size, contentHash]` — the same record shape the module index uses. */
28
- type SourceEntry = [string, number, number, string];
28
+ type SourceEntry = [string, number, number, string]
29
29
 
30
30
  interface RouteEntry {
31
31
  /** Hash of everything in the key that is not a walked source. */
32
- static: string;
33
- key: string;
34
- files: SourceEntry[];
32
+ static: string
33
+ key: string
34
+ files: SourceEntry[]
35
35
  }
36
36
 
37
37
  interface IndexFile {
38
- version: number;
39
- routes: Record<string, RouteEntry>;
38
+ version: number
39
+ routes: Record<string, RouteEntry>
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 KeyCache {
46
- file: string;
47
- routes: Map<string, RouteEntry>;
48
- dirty: boolean;
49
- flush?: Timer;
50
- retries: number;
46
+ file: string
47
+ routes: Map<string, RouteEntry>
48
+ dirty: boolean
49
+ flush?: Timer
50
+ retries: number
51
51
  }
52
52
 
53
- const caches = new Map<string, KeyCache>();
53
+ const caches = new Map<string, KeyCache>()
54
54
 
55
55
  function keyCache(config: ResolvedConfig): KeyCache {
56
- const file = path.join(config.outPath, 'cache', 'client', 'keys.json');
57
- const existing = caches.get(file);
58
- if (existing) return existing;
59
- const created: KeyCache = { file, routes: readIndex(file), dirty: false, retries: 0 };
60
- caches.set(file, created);
56
+ const file = path.join(config.outPath, 'cache', 'client', 'keys.json')
57
+ const existing = caches.get(file)
58
+ if (existing) return existing
59
+ const created: KeyCache = { file, routes: readIndex(file), dirty: false, retries: 0 }
60
+ caches.set(file, created)
61
61
  // A short-lived process can exit before the debounce fires; without this its
62
62
  // walk would not survive to the next boot.
63
63
  process.on('exit', () => {
64
- if (!created.dirty) return;
65
- created.dirty = false;
64
+ if (!created.dirty) return
65
+ created.dirty = false
66
66
  try {
67
- writeFileSync(created.file, serializeIndex(created.routes));
67
+ writeFileSync(created.file, serializeIndex(created.routes))
68
68
  } catch {
69
69
  // Best effort: a missing index only costs the next boot a walk.
70
70
  }
71
- });
72
- return created;
71
+ })
72
+ return created
73
73
  }
74
74
 
75
75
  /**
@@ -81,35 +81,35 @@ export async function devClientCacheKey(
81
81
  route: RouteManifestEntry,
82
82
  nextCompat: boolean,
83
83
  ): Promise<string> {
84
- if (!restartCacheEnabled()) return (await clientCacheKeyParts(route, nextCompat, config)).key;
85
- const cache = keyCache(config);
86
- const staticHash = await clientCacheStaticHash(route, nextCompat, config);
87
- const entry = cache.routes.get(route.id);
84
+ if (!restartCacheEnabled()) return (await clientCacheKeyParts(route, nextCompat, config)).key
85
+ const cache = keyCache(config)
86
+ const staticHash = await clientCacheStaticHash(route, nextCompat, config)
87
+ const entry = cache.routes.get(route.id)
88
88
  if (entry?.static === staticHash) {
89
- const revalidated = await revalidate(entry.files);
89
+ const revalidated = await revalidate(entry.files)
90
90
  if (revalidated) {
91
91
  // Only the stats moved (a touch, a checkout): keep the key, record the
92
92
  // new stats so the next boot takes the O(1) path again.
93
93
  if (revalidated !== entry.files) {
94
- cache.routes.set(route.id, { ...entry, files: revalidated });
95
- persist(cache);
94
+ cache.routes.set(route.id, { ...entry, files: revalidated })
95
+ persist(cache)
96
96
  }
97
- return entry.key;
97
+ return entry.key
98
98
  }
99
99
  }
100
100
 
101
- const parts = await clientCacheKeyParts(route, nextCompat, config, staticHash);
101
+ const parts = await clientCacheKeyParts(route, nextCompat, config, staticHash)
102
102
  cache.routes.set(route.id, {
103
103
  static: parts.staticHash,
104
104
  key: parts.key,
105
105
  files: parts.sources.map(sourceEntry),
106
- });
107
- persist(cache);
108
- return parts.key;
106
+ })
107
+ persist(cache)
108
+ return parts.key
109
109
  }
110
110
 
111
111
  function sourceEntry(source: ClientCacheSource): SourceEntry {
112
- return [source.file, source.mtimeMs, source.size, source.hash];
112
+ return [source.file, source.mtimeMs, source.size, source.hash]
113
113
  }
114
114
 
115
115
  /**
@@ -118,61 +118,61 @@ function sourceEntry(source: ClientCacheSource): SourceEntry {
118
118
  * walk has to run again.
119
119
  */
120
120
  async function revalidate(files: SourceEntry[]): Promise<SourceEntry[] | undefined> {
121
- let moved = false;
121
+ let moved = false
122
122
  const checked = await Promise.all(
123
123
  files.map(async (entry): Promise<SourceEntry | undefined> => {
124
- const [file, mtimeMs, size, hash] = entry;
125
- const stats = await stat(file).catch(() => undefined);
126
- if (!stats) return undefined;
127
- if (stats.mtimeMs === mtimeMs && stats.size === size) return entry;
128
- const source = await readFile(file, 'utf8').catch(() => undefined);
129
- if (source === undefined || clientSourceHash(source) !== hash) return undefined;
130
- moved = true;
131
- return [file, stats.mtimeMs, stats.size, hash];
124
+ const [file, mtimeMs, size, hash] = entry
125
+ const stats = await stat(file).catch(() => undefined)
126
+ if (!stats) return undefined
127
+ if (stats.mtimeMs === mtimeMs && stats.size === size) return entry
128
+ const source = await readFile(file, 'utf8').catch(() => undefined)
129
+ if (source === undefined || clientSourceHash(source) !== hash) return undefined
130
+ moved = true
131
+ return [file, stats.mtimeMs, stats.size, hash]
132
132
  }),
133
- );
134
- if (checked.some(entry => entry === undefined)) return undefined;
135
- return moved ? (checked as SourceEntry[]) : files;
133
+ )
134
+ if (checked.some(entry => entry === undefined)) return undefined
135
+ return moved ? (checked as SourceEntry[]) : files
136
136
  }
137
137
 
138
138
  function persist(cache: KeyCache) {
139
- cache.dirty = true;
140
- if (cache.flush) return;
139
+ cache.dirty = true
140
+ if (cache.flush) return
141
141
  cache.flush = setTimeout(async () => {
142
- cache.flush = undefined;
143
- if (!cache.dirty) return;
144
- const contents = serializeIndex(cache.routes);
142
+ cache.flush = undefined
143
+ if (!cache.dirty) return
144
+ const contents = serializeIndex(cache.routes)
145
145
  try {
146
- await mkdir(path.dirname(cache.file), { recursive: true });
147
- await writeFileAtomic(cache.file, contents);
148
- cache.dirty = false;
146
+ await mkdir(path.dirname(cache.file), { recursive: true })
147
+ await writeFileAtomic(cache.file, contents)
148
+ cache.dirty = false
149
149
  } catch {
150
150
  // A write that lost a race with a cache wipe must not look persisted.
151
- if (++cache.retries < 3) persist(cache);
151
+ if (++cache.retries < 3) persist(cache)
152
152
  }
153
- }, 50);
153
+ }, 50)
154
154
  // The index is a pure optimization; never hold the process open for it.
155
- cache.flush.unref?.();
155
+ cache.flush.unref?.()
156
156
  }
157
157
 
158
158
  function readIndex(file: string) {
159
- const routes = new Map<string, RouteEntry>();
160
- let parsed: IndexFile | undefined;
159
+ const routes = new Map<string, RouteEntry>()
160
+ let parsed: IndexFile | undefined
161
161
  try {
162
- parsed = JSON.parse(readFileSync(file, 'utf8')) as IndexFile;
162
+ parsed = JSON.parse(readFileSync(file, 'utf8')) as IndexFile
163
163
  } catch {
164
- return routes;
164
+ return routes
165
165
  }
166
- if (parsed?.version !== INDEX_VERSION) return routes;
166
+ if (parsed?.version !== INDEX_VERSION) return routes
167
167
  for (const [id, entry] of Object.entries(parsed.routes ?? {})) {
168
- if (entry?.key && entry.static && Array.isArray(entry.files)) routes.set(id, entry);
168
+ if (entry?.key && entry.static && Array.isArray(entry.files)) routes.set(id, entry)
169
169
  }
170
- return routes;
170
+ return routes
171
171
  }
172
172
 
173
173
  function serializeIndex(routes: Map<string, RouteEntry>) {
174
174
  return JSON.stringify({
175
175
  version: INDEX_VERSION,
176
176
  routes: Object.fromEntries(routes),
177
- } satisfies IndexFile);
177
+ } satisfies IndexFile)
178
178
  }
@@ -6,5 +6,5 @@
6
6
  */
7
7
  export function restartCacheEnabled() {
8
8
  // eslint-disable-next-line turbo/no-undeclared-env-vars
9
- return process.env.PNEXT_DEV_RESTART_CACHE !== '0';
9
+ return process.env.PNEXT_DEV_RESTART_CACHE !== '0'
10
10
  }
@@ -4,34 +4,34 @@
4
4
  // first page: the warm tier builds global.css and the render asks `globalCssHref` whether there is
5
5
  // any.
6
6
  //
7
- // The same three-step ladder route-facts-cache.ts uses:
7
+ // The same three-step ladder restart/route-facts.ts uses:
8
8
  // stat matches -> reuse (the common case, and the only O(1) one)
9
9
  // stat moved -> read + hash; equal content still reuses the answer
10
10
  // content differs -> discard, walk again, record the new answer
11
11
  // Paths the walk found ABSENT are re-checked too: a stylesheet restored while the server was not
12
12
  // running adds an edge that no importer's bytes record.
13
- import { mkdirSync, existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
14
- import path from 'node:path';
15
- import type { ResolvedConfig } from '../config';
16
- import { setGlobalCssSourceStore, type GlobalCssSourceStore } from '../css';
17
- import { restartCacheEnabled } from './restart-cache';
13
+ import { mkdirSync, existsSync, readFileSync, statSync, writeFileSync } from 'node:fs'
14
+ import path from 'node:path'
15
+ import type { ResolvedConfig } from '../../config'
16
+ import { setGlobalCssSourceStore, type GlobalCssSourceStore } from '../../css/build'
17
+ import { restartCacheEnabled } from './enabled'
18
18
 
19
19
  /** `[file, mtimeMs, size, contentHash]` — the shape the other restart caches use. */
20
- type SourceEntry = [string, number, number, string];
20
+ type SourceEntry = [string, number, number, string]
21
21
 
22
22
  interface RecordFile {
23
- version: number;
23
+ version: number
24
24
  /** Everything the answer depends on that is not a walked source (see cacheKey). */
25
- key: string;
26
- files: SourceEntry[];
27
- missing: string[];
28
- sources: string[];
25
+ key: string
26
+ files: SourceEntry[]
27
+ missing: string[]
28
+ sources: string[]
29
29
  }
30
30
 
31
31
  /** Bumped whenever a record's shape changes; an older record is simply ignored. */
32
- const RECORD_VERSION = 1;
32
+ const RECORD_VERSION = 1
33
33
 
34
- const hash = (value: string) => Bun.hash(value).toString(36);
34
+ const hash = (value: string) => Bun.hash(value).toString(36)
35
35
 
36
36
  /**
37
37
  * The walk's answer can change without any app file moving, when the thing that
@@ -43,83 +43,91 @@ function cacheKey(config: ResolvedConfig): string | undefined {
43
43
  try {
44
44
  const shape = JSON.stringify(config, (_key, value: unknown) =>
45
45
  typeof value === 'function' ? '[fn]' : value,
46
- );
47
- return hash(`${RECORD_VERSION}\n${pnextBuildStamp()}\n${shape}`);
46
+ )
47
+ return hash(`${RECORD_VERSION}\n${pnextBuildStamp()}\n${shape}`)
48
48
  } catch {
49
- return undefined; // a config that will not serialize simply opts out
49
+ return undefined // a config that will not serialize simply opts out
50
50
  }
51
51
  }
52
52
 
53
- /** mtime+size of the walk this process is running (see route-facts-cache.ts). */
53
+ /** mtime+size of the walk this process is running (see restart/route-facts.ts). */
54
54
  function pnextBuildStamp() {
55
55
  try {
56
- const self = Bun.fileURLToPath(import.meta.url);
57
- const walk = path.join(path.dirname(path.dirname(self)), 'css', 'build.ts');
58
- const info = statSync(walk, { throwIfNoEntry: false });
59
- return info ? `${info.mtimeMs}:${info.size}` : self;
56
+ const self = Bun.fileURLToPath(import.meta.url)
57
+ const walk = path.join(path.dirname(path.dirname(self)), 'css', 'build.ts')
58
+ const info = statSync(walk, { throwIfNoEntry: false })
59
+ return info ? `${info.mtimeMs}:${info.size}` : self
60
60
  } catch {
61
- return 'unknown';
61
+ return 'unknown'
62
62
  }
63
63
  }
64
64
 
65
65
  export function installGlobalCssCache(config: ResolvedConfig) {
66
- if (!restartCacheEnabled()) return;
66
+ if (!restartCacheEnabled()) return
67
67
  // eslint-disable-next-line turbo/no-undeclared-env-vars
68
- if (process.env.PNEXT_DEV_GLOBAL_CSS_CACHE === '0') return;
69
- const key = cacheKey(config);
70
- if (!key) return;
71
- setGlobalCssSourceStore(createStore(path.join(config.outPath, 'cache', 'global-css'), key));
68
+ if (process.env.PNEXT_DEV_GLOBAL_CSS_CACHE === '0') return
69
+ const key = cacheKey(config)
70
+ if (!key) return
71
+ setGlobalCssSourceStore(createStore(path.join(config.outPath, 'cache', 'global-css'), key))
72
72
  }
73
73
 
74
74
  function createStore(dir: string, key: string): GlobalCssSourceStore {
75
75
  // Last payload written per walk, so a save that re-runs the walk with an
76
76
  // unchanged answer costs no write, and one with a changed answer does.
77
- const written = new Map<string, string>();
78
- const recordFile = (walkKey: string) => path.join(dir, `${hash(walkKey)}.json`);
77
+ const written = new Map<string, string>()
78
+ const recordFile = (walkKey: string) => path.join(dir, `${hash(walkKey)}.json`)
79
79
 
80
80
  return {
81
81
  load(walkKey) {
82
- const record = readRecord(recordFile(walkKey), key);
82
+ const record = readRecord(recordFile(walkKey), key)
83
83
  if (!record) {
84
- stats.misses += 1;
85
- return undefined;
84
+ stats.misses += 1
85
+ return undefined
86
86
  }
87
87
  if (record.missing.some(file => existsSync(file))) {
88
- stats.misses += 1;
89
- return undefined;
88
+ stats.misses += 1
89
+ return undefined
90
90
  }
91
- const revalidated = revalidate(record.files);
91
+ const revalidated = revalidate(record.files)
92
92
  if (!revalidated) {
93
- stats.misses += 1;
94
- return undefined;
93
+ stats.misses += 1
94
+ return undefined
95
95
  }
96
- stats.hits += 1;
96
+ stats.hits += 1
97
97
  // Only the stats moved (a touch, a checkout): keep the answer, record the
98
98
  // new stats so the next boot takes the O(1) path again.
99
99
  if (revalidated !== record.files) {
100
- write(recordFile(walkKey), key, written, walkKey, revalidated, record.missing, record.sources);
100
+ write(
101
+ recordFile(walkKey),
102
+ key,
103
+ written,
104
+ walkKey,
105
+ revalidated,
106
+ record.missing,
107
+ record.sources,
108
+ )
101
109
  }
102
- return record.sources;
110
+ return record.sources
103
111
  },
104
112
  save(walkKey, sources, visited, missing) {
105
- const files = sourceEntries(visited);
106
- if (!files) return;
107
- write(recordFile(walkKey), key, written, walkKey, files, missing, sources);
113
+ const files = sourceEntries(visited)
114
+ if (!files) return
115
+ write(recordFile(walkKey), key, written, walkKey, files, missing, sources)
108
116
  },
109
- };
117
+ }
110
118
  }
111
119
 
112
120
  function readRecord(file: string, key: string): RecordFile | undefined {
113
- let parsed: RecordFile | undefined;
121
+ let parsed: RecordFile | undefined
114
122
  try {
115
- parsed = JSON.parse(readFileSync(file, 'utf8')) as RecordFile;
123
+ parsed = JSON.parse(readFileSync(file, 'utf8')) as RecordFile
116
124
  } catch {
117
- return undefined;
125
+ return undefined
118
126
  }
119
- if (parsed?.version !== RECORD_VERSION || parsed.key !== key) return undefined;
120
- if (!Array.isArray(parsed.files) || !Array.isArray(parsed.sources)) return undefined;
121
- if (!Array.isArray(parsed.missing)) return undefined;
122
- return parsed;
127
+ if (parsed?.version !== RECORD_VERSION || parsed.key !== key) return undefined
128
+ if (!Array.isArray(parsed.files) || !Array.isArray(parsed.sources)) return undefined
129
+ if (!Array.isArray(parsed.missing)) return undefined
130
+ return parsed
123
131
  }
124
132
 
125
133
  /**
@@ -141,37 +149,37 @@ function write(
141
149
  files,
142
150
  missing,
143
151
  sources,
144
- } satisfies RecordFile);
145
- if (written.get(walkKey) === contents) return;
146
- written.set(walkKey, contents);
152
+ } satisfies RecordFile)
153
+ if (written.get(walkKey) === contents) return
154
+ written.set(walkKey, contents)
147
155
  try {
148
- mkdirSync(path.dirname(file), { recursive: true });
149
- writeFileSync(file, contents);
156
+ mkdirSync(path.dirname(file), { recursive: true })
157
+ writeFileSync(file, contents)
150
158
  } catch {
151
159
  // Best effort: a missing record only costs the next boot a walk.
152
160
  }
153
161
  }
154
162
 
155
163
  function sourceEntries(files: string[]): SourceEntry[] | undefined {
156
- const entries: SourceEntry[] = [];
164
+ const entries: SourceEntry[] = []
157
165
  for (const file of files) {
158
- const entry = sourceEntry(file);
159
- if (!entry) return undefined;
160
- entries.push(entry);
166
+ const entry = sourceEntry(file)
167
+ if (!entry) return undefined
168
+ entries.push(entry)
161
169
  }
162
- return entries;
170
+ return entries
163
171
  }
164
172
 
165
173
  function sourceEntry(file: string): SourceEntry | undefined {
166
174
  try {
167
- const source = readFileSync(file, 'utf8');
175
+ const source = readFileSync(file, 'utf8')
168
176
  // Stat AFTER the read: a file that changes between the two records the
169
177
  // older stat, so the next boot re-hashes rather than trusting a stale one.
170
- const info = statSync(file, { throwIfNoEntry: false });
171
- if (!info) return undefined;
172
- return [file, info.mtimeMs, info.size, hash(source)];
178
+ const info = statSync(file, { throwIfNoEntry: false })
179
+ if (!info) return undefined
180
+ return [file, info.mtimeMs, info.size, hash(source)]
173
181
  } catch {
174
- return undefined;
182
+ return undefined
175
183
  }
176
184
  }
177
185
 
@@ -181,32 +189,32 @@ function sourceEntry(file: string): SourceEntry | undefined {
181
189
  * walk has to run again.
182
190
  */
183
191
  function revalidate(files: SourceEntry[]): SourceEntry[] | undefined {
184
- let moved = false;
185
- const checked: SourceEntry[] = [];
192
+ let moved = false
193
+ const checked: SourceEntry[] = []
186
194
  for (const entry of files) {
187
- const [file, mtimeMs, size, contentHash] = entry;
188
- const info = statSync(file, { throwIfNoEntry: false });
189
- if (!info) return undefined;
195
+ const [file, mtimeMs, size, contentHash] = entry
196
+ const info = statSync(file, { throwIfNoEntry: false })
197
+ if (!info) return undefined
190
198
  if (info.mtimeMs === mtimeMs && info.size === size) {
191
- checked.push(entry);
192
- continue;
199
+ checked.push(entry)
200
+ continue
193
201
  }
194
- let source: string;
202
+ let source: string
195
203
  try {
196
- source = readFileSync(file, 'utf8');
204
+ source = readFileSync(file, 'utf8')
197
205
  } catch {
198
- return undefined;
206
+ return undefined
199
207
  }
200
- if (hash(source) !== contentHash) return undefined;
201
- moved = true;
202
- checked.push([file, info.mtimeMs, info.size, contentHash]);
208
+ if (hash(source) !== contentHash) return undefined
209
+ moved = true
210
+ checked.push([file, info.mtimeMs, info.size, contentHash])
203
211
  }
204
- return moved ? checked : files;
212
+ return moved ? checked : files
205
213
  }
206
214
 
207
215
  /** Bisect seam: `PNEXT_DEV_GLOBAL_CSS_STATS=1` prints the hit/miss split at exit. */
208
- const stats = { hits: 0, misses: 0 };
216
+ const stats = { hits: 0, misses: 0 }
209
217
  // eslint-disable-next-line turbo/no-undeclared-env-vars
210
218
  if (process.env.PNEXT_DEV_GLOBAL_CSS_STATS === '1') {
211
- process.on('exit', () => console.log(`global-css hits=${stats.hits} misses=${stats.misses}`));
219
+ process.on('exit', () => console.log(`global-css hits=${stats.hits} misses=${stats.misses}`))
212
220
  }
@@ -1,4 +1,4 @@
1
- // Persisted node_modules bundles - the restart half of runtime/server.ts' `transformNodeModuleSource`.
1
+ // Persisted node_modules bundles - the restart half of runtime/loader.ts' `transformNodeModuleSource`.
2
2
  // The node_modules load plugin esbuild-bundles each ESM package file it matches and remembers the
3
3
  // result in memory only, so every restart re-runs those builds on the request path while the route
4
4
  // bundle it is evaluating waits.
@@ -8,37 +8,37 @@
8
8
  // Anything else - a missing input, an unparseable record, a vanished file - is a miss, never a
9
9
  // stale hit: the bundle it names is imported directly, and Bun caches a bad import for the life of
10
10
  // the process.
11
- import { mkdir, readFile, stat } from 'node:fs/promises';
12
- import path from 'node:path';
13
- import { writeFileAtomic } from '../utils/fs';
11
+ import { mkdir, readFile, stat } from 'node:fs/promises'
12
+ import path from 'node:path'
13
+ import { writeFileAtomic } from '../../utils/fs'
14
14
 
15
15
  /** `[file, mtimeMs, size]` for one esbuild input of the bundle. */
16
- type InputEntry = [string, number, number];
16
+ type InputEntry = [string, number, number]
17
17
 
18
18
  interface BundleRecord {
19
- inputs: InputEntry[];
20
- code: string;
19
+ inputs: InputEntry[]
20
+ code: string
21
21
  }
22
22
 
23
23
  /** The recorded bundle when every input it was built from is unchanged. */
24
24
  export async function readNodeModuleBundle(recordFile: string): Promise<string | undefined> {
25
- const contents = await readFile(recordFile, 'utf8').catch(() => undefined);
26
- if (contents === undefined) return undefined;
27
- let record: BundleRecord | undefined;
25
+ const contents = await readFile(recordFile, 'utf8').catch(() => undefined)
26
+ if (contents === undefined) return undefined
27
+ let record: BundleRecord | undefined
28
28
  try {
29
- record = JSON.parse(contents) as BundleRecord;
29
+ record = JSON.parse(contents) as BundleRecord
30
30
  } catch {
31
- return undefined;
31
+ return undefined
32
32
  }
33
- if (typeof record?.code !== 'string' || !Array.isArray(record.inputs)) return undefined;
34
- if (record.inputs.length === 0) return undefined;
33
+ if (typeof record?.code !== 'string' || !Array.isArray(record.inputs)) return undefined
34
+ if (record.inputs.length === 0) return undefined
35
35
  const held = await Promise.all(
36
36
  record.inputs.map(async ([input, mtimeMs, size]) => {
37
- const stats = await stat(input).catch(() => undefined);
38
- return stats?.mtimeMs === mtimeMs && stats.size === size;
37
+ const stats = await stat(input).catch(() => undefined)
38
+ return stats?.mtimeMs === mtimeMs && stats.size === size
39
39
  }),
40
- );
41
- return held.every(Boolean) ? record.code : undefined;
40
+ )
41
+ return held.every(Boolean) ? record.code : undefined
42
42
  }
43
43
 
44
44
  export async function writeNodeModuleBundle(
@@ -48,16 +48,16 @@ export async function writeNodeModuleBundle(
48
48
  ): Promise<void> {
49
49
  const stated = await Promise.all(
50
50
  inputs.map(async (input): Promise<InputEntry | undefined> => {
51
- const stats = await stat(input).catch(() => undefined);
52
- return stats ? [input, stats.mtimeMs, stats.size] : undefined;
51
+ const stats = await stat(input).catch(() => undefined)
52
+ return stats ? [input, stats.mtimeMs, stats.size] : undefined
53
53
  }),
54
- );
54
+ )
55
55
  // An input that vanished between the build and here would make the record
56
56
  // unvalidatable forever; leaving it unwritten costs the next boot one bundle.
57
- if (stated.length === 0 || stated.some(entry => entry === undefined)) return;
58
- await mkdir(path.dirname(recordFile), { recursive: true }).catch(() => undefined);
57
+ if (stated.length === 0 || stated.some(entry => entry === undefined)) return
58
+ await mkdir(path.dirname(recordFile), { recursive: true }).catch(() => undefined)
59
59
  await writeFileAtomic(
60
60
  recordFile,
61
61
  JSON.stringify({ inputs: stated as InputEntry[], code } satisfies BundleRecord),
62
- ).catch(() => undefined);
62
+ ).catch(() => undefined)
63
63
  }