@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
@@ -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
  }