vinext 0.0.51 → 0.0.52
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.
- package/dist/build/precompress.d.ts +7 -7
- package/dist/build/precompress.js +18 -17
- package/dist/build/precompress.js.map +1 -1
- package/dist/build/prerender.d.ts +3 -14
- package/dist/build/prerender.js +40 -40
- package/dist/build/prerender.js.map +1 -1
- package/dist/check.js +4 -0
- package/dist/check.js.map +1 -1
- package/dist/cli-args.d.ts +1 -0
- package/dist/cli-args.js +5 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +39 -0
- package/dist/cli.js.map +1 -1
- package/dist/client/navigation-runtime.d.ts +47 -0
- package/dist/client/navigation-runtime.js +156 -0
- package/dist/client/navigation-runtime.js.map +1 -0
- package/dist/client/pages-router-link-navigation.d.ts +26 -0
- package/dist/client/pages-router-link-navigation.js +14 -0
- package/dist/client/pages-router-link-navigation.js.map +1 -0
- package/dist/client/vinext-next-data.d.ts +12 -2
- package/dist/client/vinext-next-data.js +50 -1
- package/dist/client/vinext-next-data.js.map +1 -0
- package/dist/cloudflare/kv-cache-handler.js +2 -1
- package/dist/cloudflare/kv-cache-handler.js.map +1 -1
- package/dist/config/config-matchers.d.ts +63 -16
- package/dist/config/config-matchers.js +143 -8
- package/dist/config/config-matchers.js.map +1 -1
- package/dist/config/next-config.d.ts +20 -2
- package/dist/config/next-config.js +11 -1
- package/dist/config/next-config.js.map +1 -1
- package/dist/deploy.js +101 -39
- package/dist/deploy.js.map +1 -1
- package/dist/entries/app-browser-entry.js +9 -3
- package/dist/entries/app-browser-entry.js.map +1 -1
- package/dist/entries/app-rsc-entry.js +53 -13
- package/dist/entries/app-rsc-entry.js.map +1 -1
- package/dist/entries/app-rsc-manifest.d.ts +1 -0
- package/dist/entries/app-rsc-manifest.js +53 -6
- package/dist/entries/app-rsc-manifest.js.map +1 -1
- package/dist/entries/app-ssr-entry.d.ts +3 -3
- package/dist/entries/app-ssr-entry.js +4 -4
- package/dist/entries/app-ssr-entry.js.map +1 -1
- package/dist/entries/pages-client-entry.js +18 -2
- package/dist/entries/pages-client-entry.js.map +1 -1
- package/dist/entries/pages-server-entry.js +58 -8
- package/dist/entries/pages-server-entry.js.map +1 -1
- package/dist/entries/runtime-entry-module.d.ts +2 -1
- package/dist/entries/runtime-entry-module.js +9 -3
- package/dist/entries/runtime-entry-module.js.map +1 -1
- package/dist/index.js +132 -40
- package/dist/index.js.map +1 -1
- package/dist/plugins/css-data-url.d.ts +7 -0
- package/dist/plugins/css-data-url.js +81 -0
- package/dist/plugins/css-data-url.js.map +1 -0
- package/dist/plugins/fonts.js +5 -3
- package/dist/plugins/fonts.js.map +1 -1
- package/dist/plugins/middleware-server-only.d.ts +54 -0
- package/dist/plugins/middleware-server-only.js +91 -0
- package/dist/plugins/middleware-server-only.js.map +1 -0
- package/dist/plugins/optimize-imports.js +4 -4
- package/dist/plugins/optimize-imports.js.map +1 -1
- package/dist/plugins/strip-server-exports.js +5 -8
- package/dist/plugins/strip-server-exports.js.map +1 -1
- package/dist/routing/app-route-graph.d.ts +20 -1
- package/dist/routing/app-route-graph.js +58 -6
- package/dist/routing/app-route-graph.js.map +1 -1
- package/dist/routing/app-router.d.ts +2 -2
- package/dist/routing/app-router.js +2 -2
- package/dist/routing/app-router.js.map +1 -1
- package/dist/routing/utils.d.ts +2 -1
- package/dist/routing/utils.js +4 -1
- package/dist/routing/utils.js.map +1 -1
- package/dist/server/api-handler.js +139 -37
- package/dist/server/api-handler.js.map +1 -1
- package/dist/server/app-browser-entry.js +293 -149
- package/dist/server/app-browser-entry.js.map +1 -1
- package/dist/server/app-browser-interception-context.d.ts +24 -0
- package/dist/server/app-browser-interception-context.js +32 -0
- package/dist/server/app-browser-interception-context.js.map +1 -0
- package/dist/server/app-browser-navigation-controller.d.ts +3 -1
- package/dist/server/app-browser-navigation-controller.js +5 -1
- package/dist/server/app-browser-navigation-controller.js.map +1 -1
- package/dist/server/app-browser-rsc-redirect.d.ts +2 -1
- package/dist/server/app-browser-rsc-redirect.js +2 -2
- package/dist/server/app-browser-rsc-redirect.js.map +1 -1
- package/dist/server/app-browser-state.d.ts +18 -1
- package/dist/server/app-browser-state.js +19 -1
- package/dist/server/app-browser-state.js.map +1 -1
- package/dist/server/app-browser-stream.d.ts +5 -14
- package/dist/server/app-browser-stream.js +13 -7
- package/dist/server/app-browser-stream.js.map +1 -1
- package/dist/server/app-browser-visible-commit.d.ts +2 -1
- package/dist/server/app-browser-visible-commit.js +1 -0
- package/dist/server/app-browser-visible-commit.js.map +1 -1
- package/dist/server/app-elements-wire.d.ts +10 -5
- package/dist/server/app-elements-wire.js +84 -2
- package/dist/server/app-elements-wire.js.map +1 -1
- package/dist/server/app-elements.d.ts +3 -2
- package/dist/server/app-elements.js +3 -2
- package/dist/server/app-elements.js.map +1 -1
- package/dist/server/app-fallback-renderer.js +5 -3
- package/dist/server/app-fallback-renderer.js.map +1 -1
- package/dist/server/app-middleware.d.ts +13 -0
- package/dist/server/app-middleware.js +3 -1
- package/dist/server/app-middleware.js.map +1 -1
- package/dist/server/app-optimistic-routing.d.ts +54 -0
- package/dist/server/app-optimistic-routing.js +200 -0
- package/dist/server/app-optimistic-routing.js.map +1 -0
- package/dist/server/app-page-cache.d.ts +13 -1
- package/dist/server/app-page-cache.js +61 -6
- package/dist/server/app-page-cache.js.map +1 -1
- package/dist/server/app-page-dispatch.d.ts +2 -0
- package/dist/server/app-page-dispatch.js +28 -1
- package/dist/server/app-page-dispatch.js.map +1 -1
- package/dist/server/app-page-element-builder.js +2 -1
- package/dist/server/app-page-element-builder.js.map +1 -1
- package/dist/server/app-page-execution.d.ts +28 -1
- package/dist/server/app-page-execution.js +89 -4
- package/dist/server/app-page-execution.js.map +1 -1
- package/dist/server/app-page-head.js +21 -2
- package/dist/server/app-page-head.js.map +1 -1
- package/dist/server/app-page-probe.js +1 -1
- package/dist/server/app-page-render.d.ts +2 -0
- package/dist/server/app-page-render.js +2 -1
- package/dist/server/app-page-render.js.map +1 -1
- package/dist/server/app-page-response.js +4 -3
- package/dist/server/app-page-response.js.map +1 -1
- package/dist/server/app-page-route-wiring.js +17 -10
- package/dist/server/app-page-route-wiring.js.map +1 -1
- package/dist/server/app-page-stream.d.ts +3 -0
- package/dist/server/app-page-stream.js +1 -0
- package/dist/server/app-page-stream.js.map +1 -1
- package/dist/server/app-prerender-static-params.d.ts +2 -1
- package/dist/server/app-prerender-static-params.js +44 -8
- package/dist/server/app-prerender-static-params.js.map +1 -1
- package/dist/server/app-route-handler-cache.d.ts +2 -2
- package/dist/server/app-route-handler-cache.js +3 -2
- package/dist/server/app-route-handler-cache.js.map +1 -1
- package/dist/server/app-route-handler-dispatch.d.ts +6 -1
- package/dist/server/app-route-handler-dispatch.js +1 -1
- package/dist/server/app-route-handler-dispatch.js.map +1 -1
- package/dist/server/app-route-handler-execution.d.ts +17 -2
- package/dist/server/app-route-handler-execution.js.map +1 -1
- package/dist/server/app-route-handler-response.js +5 -4
- package/dist/server/app-route-handler-response.js.map +1 -1
- package/dist/server/app-router-entry.js +6 -2
- package/dist/server/app-router-entry.js.map +1 -1
- package/dist/server/app-rsc-handler.d.ts +9 -1
- package/dist/server/app-rsc-handler.js +32 -14
- package/dist/server/app-rsc-handler.js.map +1 -1
- package/dist/server/app-rsc-render-mode.d.ts +4 -3
- package/dist/server/app-rsc-render-mode.js +7 -1
- package/dist/server/app-rsc-render-mode.js.map +1 -1
- package/dist/server/app-rsc-request-normalization.d.ts +4 -1
- package/dist/server/app-rsc-request-normalization.js +4 -1
- package/dist/server/app-rsc-request-normalization.js.map +1 -1
- package/dist/server/app-rsc-response-finalizer.d.ts +8 -1
- package/dist/server/app-rsc-response-finalizer.js +10 -3
- package/dist/server/app-rsc-response-finalizer.js.map +1 -1
- package/dist/server/app-rsc-route-matching.js +2 -2
- package/dist/server/app-rsc-route-matching.js.map +1 -1
- package/dist/server/app-server-action-execution.js +1 -1
- package/dist/server/app-ssr-entry.d.ts +2 -0
- package/dist/server/app-ssr-entry.js +56 -55
- package/dist/server/app-ssr-entry.js.map +1 -1
- package/dist/server/app-ssr-stream.d.ts +6 -1
- package/dist/server/app-ssr-stream.js +17 -3
- package/dist/server/app-ssr-stream.js.map +1 -1
- package/dist/server/artifact-compatibility.d.ts +1 -1
- package/dist/server/artifact-compatibility.js.map +1 -1
- package/dist/server/cache-headers.d.ts +7 -0
- package/dist/server/cache-headers.js +19 -0
- package/dist/server/cache-headers.js.map +1 -0
- package/dist/server/cache-proof.d.ts +49 -3
- package/dist/server/cache-proof.js +78 -22
- package/dist/server/cache-proof.js.map +1 -1
- package/dist/server/client-reuse-manifest.d.ts +99 -0
- package/dist/server/client-reuse-manifest.js +212 -0
- package/dist/server/client-reuse-manifest.js.map +1 -0
- package/dist/server/default-global-error-module.d.ts +20 -0
- package/dist/server/default-global-error-module.js +20 -0
- package/dist/server/default-global-error-module.js.map +1 -0
- package/dist/server/dev-server.d.ts +9 -1
- package/dist/server/dev-server.js +76 -29
- package/dist/server/dev-server.js.map +1 -1
- package/dist/server/edge-api-runtime.d.ts +5 -0
- package/dist/server/edge-api-runtime.js +8 -0
- package/dist/server/edge-api-runtime.js.map +1 -0
- package/dist/server/headers.d.ts +18 -1
- package/dist/server/headers.js +18 -1
- package/dist/server/headers.js.map +1 -1
- package/dist/server/http-error-responses.d.ts +16 -1
- package/dist/server/http-error-responses.js +21 -1
- package/dist/server/http-error-responses.js.map +1 -1
- package/dist/server/isr-cache.d.ts +6 -2
- package/dist/server/isr-cache.js +20 -4
- package/dist/server/isr-cache.js.map +1 -1
- package/dist/server/middleware-runtime.d.ts +15 -0
- package/dist/server/middleware-runtime.js +59 -7
- package/dist/server/middleware-runtime.js.map +1 -1
- package/dist/server/middleware.d.ts +1 -1
- package/dist/server/middleware.js +4 -2
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/navigation-planner.d.ts +9 -3
- package/dist/server/navigation-planner.js +98 -25
- package/dist/server/navigation-planner.js.map +1 -1
- package/dist/server/navigation-trace.d.ts +2 -1
- package/dist/server/navigation-trace.js +1 -0
- package/dist/server/navigation-trace.js.map +1 -1
- package/dist/server/pages-api-route.d.ts +27 -1
- package/dist/server/pages-api-route.js +24 -3
- package/dist/server/pages-api-route.js.map +1 -1
- package/dist/server/pages-data-route.d.ts +77 -0
- package/dist/server/pages-data-route.js +97 -0
- package/dist/server/pages-data-route.js.map +1 -0
- package/dist/server/pages-i18n.d.ts +51 -1
- package/dist/server/pages-i18n.js +61 -1
- package/dist/server/pages-i18n.js.map +1 -1
- package/dist/server/pages-page-data.d.ts +29 -2
- package/dist/server/pages-page-data.js +31 -17
- package/dist/server/pages-page-data.js.map +1 -1
- package/dist/server/pages-page-response.d.ts +11 -1
- package/dist/server/pages-page-response.js +5 -3
- package/dist/server/pages-page-response.js.map +1 -1
- package/dist/server/prod-server.d.ts +13 -15
- package/dist/server/prod-server.js +109 -56
- package/dist/server/prod-server.js.map +1 -1
- package/dist/server/request-pipeline.d.ts +11 -2
- package/dist/server/request-pipeline.js +28 -11
- package/dist/server/request-pipeline.js.map +1 -1
- package/dist/server/seed-cache.d.ts +12 -31
- package/dist/server/seed-cache.js +22 -35
- package/dist/server/seed-cache.js.map +1 -1
- package/dist/server/server-action-not-found.js +8 -3
- package/dist/server/server-action-not-found.js.map +1 -1
- package/dist/server/skip-cache-proof.d.ts +41 -0
- package/dist/server/skip-cache-proof.js +101 -0
- package/dist/server/skip-cache-proof.js.map +1 -0
- package/dist/server/static-file-cache.d.ts +1 -1
- package/dist/server/static-file-cache.js +7 -6
- package/dist/server/static-file-cache.js.map +1 -1
- package/dist/shims/client-locale.d.ts +15 -0
- package/dist/shims/client-locale.js +13 -0
- package/dist/shims/client-locale.js.map +1 -0
- package/dist/shims/default-global-error.d.ts +32 -0
- package/dist/shims/default-global-error.js +181 -0
- package/dist/shims/default-global-error.js.map +1 -0
- package/dist/shims/document.d.ts +59 -3
- package/dist/shims/document.js +36 -5
- package/dist/shims/document.js.map +1 -1
- package/dist/shims/error-boundary.d.ts +2 -2
- package/dist/shims/form.js +13 -6
- package/dist/shims/form.js.map +1 -1
- package/dist/shims/link.d.ts +21 -3
- package/dist/shims/link.js +131 -22
- package/dist/shims/link.js.map +1 -1
- package/dist/shims/metadata.js +4 -4
- package/dist/shims/metadata.js.map +1 -1
- package/dist/shims/navigation.d.ts +8 -2
- package/dist/shims/navigation.js +36 -15
- package/dist/shims/navigation.js.map +1 -1
- package/dist/shims/og.d.ts +18 -2
- package/dist/shims/og.js +49 -1
- package/dist/shims/og.js.map +1 -0
- package/dist/shims/request-state-types.d.ts +1 -1
- package/dist/shims/root-params.d.ts +3 -1
- package/dist/shims/root-params.js +11 -3
- package/dist/shims/root-params.js.map +1 -1
- package/dist/shims/router-state.d.ts +1 -0
- package/dist/shims/router-state.js.map +1 -1
- package/dist/shims/router.d.ts +12 -5
- package/dist/shims/router.js +172 -22
- package/dist/shims/router.js.map +1 -1
- package/dist/shims/server.d.ts +21 -4
- package/dist/shims/server.js +29 -9
- package/dist/shims/server.js.map +1 -1
- package/dist/shims/slot.js +5 -1
- package/dist/shims/slot.js.map +1 -1
- package/dist/shims/unified-request-context.d.ts +1 -1
- package/dist/shims/url-safety.d.ts +23 -1
- package/dist/shims/url-safety.js +29 -2
- package/dist/shims/url-safety.js.map +1 -1
- package/dist/typegen.d.ts +10 -0
- package/dist/typegen.js +242 -0
- package/dist/typegen.js.map +1 -0
- package/dist/utils/asset-prefix.d.ts +33 -5
- package/dist/utils/asset-prefix.js +39 -6
- package/dist/utils/asset-prefix.js.map +1 -1
- package/dist/utils/cache-control-metadata.d.ts +2 -1
- package/dist/utils/cache-control-metadata.js +1 -3
- package/dist/utils/cache-control-metadata.js.map +1 -1
- package/dist/utils/domain-locale.d.ts +2 -1
- package/dist/utils/domain-locale.js +9 -1
- package/dist/utils/domain-locale.js.map +1 -1
- package/dist/utils/lazy-chunks.d.ts +1 -1
- package/dist/utils/lazy-chunks.js +1 -1
- package/dist/utils/lazy-chunks.js.map +1 -1
- package/dist/utils/prerender-output-paths.d.ts +15 -0
- package/dist/utils/prerender-output-paths.js +24 -0
- package/dist/utils/prerender-output-paths.js.map +1 -0
- package/dist/utils/query.d.ts +17 -1
- package/dist/utils/query.js +36 -1
- package/dist/utils/query.js.map +1 -1
- package/dist/utils/record.d.ts +5 -0
- package/dist/utils/record.js +8 -0
- package/dist/utils/record.js.map +1 -0
- package/package.json +11 -3
|
@@ -11,16 +11,16 @@ type PrecompressResult = {
|
|
|
11
11
|
* Safe to re-run — overwrites existing compressed variants with identical
|
|
12
12
|
* output, and never compresses `.br`, `.gz`, or `.zst` files themselves.
|
|
13
13
|
*
|
|
14
|
-
* `assetsDir` defaults to `"
|
|
15
|
-
* `assetPrefix` is configured
|
|
16
|
-
*
|
|
17
|
-
*
|
|
14
|
+
* `assetsDir` defaults to `"_next/static"` (Next.js's canonical convention,
|
|
15
|
+
* matching `resolveAssetsDir("")`). When `assetPrefix` is configured as a
|
|
16
|
+
* path prefix the build writes assets to a different directory (e.g.
|
|
17
|
+
* `"cdn/_next/static"`); callers should resolve that with
|
|
18
18
|
* `resolveAssetsDir(assetPrefix)` and thread it through. Without this,
|
|
19
|
-
* `assetPrefix` builds would walk an empty `
|
|
20
|
-
* zero compressed variants.
|
|
19
|
+
* `assetPrefix` builds would walk an empty `_next/static/` directory and
|
|
20
|
+
* emit zero compressed variants.
|
|
21
21
|
*/
|
|
22
22
|
declare function precompressAssets(clientDir: string, options?: {
|
|
23
|
-
/** Subdirectory under `clientDir` containing hashed assets. Defaults to `"
|
|
23
|
+
/** Subdirectory under `clientDir` containing hashed assets. Defaults to `"_next/static"`. */assetsDir?: string;
|
|
24
24
|
onProgress?: (completed: number, total: number, file: string) => void;
|
|
25
25
|
}): Promise<PrecompressResult>;
|
|
26
26
|
//#endregion
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { ASSET_PREFIX_URL_DIR } from "../utils/asset-prefix.js";
|
|
1
2
|
import path from "node:path";
|
|
2
|
-
import
|
|
3
|
+
import fs from "node:fs/promises";
|
|
3
4
|
import os from "node:os";
|
|
4
5
|
import zlib from "node:zlib";
|
|
5
6
|
import { promisify } from "node:util";
|
|
@@ -8,12 +9,12 @@ import { promisify } from "node:util";
|
|
|
8
9
|
* Build-time precompression for hashed static assets.
|
|
9
10
|
*
|
|
10
11
|
* Generates .br (brotli q5), .gz (gzip l8), and .zst (zstd l8) files
|
|
11
|
-
* alongside compressible assets in dist/client/
|
|
12
|
-
* the production server — no per-request compression needed
|
|
13
|
-
* build output.
|
|
12
|
+
* alongside compressible assets in dist/client/_next/static/. Served
|
|
13
|
+
* directly by the production server — no per-request compression needed
|
|
14
|
+
* for immutable build output.
|
|
14
15
|
*
|
|
15
|
-
* Only targets
|
|
16
|
-
* on-the-fly compression since they may change between deploys.
|
|
16
|
+
* Only targets the hashed-asset directory (immutable) — public directory
|
|
17
|
+
* files use on-the-fly compression since they may change between deploys.
|
|
17
18
|
*/
|
|
18
19
|
const brotliCompress = promisify(zlib.brotliCompress);
|
|
19
20
|
const gzip = promisify(zlib.gzip);
|
|
@@ -45,7 +46,7 @@ const CONCURRENCY = Math.min(os.availableParallelism(), 8);
|
|
|
45
46
|
async function* walkFiles(dir, base = dir) {
|
|
46
47
|
let entries;
|
|
47
48
|
try {
|
|
48
|
-
entries = await
|
|
49
|
+
entries = await fs.readdir(dir, { withFileTypes: true });
|
|
49
50
|
} catch {
|
|
50
51
|
return;
|
|
51
52
|
}
|
|
@@ -62,16 +63,16 @@ async function* walkFiles(dir, base = dir) {
|
|
|
62
63
|
* Safe to re-run — overwrites existing compressed variants with identical
|
|
63
64
|
* output, and never compresses `.br`, `.gz`, or `.zst` files themselves.
|
|
64
65
|
*
|
|
65
|
-
* `assetsDir` defaults to `"
|
|
66
|
-
* `assetPrefix` is configured
|
|
67
|
-
*
|
|
68
|
-
*
|
|
66
|
+
* `assetsDir` defaults to `"_next/static"` (Next.js's canonical convention,
|
|
67
|
+
* matching `resolveAssetsDir("")`). When `assetPrefix` is configured as a
|
|
68
|
+
* path prefix the build writes assets to a different directory (e.g.
|
|
69
|
+
* `"cdn/_next/static"`); callers should resolve that with
|
|
69
70
|
* `resolveAssetsDir(assetPrefix)` and thread it through. Without this,
|
|
70
|
-
* `assetPrefix` builds would walk an empty `
|
|
71
|
-
* zero compressed variants.
|
|
71
|
+
* `assetPrefix` builds would walk an empty `_next/static/` directory and
|
|
72
|
+
* emit zero compressed variants.
|
|
72
73
|
*/
|
|
73
74
|
async function precompressAssets(clientDir, options = {}) {
|
|
74
|
-
const { assetsDir: assetsSubdir =
|
|
75
|
+
const { assetsDir: assetsSubdir = ASSET_PREFIX_URL_DIR, onProgress } = options;
|
|
75
76
|
const assetsDir = path.join(clientDir, assetsSubdir);
|
|
76
77
|
const result = {
|
|
77
78
|
filesCompressed: 0,
|
|
@@ -88,13 +89,13 @@ async function precompressAssets(clientDir, options = {}) {
|
|
|
88
89
|
for (let i = 0; i < filePaths.length; i += CONCURRENCY) {
|
|
89
90
|
const chunk = filePaths.slice(i, i + CONCURRENCY);
|
|
90
91
|
await Promise.all(chunk.map(async (fullPath) => {
|
|
91
|
-
const content = await
|
|
92
|
+
const content = await fs.readFile(fullPath);
|
|
92
93
|
if (content.length < MIN_SIZE) return;
|
|
93
94
|
const compressions = [brotliCompress(content, { params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5 } }), gzip(content, { level: 8 })];
|
|
94
95
|
if (zstdCompress) compressions.push(zstdCompress(content, { params: { [zlib.constants.ZSTD_c_compressionLevel]: 8 } }));
|
|
95
96
|
const [brContent, gzContent, zstdContent] = await Promise.all(compressions);
|
|
96
|
-
const writes = [
|
|
97
|
-
if (zstdContent) writes.push(
|
|
97
|
+
const writes = [fs.writeFile(fullPath + ".br", brContent), fs.writeFile(fullPath + ".gz", gzContent)];
|
|
98
|
+
if (zstdContent) writes.push(fs.writeFile(fullPath + ".zst", zstdContent));
|
|
98
99
|
await Promise.all(writes);
|
|
99
100
|
result.filesCompressed++;
|
|
100
101
|
result.totalOriginalBytes += content.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"precompress.js","names":[],"sources":["../../src/build/precompress.ts"],"sourcesContent":["/**\n * Build-time precompression for hashed static assets.\n *\n * Generates .br (brotli q5), .gz (gzip l8), and .zst (zstd l8) files\n * alongside compressible assets in dist/client/
|
|
1
|
+
{"version":3,"file":"precompress.js","names":["fsp"],"sources":["../../src/build/precompress.ts"],"sourcesContent":["/**\n * Build-time precompression for hashed static assets.\n *\n * Generates .br (brotli q5), .gz (gzip l8), and .zst (zstd l8) files\n * alongside compressible assets in dist/client/_next/static/. Served\n * directly by the production server — no per-request compression needed\n * for immutable build output.\n *\n * Only targets the hashed-asset directory (immutable) — public directory\n * files use on-the-fly compression since they may change between deploys.\n */\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport zlib from \"node:zlib\";\nimport { promisify } from \"node:util\";\nimport { ASSET_PREFIX_URL_DIR } from \"../utils/asset-prefix.js\";\n\nconst brotliCompress = promisify(zlib.brotliCompress);\nconst gzip = promisify(zlib.gzip);\nconst zstdCompress = typeof zlib.zstdCompress === \"function\" ? promisify(zlib.zstdCompress) : null;\n\n/** File extensions worth compressing (text-based, not already compressed). */\nconst COMPRESSIBLE_EXTENSIONS = new Set([\n \".js\",\n \".mjs\",\n \".css\",\n \".html\",\n \".json\",\n \".xml\",\n \".svg\",\n \".txt\",\n \".map\",\n \".wasm\",\n]);\n\n/** Below this size, compression overhead exceeds savings. */\nconst MIN_SIZE = 1024;\n\n/**\n * Past ~8 parallel files, mixed-size asset sets spend more time queueing zlib\n * work than making forward progress. Keep the batch size bounded even on\n * higher-core machines.\n */\nconst CONCURRENCY = Math.min(os.availableParallelism(), 8);\n\ntype PrecompressResult = {\n filesCompressed: number;\n totalOriginalBytes: number;\n /** Sum of brotli-compressed sizes (used for compression ratio reporting). */\n totalBrotliBytes: number;\n};\n\n/**\n * Walk a directory recursively, yielding relative paths for regular files.\n */\nasync function* walkFiles(dir: string, base: string = dir): AsyncGenerator<string> {\n let entries;\n try {\n entries = await fsp.readdir(dir, { withFileTypes: true });\n } catch {\n return; // directory doesn't exist\n }\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n yield* walkFiles(fullPath, base);\n } else if (entry.isFile()) {\n yield path.relative(base, fullPath);\n }\n }\n}\n\n/**\n * Precompress all compressible hashed assets under `clientDir/<assetsDir>/`.\n *\n * Writes `.br`, `.gz`, and `.zst` files alongside each original.\n * Safe to re-run — overwrites existing compressed variants with identical\n * output, and never compresses `.br`, `.gz`, or `.zst` files themselves.\n *\n * `assetsDir` defaults to `\"_next/static\"` (Next.js's canonical convention,\n * matching `resolveAssetsDir(\"\")`). When `assetPrefix` is configured as a\n * path prefix the build writes assets to a different directory (e.g.\n * `\"cdn/_next/static\"`); callers should resolve that with\n * `resolveAssetsDir(assetPrefix)` and thread it through. Without this,\n * `assetPrefix` builds would walk an empty `_next/static/` directory and\n * emit zero compressed variants.\n */\nexport async function precompressAssets(\n clientDir: string,\n options: {\n /** Subdirectory under `clientDir` containing hashed assets. Defaults to `\"_next/static\"`. */\n assetsDir?: string;\n onProgress?: (completed: number, total: number, file: string) => void;\n } = {},\n): Promise<PrecompressResult> {\n const { assetsDir: assetsSubdir = ASSET_PREFIX_URL_DIR, onProgress } = options;\n const assetsDir = path.join(clientDir, assetsSubdir);\n const result: PrecompressResult = {\n filesCompressed: 0,\n totalOriginalBytes: 0,\n totalBrotliBytes: 0,\n };\n\n // Collect compressible file paths, then read + compress in bounded chunks\n // to keep peak memory at O(CONCURRENCY * max_file_size) instead of\n // O(total_assets).\n const filePaths: string[] = [];\n\n for await (const relativePath of walkFiles(assetsDir)) {\n const ext = path.extname(relativePath).toLowerCase();\n\n if (!COMPRESSIBLE_EXTENSIONS.has(ext)) continue;\n // .br/.gz/.zst are intentionally absent from COMPRESSIBLE_EXTENSIONS, so\n // precompressed variants generated by a previous run are never re-compressed.\n\n filePaths.push(path.join(assetsDir, relativePath));\n }\n\n let processed = 0;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const chunk = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(\n chunk.map(async (fullPath) => {\n const content = await fsp.readFile(fullPath);\n // readFile already done before this check — stat()-first would save\n // the read for tiny files but costs an extra syscall per file;\n // sub-1KB hashed assets are rare enough that read-first is cheaper.\n if (content.length < MIN_SIZE) return;\n\n // Compress all variants concurrently within each file\n const compressions: Promise<Buffer>[] = [\n brotliCompress(content, {\n params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 5 },\n }),\n gzip(content, { level: 8 }),\n ];\n if (zstdCompress) {\n compressions.push(\n zstdCompress(content, {\n params: { [zlib.constants.ZSTD_c_compressionLevel]: 8 },\n }),\n );\n }\n\n const results = await Promise.all(compressions);\n const [brContent, gzContent, zstdContent] = results;\n\n const writes = [\n fsp.writeFile(fullPath + \".br\", brContent),\n fsp.writeFile(fullPath + \".gz\", gzContent),\n ];\n if (zstdContent) {\n writes.push(fsp.writeFile(fullPath + \".zst\", zstdContent));\n }\n await Promise.all(writes);\n\n // Increment counters only after all writes succeed, so partial\n // failures (e.g. ENOSPC mid-write) don't inflate the reported totals.\n result.filesCompressed++;\n result.totalOriginalBytes += content.length;\n result.totalBrotliBytes += brContent.length;\n }),\n );\n // Report progress once per chunk to avoid non-deterministic ordering\n // within Promise.all (smaller files complete before larger ones).\n // Progress tracks all files (including skipped ones below MIN_SIZE),\n // which differs from filesCompressed (only files actually compressed).\n processed += chunk.length;\n onProgress?.(processed, filePaths.length, path.basename(chunk[chunk.length - 1]));\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAM,iBAAiB,UAAU,KAAK,eAAe;AACrD,MAAM,OAAO,UAAU,KAAK,KAAK;AACjC,MAAM,eAAe,OAAO,KAAK,iBAAiB,aAAa,UAAU,KAAK,aAAa,GAAG;;AAG9F,MAAM,0BAA0B,IAAI,IAAI;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;;AAGF,MAAM,WAAW;;;;;;AAOjB,MAAM,cAAc,KAAK,IAAI,GAAG,sBAAsB,EAAE,EAAE;;;;AAY1D,gBAAgB,UAAU,KAAa,OAAe,KAA6B;CACjF,IAAI;CACJ,IAAI;EACF,UAAU,MAAMA,GAAI,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;SACnD;EACN;;CAEF,KAAK,MAAM,SAAS,SAAS;EAC3B,MAAM,WAAW,KAAK,KAAK,KAAK,MAAM,KAAK;EAC3C,IAAI,MAAM,aAAa,EACrB,OAAO,UAAU,UAAU,KAAK;OAC3B,IAAI,MAAM,QAAQ,EACvB,MAAM,KAAK,SAAS,MAAM,SAAS;;;;;;;;;;;;;;;;;;AAoBzC,eAAsB,kBACpB,WACA,UAII,EAAE,EACsB;CAC5B,MAAM,EAAE,WAAW,eAAe,sBAAsB,eAAe;CACvE,MAAM,YAAY,KAAK,KAAK,WAAW,aAAa;CACpD,MAAM,SAA4B;EAChC,iBAAiB;EACjB,oBAAoB;EACpB,kBAAkB;EACnB;CAKD,MAAM,YAAsB,EAAE;CAE9B,WAAW,MAAM,gBAAgB,UAAU,UAAU,EAAE;EACrD,MAAM,MAAM,KAAK,QAAQ,aAAa,CAAC,aAAa;EAEpD,IAAI,CAAC,wBAAwB,IAAI,IAAI,EAAE;EAIvC,UAAU,KAAK,KAAK,KAAK,WAAW,aAAa,CAAC;;CAGpD,IAAI,YAAY;CAChB,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK,aAAa;EACtD,MAAM,QAAQ,UAAU,MAAM,GAAG,IAAI,YAAY;EACjD,MAAM,QAAQ,IACZ,MAAM,IAAI,OAAO,aAAa;GAC5B,MAAM,UAAU,MAAMA,GAAI,SAAS,SAAS;GAI5C,IAAI,QAAQ,SAAS,UAAU;GAG/B,MAAM,eAAkC,CACtC,eAAe,SAAS,EACtB,QAAQ,GAAG,KAAK,UAAU,uBAAuB,GAAG,EACrD,CAAC,EACF,KAAK,SAAS,EAAE,OAAO,GAAG,CAAC,CAC5B;GACD,IAAI,cACF,aAAa,KACX,aAAa,SAAS,EACpB,QAAQ,GAAG,KAAK,UAAU,0BAA0B,GAAG,EACxD,CAAC,CACH;GAIH,MAAM,CAAC,WAAW,WAAW,eAAe,MADtB,QAAQ,IAAI,aAAa;GAG/C,MAAM,SAAS,CACbA,GAAI,UAAU,WAAW,OAAO,UAAU,EAC1CA,GAAI,UAAU,WAAW,OAAO,UAAU,CAC3C;GACD,IAAI,aACF,OAAO,KAAKA,GAAI,UAAU,WAAW,QAAQ,YAAY,CAAC;GAE5D,MAAM,QAAQ,IAAI,OAAO;GAIzB,OAAO;GACP,OAAO,sBAAsB,QAAQ;GACrC,OAAO,oBAAoB,UAAU;IACrC,CACH;EAKD,aAAa,MAAM;EACnB,aAAa,WAAW,UAAU,QAAQ,KAAK,SAAS,MAAM,MAAM,SAAS,GAAG,CAAC;;CAGnF,OAAO"}
|
|
@@ -123,15 +123,10 @@ type PrerenderAppOptionsInternal = PrerenderAppOptions & {
|
|
|
123
123
|
* all '<' and '>' in the embedded JSON, preventing false </script> matches.
|
|
124
124
|
*/
|
|
125
125
|
declare function extractRscPayloadFromPrerenderedHtml(html: string): Uint8Array | null;
|
|
126
|
-
/**
|
|
127
|
-
* Determine the HTML output file path for a URL.
|
|
128
|
-
* Respects trailingSlash config.
|
|
129
|
-
*/
|
|
130
|
-
declare function getOutputPath(urlPath: string, trailingSlash: boolean): string;
|
|
131
126
|
/** Map of route patterns to generateStaticParams functions (or null/undefined). */
|
|
132
127
|
type StaticParamsMap = Record<string, ((opts: {
|
|
133
128
|
params: Record<string, string | string[]>;
|
|
134
|
-
}) => Promise<
|
|
129
|
+
}) => Promise<unknown>) | null | undefined>;
|
|
135
130
|
/**
|
|
136
131
|
* Resolve parent dynamic segment params for a route.
|
|
137
132
|
* Handles top-down generateStaticParams resolution for nested dynamic routes.
|
|
@@ -139,7 +134,7 @@ type StaticParamsMap = Record<string, ((opts: {
|
|
|
139
134
|
* Uses the `staticParamsMap` (pattern → generateStaticParams) exported from
|
|
140
135
|
* the production bundle.
|
|
141
136
|
*/
|
|
142
|
-
declare function resolveParentParams(childRoute: AppRoute,
|
|
137
|
+
declare function resolveParentParams(childRoute: AppRoute, staticParamsMap: StaticParamsMap): Promise<Record<string, string | string[]>[]>;
|
|
143
138
|
/**
|
|
144
139
|
* Run the prerender phase for Pages Router.
|
|
145
140
|
*
|
|
@@ -187,12 +182,6 @@ declare function prerenderApp({
|
|
|
187
182
|
rscBundlePath,
|
|
188
183
|
...options
|
|
189
184
|
}: PrerenderAppOptionsInternal): Promise<PrerenderResult>;
|
|
190
|
-
/**
|
|
191
|
-
* Determine the RSC output file path for a URL.
|
|
192
|
-
* "/blog/hello-world" → "blog/hello-world.rsc"
|
|
193
|
-
* "/" → "index.rsc"
|
|
194
|
-
*/
|
|
195
|
-
declare function getRscOutputPath(urlPath: string): string;
|
|
196
185
|
/**
|
|
197
186
|
* Write `vinext-prerender.json` to `outDir`.
|
|
198
187
|
*
|
|
@@ -205,5 +194,5 @@ declare function writePrerenderIndex(routes: PrerenderRouteResult[], outDir: str
|
|
|
205
194
|
trailingSlash?: boolean;
|
|
206
195
|
}): void;
|
|
207
196
|
//#endregion
|
|
208
|
-
export { PrerenderResult, PrerenderRouteResult, StaticParamsMap, extractRscPayloadFromPrerenderedHtml,
|
|
197
|
+
export { PrerenderResult, PrerenderRouteResult, StaticParamsMap, extractRscPayloadFromPrerenderedHtml, prerenderApp, prerenderPages, readPrerenderSecret, resolveParentParams, writePrerenderIndex };
|
|
209
198
|
//# sourceMappingURL=prerender.d.ts.map
|
package/dist/build/prerender.js
CHANGED
|
@@ -5,7 +5,9 @@ import { headersContextFromRequest, runWithHeadersContext } from "../shims/heade
|
|
|
5
5
|
import { NoOpCacheHandler, _consumeRequestScopedCacheLife, getCacheHandler, setCacheHandler } from "../shims/cache.js";
|
|
6
6
|
import { classifyAppRoute, classifyPagesRoute, getAppRouteRenderEntryPath } from "./report.js";
|
|
7
7
|
import { concatUint8Arrays, decodeRscEmbeddedChunk } from "../server/app-rsc-embedded-chunks.js";
|
|
8
|
+
import { navigationRuntimeRscBootstrapExpression } from "../server/app-ssr-stream.js";
|
|
8
9
|
import { readPrerenderSecret } from "./server-manifest.js";
|
|
10
|
+
import { getOutputPath, getRscOutputPath } from "../utils/prerender-output-paths.js";
|
|
9
11
|
import { startProdServer } from "../server/prod-server.js";
|
|
10
12
|
import fs from "node:fs";
|
|
11
13
|
import path from "node:path";
|
|
@@ -34,9 +36,12 @@ function getErrorMessageWithStack(err) {
|
|
|
34
36
|
/** Sentinel path used to trigger 404 rendering without a real route match. */
|
|
35
37
|
const NOT_FOUND_SENTINEL_PATH = "/__vinext_nonexistent_for_404__";
|
|
36
38
|
const DEFAULT_CONCURRENCY = Math.min(os.availableParallelism(), 8);
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
39
|
+
const RSC_LEGACY_CHUNK_SCRIPT_PREFIX = "self.__VINEXT_RSC_CHUNKS__=self.__VINEXT_RSC_CHUNKS__||[];";
|
|
40
|
+
const RSC_LEGACY_DONE_SCRIPT = "self.__VINEXT_RSC_DONE__=true";
|
|
41
|
+
const RSC_LEGACY_CHUNK_FULL_PREFIX = `${RSC_LEGACY_CHUNK_SCRIPT_PREFIX}self.__VINEXT_RSC_CHUNKS__.push(`;
|
|
42
|
+
const RSC_RUNTIME_BOOTSTRAP_EXPRESSION = navigationRuntimeRscBootstrapExpression();
|
|
43
|
+
const RSC_RUNTIME_CHUNK_FULL_PREFIX = `${RSC_RUNTIME_BOOTSTRAP_EXPRESSION}.rsc.push(`;
|
|
44
|
+
const RSC_RUNTIME_DONE_SCRIPT = `${RSC_RUNTIME_BOOTSTRAP_EXPRESSION}.done=true`;
|
|
40
45
|
/**
|
|
41
46
|
* Reconstruct the RSC payload from a prerender HTML response by parsing the
|
|
42
47
|
* inline bootstrap chunk scripts emitted by createRscEmbedTransform.
|
|
@@ -59,15 +64,19 @@ function extractRscPayloadFromPrerenderedHtml(html) {
|
|
|
59
64
|
let match;
|
|
60
65
|
while ((match = scriptPattern.exec(html)) !== null) {
|
|
61
66
|
const script = (match[1] ?? "").trim().replace(/;$/, "");
|
|
62
|
-
if (script ===
|
|
67
|
+
if (script === RSC_RUNTIME_DONE_SCRIPT || script === RSC_LEGACY_DONE_SCRIPT) {
|
|
63
68
|
sawDone = true;
|
|
64
69
|
continue;
|
|
65
70
|
}
|
|
66
|
-
if (script.startsWith(
|
|
71
|
+
if (script.startsWith(RSC_RUNTIME_CHUNK_FULL_PREFIX)) {
|
|
72
|
+
chunks.push(decodeRscEmbeddedChunk(parseRscChunkPushArgument(script, RSC_RUNTIME_CHUNK_FULL_PREFIX)));
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (script.startsWith(RSC_LEGACY_CHUNK_SCRIPT_PREFIX)) chunks.push(decodeRscEmbeddedChunk(parseRscChunkPushArgument(script, RSC_LEGACY_CHUNK_FULL_PREFIX)));
|
|
67
76
|
}
|
|
68
77
|
if (chunks.length === 0 && !sawDone) return null;
|
|
69
78
|
if (chunks.length === 0) throw new Error("[vinext] Malformed prerender RSC embed: done marker present without chunk scripts");
|
|
70
|
-
if (!sawDone) throw new Error("[vinext] Malformed prerender RSC embed: missing
|
|
79
|
+
if (!sawDone) throw new Error("[vinext] Malformed prerender RSC embed: missing RSC done marker");
|
|
71
80
|
return concatUint8Arrays(chunks);
|
|
72
81
|
}
|
|
73
82
|
/**
|
|
@@ -77,9 +86,9 @@ function extractRscPayloadFromPrerenderedHtml(html) {
|
|
|
77
86
|
* prefix and ends with `)`. JSON.parse on the slice catches any tampering or
|
|
78
87
|
* trailing code.
|
|
79
88
|
*/
|
|
80
|
-
function parseRscChunkPushArgument(script) {
|
|
81
|
-
if (!script.startsWith(
|
|
82
|
-
const jsonSource = script.slice(
|
|
89
|
+
function parseRscChunkPushArgument(script, chunkPrefix) {
|
|
90
|
+
if (!script.startsWith(chunkPrefix) || !script.endsWith(")")) throw new Error("[vinext] Malformed prerender RSC embed: unexpected chunk script shape");
|
|
91
|
+
const jsonSource = script.slice(chunkPrefix.length, -1);
|
|
83
92
|
let parsed;
|
|
84
93
|
try {
|
|
85
94
|
parsed = JSON.parse(jsonSource);
|
|
@@ -135,23 +144,13 @@ function buildUrlFromParams(pattern, params) {
|
|
|
135
144
|
return "/" + result.join("/");
|
|
136
145
|
}
|
|
137
146
|
/**
|
|
138
|
-
* Determine the HTML output file path for a URL.
|
|
139
|
-
* Respects trailingSlash config.
|
|
140
|
-
*/
|
|
141
|
-
function getOutputPath(urlPath, trailingSlash) {
|
|
142
|
-
if (urlPath === "/") return "index.html";
|
|
143
|
-
const clean = urlPath.replace(/^\//, "");
|
|
144
|
-
if (trailingSlash) return `${clean}/index.html`;
|
|
145
|
-
return `${clean}.html`;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
147
|
* Resolve parent dynamic segment params for a route.
|
|
149
148
|
* Handles top-down generateStaticParams resolution for nested dynamic routes.
|
|
150
149
|
*
|
|
151
150
|
* Uses the `staticParamsMap` (pattern → generateStaticParams) exported from
|
|
152
151
|
* the production bundle.
|
|
153
152
|
*/
|
|
154
|
-
async function resolveParentParams(childRoute,
|
|
153
|
+
async function resolveParentParams(childRoute, staticParamsMap) {
|
|
155
154
|
const { patternParts } = childRoute;
|
|
156
155
|
let lastDynamicIdx = -1;
|
|
157
156
|
for (let i = patternParts.length - 1; i >= 0; i--) if (patternParts[i].startsWith(":")) {
|
|
@@ -164,25 +163,29 @@ async function resolveParentParams(childRoute, routeIndex, staticParamsMap) {
|
|
|
164
163
|
const part = patternParts[i];
|
|
165
164
|
prefixPattern += "/" + part;
|
|
166
165
|
if (!part.startsWith(":")) continue;
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if (typeof fn === "function") parentSegments.push(fn);
|
|
170
|
-
}
|
|
166
|
+
const fn = staticParamsMap[prefixPattern];
|
|
167
|
+
if (typeof fn === "function") parentSegments.push(fn);
|
|
171
168
|
}
|
|
172
169
|
if (parentSegments.length === 0) return [];
|
|
173
170
|
let currentParams = [{}];
|
|
171
|
+
let resolvedAnyParent = false;
|
|
174
172
|
for (const generateStaticParams of parentSegments) {
|
|
175
173
|
const nextParams = [];
|
|
174
|
+
let resolvedThisParent = false;
|
|
176
175
|
for (const parentParams of currentParams) {
|
|
177
176
|
const results = await generateStaticParams({ params: parentParams });
|
|
178
|
-
if (
|
|
177
|
+
if (results === null) continue;
|
|
178
|
+
if (!Array.isArray(results)) return [];
|
|
179
|
+
resolvedThisParent = true;
|
|
180
|
+
resolvedAnyParent = true;
|
|
181
|
+
for (const result of results) nextParams.push({
|
|
179
182
|
...parentParams,
|
|
180
183
|
...result
|
|
181
184
|
});
|
|
182
185
|
}
|
|
183
|
-
currentParams = nextParams;
|
|
186
|
+
if (resolvedThisParent) currentParams = nextParams;
|
|
184
187
|
}
|
|
185
|
-
return currentParams;
|
|
188
|
+
return resolvedAnyParent ? currentParams : [];
|
|
186
189
|
}
|
|
187
190
|
/**
|
|
188
191
|
* Run the prerender phase for Pages Router.
|
|
@@ -505,7 +508,6 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
|
|
|
505
508
|
return false;
|
|
506
509
|
}
|
|
507
510
|
});
|
|
508
|
-
const routeIndex = new Map(routes.map((r) => [r.pattern, r]));
|
|
509
511
|
const urlsToRender = [];
|
|
510
512
|
for (const route of routes) {
|
|
511
513
|
const renderEntryPath = getAppRouteRenderEntryPath(route);
|
|
@@ -556,7 +558,7 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
|
|
|
556
558
|
});
|
|
557
559
|
continue;
|
|
558
560
|
}
|
|
559
|
-
const parentParamSets = await resolveParentParams(route,
|
|
561
|
+
const parentParamSets = await resolveParentParams(route, staticParamsMap);
|
|
560
562
|
let paramSets;
|
|
561
563
|
if (parentParamSets.length > 0) {
|
|
562
564
|
paramSets = [];
|
|
@@ -570,8 +572,15 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
|
|
|
570
572
|
...parentParams,
|
|
571
573
|
...childParams
|
|
572
574
|
});
|
|
575
|
+
else {
|
|
576
|
+
paramSets = [];
|
|
577
|
+
break;
|
|
578
|
+
}
|
|
573
579
|
}
|
|
574
|
-
} else
|
|
580
|
+
} else {
|
|
581
|
+
const results = await generateStaticParamsFn({ params: {} });
|
|
582
|
+
paramSets = Array.isArray(results) || results === null ? results : [];
|
|
583
|
+
}
|
|
575
584
|
if (paramSets === null) {
|
|
576
585
|
if (mode === "export") results.push({
|
|
577
586
|
route: route.pattern,
|
|
@@ -772,15 +781,6 @@ async function prerenderApp({ routes, outDir, config, mode, rscBundlePath, ...op
|
|
|
772
781
|
if (ownedProdServerHandle) await new Promise((resolve) => ownedProdServerHandle.server.close(() => resolve()));
|
|
773
782
|
}
|
|
774
783
|
}
|
|
775
|
-
/**
|
|
776
|
-
* Determine the RSC output file path for a URL.
|
|
777
|
-
* "/blog/hello-world" → "blog/hello-world.rsc"
|
|
778
|
-
* "/" → "index.rsc"
|
|
779
|
-
*/
|
|
780
|
-
function getRscOutputPath(urlPath) {
|
|
781
|
-
if (urlPath === "/") return "index.rsc";
|
|
782
|
-
return urlPath.replace(/^\//, "") + ".rsc";
|
|
783
|
-
}
|
|
784
784
|
function resolveRenderedCacheControl(requestCacheLife, cacheControl, fallbackExpireSeconds) {
|
|
785
785
|
const sMaxage = parseCacheControlSeconds(cacheControl, "s-maxage");
|
|
786
786
|
const staleWhileRevalidate = parseCacheControlSeconds(cacheControl, "stale-while-revalidate");
|
|
@@ -846,6 +846,6 @@ function writePrerenderIndex(routes, outDir, options) {
|
|
|
846
846
|
fs.writeFileSync(path.join(outDir, "vinext-prerender.json"), JSON.stringify(index, null, 2), "utf-8");
|
|
847
847
|
}
|
|
848
848
|
//#endregion
|
|
849
|
-
export { extractRscPayloadFromPrerenderedHtml,
|
|
849
|
+
export { extractRscPayloadFromPrerenderedHtml, prerenderApp, prerenderPages, readPrerenderSecret, resolveParentParams, writePrerenderIndex };
|
|
850
850
|
|
|
851
851
|
//# sourceMappingURL=prerender.js.map
|