vinext 1.0.0-beta.7 → 1.0.0-beta.9

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 (137) hide show
  1. package/README.md +43 -0
  2. package/dist/build/prerender-paths.d.ts +50 -1
  3. package/dist/build/prerender-paths.js +627 -88
  4. package/dist/build/prerender.d.ts +4 -2
  5. package/dist/build/prerender.js +40 -23
  6. package/dist/build/report.d.ts +16 -1
  7. package/dist/build/report.js +64 -3
  8. package/dist/build/static-export.d.ts +1 -1
  9. package/dist/cache/cache-adapters-virtual.d.ts +47 -1
  10. package/dist/cache/cache-adapters-virtual.js +10 -1
  11. package/dist/cli.js +7 -0
  12. package/dist/client/vinext-next-data.d.ts +2 -0
  13. package/dist/config/config-matchers.d.ts +3 -3
  14. package/dist/config/config-matchers.js +8 -3
  15. package/dist/config/prerender.d.ts +2 -2
  16. package/dist/config/prerender.js +2 -2
  17. package/dist/entries/app-browser-entry.d.ts +1 -1
  18. package/dist/entries/app-browser-entry.js +4 -1
  19. package/dist/entries/app-rsc-entry.d.ts +2 -0
  20. package/dist/entries/app-rsc-entry.js +28 -4
  21. package/dist/entries/app-rsc-manifest.js +1 -0
  22. package/dist/entries/pages-server-entry.d.ts +1 -1
  23. package/dist/entries/pages-server-entry.js +4 -1
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.js +146 -28
  26. package/dist/init-cloudflare.d.ts +5 -3
  27. package/dist/init-cloudflare.js +58 -25
  28. package/dist/plugins/import-meta-url.js +7 -6
  29. package/dist/routing/app-router.d.ts +3 -1
  30. package/dist/routing/app-router.js +5 -1
  31. package/dist/server/app-browser-entry.js +41 -13
  32. package/dist/server/app-browser-navigation-controller.js +1 -1
  33. package/dist/server/app-browser-state.js +1 -1
  34. package/dist/server/app-browser-visible-commit.js +1 -1
  35. package/dist/server/app-middleware.d.ts +8 -0
  36. package/dist/server/app-middleware.js +28 -2
  37. package/dist/server/app-optimistic-routing.d.ts +6 -1
  38. package/dist/server/app-optimistic-routing.js +13 -1
  39. package/dist/server/app-page-boundary.js +2 -1
  40. package/dist/server/app-page-cache-finalizer.d.ts +16 -1
  41. package/dist/server/app-page-cache-finalizer.js +73 -4
  42. package/dist/server/app-page-cache.js +2 -2
  43. package/dist/server/app-page-dispatch.d.ts +2 -0
  44. package/dist/server/app-page-dispatch.js +12 -4
  45. package/dist/server/app-page-execution.js +1 -1
  46. package/dist/server/app-page-render.d.ts +1 -0
  47. package/dist/server/app-page-render.js +27 -9
  48. package/dist/server/app-page-response.js +2 -2
  49. package/dist/server/app-page-stream.js +2 -1
  50. package/dist/server/app-pages-bridge.js +2 -0
  51. package/dist/server/app-prerender-endpoints.js +23 -11
  52. package/dist/server/app-prerender-static-params.js +12 -5
  53. package/dist/server/app-route-handler-dispatch.js +13 -9
  54. package/dist/server/app-route-handler-execution.d.ts +1 -0
  55. package/dist/server/app-route-handler-execution.js +127 -14
  56. package/dist/server/app-route-handler-policy.d.ts +15 -3
  57. package/dist/server/app-route-handler-policy.js +19 -4
  58. package/dist/server/app-route-tree-prefetch.js +2 -2
  59. package/dist/server/app-router-entry.js +52 -8
  60. package/dist/server/app-rsc-cache-busting.d.ts +22 -4
  61. package/dist/server/app-rsc-cache-busting.js +68 -18
  62. package/dist/server/app-rsc-handler.d.ts +2 -0
  63. package/dist/server/app-rsc-handler.js +95 -30
  64. package/dist/server/app-rsc-response-finalizer.js +24 -7
  65. package/dist/server/app-rsc-route-matching.d.ts +1 -0
  66. package/dist/server/app-rsc-route-matching.js +1 -0
  67. package/dist/server/app-segment-config.d.ts +3 -1
  68. package/dist/server/app-segment-config.js +23 -11
  69. package/dist/server/app-server-action-execution.js +4 -4
  70. package/dist/server/app-ssr-entry.js +4 -4
  71. package/dist/server/cache-control.d.ts +8 -2
  72. package/dist/server/cache-control.js +35 -4
  73. package/dist/server/cacheability-limits.d.ts +9 -0
  74. package/dist/server/cacheability-limits.js +9 -0
  75. package/dist/server/cacheability-manifest.d.ts +42 -0
  76. package/dist/server/cacheability-manifest.js +191 -0
  77. package/dist/server/cacheability-request.d.ts +20 -0
  78. package/dist/server/cacheability-request.js +457 -0
  79. package/dist/server/config-headers.js +23 -3
  80. package/dist/server/headers.d.ts +16 -3
  81. package/dist/server/headers.js +29 -3
  82. package/dist/server/middleware-matcher.d.ts +9 -1
  83. package/dist/server/middleware-matcher.js +22 -1
  84. package/dist/server/middleware-runtime.d.ts +6 -0
  85. package/dist/server/middleware-runtime.js +18 -3
  86. package/dist/server/normalize-path.js +1 -1
  87. package/dist/server/pages-api-route.js +1 -1
  88. package/dist/server/pages-i18n.js +3 -2
  89. package/dist/server/pages-page-handler.js +22 -9
  90. package/dist/server/pages-request-pipeline.d.ts +2 -0
  91. package/dist/server/pages-request-pipeline.js +17 -6
  92. package/dist/server/pages-router-entry.js +56 -9
  93. package/dist/server/prerender-route-params.js +1 -0
  94. package/dist/server/prerender-work-unit-setup.d.ts +3 -2
  95. package/dist/server/prerender-work-unit-setup.js +34 -11
  96. package/dist/server/prod-server.js +5 -5
  97. package/dist/server/request-pipeline.d.ts +1 -5
  98. package/dist/server/request-pipeline.js +2 -9
  99. package/dist/server/revalidation-host.js +1 -0
  100. package/dist/server/server-globals.js +13 -0
  101. package/dist/server/static-file-signal.d.ts +13 -0
  102. package/dist/server/static-file-signal.js +33 -0
  103. package/dist/server/worker-prerender-discovery.d.ts +19 -0
  104. package/dist/server/worker-prerender-discovery.js +55 -0
  105. package/dist/server/worker-utils.js +2 -3
  106. package/dist/shims/cache-runtime.js +140 -102
  107. package/dist/shims/cache.js +11 -1
  108. package/dist/shims/cacheability-classification.d.ts +85 -0
  109. package/dist/shims/cacheability-classification.js +146 -0
  110. package/dist/shims/cdn-cache.d.ts +30 -1
  111. package/dist/shims/cdn-cache.js +25 -1
  112. package/dist/shims/error.js +1 -1
  113. package/dist/shims/fetch-cache.js +8 -3
  114. package/dist/shims/headers.d.ts +3 -1
  115. package/dist/shims/headers.js +9 -5
  116. package/dist/shims/internal/app-prefetch-rsc-request.d.ts +25 -0
  117. package/dist/shims/internal/app-prefetch-rsc-request.js +21 -0
  118. package/dist/shims/internal/app-route-prefetch-policy.d.ts +2 -0
  119. package/dist/shims/internal/app-route-prefetch-policy.js +2 -0
  120. package/dist/shims/internal/hybrid-client-route-owner-direct.d.ts +2 -2
  121. package/dist/shims/internal/hybrid-client-route-owner-direct.js +29 -11
  122. package/dist/shims/internal/hybrid-client-route-owner.js +2 -2
  123. package/dist/shims/internal/make-hanging-promise.d.ts +7 -1
  124. package/dist/shims/internal/make-hanging-promise.js +13 -2
  125. package/dist/shims/internal/work-unit-async-storage.d.ts +2 -0
  126. package/dist/shims/link.js +25 -14
  127. package/dist/shims/navigation.js +31 -11
  128. package/dist/shims/navigation.react-server.js +1 -1
  129. package/dist/shims/request-context.d.ts +2 -0
  130. package/dist/shims/server.js +1 -1
  131. package/dist/shims/url-utils.d.ts +8 -1
  132. package/dist/shims/url-utils.js +10 -1
  133. package/dist/utils/prerender-output-paths.d.ts +7 -7
  134. package/dist/utils/prerender-output-paths.js +16 -9
  135. package/dist/utils/react-compiler-support.d.ts +20 -0
  136. package/dist/utils/react-compiler-support.js +29 -0
  137. package/package.json +10 -2
package/README.md CHANGED
@@ -517,6 +517,7 @@ These are deployed to Cloudflare Workers and updated on every push to `main`:
517
517
  | Nextra Docs | Nextra docs site (MDX, App Router) | [nextra-docs-template.vinext.workers.dev](https://nextra-docs-template.vinext.workers.dev) |
518
518
  | App Router (minimal) | Minimal App Router on Workers | [app-router-cloudflare.vinext.workers.dev](https://app-router-cloudflare.vinext.workers.dev) |
519
519
  | Pages Router (minimal) | Minimal Pages Router on Workers | [pages-router-cloudflare.vinext.workers.dev](https://pages-router-cloudflare.vinext.workers.dev) |
520
+ | Static export | [Hybrid App/Pages Router site](examples/static-export) served as assets only | [static-export.vinext.workers.dev](https://static-export.vinext.workers.dev) |
520
521
  | RealWorld API | REST API routes example | [realworld-api-rest.vinext.workers.dev](https://realworld-api-rest.vinext.workers.dev) |
521
522
  | Benchmarks Dashboard | Build performance tracking over time (D1-backed) | [vinext.dev/benchmarks](https://vinext.dev/benchmarks) |
522
523
  | App Router + Nitro | App Router deployed via Nitro (multi-platform) | [examples/app-router-nitro](examples/app-router-nitro) |
@@ -606,6 +607,33 @@ Every `next/*` import is shimmed to a Vite-compatible implementation.
606
607
  | `images` config | 🟡 | Parsed but not used for optimization |
607
608
  | `experimental.optimizePackageImports` | ✅ | Rewrites barrel imports to direct sub-module imports in RSC/SSR environments. A default set (lucide-react, date-fns, radix-ui, antd, MUI, and others) are always optimized. Add package names here to extend the list. |
608
609
  | `vinext({ nextConfig })` | ✅ | Inline Next-style config from `vite.config.*`. Supports object-form and function-form config. When provided, this overrides root `next.config.*`. |
610
+ | `vinext({ react: { compiler: true } })` | ✅ | React Compiler auto memoization. Needs `@vitejs/plugin-react` 6.1+ and the optional `oxc-transform-react` package. |
611
+
612
+ ### React Compiler
613
+
614
+ vinext auto-registers `@vitejs/plugin-react`, so the React Compiler is enabled through the same `react` option:
615
+
616
+ ```ts
617
+ import { defineConfig } from "vite";
618
+ import vinext from "vinext";
619
+
620
+ export default defineConfig({
621
+ plugins: [vinext({ react: { compiler: true } })],
622
+ });
623
+ ```
624
+
625
+ The transform itself ships separately, so install it alongside:
626
+
627
+ ```bash
628
+ npm install -D oxc-transform-react
629
+ ```
630
+
631
+ This requires `@vitejs/plugin-react` 6.1.0 or newer. Older versions accept the option and drop it, so vinext fails with an actionable error instead of leaving the compiler silently disabled. The compiler runs on the client environment only.
632
+
633
+ One caveat: modules whose JSX is lowered earlier in the pipeline are not memoized. Those build and behave correctly, they just miss auto memoization:
634
+
635
+ - JSX in plain `.js` files, which `vinext:jsx-in-js` compiles first so the compiler can parse them at all. Rename to `.jsx` or `.tsx` to get memoization.
636
+ - Components using `<style jsx>`, which `vinext:styled-jsx` compiles through the Next.js SWC transform before the compiler runs.
609
637
 
610
638
  ### Environment variable loading (`.env*`)
611
639
 
@@ -682,11 +710,26 @@ The KV data adapter reads `env[binding]` at runtime, so add the matching KV name
682
710
  ```jsonc
683
711
  {
684
712
  "cache": { "enabled": true },
713
+ "version_metadata": { "binding": "CF_VERSION_METADATA" },
685
714
  }
686
715
  ```
687
716
 
717
+ The version metadata binding is required for staged discovery and warming to
718
+ verify the uploaded Worker version. Wrangler named environments do not inherit
719
+ `version_metadata`, so repeat it inside each `env.<name>` used for warming.
720
+
721
+ `vinext-cloudflare deploy --experimental-warm-cdn-cache` performs the two-stage
722
+ upload and makes one final cache-fill request per admitted identity by default.
723
+ Add `--warm-cdn-certify` only to opt into a second, header-only request that
724
+ must prove every planned entry reusable before promotion.
725
+
688
726
  While the data adapter can store entries and serve HIT/STALE itself, the CDN adapter delegates serving to Cloudflare's edge: the origin renders fresh responses and tags them with `Cache-Tag`, and `revalidateTag()` / `revalidatePath()` purge the edge through `ctx.cache.purge({ tags })`. See [examples/workers-cache](examples/workers-cache) for both adapters wired up together.
689
727
 
728
+ Keep Cloudflare's incoming cache key query-sensitive when using `cdnAdapter()`.
729
+ The two-stage cacheability manifest authorizes exact pathname + query
730
+ identities, and a Cache Rule that ignores or normalizes query strings can serve
731
+ an edge HIT before the Worker has a chance to enforce that identity.
732
+
690
733
  Each builder returns a plain, serializable `{ adapter, options }` descriptor — **it never touches the Workers runtime**, so nothing throws at build or dev time when bindings aren't available. The actual adapter (and its `env` binding lookup) is instantiated lazily on the first request.
691
734
 
692
735
  Registration is wired into **every router and runtime** — App Router and Pages Router, on Cloudflare Workers as well as the Node.js server (`vinext start`) and dev. It self-guards (instantiated once per isolate) and is resilient: if an adapter can't initialize on a given runtime (e.g. a KV binding doesn't exist on the Node server), vinext logs a warning and falls back to the default handler instead of failing requests.
@@ -1,13 +1,51 @@
1
1
  import { ResolvedNextConfig } from "../config/next-config.js";
2
+ import { CdnCacheAdapterCapabilities } from "../cache/cache-adapters-virtual.js";
2
3
  import { VinextRouteRootConfig } from "../config/prerender.js";
3
4
  //#region src/build/prerender-paths.d.ts
5
+ type PrerenderRoutePattern = {
6
+ kind: "app-page" | "app-route" | "pages-page";
7
+ pattern: string;
8
+ /** Closed-world safety facts for probe coordinator optimizations. */
9
+ cacheabilityProbe?: {
10
+ canPrunePattern: boolean;
11
+ /** HTML pathname shared by alternate representations of this route. */
12
+ concretePathname?: string;
13
+ };
14
+ };
4
15
  type PrerenderPathManifest = {
16
+ /** App Page HTML paths after hybrid route ownership has been resolved. */
17
+ appPaths?: string[];
18
+ basePath?: string;
5
19
  buildId?: string;
20
+ /** Opaque per-build identity emitted by CDN adapter page responses. */
21
+ buildIdentity?: string;
22
+ deploymentId?: string;
23
+ /** Opaque per-build identity emitted by RSC responses. */
24
+ rscBuildId?: string;
25
+ responseVary?: CdnCacheAdapterCapabilities["responseVary"];
26
+ /** App Router paths discovered without rendering their page responses. */
27
+ rscPaths?: string[];
28
+ /** Statically eligible App Route Handler request paths. */
29
+ routeHandlerPaths?: string[];
30
+ /** App Router paths with an ordinary main-tree loading boundary. */
31
+ loadingShellPaths?: string[];
32
+ /** Pages Router paths selected by the existing HTML warm discovery pass. */
33
+ pagesPaths?: string[];
34
+ /** Pages Router JSON data identities corresponding to discovered static paths. */
35
+ pagesDataPaths?: string[];
36
+ /** Public paths omitted because configured routes can replace their page response. */
37
+ excludedWarmPaths?: string[];
38
+ /** Static dynamic-route patterns with no build-discovered concrete path. */
39
+ fallbackRoutePatterns?: PrerenderRoutePattern[];
40
+ /** Resolved route ownership for grouping cacheability probes without re-matching paths. */
41
+ routePatterns?: Record<string, PrerenderRoutePattern>;
6
42
  trailingSlash?: boolean;
7
43
  paths: string[];
8
44
  };
9
45
  declare const PRERENDER_PATH_DISCOVERY_ENV = "__VINEXT_PRERENDER_PATH_DISCOVERY";
10
46
  declare const PRERENDER_PATHS_MANIFEST = "vinext-prerender-paths.json";
47
+ declare const DEFAULT_REMOTE_PATH_DISCOVERY_RETRY_DELAY_MS = 1000;
48
+ declare const DEFAULT_REMOTE_PATH_DISCOVERY_PHASE_TIMEOUT_MS = 120000;
11
49
  type EmitPrerenderPathManifestOptions = {
12
50
  root: string;
13
51
  /** Fully resolved Next.js config. Loaded from disk when omitted. */
@@ -17,7 +55,18 @@ type EmitPrerenderPathManifestOptions = {
17
55
  routeRootConfig?: VinextRouteRootConfig | null;
18
56
  pagesBundlePath?: string;
19
57
  rscBundlePath?: string;
58
+ buildIdentity?: CdnCacheAdapterCapabilities["buildIdentity"];
59
+ responseVary?: CdnCacheAdapterCapabilities["responseVary"];
60
+ /** Execute dynamic path hooks against an already-uploaded Worker. */
61
+ pathDiscoveryTarget?: {
62
+ baseUrl: string;
63
+ headers?: HeadersInit;
64
+ /** Retry transient staged-version routing responses before failing discovery. */
65
+ phaseTimeoutMs?: number;
66
+ retries?: number;
67
+ retryDelayMs?: number;
68
+ };
20
69
  };
21
70
  declare function emitPrerenderPathManifest(options: EmitPrerenderPathManifestOptions): Promise<PrerenderPathManifest | null>;
22
71
  //#endregion
23
- export { PRERENDER_PATHS_MANIFEST, PRERENDER_PATH_DISCOVERY_ENV, PrerenderPathManifest, emitPrerenderPathManifest };
72
+ export { DEFAULT_REMOTE_PATH_DISCOVERY_PHASE_TIMEOUT_MS, DEFAULT_REMOTE_PATH_DISCOVERY_RETRY_DELAY_MS, PRERENDER_PATHS_MANIFEST, PRERENDER_PATH_DISCOVERY_ENV, PrerenderPathManifest, PrerenderRoutePattern, emitPrerenderPathManifest };