@wular/pnext 0.0.3 → 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 -1961
  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 -1887
  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} +152 -143
  351. package/src/resolve/engine.ts +90 -77
  352. package/src/resolve/imports.ts +475 -463
  353. package/src/resolve/scan-facts.ts +442 -186
  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 +833 -848
  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
@@ -9,31 +9,31 @@
9
9
  // images.maximumDiskCacheSize (0 disables writes entirely).
10
10
  // ---------------------------------------------------------------------------
11
11
 
12
- import { createHash } from 'node:crypto';
13
- import { promises as fs } from 'node:fs';
14
- import path from 'node:path';
12
+ import { createHash } from 'node:crypto'
13
+ import { promises as fs } from 'node:fs'
14
+ import path from 'node:path'
15
15
 
16
- export const IMAGE_CACHE_VERSION = 4;
16
+ export const IMAGE_CACHE_VERSION = 4
17
17
 
18
18
  export function getHash(items: (string | number | Buffer)[]): string {
19
- const hash = createHash('sha256');
19
+ const hash = createHash('sha256')
20
20
  for (const item of items) {
21
- hash.update(typeof item === 'number' ? String(item) : item);
21
+ hash.update(typeof item === 'number' ? String(item) : item)
22
22
  }
23
- return hash.digest('base64url');
23
+ return hash.digest('base64url')
24
24
  }
25
25
 
26
26
  export interface ImageCacheEntry {
27
- buffer: Buffer;
28
- etag: string;
29
- upstreamEtag: string;
30
- extension: string;
31
- maxAge: number;
32
- expireAt: number;
27
+ buffer: Buffer
28
+ etag: string
29
+ upstreamEtag: string
30
+ extension: string
31
+ maxAge: number
32
+ expireAt: number
33
33
  }
34
34
 
35
35
  export function imageCacheDir(root: string): string {
36
- return path.join(root, '.next', 'cache', 'images');
36
+ return path.join(root, '.next', 'cache', 'images')
37
37
  }
38
38
 
39
39
  export async function readCacheEntry(
@@ -41,13 +41,13 @@ export async function readCacheEntry(
41
41
  cacheKey: string,
42
42
  ): Promise<ImageCacheEntry | undefined> {
43
43
  try {
44
- const dir = path.join(cacheDir, cacheKey);
45
- const files = await fs.readdir(dir);
46
- const file = files[0];
47
- if (!file) return undefined;
48
- const [maxAgeSt, expireAtSt, etag, upstreamEtag, extension] = file.split('.', 5);
49
- if (!etag || !upstreamEtag || !extension) return undefined;
50
- const buffer = await fs.readFile(path.join(dir, file));
44
+ const dir = path.join(cacheDir, cacheKey)
45
+ const files = await fs.readdir(dir)
46
+ const file = files[0]
47
+ if (!file) return undefined
48
+ const [maxAgeSt, expireAtSt, etag, upstreamEtag, extension] = file.split('.', 5)
49
+ if (!etag || !upstreamEtag || !extension) return undefined
50
+ const buffer = await fs.readFile(path.join(dir, file))
51
51
  return {
52
52
  buffer,
53
53
  etag,
@@ -55,9 +55,9 @@ export async function readCacheEntry(
55
55
  extension,
56
56
  maxAge: Number(maxAgeSt),
57
57
  expireAt: Number(expireAtSt),
58
- };
58
+ }
59
59
  } catch {
60
- return undefined;
60
+ return undefined
61
61
  }
62
62
  }
63
63
 
@@ -67,24 +67,24 @@ export async function writeCacheEntry(
67
67
  entry: ImageCacheEntry,
68
68
  maximumDiskCacheSize: number | undefined,
69
69
  ): Promise<void> {
70
- if (maximumDiskCacheSize === 0) return;
70
+ if (maximumDiskCacheSize === 0) return
71
71
  if (maximumDiskCacheSize !== undefined && entry.buffer.byteLength > maximumDiskCacheSize) {
72
- return;
72
+ return
73
73
  }
74
74
  try {
75
- const dir = path.join(cacheDir, cacheKey);
75
+ const dir = path.join(cacheDir, cacheKey)
76
76
  const filename = path.join(
77
77
  dir,
78
78
  `${entry.maxAge}.${entry.expireAt}.${entry.etag}.${entry.upstreamEtag}.${entry.extension}`,
79
- );
80
- await fs.rm(dir, { recursive: true, force: true }).catch(() => undefined);
81
- await fs.mkdir(dir, { recursive: true });
82
- await fs.writeFile(filename, entry.buffer);
79
+ )
80
+ await fs.rm(dir, { recursive: true, force: true }).catch(() => undefined)
81
+ await fs.mkdir(dir, { recursive: true })
82
+ await fs.writeFile(filename, entry.buffer)
83
83
  if (maximumDiskCacheSize !== undefined) {
84
- await evictToBudget(cacheDir, cacheKey, maximumDiskCacheSize);
84
+ await evictToBudget(cacheDir, cacheKey, maximumDiskCacheSize)
85
85
  }
86
86
  } catch (err) {
87
- console.error(`Failed to write image to cache ${cacheKey}`, err);
87
+ console.error(`Failed to write image to cache ${cacheKey}`, err)
88
88
  }
89
89
  }
90
90
 
@@ -95,25 +95,27 @@ async function evictToBudget(
95
95
  keepKey: string,
96
96
  maximumDiskCacheSize: number,
97
97
  ): Promise<void> {
98
- const keys = await fs.readdir(cacheDir).catch(() => [] as string[]);
99
- const entries: { key: string; size: number; expireAt: number }[] = [];
100
- let total = 0;
98
+ const keys = await fs.readdir(cacheDir).catch(() => [] as string[])
99
+ const entries: { key: string; size: number; expireAt: number }[] = []
100
+ let total = 0
101
101
  for (const key of keys) {
102
- const dir = path.join(cacheDir, key);
103
- const files = await fs.readdir(dir).catch(() => [] as string[]);
104
- const file = files[0];
105
- if (!file) continue;
106
- const stat = await fs.stat(path.join(dir, file)).catch(() => null);
107
- if (!stat) continue;
108
- total += stat.size;
109
- entries.push({ key, size: stat.size, expireAt: Number(file.split('.', 2)[1]) || 0 });
102
+ const dir = path.join(cacheDir, key)
103
+ const files = await fs.readdir(dir).catch(() => [] as string[])
104
+ const file = files[0]
105
+ if (!file) continue
106
+ const stat = await fs.stat(path.join(dir, file)).catch(() => null)
107
+ if (!stat) continue
108
+ total += stat.size
109
+ entries.push({ key, size: stat.size, expireAt: Number(file.split('.', 2)[1]) || 0 })
110
110
  }
111
- if (total <= maximumDiskCacheSize) return;
112
- entries.sort((a, b) => a.expireAt - b.expireAt);
111
+ if (total <= maximumDiskCacheSize) return
112
+ entries.sort((a, b) => a.expireAt - b.expireAt)
113
113
  for (const entry of entries) {
114
- if (total <= maximumDiskCacheSize) break;
115
- if (entry.key === keepKey) continue;
116
- await fs.rm(path.join(cacheDir, entry.key), { recursive: true, force: true }).catch(() => undefined);
117
- total -= entry.size;
114
+ if (total <= maximumDiskCacheSize) break
115
+ if (entry.key === keepKey) continue
116
+ await fs
117
+ .rm(path.join(cacheDir, entry.key), { recursive: true, force: true })
118
+ .catch(() => undefined)
119
+ total -= entry.size
118
120
  }
119
121
  }
@@ -3,25 +3,25 @@
3
3
  // serve-static tables so the optimizer classifies sources (bypass vs optimize vs reject) exactly like
4
4
  // Next.
5
5
 
6
- export const AVIF = 'image/avif';
7
- export const WEBP = 'image/webp';
8
- export const PNG = 'image/png';
9
- export const JPEG = 'image/jpeg';
10
- export const JXL = 'image/jxl';
11
- export const JP2 = 'image/jp2';
12
- export const HEIC = 'image/heic';
13
- export const GIF = 'image/gif';
14
- export const SVG = 'image/svg+xml';
15
- export const ICO = 'image/x-icon';
16
- export const ICNS = 'image/x-icns';
17
- export const TIFF = 'image/tiff';
18
- export const BMP = 'image/bmp';
19
- export const PDF = 'application/pdf';
6
+ export const AVIF = 'image/avif'
7
+ export const WEBP = 'image/webp'
8
+ export const PNG = 'image/png'
9
+ export const JPEG = 'image/jpeg'
10
+ export const JXL = 'image/jxl'
11
+ export const JP2 = 'image/jp2'
12
+ export const HEIC = 'image/heic'
13
+ export const GIF = 'image/gif'
14
+ export const SVG = 'image/svg+xml'
15
+ export const ICO = 'image/x-icon'
16
+ export const ICNS = 'image/x-icns'
17
+ export const TIFF = 'image/tiff'
18
+ export const BMP = 'image/bmp'
19
+ export const PDF = 'application/pdf'
20
20
 
21
21
  /** Animated variants of these are served as-is (never re-encoded). */
22
- export const ANIMATABLE_TYPES = [WEBP, PNG, GIF];
22
+ export const ANIMATABLE_TYPES = [WEBP, PNG, GIF]
23
23
  /** Types sharp never re-encodes — passthrough with the original bytes. */
24
- export const BYPASS_TYPES = [SVG, ICO, ICNS, BMP, JXL, HEIC];
24
+ export const BYPASS_TYPES = [SVG, ICO, ICNS, BMP, JXL, HEIC]
25
25
 
26
26
  const EXTENSION_BY_TYPE: Record<string, string> = {
27
27
  [AVIF]: 'avif',
@@ -37,25 +37,25 @@ const EXTENSION_BY_TYPE: Record<string, string> = {
37
37
  [ICNS]: 'icns',
38
38
  [TIFF]: 'tiff',
39
39
  [BMP]: 'bmp',
40
- };
40
+ }
41
41
 
42
42
  const TYPE_BY_EXTENSION: Record<string, string> = Object.fromEntries(
43
43
  Object.entries(EXTENSION_BY_TYPE).map(([type, ext]) => [ext, type]),
44
- );
44
+ )
45
45
 
46
46
  /** File extension for a content type (Next's getExtension); undefined if unknown. */
47
47
  export function extensionForType(contentType: string): string | undefined {
48
- return EXTENSION_BY_TYPE[contentType];
48
+ return EXTENSION_BY_TYPE[contentType]
49
49
  }
50
50
 
51
51
  /** Content type for a cache-file extension (Next's getContentType). */
52
52
  export function typeForExtension(extension: string): string | undefined {
53
- return TYPE_BY_EXTENSION[extension];
53
+ return TYPE_BY_EXTENSION[extension]
54
54
  }
55
55
 
56
56
  function startsWithBytes(buffer: Buffer, bytes: number[]): boolean {
57
57
  // A zero in the signature is a wildcard byte (Next's convention).
58
- return bytes.every((b, i) => !b || buffer[i] === b);
58
+ return bytes.every((b, i) => !b || buffer[i] === b)
59
59
  }
60
60
 
61
61
  /**
@@ -64,72 +64,72 @@ function startsWithBytes(buffer: Buffer, bytes: number[]): boolean {
64
64
  * unknown formats.
65
65
  */
66
66
  export function detectContentType(buffer: Buffer): string | null {
67
- if (buffer.byteLength === 0) return null;
68
- if ([0xff, 0xd8, 0xff].every((b, i) => buffer[i] === b)) return JPEG;
67
+ if (buffer.byteLength === 0) return null
68
+ if ([0xff, 0xd8, 0xff].every((b, i) => buffer[i] === b)) return JPEG
69
69
  if ([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every((b, i) => buffer[i] === b)) {
70
- return PNG;
70
+ return PNG
71
71
  }
72
- if ([0x47, 0x49, 0x46, 0x38].every((b, i) => buffer[i] === b)) return GIF;
72
+ if ([0x47, 0x49, 0x46, 0x38].every((b, i) => buffer[i] === b)) return GIF
73
73
  if (startsWithBytes(buffer, [0x52, 0x49, 0x46, 0x46, 0, 0, 0, 0, 0x57, 0x45, 0x42, 0x50])) {
74
- return WEBP;
74
+ return WEBP
75
75
  }
76
- if ([0x3c, 0x3f, 0x78, 0x6d, 0x6c].every((b, i) => buffer[i] === b)) return SVG;
77
- if ([0x3c, 0x73, 0x76, 0x67].every((b, i) => buffer[i] === b)) return SVG;
76
+ if ([0x3c, 0x3f, 0x78, 0x6d, 0x6c].every((b, i) => buffer[i] === b)) return SVG
77
+ if ([0x3c, 0x73, 0x76, 0x67].every((b, i) => buffer[i] === b)) return SVG
78
78
  if (startsWithBytes(buffer, [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66])) {
79
- return AVIF;
79
+ return AVIF
80
80
  }
81
- if ([0x00, 0x00, 0x01, 0x00].every((b, i) => buffer[i] === b)) return ICO;
82
- if ([0x69, 0x63, 0x6e, 0x73].every((b, i) => buffer[i] === b)) return ICNS;
83
- if ([0x49, 0x49, 0x2a, 0x00].every((b, i) => buffer[i] === b)) return TIFF;
84
- if ([0x4d, 0x4d, 0x00, 0x2a].every((b, i) => buffer[i] === b)) return TIFF;
85
- if ([0x42, 0x4d].every((b, i) => buffer[i] === b)) return BMP;
86
- if ([0xff, 0x0a].every((b, i) => buffer[i] === b)) return JXL;
81
+ if ([0x00, 0x00, 0x01, 0x00].every((b, i) => buffer[i] === b)) return ICO
82
+ if ([0x69, 0x63, 0x6e, 0x73].every((b, i) => buffer[i] === b)) return ICNS
83
+ if ([0x49, 0x49, 0x2a, 0x00].every((b, i) => buffer[i] === b)) return TIFF
84
+ if ([0x4d, 0x4d, 0x00, 0x2a].every((b, i) => buffer[i] === b)) return TIFF
85
+ if ([0x42, 0x4d].every((b, i) => buffer[i] === b)) return BMP
86
+ if ([0xff, 0x0a].every((b, i) => buffer[i] === b)) return JXL
87
87
  if (
88
88
  [0x00, 0x00, 0x00, 0x0c, 0x4a, 0x58, 0x4c, 0x20, 0x0d, 0x0a, 0x87, 0x0a].every(
89
89
  (b, i) => buffer[i] === b,
90
90
  )
91
91
  ) {
92
- return JXL;
92
+ return JXL
93
93
  }
94
94
  if (startsWithBytes(buffer, [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63])) {
95
- return HEIC;
95
+ return HEIC
96
96
  }
97
- if ([0x25, 0x50, 0x44, 0x46, 0x2d].every((b, i) => buffer[i] === b)) return PDF;
97
+ if ([0x25, 0x50, 0x44, 0x46, 0x2d].every((b, i) => buffer[i] === b)) return PDF
98
98
  if (
99
99
  [0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a].every(
100
100
  (b, i) => buffer[i] === b,
101
101
  )
102
102
  ) {
103
- return JP2;
103
+ return JP2
104
104
  }
105
105
  // SVG documents may start with whitespace/comments/doctype before <svg.
106
- const head = buffer.toString('utf8', 0, Math.min(buffer.length, 512)).trimStart();
107
- if (/^(<\?xml|<!doctype svg|<svg)/i.test(head)) return SVG;
108
- return null;
106
+ const head = buffer.toString('utf8', 0, Math.min(buffer.length, 512)).trimStart()
107
+ if (/^(<\?xml|<!doctype svg|<svg)/i.test(head)) return SVG
108
+ return null
109
109
  }
110
110
 
111
111
  /** True when a gif/apng/webp buffer contains multiple frames (Next's is-animated). */
112
112
  export function isAnimated(buffer: Buffer): boolean {
113
113
  // GIF: more than one Graphics Control Extension block (0x21 0xF9 0x04).
114
114
  if (buffer.length > 6 && buffer.toString('ascii', 0, 3) === 'GIF') {
115
- let frames = 0;
115
+ let frames = 0
116
116
  for (let i = 0; i < buffer.length - 2; i++) {
117
117
  if (buffer[i] === 0x21 && buffer[i + 1] === 0xf9 && buffer[i + 2] === 0x04) {
118
- frames++;
119
- if (frames > 1) return true;
118
+ frames++
119
+ if (frames > 1) return true
120
120
  }
121
121
  }
122
- return false;
122
+ return false
123
123
  }
124
124
  // APNG: an acTL chunk appearing before the first IDAT chunk.
125
125
  if (
126
126
  buffer.length > 8 &&
127
127
  [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every((b, i) => buffer[i] === b)
128
128
  ) {
129
- const actl = buffer.indexOf('acTL');
130
- if (actl === -1) return false;
131
- const idat = buffer.indexOf('IDAT');
132
- return idat === -1 || actl < idat;
129
+ const actl = buffer.indexOf('acTL')
130
+ if (actl === -1) return false
131
+ const idat = buffer.indexOf('IDAT')
132
+ return idat === -1 || actl < idat
133
133
  }
134
134
  // WebP: an ANIM chunk inside a VP8X container.
135
135
  if (
@@ -137,7 +137,7 @@ export function isAnimated(buffer: Buffer): boolean {
137
137
  buffer.toString('ascii', 0, 4) === 'RIFF' &&
138
138
  buffer.toString('ascii', 8, 12) === 'WEBP'
139
139
  ) {
140
- return buffer.includes('ANIM');
140
+ return buffer.includes('ANIM')
141
141
  }
142
- return false;
142
+ return false
143
143
  }