@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
@@ -10,24 +10,24 @@
10
10
  // installs it via setCacheHandler, so core never imports compat.
11
11
 
12
12
  export interface CacheHandlerEntry {
13
- value: unknown;
14
- lastModified: number;
15
- tags?: readonly string[];
13
+ value: unknown
14
+ lastModified: number
15
+ tags?: readonly string[]
16
16
  }
17
17
 
18
18
  export interface CacheHandlerGetContext {
19
- tags?: readonly string[];
20
- softTags?: readonly string[];
21
- kind?: string;
19
+ tags?: readonly string[]
20
+ softTags?: readonly string[]
21
+ kind?: string
22
22
  }
23
23
 
24
24
  export interface CacheHandlerSetContext {
25
- tags?: readonly string[];
26
- revalidate?: number | false;
27
- kind?: string;
25
+ tags?: readonly string[]
26
+ revalidate?: number | false
27
+ kind?: string
28
28
  /** Set for fetch data-cache writes (Next's incremental-cache fetch ctx). */
29
- fetchCache?: boolean;
30
- fetchUrl?: string;
29
+ fetchCache?: boolean
30
+ fetchUrl?: string
31
31
  }
32
32
 
33
33
  /** The subset of Next's IncrementalCacheHandler contract pnext drives. */
@@ -35,29 +35,25 @@ export interface CacheHandler {
35
35
  get(
36
36
  key: string,
37
37
  ctx?: CacheHandlerGetContext,
38
- ): Promise<CacheHandlerEntry | undefined | null> | CacheHandlerEntry | undefined | null;
39
- set(
40
- key: string,
41
- data: unknown,
42
- ctx?: CacheHandlerSetContext,
43
- ): Promise<void> | void;
44
- revalidateTag?(tag: string | string[]): Promise<void> | void;
45
- resetRequestCache?(): void;
38
+ ): Promise<CacheHandlerEntry | undefined | null> | CacheHandlerEntry | undefined | null
39
+ set(key: string, data: unknown, ctx?: CacheHandlerSetContext): Promise<void> | void
40
+ revalidateTag?(tag: string | string[]): Promise<void> | void
41
+ resetRequestCache?(): void
46
42
  }
47
43
 
48
- let handler: CacheHandler | undefined;
44
+ let handler: CacheHandler | undefined
49
45
 
50
46
  /** Install the configured handler (compat calls this from an init hook). */
51
47
  export function setCacheHandler(instance: CacheHandler | undefined): void {
52
- handler = instance;
48
+ handler = instance
53
49
  }
54
50
 
55
51
  export function getCacheHandler(): CacheHandler | undefined {
56
- return handler;
52
+ return handler
57
53
  }
58
54
 
59
55
  export function hasCacheHandler(): boolean {
60
- return handler !== undefined;
56
+ return handler !== undefined
61
57
  }
62
58
 
63
59
  /** Read an entry from the configured handler, tolerating sync/async + throws. */
@@ -65,12 +61,12 @@ export async function cacheHandlerGet(
65
61
  key: string,
66
62
  ctx?: CacheHandlerGetContext,
67
63
  ): Promise<CacheHandlerEntry | undefined> {
68
- if (!handler) return undefined;
64
+ if (!handler) return undefined
69
65
  try {
70
- const entry = await handler.get(key, ctx);
71
- return entry ?? undefined;
66
+ const entry = await handler.get(key, ctx)
67
+ return entry ?? undefined
72
68
  } catch {
73
- return undefined;
69
+ return undefined
74
70
  }
75
71
  }
76
72
 
@@ -80,9 +76,9 @@ export async function cacheHandlerSet(
80
76
  data: unknown,
81
77
  ctx?: CacheHandlerSetContext,
82
78
  ): Promise<void> {
83
- if (!handler) return;
79
+ if (!handler) return
84
80
  try {
85
- await handler.set(key, data, ctx);
81
+ await handler.set(key, data, ctx)
86
82
  } catch {
87
83
  // A handler failure must not break the response; the in-memory store is
88
84
  // authoritative for correctness, the handler is a persistence layer.
@@ -91,9 +87,9 @@ export async function cacheHandlerSet(
91
87
 
92
88
  /** Forward on-demand tag invalidation to the handler if it supports it. */
93
89
  export async function cacheHandlerRevalidateTag(tag: string): Promise<void> {
94
- if (!handler?.revalidateTag) return;
90
+ if (!handler?.revalidateTag) return
95
91
  try {
96
- await handler.revalidateTag(tag);
92
+ await handler.revalidateTag(tag)
97
93
  } catch {
98
94
  // best-effort
99
95
  }
@@ -1,113 +1,127 @@
1
- import { existsSync, readFileSync } from 'node:fs';
2
- import { createRequire } from 'node:module';
3
- import path from 'node:path';
4
- import { format } from 'node:util';
5
- import { fileURLToPath, pathToFileURL } from 'node:url';
6
- import { currentRequest } from '../../request/context';
7
- import { realNow } from '../../ppr';
8
- import { getNextConfig } from '../next/config-loader';
1
+ import { existsSync, readFileSync } from 'node:fs'
2
+ import { createRequire } from 'node:module'
3
+ import path from 'node:path'
4
+ import { format } from 'node:util'
5
+ import { fileURLToPath, pathToFileURL } from 'node:url'
6
+ import { currentRequest } from '../../request/context'
7
+ import { realNow } from '../../render/ppr'
8
+ import { getNextConfig } from '../next/config-loader'
9
9
 
10
10
  interface ModernCacheEntry {
11
- value: ReadableStream<Uint8Array>;
12
- tags: string[];
13
- stale: number;
14
- timestamp: number;
15
- expire: number;
16
- revalidate: number;
11
+ value: ReadableStream<Uint8Array>
12
+ tags: string[]
13
+ stale: number
14
+ timestamp: number
15
+ expire: number
16
+ revalidate: number
17
17
  }
18
18
 
19
19
  interface ModernCacheHandler {
20
- get?: (cacheKey: string, softTags: string[]) => Promise<ModernCacheEntry | undefined> | ModernCacheEntry | undefined;
21
- set?: (cacheKey: string, pendingEntry: Promise<ModernCacheEntry>) => Promise<void> | void;
22
- refreshTags?: () => Promise<void> | void;
23
- getExpiration?: (tags: string[]) => Promise<number> | number;
24
- updateTags?: (tags: string[], durations?: { expire?: number }) => Promise<void> | void;
20
+ get?: (
21
+ cacheKey: string,
22
+ softTags: string[],
23
+ ) => Promise<ModernCacheEntry | undefined> | ModernCacheEntry | undefined
24
+ set?: (cacheKey: string, pendingEntry: Promise<ModernCacheEntry>) => Promise<void> | void
25
+ refreshTags?: () => Promise<void> | void
26
+ getExpiration?: (tags: string[]) => Promise<number> | number
27
+ updateTags?: (tags: string[], durations?: { expire?: number }) => Promise<void> | void
25
28
  }
26
29
 
27
30
  interface ModernCacheHandlerState {
28
- handler?: ModernCacheHandler;
29
- installedFor?: string;
31
+ handler?: ModernCacheHandler
32
+ installedFor?: string
30
33
  }
31
34
 
32
- const MODERN_CACHE_HANDLER_STATE = Symbol.for('pnext.compat.modernCacheHandler');
35
+ const MODERN_CACHE_HANDLER_STATE = Symbol.for('pnext.compat.modernCacheHandler')
33
36
 
34
37
  function state(): ModernCacheHandlerState {
35
38
  const global = globalThis as typeof globalThis & {
36
- [MODERN_CACHE_HANDLER_STATE]?: ModernCacheHandlerState;
37
- };
38
- return (global[MODERN_CACHE_HANDLER_STATE] ??= {});
39
+ [MODERN_CACHE_HANDLER_STATE]?: ModernCacheHandlerState
40
+ }
41
+ return (global[MODERN_CACHE_HANDLER_STATE] ??= {})
39
42
  }
40
43
 
41
44
  export function installModernCacheHandlers(root: string): void {
42
- const configured = defaultCacheHandlerPath();
43
- const current = state();
45
+ const configured = defaultCacheHandlerPath()
46
+ const current = state()
44
47
  if (!configured) {
45
- current.handler = undefined;
46
- current.installedFor = undefined;
47
- return;
48
+ current.handler = undefined
49
+ current.installedFor = undefined
50
+ return
48
51
  }
49
- const filePath = resolveHandlerPath(configured, root);
50
- if (current.installedFor === filePath) return;
51
- const loaded = loadHandler(filePath, root);
52
- if (!loaded) return;
53
- current.handler = loaded;
54
- current.installedFor = filePath;
52
+ const filePath = resolveHandlerPath(configured, root)
53
+ if (current.installedFor === filePath) return
54
+ const loaded = loadHandler(filePath, root)
55
+ if (!loaded) return
56
+ current.handler = loaded
57
+ current.installedFor = filePath
55
58
  }
56
59
 
57
60
  export function hasModernCacheHandler(): boolean {
58
- return state().handler !== undefined;
61
+ return state().handler !== undefined
59
62
  }
60
63
 
61
64
  export async function modernCacheRefreshTags(): Promise<void> {
62
- const refreshTags = state().handler?.refreshTags;
63
- const handler = state().handler;
64
- if (!handler || !refreshTags) return;
65
+ const refreshTags = state().handler?.refreshTags
66
+ const handler = state().handler
67
+ if (!handler || !refreshTags) return
65
68
  try {
66
- await withNodeConsoleFormat(() => refreshTags.call(handler));
69
+ await withNodeConsoleFormat(() => refreshTags.call(handler))
67
70
  } catch {
68
71
  // best-effort
69
72
  }
70
73
  }
71
74
 
72
- export async function modernCacheGet(key: string, softTags = implicitSoftTags()): Promise<ModernCacheEntry | undefined> {
73
- const handler = state().handler;
74
- const get = handler?.get;
75
- if (!handler || !get) return undefined;
75
+ export async function modernCacheGet(
76
+ key: string,
77
+ softTags = implicitSoftTags(),
78
+ ): Promise<ModernCacheEntry | undefined> {
79
+ const handler = state().handler
80
+ const get = handler?.get
81
+ if (!handler || !get) return undefined
76
82
  try {
77
- return await withNodeConsoleFormat(() => get.call(handler, key, softTags));
83
+ return await withNodeConsoleFormat(() => get.call(handler, key, softTags))
78
84
  } catch {
79
- return undefined;
85
+ return undefined
80
86
  }
81
87
  }
82
88
 
83
- export async function modernCacheSet(key: string, pendingEntry: Promise<ModernCacheEntry>): Promise<void> {
84
- const handler = state().handler;
85
- const set = handler?.set;
86
- if (!handler || !set) return;
89
+ export async function modernCacheSet(
90
+ key: string,
91
+ pendingEntry: Promise<ModernCacheEntry>,
92
+ ): Promise<void> {
93
+ const handler = state().handler
94
+ const set = handler?.set
95
+ if (!handler || !set) return
87
96
  try {
88
- await withNodeConsoleFormat(() => set.call(handler, key, pendingEntry));
97
+ await withNodeConsoleFormat(() => set.call(handler, key, pendingEntry))
89
98
  } catch {
90
99
  // best-effort
91
100
  }
92
101
  }
93
102
 
94
- export async function modernCacheGetExpiration(tags = implicitSoftTags()): Promise<number | undefined> {
95
- const handler = state().handler;
96
- const getExpiration = handler?.getExpiration;
97
- if (!handler || !getExpiration) return undefined;
103
+ export async function modernCacheGetExpiration(
104
+ tags = implicitSoftTags(),
105
+ ): Promise<number | undefined> {
106
+ const handler = state().handler
107
+ const getExpiration = handler?.getExpiration
108
+ if (!handler || !getExpiration) return undefined
98
109
  try {
99
- return await withNodeConsoleFormat(() => getExpiration.call(handler, tags));
110
+ return await withNodeConsoleFormat(() => getExpiration.call(handler, tags))
100
111
  } catch {
101
- return undefined;
112
+ return undefined
102
113
  }
103
114
  }
104
115
 
105
- export async function modernCacheUpdateTags(tags: string[], durations?: { expire?: number }): Promise<void> {
106
- const handler = state().handler;
107
- const updateTags = handler?.updateTags;
108
- if (!handler || !updateTags) return;
116
+ export async function modernCacheUpdateTags(
117
+ tags: string[],
118
+ durations?: { expire?: number },
119
+ ): Promise<void> {
120
+ const handler = state().handler
121
+ const updateTags = handler?.updateTags
122
+ if (!handler || !updateTags) return
109
123
  try {
110
- await withNodeConsoleFormat(() => updateTags.call(handler, tags, durations));
124
+ await withNodeConsoleFormat(() => updateTags.call(handler, tags, durations))
111
125
  } catch {
112
126
  // best-effort
113
127
  }
@@ -120,40 +134,40 @@ export async function modernCacheUpdateTags(tags: string[], durations?: { expire
120
134
  * single-quoted util.inspect output verbatim.
121
135
  */
122
136
  async function withNodeConsoleFormat<T>(fn: () => Promise<T> | T): Promise<T> {
123
- const original = console.log.bind(console);
137
+ const original = console.log.bind(console)
124
138
  console.log = (...args: unknown[]) => {
125
- original(format(...args));
126
- };
139
+ original(format(...args))
140
+ }
127
141
  try {
128
- return await fn();
142
+ return await fn()
129
143
  } finally {
130
- console.log = original;
144
+ console.log = original
131
145
  }
132
146
  }
133
147
 
134
148
  export function modernCacheKey(id: string, argsJson: string): string {
135
149
  // eslint-disable-next-line turbo/no-undeclared-env-vars
136
- const buildId = process.env.NODE_ENV === 'development' ? 'development' : 'pnext';
150
+ const buildId = process.env.NODE_ENV === 'development' ? 'development' : 'pnext'
137
151
  // Fixed-width hex: Next's cache keys are whole-byte hex strings and the e2e
138
152
  // suites match them with `([0-9a-f]{2})+` — an odd-length (leading-zero
139
153
  // trimmed) hash would never match.
140
- const hash = Bun.hash.wyhash(`${id}:${argsJson}`).toString(16).padStart(16, '0');
141
- return JSON.stringify([buildId, hash, JSON.parse(argsJson)]);
154
+ const hash = Bun.hash.wyhash(`${id}:${argsJson}`).toString(16).padStart(16, '0')
155
+ return JSON.stringify([buildId, hash, JSON.parse(argsJson)])
142
156
  }
143
157
 
144
158
  export function modernCacheEntry(input: {
145
- value: unknown;
146
- tags: string[];
147
- staleSeconds?: number;
148
- expireSeconds?: number;
149
- revalidateSeconds?: number;
150
- storedAt: number;
159
+ value: unknown
160
+ tags: string[]
161
+ staleSeconds?: number
162
+ expireSeconds?: number
163
+ revalidateSeconds?: number
164
+ storedAt: number
151
165
  }): ModernCacheEntry {
152
166
  return {
153
167
  value: new ReadableStream<Uint8Array>({
154
168
  start(controller) {
155
- controller.enqueue(new TextEncoder().encode(JSON.stringify(input.value)));
156
- controller.close();
169
+ controller.enqueue(new TextEncoder().encode(JSON.stringify(input.value)))
170
+ controller.close()
157
171
  },
158
172
  }),
159
173
  tags: input.tags,
@@ -161,40 +175,41 @@ export function modernCacheEntry(input: {
161
175
  timestamp: input.storedAt,
162
176
  expire: input.expireSeconds ?? 31536000,
163
177
  revalidate: input.revalidateSeconds ?? 900,
164
- };
178
+ }
165
179
  }
166
180
 
167
181
  export function clearModernCacheHandlerForTest(): void {
168
- const current = state();
169
- current.handler = undefined;
170
- current.installedFor = undefined;
182
+ const current = state()
183
+ current.handler = undefined
184
+ current.installedFor = undefined
171
185
  }
172
186
 
173
187
  function defaultCacheHandlerPath(): string | undefined {
174
- const cacheHandlers = getNextConfig().cacheHandlers;
175
- if (!cacheHandlers || typeof cacheHandlers !== 'object' || Array.isArray(cacheHandlers)) return undefined;
176
- const configured = (cacheHandlers as Record<string, unknown>).default;
177
- return typeof configured === 'string' && configured.length > 0 ? configured : undefined;
188
+ const cacheHandlers = getNextConfig().cacheHandlers
189
+ if (!cacheHandlers || typeof cacheHandlers !== 'object' || Array.isArray(cacheHandlers))
190
+ return undefined
191
+ const configured = (cacheHandlers as Record<string, unknown>).default
192
+ return typeof configured === 'string' && configured.length > 0 ? configured : undefined
178
193
  }
179
194
 
180
195
  function resolveHandlerPath(configured: string, root: string): string {
181
- const resolved = configured.startsWith('file:') ? fileURLToPath(configured) : configured;
182
- if (path.isAbsolute(resolved)) return resolved;
183
- return path.resolve(root, resolved);
196
+ const resolved = configured.startsWith('file:') ? fileURLToPath(configured) : configured
197
+ if (path.isAbsolute(resolved)) return resolved
198
+ return path.resolve(root, resolved)
184
199
  }
185
200
 
186
201
  function loadHandler(filePath: string, root: string): ModernCacheHandler | undefined {
187
- if (!existsSync(filePath)) return undefined;
202
+ if (!existsSync(filePath)) return undefined
188
203
  try {
189
- const require = createRequire(pathToFileURL(`${root}/index.js`).href);
204
+ const require = createRequire(pathToFileURL(`${root}/index.js`).href)
190
205
  try {
191
- return pickHandler(require(filePath));
206
+ return pickHandler(require(filePath))
192
207
  } catch (error) {
193
- if (!isNextDistMissing(error)) return undefined;
194
- return loadCommonJsHandlerWithNextStubs(filePath, require);
208
+ if (!isNextDistMissing(error)) return undefined
209
+ return loadCommonJsHandlerWithNextStubs(filePath, require)
195
210
  }
196
211
  } catch {
197
- return undefined;
212
+ return undefined
198
213
  }
199
214
  }
200
215
 
@@ -203,73 +218,80 @@ function loadCommonJsHandlerWithNextStubs(
203
218
  rootRequire: NodeRequire,
204
219
  ): ModernCacheHandler | undefined {
205
220
  try {
206
- const module = { exports: {} as unknown };
221
+ const module = { exports: {} as unknown }
207
222
  const localRequire = (specifier: string): unknown => {
208
223
  if (specifier === 'next/dist/server/lib/cache-handlers/default.external') {
209
- return { default: createDefaultExternalHandler() };
224
+ return { default: createDefaultExternalHandler() }
210
225
  }
211
- if (specifier.startsWith('next/dist/')) return {};
226
+ if (specifier.startsWith('next/dist/')) return {}
212
227
  if (specifier.startsWith('./') || specifier.startsWith('../')) {
213
- return rootRequire(path.resolve(path.dirname(filePath), specifier));
228
+ return rootRequire(path.resolve(path.dirname(filePath), specifier))
214
229
  }
215
- return rootRequire(specifier);
216
- };
217
- const source = readFileSync(filePath, 'utf8');
230
+ return rootRequire(specifier)
231
+ }
232
+ const source = readFileSync(filePath, 'utf8')
218
233
  // eslint-disable-next-line @typescript-eslint/no-implied-eval
219
- const evaluate = new Function('require', 'module', 'exports', '__filename', '__dirname', source) as (
234
+ const evaluate = new Function(
235
+ 'require',
236
+ 'module',
237
+ 'exports',
238
+ '__filename',
239
+ '__dirname',
240
+ source,
241
+ ) as (
220
242
  require: (specifier: string) => unknown,
221
243
  module: { exports: unknown },
222
244
  exports: unknown,
223
245
  filename: string,
224
246
  dirname: string,
225
- ) => void;
226
- evaluate(localRequire, module, module.exports, filePath, path.dirname(filePath));
227
- return pickHandler(module.exports);
247
+ ) => void
248
+ evaluate(localRequire, module, module.exports, filePath, path.dirname(filePath))
249
+ return pickHandler(module.exports)
228
250
  } catch {
229
- return undefined;
251
+ return undefined
230
252
  }
231
253
  }
232
254
 
233
255
  function isNextDistMissing(error: unknown): boolean {
234
- const message = (error as { message?: unknown }).message;
235
- return typeof message === 'string' && message.includes('next/dist/');
256
+ const message = (error as { message?: unknown }).message
257
+ return typeof message === 'string' && message.includes('next/dist/')
236
258
  }
237
259
 
238
260
  function pickHandler(mod: unknown): ModernCacheHandler | undefined {
239
261
  const candidate =
240
262
  mod && typeof mod === 'object' && 'default' in mod
241
263
  ? (mod as { default?: unknown }).default
242
- : mod;
243
- return candidate && typeof candidate === 'object' ? candidate : undefined;
264
+ : mod
265
+ return candidate && typeof candidate === 'object' ? candidate : undefined
244
266
  }
245
267
 
246
268
  function createDefaultExternalHandler(): ModernCacheHandler {
247
- const entries = new Map<string, ModernCacheEntry>();
248
- const tagExpirations = new Map<string, number>();
269
+ const entries = new Map<string, ModernCacheEntry>()
270
+ const tagExpirations = new Map<string, number>()
249
271
  return {
250
272
  get(cacheKey) {
251
- return entries.get(cacheKey);
273
+ return entries.get(cacheKey)
252
274
  },
253
275
  async set(cacheKey, pendingEntry) {
254
- entries.set(cacheKey, await pendingEntry);
276
+ entries.set(cacheKey, await pendingEntry)
255
277
  },
256
278
  refreshTags() {
257
- return undefined;
279
+ return undefined
258
280
  },
259
281
  getExpiration(tags) {
260
- let value = 0;
261
- for (const tag of tags) value = Math.max(value, tagExpirations.get(tag) ?? 0);
262
- return value;
282
+ let value = 0
283
+ for (const tag of tags) value = Math.max(value, tagExpirations.get(tag) ?? 0)
284
+ return value
263
285
  },
264
286
  updateTags(tags) {
265
- const now = realNow();
266
- for (const tag of tags) tagExpirations.set(tag, now);
287
+ const now = realNow()
288
+ for (const tag of tags) tagExpirations.set(tag, now)
267
289
  },
268
- };
290
+ }
269
291
  }
270
292
 
271
293
  function implicitSoftTags(): string[] {
272
- const pathname = new URL(currentRequest()?.url ?? 'http://pnext.local/').pathname || '/';
273
- const leaf = pathname === '/' ? '/index' : pathname;
274
- return ['_N_T_/layout', '_N_T_/page', '_N_T_/', `_N_T_${leaf}`];
294
+ const pathname = new URL(currentRequest()?.url ?? 'http://pnext.local/').pathname || '/'
295
+ const leaf = pathname === '/' ? '/index' : pathname
296
+ return ['_N_T_/layout', '_N_T_/page', '_N_T_/', `_N_T_${leaf}`]
275
297
  }