@nifrajs/web 5.0.0 → 5.2.0
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/CHANGELOG.md +2970 -0
- package/README.md +8 -0
- package/dist/build-plan.d.ts +7 -0
- package/dist/build-plan.d.ts.map +1 -1
- package/dist/build-plan.js +19 -0
- package/dist/build-plan.js.map +1 -1
- package/dist/build-vite.d.ts +1 -0
- package/dist/build-vite.d.ts.map +1 -1
- package/dist/build-vite.js +51 -3
- package/dist/build-vite.js.map +1 -1
- package/dist/build.d.ts +12 -1
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +43 -6
- package/dist/build.js.map +1 -1
- package/dist/client.d.ts +7 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +39 -22
- package/dist/client.js.map +1 -1
- package/dist/dev-port.d.ts +3 -2
- package/dist/dev-port.d.ts.map +1 -1
- package/dist/dev-port.js +2 -6
- package/dist/dev-port.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/internal/codegen.d.ts +6 -0
- package/dist/internal/codegen.d.ts.map +1 -1
- package/dist/internal/codegen.js +23 -5
- package/dist/internal/codegen.js.map +1 -1
- package/dist/internal/copy-split.d.ts +27 -0
- package/dist/internal/copy-split.d.ts.map +1 -0
- package/dist/internal/copy-split.js +173 -0
- package/dist/internal/copy-split.js.map +1 -0
- package/dist/internal/package-entries.d.ts +34 -0
- package/dist/internal/package-entries.d.ts.map +1 -0
- package/dist/internal/package-entries.js +324 -0
- package/dist/internal/package-entries.js.map +1 -0
- package/dist/internal/page-execution.d.ts +19 -1
- package/dist/internal/page-execution.d.ts.map +1 -1
- package/dist/internal/page-execution.js +123 -14
- package/dist/internal/page-execution.js.map +1 -1
- package/dist/internal/parity.d.ts.map +1 -1
- package/dist/internal/parity.js +15 -2
- package/dist/internal/parity.js.map +1 -1
- package/dist/internal/private-env.d.ts +8 -0
- package/dist/internal/private-env.d.ts.map +1 -1
- package/dist/internal/private-env.js +25 -10
- package/dist/internal/private-env.js.map +1 -1
- package/dist/internal/render-document.d.ts +15 -46
- package/dist/internal/render-document.d.ts.map +1 -1
- package/dist/internal/render-document.js +59 -62
- package/dist/internal/render-document.js.map +1 -1
- package/dist/internal/route-path.d.ts +6 -0
- package/dist/internal/route-path.d.ts.map +1 -1
- package/dist/internal/route-path.js +11 -0
- package/dist/internal/route-path.js.map +1 -1
- package/dist/internal/secret-scan.d.ts.map +1 -1
- package/dist/internal/secret-scan.js +103 -1
- package/dist/internal/secret-scan.js.map +1 -1
- package/dist/internal/typescript-api.d.ts +4 -0
- package/dist/internal/typescript-api.d.ts.map +1 -0
- package/dist/internal/typescript-api.js +8 -0
- package/dist/internal/typescript-api.js.map +1 -0
- package/dist/internal/vite-plugin-compat.d.ts +28 -0
- package/dist/internal/vite-plugin-compat.d.ts.map +1 -0
- package/dist/internal/vite-plugin-compat.js +82 -0
- package/dist/internal/vite-plugin-compat.js.map +1 -0
- package/dist/internal/web-app.d.ts +38 -2
- package/dist/internal/web-app.d.ts.map +1 -1
- package/dist/internal/web-app.js +30 -3
- package/dist/internal/web-app.js.map +1 -1
- package/dist/internal/without-query.d.ts +4 -0
- package/dist/internal/without-query.d.ts.map +1 -0
- package/dist/internal/without-query.js +9 -0
- package/dist/internal/without-query.js.map +1 -0
- package/dist/internal/zone-graph.d.ts.map +1 -1
- package/dist/internal/zone-graph.js +17 -6
- package/dist/internal/zone-graph.js.map +1 -1
- package/dist/isr.d.ts +1 -1
- package/dist/isr.d.ts.map +1 -1
- package/dist/isr.js +15 -2
- package/dist/isr.js.map +1 -1
- package/dist/manifest.d.ts +9 -0
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +1 -0
- package/dist/manifest.js.map +1 -1
- package/dist/plugins/import-glob.d.ts +20 -0
- package/dist/plugins/import-glob.d.ts.map +1 -0
- package/dist/plugins/import-glob.js +401 -0
- package/dist/plugins/import-glob.js.map +1 -0
- package/dist/plugins/kit.d.ts +11 -0
- package/dist/plugins/kit.d.ts.map +1 -1
- package/dist/plugins/kit.js +32 -0
- package/dist/plugins/kit.js.map +1 -1
- package/dist/plugins/stylex.d.ts.map +1 -1
- package/dist/plugins/stylex.js +2 -2
- package/dist/plugins/stylex.js.map +1 -1
- package/dist/plugins/vite-leak-guard.d.ts +6 -0
- package/dist/plugins/vite-leak-guard.d.ts.map +1 -1
- package/dist/plugins/vite-leak-guard.js +80 -7
- package/dist/plugins/vite-leak-guard.js.map +1 -1
- package/dist/plugins/vite-zone-guard.d.ts.map +1 -1
- package/dist/plugins/vite-zone-guard.js +17 -21
- package/dist/plugins/vite-zone-guard.js.map +1 -1
- package/dist/plugins/zone-guard.d.ts.map +1 -1
- package/dist/plugins/zone-guard.js +44 -3
- package/dist/plugins/zone-guard.js.map +1 -1
- package/dist/prerender.d.ts +5 -1
- package/dist/prerender.d.ts.map +1 -1
- package/dist/prerender.js +41 -19
- package/dist/prerender.js.map +1 -1
- package/dist/render-seam.d.ts +60 -2
- package/dist/render-seam.d.ts.map +1 -1
- package/dist/render-seam.js +33 -0
- package/dist/render-seam.js.map +1 -1
- package/dist/router.d.ts +3 -2
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +13 -9
- package/dist/router.js.map +1 -1
- package/dist/seo.d.ts +49 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +48 -0
- package/dist/seo.js.map +1 -0
- package/dist/server-components/typescript.d.ts.map +1 -1
- package/dist/server-components/typescript.js +2 -7
- package/dist/server-components/typescript.js.map +1 -1
- package/dist/vite.d.ts +1 -28
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +3 -69
- package/dist/vite.js.map +1 -1
- package/dist/zones.d.ts +30 -8
- package/dist/zones.d.ts.map +1 -1
- package/dist/zones.js +185 -46
- package/dist/zones.js.map +1 -1
- package/package.json +10 -4
- package/src/build-plan.ts +21 -0
- package/src/build-vite.ts +60 -3
- package/src/build.ts +57 -4
- package/src/client.ts +42 -22
- package/src/dev-port.ts +4 -10
- package/src/index.ts +8 -4
- package/src/internal/codegen.ts +32 -3
- package/src/internal/copy-split.ts +220 -0
- package/src/internal/package-entries.ts +331 -0
- package/src/internal/page-execution.ts +150 -13
- package/src/internal/parity.ts +15 -2
- package/src/internal/private-env.ts +27 -13
- package/src/internal/render-document.ts +100 -81
- package/src/internal/route-path.ts +16 -0
- package/src/internal/secret-scan.ts +101 -1
- package/src/internal/typescript-api.ts +11 -0
- package/src/internal/vite-plugin-compat.ts +81 -0
- package/src/internal/web-app.ts +71 -6
- package/src/internal/without-query.ts +8 -0
- package/src/internal/zone-graph.ts +19 -6
- package/src/isr.ts +13 -2
- package/src/manifest.ts +10 -0
- package/src/plugins/import-glob.ts +392 -0
- package/src/plugins/kit.ts +36 -0
- package/src/plugins/stylex.ts +2 -1
- package/src/plugins/vite-leak-guard.ts +99 -7
- package/src/plugins/vite-zone-guard.ts +21 -19
- package/src/plugins/zone-guard.ts +41 -2
- package/src/prerender.ts +39 -18
- package/src/render-seam.ts +88 -2
- package/src/router.ts +16 -11
- package/src/seo.ts +68 -0
- package/src/server-components/typescript.ts +2 -10
- package/src/vite.ts +3 -81
- package/src/zones.ts +237 -52
|
@@ -8,8 +8,10 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { statSync } from "node:fs";
|
|
10
10
|
import { dirname, isAbsolute, relative, resolve } from "node:path";
|
|
11
|
+
import { installedManifest } from "../internal/package-entries.js";
|
|
11
12
|
import { privateEnvDenial } from "../internal/private-env.js";
|
|
12
|
-
import {
|
|
13
|
+
import { withoutQuery } from "../internal/without-query.js";
|
|
14
|
+
import { BACKEND_ONLY_MARKER, browserDenial, createZoneClassifier, specifierPackage, } from "../zones.js";
|
|
13
15
|
const SOURCE_EXTENSIONS = "[cm]?[jt]sx?|svelte|vue|mdx|astro|css|scss|sass|less|json|jsonc|toml|ya?ml|txt|md";
|
|
14
16
|
/** Source files Bun loads through a loader that tolerates a declining `onLoad`. Every other file
|
|
15
17
|
* (images, fonts, wasm, and a `.pem` or `.sql` imported `with { type: "text" }`) goes through
|
|
@@ -27,6 +29,43 @@ const NON_SOURCE_PATH = new RegExp(`^(?:\\.|\\/|[A-Za-z]:[\\\\/])(?![^?#]*\\.(?:
|
|
|
27
29
|
const isFile = (path) => statSync(path, { throwIfNoEntry: false })?.isFile() ?? false;
|
|
28
30
|
/** Zones whose code runs in a browser, so may read only public environment variables. */
|
|
29
31
|
const BROWSER_CODE = new Set(["route-frontend", "frontend", "shared"]);
|
|
32
|
+
const loaderFor = (file) => {
|
|
33
|
+
const extension = /\.[cm]?([jt]sx?)$/.exec(file)?.[1];
|
|
34
|
+
return extension === "ts" || extension === "tsx" || extension === "js" || extension === "jsx"
|
|
35
|
+
? extension
|
|
36
|
+
: undefined;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Why browser code at `file` may not make one of its package imports: one naming an entry its package
|
|
40
|
+
* declares backend-only, or one its per-entry map leaves out. A path cannot tell two entries that share
|
|
41
|
+
* a file apart, so the dev server judges the specifier here, where it is written.
|
|
42
|
+
*/
|
|
43
|
+
function entryDenial(classifier, file, source) {
|
|
44
|
+
const loader = loaderFor(file);
|
|
45
|
+
if (loader === undefined)
|
|
46
|
+
return undefined;
|
|
47
|
+
let imports;
|
|
48
|
+
try {
|
|
49
|
+
imports = new Bun.Transpiler({ loader }).scanImports(source);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Source Bun cannot read fails its own load with the parse error.
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
for (const { path } of imports) {
|
|
56
|
+
const name = specifierPackage(path);
|
|
57
|
+
const manifest = name === undefined ? undefined : installedManifest(dirname(file), name);
|
|
58
|
+
if (manifest === undefined)
|
|
59
|
+
continue;
|
|
60
|
+
const classification = classifier.classify(manifest, path);
|
|
61
|
+
if (classification.entry === undefined)
|
|
62
|
+
continue;
|
|
63
|
+
const reason = browserDenial(classification, path);
|
|
64
|
+
if (reason !== undefined)
|
|
65
|
+
return `it imports "${path}": ${reason}`;
|
|
66
|
+
}
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
30
69
|
export function zoneGuardPlugin(options) {
|
|
31
70
|
const classifier = options.classifier ?? createZoneClassifier(options);
|
|
32
71
|
const display = (file) => {
|
|
@@ -53,7 +92,9 @@ export function zoneGuardPlugin(options) {
|
|
|
53
92
|
options.onDenied === undefined &&
|
|
54
93
|
BROWSER_CODE.has(classification.zone)) {
|
|
55
94
|
const source = await Bun.file(args.path).text();
|
|
56
|
-
reason =
|
|
95
|
+
reason =
|
|
96
|
+
privateEnvDenial(args.path, source, options.publicEnvPrefix ?? "PUBLIC_") ??
|
|
97
|
+
entryDenial(classifier, args.path, source);
|
|
57
98
|
}
|
|
58
99
|
return reason === undefined ? undefined : refuse(args.path, reason);
|
|
59
100
|
});
|
|
@@ -61,7 +102,7 @@ export function zoneGuardPlugin(options) {
|
|
|
61
102
|
// An entry point (a dev server's HTML page) is the build's own choice, not an import.
|
|
62
103
|
if (args.importer === "")
|
|
63
104
|
return undefined;
|
|
64
|
-
const file = resolve(dirname(args.importer), args.path
|
|
105
|
+
const file = resolve(dirname(args.importer), withoutQuery(args.path));
|
|
65
106
|
// No such file means an extensionless import of a dotted source name (`./date.utils`): Bun resolves
|
|
66
107
|
// it to the source file, which onLoad judges. Judging the bare path would refuse a file never loaded.
|
|
67
108
|
if (!isFile(file))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zone-guard.js","sourceRoot":"","sources":["../../src/plugins/zone-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,oBAAoB,
|
|
1
|
+
{"version":3,"file":"zone-guard.js","sourceRoot":"","sources":["../../src/plugins/zone-guard.ts"],"names":[],"mappings":"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"}
|
package/dist/prerender.d.ts
CHANGED
|
@@ -47,7 +47,11 @@ export interface PrerenderResult {
|
|
|
47
47
|
* layer knows whether unlisted paths should hit the worker (`"ssr"`) or 404 (`"404"`). */
|
|
48
48
|
readonly fallbacks: Readonly<Record<string, "ssr" | "404">>;
|
|
49
49
|
}
|
|
50
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Map a route path to its output file: `/` → `index.html`, `/a/b` → `a/b/index.html`. Segments are
|
|
52
|
+
* written decoded (`/caf%C3%A9` → `café/index.html`) because a static host decodes the request path
|
|
53
|
+
* before it looks for a file; a segment with no such file name stays as written.
|
|
54
|
+
*/
|
|
51
55
|
export declare function htmlFileFor(pattern: string): string;
|
|
52
56
|
/** The static loader-data file next to a route's `index.html`: `/` → `_data.json`, `/a/b` →
|
|
53
57
|
* `a/b/_data.json`. The client fetches it on soft-nav into a prerendered route (no worker). */
|
package/dist/prerender.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../src/prerender.ts"],"names":[],"mappings":"AAYA,OAAO,EAAqC,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACnG,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAA;AAGjE,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,gBAAgB;IAC/B;4EACwE;IACxE,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAA;IAC1B;oGACgG;IAChG,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,kGAAkG;IAClG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;wGACoG;IACpG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB;mGAC+F;IAC/F,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,sEAAsE;QACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;QAC3D,2BAA2B;QAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;QACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;KACjD,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,sFAAsF;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;mGAC+F;IAC/F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAA;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC/E;8FAC0F;IAC1F,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAA;CAC5D;
|
|
1
|
+
{"version":3,"file":"prerender.d.ts","sourceRoot":"","sources":["../src/prerender.ts"],"names":[],"mappings":"AAYA,OAAO,EAAqC,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACnG,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAA;AAGjE,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAClD;AAED,MAAM,WAAW,gBAAgB;IAC/B;4EACwE;IACxE,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAA;IAC1B;oGACgG;IAChG,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAA;IACtC,kGAAkG;IAClG,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;wGACoG;IACpG,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB;mGAC+F;IAC/F,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,sEAAsE;QACtE,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;QAC3D,2BAA2B;QAC3B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;QACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;KACjD,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,sFAAsF;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB;mGAC+F;IAC/F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAA;IAC/C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC/E;8FAC0F;IAC1F,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC,CAAC,CAAA;CAC5D;AA0BD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAKnD;AAOD;+FAC+F;AAC/F,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAOD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA4HzF;AAED;oFACoF;AACpF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,4BAA4B;IAC3C;uGACmG;IACnG,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,oGAAoG;IACpG,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,qBAAqB,CAOvB"}
|
package/dist/prerender.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* routes are not supported.
|
|
10
10
|
*/
|
|
11
11
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
12
|
-
import { dirname, resolve, sep } from "node:path";
|
|
12
|
+
import { dirname, join, resolve, sep } from "node:path";
|
|
13
13
|
import { assertNoSecrets, buildEnvironment } from "./internal/secret-scan.js";
|
|
14
14
|
import { fillRoutePattern } from "./manifest.js";
|
|
15
15
|
import { DATA_HEADER, PRERENDERED_GLOBAL, PRERENDERED_LIST_PATH } from "./router.js";
|
|
@@ -21,10 +21,34 @@ function trimTrailingSlashes(path) {
|
|
|
21
21
|
end--;
|
|
22
22
|
return path.slice(0, end);
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
24
|
+
/**
|
|
25
|
+
* One request-path segment as the file name a static host looks up, which is the segment decoded, or
|
|
26
|
+
* `undefined` when no file name maps back to it: malformed percent-encoding, `.` or `..`, or a decoded
|
|
27
|
+
* `/`, `\` or NUL.
|
|
28
|
+
*/
|
|
29
|
+
function fileSegment(segment) {
|
|
30
|
+
let decoded;
|
|
31
|
+
try {
|
|
32
|
+
decoded = decodeURIComponent(segment);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
if (decoded === "." || decoded === ".." || /[/\\\0]/.test(decoded))
|
|
38
|
+
return undefined;
|
|
39
|
+
return decoded;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Map a route path to its output file: `/` → `index.html`, `/a/b` → `a/b/index.html`. Segments are
|
|
43
|
+
* written decoded (`/caf%C3%A9` → `café/index.html`) because a static host decodes the request path
|
|
44
|
+
* before it looks for a file; a segment with no such file name stays as written.
|
|
45
|
+
*/
|
|
25
46
|
export function htmlFileFor(pattern) {
|
|
26
47
|
const trimmed = trimTrailingSlashes(pattern.replace(/^\/+/, ""));
|
|
27
|
-
|
|
48
|
+
if (trimmed === "")
|
|
49
|
+
return "index.html";
|
|
50
|
+
const segments = trimmed.split("/").map((segment) => fileSegment(segment) ?? segment);
|
|
51
|
+
return `${segments.join("/")}/index.html`;
|
|
28
52
|
}
|
|
29
53
|
// The handover of a page whose prerendered set is served as a list rather than inlined.
|
|
30
54
|
const PRERENDERED_LIST_URL = new RegExp(`"${PRERENDERED_GLOBAL}":"(${PRERENDERED_LIST_PATH.replaceAll(".", "\\.")}\\?v=[0-9a-f]+)"`);
|
|
@@ -61,6 +85,16 @@ export async function prerenderRoutes(options) {
|
|
|
61
85
|
// static (one path) and dynamic (one path per getStaticPaths entry) routes. A failed render is a skip;
|
|
62
86
|
// a credential in the output fails the whole prerender.
|
|
63
87
|
const renderPath = async (path) => {
|
|
88
|
+
// Refused before rendering: a segment no file name maps back to, or a file outside `outDir`.
|
|
89
|
+
const file = htmlFileFor(path);
|
|
90
|
+
const segments = trimTrailingSlashes(path.replace(/^\/+/, "")).split("/");
|
|
91
|
+
const abs = segments.every((s) => s === "" || fileSegment(s) !== undefined)
|
|
92
|
+
? outputPath(outRoot, file)
|
|
93
|
+
: undefined;
|
|
94
|
+
if (abs === undefined) {
|
|
95
|
+
skipped.push({ path, reason: "unsafe output path" });
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
64
98
|
const res = await options.app.fetch(new Request(`${origin}${path}`));
|
|
65
99
|
if (!res.ok) {
|
|
66
100
|
// A failed render is a per-route skip, not a build failure - surfaced for the caller to log.
|
|
@@ -69,12 +103,6 @@ export async function prerenderRoutes(options) {
|
|
|
69
103
|
}
|
|
70
104
|
const html = await res.text();
|
|
71
105
|
listUrl ??= PRERENDERED_LIST_URL.exec(html)?.[1];
|
|
72
|
-
const file = htmlFileFor(path);
|
|
73
|
-
const abs = outputPath(outRoot, file);
|
|
74
|
-
if (abs === undefined) {
|
|
75
|
-
skipped.push({ path, reason: "unsafe output path" });
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
106
|
assertClean(file, html);
|
|
79
107
|
mkdirSync(dirname(abs), { recursive: true });
|
|
80
108
|
writeFileSync(abs, html);
|
|
@@ -87,16 +115,10 @@ export async function prerenderRoutes(options) {
|
|
|
87
115
|
if (dataRes.ok &&
|
|
88
116
|
!(dataRes.headers.get("content-type") ?? "").includes("application/x-ndjson")) {
|
|
89
117
|
dataFile = dataFileFor(path);
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
const data = await dataRes.text();
|
|
97
|
-
assertClean(dataFile, data);
|
|
98
|
-
writeFileSync(dataAbs, data);
|
|
99
|
-
}
|
|
118
|
+
const data = await dataRes.text();
|
|
119
|
+
assertClean(dataFile, data);
|
|
120
|
+
// Beside `index.html`, so inside `outDir` whenever it is.
|
|
121
|
+
writeFileSync(join(dirname(abs), "_data.json"), data);
|
|
100
122
|
}
|
|
101
123
|
else {
|
|
102
124
|
await dataRes.body?.cancel(); // not emitting (non-OK or NDJSON) - release the stream
|
package/dist/prerender.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prerender.js","sourceRoot":"","sources":["../src/prerender.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"prerender.js","sourceRoot":"","sources":["../src/prerender.ts"],"names":[],"mappings":"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"}
|
package/dist/render-seam.d.ts
CHANGED
|
@@ -31,7 +31,39 @@ export interface RenderProps {
|
|
|
31
31
|
readonly boundaries?: BoundaryStates;
|
|
32
32
|
/** The rendered chain's module ids and `handle` exports, for the adapter's `useMatches`. */
|
|
33
33
|
readonly matchChain?: MatchChain;
|
|
34
|
+
/** The page's locale, when the app registers its locale routing (`createWebApp`'s `i18n`). Set on
|
|
35
|
+
* SSR only; the client names it from `path` (see {@link localeOfProps}). */
|
|
36
|
+
readonly locale?: PageLocale;
|
|
34
37
|
}
|
|
38
|
+
/** A served locale as a page renders in it: from the app's locale registry. */
|
|
39
|
+
export interface PageLocale {
|
|
40
|
+
/** The registry key, which is also the URL segment (`ur`). */
|
|
41
|
+
readonly key: string;
|
|
42
|
+
/** The BCP-47 tag `<html lang>` and `Content-Language` carry (`ur-PK`). */
|
|
43
|
+
readonly lang: string;
|
|
44
|
+
readonly dir: "ltr" | "rtl";
|
|
45
|
+
}
|
|
46
|
+
/** The served locales, handed to the client so it names a page's locale from its path the way the
|
|
47
|
+
* server does. */
|
|
48
|
+
export interface PageLocales {
|
|
49
|
+
/** The default locale's key. */
|
|
50
|
+
readonly default: string;
|
|
51
|
+
/** Every served locale, in registry order. */
|
|
52
|
+
readonly locales: readonly PageLocale[];
|
|
53
|
+
}
|
|
54
|
+
/** The handover global carrying {@link PageLocales}. */
|
|
55
|
+
export declare const LOCALES_GLOBAL = "__NIFRA_LOCALES__";
|
|
56
|
+
/**
|
|
57
|
+
* The locale a path is in, by the rule `@nifrajs/i18n/routing`'s `localeOf` follows: a first path
|
|
58
|
+
* segment that names a served locale, ignoring ASCII case, or else the default.
|
|
59
|
+
*/
|
|
60
|
+
export declare function pageLocaleIn(config: PageLocales, path: string): PageLocale | undefined;
|
|
61
|
+
/** The locale of the page at `path`, from the served locales the server handed over; `undefined`
|
|
62
|
+
* outside a browser page, or when the app registers no locale routing. */
|
|
63
|
+
export declare function handoverLocale(path: string): PageLocale | undefined;
|
|
64
|
+
/** The locale of the page `props` render: the server's answer on SSR, else the one the client names
|
|
65
|
+
* from `props.path`. What every adapter's `useLocale` reads. */
|
|
66
|
+
export declare function localeOfProps(props: RenderProps | undefined): PageLocale | undefined;
|
|
35
67
|
/**
|
|
36
68
|
* The modules a render stacks, as `useMatches` needs them: each one's id and `handle` export,
|
|
37
69
|
* outermost layout first and the page (or status page) last. Built by the server for SSR and by the
|
|
@@ -57,10 +89,23 @@ export interface UIMatch {
|
|
|
57
89
|
/** The module's `handle` export - any value, commonly a breadcrumb label or a render function. */
|
|
58
90
|
readonly handle: unknown;
|
|
59
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Markup a render produced for outside the app root, which an adapter that sets
|
|
94
|
+
* {@link RenderAdapter.documentParts} appends to. Each part must be complete before the render
|
|
95
|
+
* settles: `renderToString` resolving, or `renderToStream` returning its stream.
|
|
96
|
+
*/
|
|
97
|
+
export interface DocumentParts {
|
|
98
|
+
/** Placed at the end of `<head>`. Svelte's `<svelte:head>` lands here. */
|
|
99
|
+
head: string;
|
|
100
|
+
/** Placed first in `<body>`, before the app root. Vue's `<Teleport to="body">` lands here. */
|
|
101
|
+
body: string;
|
|
102
|
+
}
|
|
60
103
|
/** Per-document options for {@link RenderAdapter.renderToStream}. */
|
|
61
104
|
export interface RenderStreamOptions {
|
|
62
105
|
/** The document's CSP nonce, for every executable `<script>` the framework streams. */
|
|
63
106
|
readonly nonce?: string;
|
|
107
|
+
/** Present only for an adapter that sets {@link RenderAdapter.documentParts}. */
|
|
108
|
+
readonly parts?: DocumentParts;
|
|
64
109
|
}
|
|
65
110
|
/**
|
|
66
111
|
* The seam every render adapter implements. New adapters should prove these invariants with
|
|
@@ -74,10 +119,18 @@ export interface RenderAdapter {
|
|
|
74
119
|
* carry it, or a nonce-based Content-Security-Policy blocks it and the boundary never resolves.
|
|
75
120
|
*/
|
|
76
121
|
renderToStream(chain: readonly unknown[], props: RenderProps, options?: RenderStreamOptions): ReadableStream<Uint8Array> | Promise<ReadableStream<Uint8Array>>;
|
|
77
|
-
/**
|
|
78
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Render the chain to a complete HTML string when no content is deferred. `options.nonce` is the
|
|
124
|
+
* document's CSP nonce, for any inline script the renderer emits (Solid's hydration data).
|
|
125
|
+
*/
|
|
126
|
+
renderToString?(chain: readonly unknown[], props: RenderProps, options?: RenderStreamOptions): string | Promise<string>;
|
|
79
127
|
/** Per-document bootstrap markup injected into `<head>` for client hydration. */
|
|
80
128
|
hydrationHead(nonce?: string): string;
|
|
129
|
+
/**
|
|
130
|
+
* Set when a render can produce markup that belongs outside the app root. Every render is then
|
|
131
|
+
* passed `options.parts` to fill; an adapter without it never is, and pays nothing for the seam.
|
|
132
|
+
*/
|
|
133
|
+
readonly documentParts?: boolean;
|
|
81
134
|
}
|
|
82
135
|
/** Loads a module through the dev server's module graph rather than the runtime's resolver. */
|
|
83
136
|
export type SsrModuleLoader = (id: string) => Promise<unknown>;
|
|
@@ -103,6 +156,11 @@ export declare const ACTION_GLOBAL = "__NIFRA_ACTION__";
|
|
|
103
156
|
/** Dynamic-boundary states for hydration; absent when a route declares no boundaries. */
|
|
104
157
|
export declare const BOUNDARY_GLOBAL = "__NIFRA_BOUNDARIES__";
|
|
105
158
|
export declare const COMPONENT_GLOBAL = "__NIFRA_COMPONENTS__";
|
|
159
|
+
/** Locale key -> copy chunk URL, in a production build that split copy tables by locale. The name
|
|
160
|
+
* `@nifrajs/i18n/copy` reads. */
|
|
161
|
+
export declare const COPY_CHUNKS_GLOBAL = "__NIFRA_COPY__";
|
|
162
|
+
/** The registry `@nifrajs/i18n/copy` keeps its loaded chunks and definitions in. */
|
|
163
|
+
export declare const COPY_REALM = "nifra.copy";
|
|
106
164
|
/** Marker attribute used to find a non-default hydration container. */
|
|
107
165
|
export declare const ROOT_ATTRIBUTE = "data-nifra-root";
|
|
108
166
|
//# sourceMappingURL=render-seam.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-seam.d.ts","sourceRoot":"","sources":["../src/render-seam.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,8BAA8B,EAAE,cAAc,CAAA;IACjF,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,yFAAyF;IACzF,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;IAC7B,gGAAgG;IAChG,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;IAC1B,qGAAqG;IACrG,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,uDAAuD;IACvD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,kDAAkD;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,iGAAiG;IACjG,QAAQ,CAAC,UAAU,CAAC,EAAE,cAAc,CAAA;IACpC,4FAA4F;IAC5F,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"render-seam.d.ts","sourceRoot":"","sources":["../src/render-seam.ts"],"names":[],"mappings":"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"}
|
package/dist/render-seam.js
CHANGED
|
@@ -6,6 +6,34 @@
|
|
|
6
6
|
* without importing the document renderer through the root module. The singleton is stored on
|
|
7
7
|
* globalThis because the Bun and Vite dev pipelines can evaluate two copies in one process.
|
|
8
8
|
*/
|
|
9
|
+
/** The handover global carrying {@link PageLocales}. */
|
|
10
|
+
export const LOCALES_GLOBAL = "__NIFRA_LOCALES__";
|
|
11
|
+
/**
|
|
12
|
+
* The locale a path is in, by the rule `@nifrajs/i18n/routing`'s `localeOf` follows: a first path
|
|
13
|
+
* segment that names a served locale, ignoring ASCII case, or else the default.
|
|
14
|
+
*/
|
|
15
|
+
export function pageLocaleIn(config, path) {
|
|
16
|
+
// One linear pass: separators, then the segment up to the next separator, query or hash.
|
|
17
|
+
const first = /^[/\\]*([^/\\?#]*)/.exec(path.replace(/[\t\n\r]/g, ""))?.[1]?.toLowerCase();
|
|
18
|
+
return (config.locales.find((locale) => first !== "" && locale.key.toLowerCase() === first) ??
|
|
19
|
+
config.locales.find((locale) => locale.key === config.default));
|
|
20
|
+
}
|
|
21
|
+
const isPageLocales = (value) => typeof value === "object" && value !== null && "locales" in value && Array.isArray(value.locales);
|
|
22
|
+
/** The locale of the page at `path`, from the served locales the server handed over; `undefined`
|
|
23
|
+
* outside a browser page, or when the app registers no locale routing. */
|
|
24
|
+
export function handoverLocale(path) {
|
|
25
|
+
const config = Reflect.get(globalThis, LOCALES_GLOBAL);
|
|
26
|
+
return isPageLocales(config) ? pageLocaleIn(config, path) : undefined;
|
|
27
|
+
}
|
|
28
|
+
/** The locale of the page `props` render: the server's answer on SSR, else the one the client names
|
|
29
|
+
* from `props.path`. What every adapter's `useLocale` reads. */
|
|
30
|
+
export function localeOfProps(props) {
|
|
31
|
+
if (props === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (props.locale !== undefined)
|
|
34
|
+
return props.locale;
|
|
35
|
+
return props.path === undefined ? undefined : handoverLocale(props.path);
|
|
36
|
+
}
|
|
9
37
|
const SSR_MODULE_LOADER_SLOT = Symbol.for("nifra.web.ssr-module-loader");
|
|
10
38
|
const loaderSlot = globalThis;
|
|
11
39
|
/** Publish or clear the dev server's SSR module loader. */
|
|
@@ -34,6 +62,11 @@ export const ACTION_GLOBAL = "__NIFRA_ACTION__";
|
|
|
34
62
|
/** Dynamic-boundary states for hydration; absent when a route declares no boundaries. */
|
|
35
63
|
export const BOUNDARY_GLOBAL = "__NIFRA_BOUNDARIES__";
|
|
36
64
|
export const COMPONENT_GLOBAL = "__NIFRA_COMPONENTS__";
|
|
65
|
+
/** Locale key -> copy chunk URL, in a production build that split copy tables by locale. The name
|
|
66
|
+
* `@nifrajs/i18n/copy` reads. */
|
|
67
|
+
export const COPY_CHUNKS_GLOBAL = "__NIFRA_COPY__";
|
|
68
|
+
/** The registry `@nifrajs/i18n/copy` keeps its loaded chunks and definitions in. */
|
|
69
|
+
export const COPY_REALM = "nifra.copy";
|
|
37
70
|
/** Marker attribute used to find a non-default hydration container. */
|
|
38
71
|
export const ROOT_ATTRIBUTE = "data-nifra-root";
|
|
39
72
|
//# sourceMappingURL=render-seam.js.map
|
package/dist/render-seam.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-seam.js","sourceRoot":"","sources":["../src/render-seam.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"render-seam.js","sourceRoot":"","sources":["../src/render-seam.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAmDH,wDAAwD;AACxD,MAAM,CAAC,MAAM,cAAc,GAAG,mBAAmB,CAAA;AAEjD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,IAAY;IAC5D,yFAAyF;IACzF,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAA;IAC1F,OAAO,CACL,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QACnF,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,OAAO,CAAC,CAC/D,CAAA;AACH,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,KAAc,EAAwB,EAAE,CAC7D,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;AAEnG;0EAC0E;AAC1E,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,MAAM,GAAY,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAC/D,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACvE,CAAC;AAED;gEACgE;AAChE,MAAM,UAAU,aAAa,CAAC,KAA8B;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,MAAM,CAAA;IACnD,OAAO,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;AAC1E,CAAC;AAsFD,MAAM,sBAAsB,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;AACxE,MAAM,UAAU,GAAG,UAAwE,CAAA;AAE3F,2DAA2D;AAC3D,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IAClE,UAAU,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAA;AAC3C,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe;IAC7B,OAAO,UAAU,CAAC,sBAAsB,CAAC,CAAA;AAC3C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAA;AAE7C,qFAAqF;AACrF,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAA;AAC3C,4CAA4C;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,uBAAuB,CAAA;AACzD,0DAA0D;AAC1D,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAC7C;+EAC+E;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAA;AAC/C,yFAAyF;AACzF,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAA;AACrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAA;AACtD;iCACiC;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,gBAAgB,CAAA;AAClD,oFAAoF;AACpF,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAA;AACtC,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAA"}
|
package/dist/router.d.ts
CHANGED
|
@@ -236,8 +236,9 @@ export interface ClientRouterOptions {
|
|
|
236
236
|
/** Override the loader-data fetch (tests inject a stub; defaults to a same-origin JSON GET). */
|
|
237
237
|
readonly fetchData?: FetchRouteData;
|
|
238
238
|
/** Ensure a route's code chunk is loaded before rendering (code-splitting). Awaited in parallel
|
|
239
|
-
* with the loader data, so `pending` covers both. Omit when the bundle isn't split.
|
|
240
|
-
|
|
239
|
+
* with the loader data, so `pending` covers both. Omit when the bundle isn't split. `path` is the URL
|
|
240
|
+
* the route is about to render, for code loaded per URL (a production build's copy chunks). */
|
|
241
|
+
readonly loadModule?: (routeId: string, path?: string) => Promise<void>;
|
|
241
242
|
/** Terminal status → client route id. Generated entries populate this from `_404` and
|
|
242
243
|
* `_<status>` files so soft navigation renders the same boundary as a hard request. */
|
|
243
244
|
readonly statusRoutes?: Readonly<Record<number, string>>;
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
package/dist/router.js
CHANGED
|
@@ -8,7 +8,7 @@ import { decodeRouteParams } from "@nifrajs/core/pattern";
|
|
|
8
8
|
import { Router as CoreRouter } from "@nifrajs/core/router";
|
|
9
9
|
import { parseNdjsonData } from "./deferred.js";
|
|
10
10
|
import { parsePageData } from "./internal/revive-dates.js";
|
|
11
|
-
import { requestPattern } from "./internal/route-path.js";
|
|
11
|
+
import { appUrl, requestPattern } from "./internal/route-path.js";
|
|
12
12
|
import { isClientOnlySearchChange } from "./search.js";
|
|
13
13
|
/**
|
|
14
14
|
* Request header that asks a nifra route's GET to return just the loader data as JSON (instead of
|
|
@@ -181,7 +181,7 @@ const defaultFetchData = async (path, _match, signal, navigation) => {
|
|
|
181
181
|
const cut = query === -1 ? hash : hash === -1 ? query : Math.min(query, hash);
|
|
182
182
|
const pathname = cut === -1 ? path : path.slice(0, cut);
|
|
183
183
|
if (prerenderedSetOf(prerendered).has(pathname)) {
|
|
184
|
-
const staticRes = await fetch(dataUrlFor(pathname), { signal: signal ?? null });
|
|
184
|
+
const staticRes = await fetch(appUrl(dataUrlFor(pathname)), { signal: signal ?? null });
|
|
185
185
|
if (staticRes.ok)
|
|
186
186
|
return readResponseData(staticRes, signal);
|
|
187
187
|
}
|
|
@@ -191,7 +191,7 @@ const defaultFetchData = async (path, _match, signal, navigation) => {
|
|
|
191
191
|
headers.set(RETAIN_HEADER, navigation.retain.join(","));
|
|
192
192
|
headers.set(NAV_FROM_HEADER, navigation.from);
|
|
193
193
|
}
|
|
194
|
-
const res = await fetch(path, { headers, signal: signal ?? null });
|
|
194
|
+
const res = await fetch(appUrl(path), { headers, signal: signal ?? null });
|
|
195
195
|
const redirectTo = res.headers.get(REDIRECT_HEADER);
|
|
196
196
|
if (redirectTo !== null)
|
|
197
197
|
throw redirected(redirectTo);
|
|
@@ -377,7 +377,7 @@ export function createClientRouter(options) {
|
|
|
377
377
|
if (mine !== generation)
|
|
378
378
|
return;
|
|
379
379
|
if (loaded.terminalRouteId !== undefined) {
|
|
380
|
-
await loadModule?.(loaded.terminalRouteId);
|
|
380
|
+
await loadModule?.(loaded.terminalRouteId, state.path);
|
|
381
381
|
state = { ...state, routeId: loaded.terminalRouteId, params: {}, data: null };
|
|
382
382
|
}
|
|
383
383
|
else {
|
|
@@ -486,7 +486,7 @@ export function createClientRouter(options) {
|
|
|
486
486
|
state = { ...state, pendingPath: at };
|
|
487
487
|
emit();
|
|
488
488
|
}
|
|
489
|
-
await loadModule?.(route.routeId);
|
|
489
|
+
await loadModule?.(route.routeId, at);
|
|
490
490
|
// Prefetched server data is one-shot; a clientLoader still runs over it without another request.
|
|
491
491
|
const prefetchedData = usePrefetch ? freshPrefetch(at) : undefined;
|
|
492
492
|
if (usePrefetch)
|
|
@@ -494,7 +494,7 @@ export function createClientRouter(options) {
|
|
|
494
494
|
try {
|
|
495
495
|
const loaded = await applyClientLoader(at, route, signal, () => loadRouteData(at, route, signal, keepLayouts), prefetchedData);
|
|
496
496
|
if (loaded.terminalRouteId !== undefined) {
|
|
497
|
-
await loadModule?.(loaded.terminalRouteId);
|
|
497
|
+
await loadModule?.(loaded.terminalRouteId, at);
|
|
498
498
|
if (options.layoutStatusRoutes?.[loaded.terminalRouteId] === true) {
|
|
499
499
|
throw new Error(`[nifra/web] ${loaded.terminalRouteId} renders inside layouts; loading ${at} as a document`);
|
|
500
500
|
}
|
|
@@ -634,7 +634,11 @@ export function createClientRouter(options) {
|
|
|
634
634
|
};
|
|
635
635
|
fEmit();
|
|
636
636
|
try {
|
|
637
|
-
const res = await fetch(action, {
|
|
637
|
+
const res = await fetch(appUrl(action), {
|
|
638
|
+
method: "POST",
|
|
639
|
+
body,
|
|
640
|
+
headers: { [DATA_HEADER]: "1" },
|
|
641
|
+
});
|
|
638
642
|
if (!res.ok)
|
|
639
643
|
throw new Error(`[nifra/web] fetcher action failed (${res.status}): ${action}`);
|
|
640
644
|
const actionData = res.status === 204 ? undefined : await readResponseData(res, ac.signal);
|
|
@@ -782,7 +786,7 @@ export function createClientRouter(options) {
|
|
|
782
786
|
state = { ...state, actionData: prepared.optimisticData };
|
|
783
787
|
emit();
|
|
784
788
|
}
|
|
785
|
-
const res = await fetch(action, {
|
|
789
|
+
const res = await fetch(appUrl(action), {
|
|
786
790
|
method: "POST",
|
|
787
791
|
body: prepared.body,
|
|
788
792
|
headers: { [DATA_HEADER]: "1" },
|
|
@@ -901,7 +905,7 @@ export function createClientRouter(options) {
|
|
|
901
905
|
// Unwrapped here, so a prefetched entry is the same shape `navigate` builds state from -
|
|
902
906
|
// otherwise a prefetch hit would publish an envelope where a miss publishes loader data.
|
|
903
907
|
const [, loaded] = await Promise.all([
|
|
904
|
-
loadModule?.(matched.routeId),
|
|
908
|
+
loadModule?.(matched.routeId, path),
|
|
905
909
|
loadRouteData(path, matched),
|
|
906
910
|
]);
|
|
907
911
|
prefetched.delete(path); // a stale entry re-enters as the newest
|