@demiurgejs/core 0.2.0-beta.1 → 0.2.0-beta.3
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/README.md +2 -0
- package/dist/adapter/testing.d.ts +33 -0
- package/dist/adapter/testing.d.ts.map +1 -0
- package/dist/adapter/testing.js +251 -0
- package/dist/adapter/testing.js.map +1 -0
- package/dist/browser/file-router.d.ts.map +1 -1
- package/dist/chunks/document-shell-WoM8yZlR.js +35 -0
- package/dist/chunks/document-shell-WoM8yZlR.js.map +1 -0
- package/dist/chunks/image-codec-Di53WpcH.js +141 -0
- package/dist/chunks/image-codec-Di53WpcH.js.map +1 -0
- package/dist/chunks/images-Edar3eU1.js +339 -0
- package/dist/chunks/images-Edar3eU1.js.map +1 -0
- package/dist/chunks/request-metadata-DaIYq4Ea.js +677 -0
- package/dist/chunks/request-metadata-DaIYq4Ea.js.map +1 -0
- package/dist/chunks/streaming-D0fGAuiO.js +469 -0
- package/dist/chunks/streaming-D0fGAuiO.js.map +1 -0
- package/dist/chunks/{testing-DBjVCN5v.js → testing-CRflAw4X.js} +1300 -1139
- package/dist/chunks/testing-CRflAw4X.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +63 -54
- package/dist/cli.js.map +1 -1
- package/dist/data/cache.d.ts +8 -0
- package/dist/data/cache.d.ts.map +1 -1
- package/dist/data/idempotency.d.ts.map +1 -1
- package/dist/data/index.d.ts +3 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/testing.d.ts.map +1 -1
- package/dist/data/testing.js +94 -72
- package/dist/data/testing.js.map +1 -1
- package/dist/data/tiered.d.ts +7 -0
- package/dist/data/tiered.d.ts.map +1 -0
- package/dist/document/deferred-scripts.d.ts +11 -0
- package/dist/document/deferred-scripts.d.ts.map +1 -0
- package/dist/document/hydration.d.ts.map +1 -1
- package/dist/document/index.d.ts +4 -1
- package/dist/document/index.d.ts.map +1 -1
- package/dist/document/render.d.ts.map +1 -1
- package/dist/document/scripts.d.ts +12 -1
- package/dist/document/scripts.d.ts.map +1 -1
- package/dist/document/trusted-types.d.ts +10 -0
- package/dist/document/trusted-types.d.ts.map +1 -0
- package/dist/edge/assets.d.ts +14 -0
- package/dist/edge/assets.d.ts.map +1 -0
- package/dist/edge/index.d.ts +19 -0
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +286 -0
- package/dist/edge/index.js.map +1 -0
- package/dist/edge/stores.d.ts +8 -0
- package/dist/edge/stores.d.ts.map +1 -0
- package/dist/edge/streaming.d.ts +7 -0
- package/dist/edge/streaming.d.ts.map +1 -0
- package/dist/index.d.ts +7 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +895 -556
- package/dist/index.js.map +1 -1
- package/dist/internal/testing.js +6 -6
- package/dist/kv/index.d.ts +5 -0
- package/dist/kv/index.d.ts.map +1 -0
- package/dist/kv/index.js +126 -0
- package/dist/kv/index.js.map +1 -0
- package/dist/kv/rate-limit-store.d.ts +8 -0
- package/dist/kv/rate-limit-store.d.ts.map +1 -0
- package/dist/kv/store.d.ts +28 -0
- package/dist/kv/store.d.ts.map +1 -0
- package/dist/node/font.d.ts +5 -0
- package/dist/node/font.d.ts.map +1 -0
- package/dist/node/http.d.ts.map +1 -1
- package/dist/node/image.d.ts +15 -0
- package/dist/node/image.d.ts.map +1 -0
- package/dist/node/index.d.ts +4 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +25 -23
- package/dist/node/index.js.map +1 -1
- package/dist/node/static.d.ts.map +1 -1
- package/dist/node/streaming.d.ts.map +1 -1
- package/dist/platform/analytics.d.ts +58 -5
- package/dist/platform/analytics.d.ts.map +1 -1
- package/dist/platform/font-assets.d.ts +19 -0
- package/dist/platform/font-assets.d.ts.map +1 -0
- package/dist/platform/fonts.d.ts +14 -4
- package/dist/platform/fonts.d.ts.map +1 -1
- package/dist/platform/image-codec.d.ts +15 -0
- package/dist/platform/image-codec.d.ts.map +1 -0
- package/dist/platform/image-url.d.ts +17 -0
- package/dist/platform/image-url.d.ts.map +1 -0
- package/dist/platform/image.d.ts +8 -0
- package/dist/platform/image.d.ts.map +1 -0
- package/dist/platform/images.d.ts +15 -0
- package/dist/platform/images.d.ts.map +1 -1
- package/dist/platform/index.d.ts +13 -6
- package/dist/platform/index.d.ts.map +1 -1
- package/dist/platform/observability.d.ts +2 -1
- package/dist/platform/observability.d.ts.map +1 -1
- package/dist/platform/web-vitals-client.d.ts +32 -0
- package/dist/platform/web-vitals-client.d.ts.map +1 -0
- package/dist/platform/web-vitals.d.ts +78 -0
- package/dist/platform/web-vitals.d.ts.map +1 -0
- package/dist/redis/index.d.ts +5 -0
- package/dist/redis/index.d.ts.map +1 -0
- package/dist/redis/index.js +209 -0
- package/dist/redis/index.js.map +1 -0
- package/dist/redis/rate-limit-store.d.ts +8 -0
- package/dist/redis/rate-limit-store.d.ts.map +1 -0
- package/dist/redis/store.d.ts +8 -0
- package/dist/redis/store.d.ts.map +1 -0
- package/dist/route/action.d.ts.map +1 -1
- package/dist/route/middleware.d.ts.map +1 -1
- package/dist/route/response.d.ts.map +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/manifest.d.ts +1 -0
- package/dist/router/manifest.d.ts.map +1 -1
- package/dist/security/cookies.d.ts +26 -0
- package/dist/security/cookies.d.ts.map +1 -0
- package/dist/security/env.d.ts.map +1 -1
- package/dist/security/fetch-metadata.d.ts +29 -0
- package/dist/security/fetch-metadata.d.ts.map +1 -0
- package/dist/security/index.d.ts +5 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/policy.d.ts +2 -27
- package/dist/security/policy.d.ts.map +1 -1
- package/dist/security/rate-limit.d.ts +6 -3
- package/dist/security/rate-limit.d.ts.map +1 -1
- package/dist/security/request.d.ts.map +1 -1
- package/dist/security/types.d.ts +82 -6
- package/dist/security/types.d.ts.map +1 -1
- package/dist/security/verification.d.ts.map +1 -1
- package/dist/server/document-shell.d.ts +12 -0
- package/dist/server/document-shell.d.ts.map +1 -0
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/request-handler.d.ts +6 -2
- package/dist/server/request-handler.d.ts.map +1 -1
- package/dist/static/images.d.ts +13 -0
- package/dist/static/images.d.ts.map +1 -0
- package/dist/static/index.d.ts +8 -0
- package/dist/static/index.d.ts.map +1 -1
- package/dist/static/index.js +421 -313
- package/dist/static/index.js.map +1 -1
- package/dist/static/vercel.d.ts +3 -0
- package/dist/static/vercel.d.ts.map +1 -1
- package/dist/vite/index.d.ts +3 -0
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +1041 -652
- package/dist/vite/index.js.map +1 -1
- package/dist/vite/plugin.d.ts +9 -0
- package/dist/vite/plugin.d.ts.map +1 -1
- package/dist/vite/policy-verification.d.ts.map +1 -1
- package/dist/vite/route-audit.d.ts +50 -0
- package/dist/vite/route-audit.d.ts.map +1 -0
- package/package.json +34 -3
- package/dist/chunks/request-metadata-DwEO1EAS.js +0 -477
- package/dist/chunks/request-metadata-DwEO1EAS.js.map +0 -1
- package/dist/chunks/streaming-Ci6vf3BB.js +0 -353
- package/dist/chunks/streaming-Ci6vf3BB.js.map +0 -1
- package/dist/chunks/testing-DBjVCN5v.js.map +0 -1
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAGzC,OAAO,EAGL,KAAK,2BAA2B,EAEhC,KAAK,oBAAoB,EAE1B,MAAM,UAAU,CAAC;AAElB,KAAK,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAIzD,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,KAAK,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,QAAQ,EAAE,CACR,OAAO,EAAE,2BAA2B,KACjC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACnC,YAAY,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACtE,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,MAAM,OAAO,CAAC;QAC3B,OAAO,CAAC,EAAE,KAAK,CAAC;YACd,GAAG,CAAC,EAAE,OAAO,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;SACd,CAAC,CAAC;QACH,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;QAC1B,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,GAAE,cAAmB,GAC/B,UAAU,CA8CZ;AAED,eAAO,MAAM,QAAQ,gfAWkB,CAAC;AAExC,wBAAsB,eAAe,CACnC,OAAO,EAAE,UAAU,EACnB,OAAO,CAAC,EAAE,kBAAkB;;;;GA2E7B;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,mBAMhD;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,KAAK,GAAG,MAAM,EACzB,YAAY,EAAE,MAAM,iBAqCrB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM;;;EAmBjD"}
|
package/dist/cli.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { readFile as b, readdir as E } from "node:fs/promises";
|
|
2
|
-
import { resolve as c, relative as
|
|
2
|
+
import { resolve as c, relative as d, sep as g, isAbsolute as v } from "node:path";
|
|
3
3
|
import { pathToFileURL as O } from "node:url";
|
|
4
4
|
import { generateStaticOutput as S, generateVercelStaticOutput as D } from "./static/index.js";
|
|
5
5
|
const T = /* @__PURE__ */ new Set(["--host", "--origin", "--out-dir", "--port"]);
|
|
6
|
-
function
|
|
6
|
+
function B(t, e = {}) {
|
|
7
7
|
const r = t[0];
|
|
8
8
|
if (!r || r === "--help" || r === "-h" || r === "help")
|
|
9
9
|
return {
|
|
@@ -14,7 +14,7 @@ function k(t, e = {}) {
|
|
|
14
14
|
};
|
|
15
15
|
if (r !== "build" && r !== "preview")
|
|
16
16
|
throw new Error(`Unknown command: ${r}`);
|
|
17
|
-
const
|
|
17
|
+
const i = {
|
|
18
18
|
command: r,
|
|
19
19
|
host: "localhost",
|
|
20
20
|
origin: e.SITE_ORIGIN,
|
|
@@ -22,22 +22,22 @@ function k(t, e = {}) {
|
|
|
22
22
|
port: 4173
|
|
23
23
|
};
|
|
24
24
|
for (let n = 1; n < t.length; n += 1) {
|
|
25
|
-
const
|
|
25
|
+
const o = t[n], [s, l] = o.split("=", 2);
|
|
26
26
|
if (!T.has(s))
|
|
27
|
-
throw new Error(`Unknown option: ${
|
|
27
|
+
throw new Error(`Unknown option: ${o}`);
|
|
28
28
|
const u = l ?? t[++n];
|
|
29
29
|
if (!u || u.startsWith("--"))
|
|
30
30
|
throw new Error(`Option ${s} requires a value.`);
|
|
31
|
-
if (s === "--host" && (
|
|
31
|
+
if (s === "--host" && (i.host = u), s === "--origin" && (i.origin = u), s === "--out-dir" && (i.outDir = u), s === "--port") {
|
|
32
32
|
const a = Number(u);
|
|
33
33
|
if (!Number.isSafeInteger(a) || a < 0 || a > 65535)
|
|
34
34
|
throw new Error("Preview port must be an integer from 0 through 65535.");
|
|
35
|
-
|
|
35
|
+
i.port = a;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
return
|
|
38
|
+
return i;
|
|
39
39
|
}
|
|
40
|
-
const
|
|
40
|
+
const H = `Usage: demiurge <command> [options]
|
|
41
41
|
|
|
42
42
|
Commands:
|
|
43
43
|
build Build static production output
|
|
@@ -49,17 +49,17 @@ Options:
|
|
|
49
49
|
--out-dir <directory> Set the output directory (default: dist)
|
|
50
50
|
--port <port> Set the preview port (default: 4173)
|
|
51
51
|
-h, --help Show this help`;
|
|
52
|
-
async function
|
|
53
|
-
const r = e ? void 0 : await import("vite"),
|
|
52
|
+
async function W(t, e) {
|
|
53
|
+
const r = e ? void 0 : await import("vite"), i = e ? await e.resolveConfig() : await r.resolveConfig({}, "build", "production"), n = i.root, o = c(n, t.outDir), s = c(n, ".demiurge/server"), l = e?.build ?? r.build;
|
|
54
54
|
await j(
|
|
55
55
|
n,
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
o,
|
|
57
|
+
i.publicDir,
|
|
58
58
|
s
|
|
59
59
|
), await l({
|
|
60
60
|
build: {
|
|
61
61
|
emptyOutDir: !0,
|
|
62
|
-
outDir:
|
|
62
|
+
outDir: o,
|
|
63
63
|
rollupOptions: { input: "virtual:demiurge/client-entry" }
|
|
64
64
|
}
|
|
65
65
|
}), await l({
|
|
@@ -75,44 +75,47 @@ async function B(t, e) {
|
|
|
75
75
|
}
|
|
76
76
|
});
|
|
77
77
|
const u = N(
|
|
78
|
-
e ? await e.readText(c(
|
|
79
|
-
), a = `${O(c(s, "server-entry.js")).href}?build=${e?.now() ?? Date.now()}`,
|
|
80
|
-
if (!
|
|
78
|
+
e ? await e.readText(c(o, "demiurge-manifest.json")) : await b(c(o, "demiurge-manifest.json"), "utf8")
|
|
79
|
+
), a = `${O(c(s, "server-entry.js")).href}?build=${e?.now() ?? Date.now()}`, f = e ? await e.importModule(a) : await import(a);
|
|
80
|
+
if (!I(f.routes))
|
|
81
81
|
throw new Error("The framework server bundle does not export routes.");
|
|
82
|
-
const
|
|
82
|
+
const h = await (e?.generate ?? S)({
|
|
83
|
+
fonts: A(i.plugins),
|
|
84
|
+
images: F(i.plugins),
|
|
83
85
|
origin: t.origin,
|
|
84
|
-
outDir:
|
|
85
|
-
|
|
86
|
+
outDir: o,
|
|
87
|
+
root: n,
|
|
88
|
+
routes: f.routes,
|
|
86
89
|
ssr: u,
|
|
87
|
-
staticFileHeaders:
|
|
88
|
-
}),
|
|
89
|
-
return { deploymentOutDir:
|
|
90
|
-
deployment:
|
|
91
|
-
manifest:
|
|
92
|
-
outDir:
|
|
90
|
+
staticFileHeaders: R(i.plugins)
|
|
91
|
+
}), m = P(i.plugins);
|
|
92
|
+
return { deploymentOutDir: m ? await D({
|
|
93
|
+
deployment: m,
|
|
94
|
+
manifest: h,
|
|
95
|
+
outDir: o,
|
|
93
96
|
projectRoot: process.cwd()
|
|
94
|
-
}) : void 0, manifest:
|
|
97
|
+
}) : void 0, manifest: h, outDir: o };
|
|
95
98
|
}
|
|
96
|
-
async function
|
|
99
|
+
async function G(t, e) {
|
|
97
100
|
const r = e ? await e() : await (await import("vite")).resolveConfig({}, "serve", "production");
|
|
98
101
|
return c(r.root, t);
|
|
99
102
|
}
|
|
100
|
-
async function j(t, e, r,
|
|
101
|
-
const n =
|
|
102
|
-
if (!n || n === ".." || n.startsWith(`..${
|
|
103
|
+
async function j(t, e, r, i) {
|
|
104
|
+
const n = d(t, e);
|
|
105
|
+
if (!n || n === ".." || n.startsWith(`..${g}`) || v(n))
|
|
103
106
|
throw new Error("The static output directory must be inside the Vite root.");
|
|
104
|
-
if (r &&
|
|
107
|
+
if (r && w(e, r))
|
|
105
108
|
throw new Error("The static output directory must not overlap the Vite public directory.");
|
|
106
|
-
if (
|
|
109
|
+
if (w(e, i))
|
|
107
110
|
throw new Error("The static output directory must not overlap the framework server directory.");
|
|
108
|
-
let
|
|
111
|
+
let o;
|
|
109
112
|
try {
|
|
110
|
-
|
|
113
|
+
o = await E(e);
|
|
111
114
|
} catch (s) {
|
|
112
|
-
if (
|
|
115
|
+
if ($(s)) return;
|
|
113
116
|
throw s;
|
|
114
117
|
}
|
|
115
|
-
if (
|
|
118
|
+
if (o.length && !o.includes("demiurge-manifest.json") && !o.includes("demiurge-static-manifest.json"))
|
|
116
119
|
throw new Error(
|
|
117
120
|
"The static output directory contains files that a Demiurge build did not create."
|
|
118
121
|
);
|
|
@@ -128,37 +131,43 @@ function N(t) {
|
|
|
128
131
|
throw new Error("The client build manifest has an unsupported format.");
|
|
129
132
|
return { clientEntry: e.clientEntry, styles: e.styles };
|
|
130
133
|
}
|
|
131
|
-
function A(t) {
|
|
132
|
-
return !t || typeof t != "object" || Array.isArray(t) ? !1 : Object.values(t).every((e) => typeof e == "function");
|
|
133
|
-
}
|
|
134
134
|
function I(t) {
|
|
135
|
-
return
|
|
135
|
+
return !t || typeof t != "object" || Array.isArray(t) ? !1 : Object.values(t).every((e) => typeof e == "function");
|
|
136
136
|
}
|
|
137
137
|
function P(t) {
|
|
138
|
-
return
|
|
138
|
+
return p(t)?.staticDeployment;
|
|
139
|
+
}
|
|
140
|
+
function A(t) {
|
|
141
|
+
return p(t)?.fonts;
|
|
139
142
|
}
|
|
140
|
-
function
|
|
141
|
-
return t?.
|
|
143
|
+
function F(t) {
|
|
144
|
+
return p(t)?.images;
|
|
142
145
|
}
|
|
143
146
|
function R(t) {
|
|
147
|
+
return p(t)?.staticFileHeaders ?? [];
|
|
148
|
+
}
|
|
149
|
+
function p(t) {
|
|
150
|
+
return t?.filter((e) => e.name === "demiurge").map((e) => e.api).find(C);
|
|
151
|
+
}
|
|
152
|
+
function C(t) {
|
|
144
153
|
return !!t && t !== null && typeof t == "object" && "demiurge" in t && t.demiurge === !0;
|
|
145
154
|
}
|
|
146
|
-
function
|
|
147
|
-
const r =
|
|
148
|
-
return
|
|
155
|
+
function w(t, e) {
|
|
156
|
+
const r = d(t, e), i = d(e, t);
|
|
157
|
+
return y(r) || y(i);
|
|
149
158
|
}
|
|
150
|
-
function
|
|
151
|
-
return !t || t !== ".." && !t.startsWith(`..${
|
|
159
|
+
function y(t) {
|
|
160
|
+
return !t || t !== ".." && !t.startsWith(`..${g}`) && !v(t);
|
|
152
161
|
}
|
|
153
|
-
function
|
|
162
|
+
function $(t) {
|
|
154
163
|
return t instanceof Error && "code" in t && t.code === "ENOENT";
|
|
155
164
|
}
|
|
156
165
|
export {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
166
|
+
W as buildStaticSite,
|
|
167
|
+
H as helpText,
|
|
168
|
+
B as parseCliArguments,
|
|
160
169
|
N as parseClientManifest,
|
|
161
|
-
|
|
170
|
+
G as resolvePreviewOutputDirectory,
|
|
162
171
|
j as validateBuildOutputDirectory
|
|
163
172
|
};
|
|
164
173
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import { readFile, readdir } from \"node:fs/promises\";\nimport { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { InlineConfig } from \"vite\";\nimport type { RouteImporter } from \"./route\";\nimport {\n generateVercelStaticOutput,\n generateStaticOutput,\n type GenerateStaticOutputOptions,\n type StaticFileHeaderPatternRule,\n type StaticOutputManifest,\n type VercelStaticDeployment,\n} from \"./static\";\n\ntype CliEnvironment = Record<string, string | undefined>;\n\nconst cliOptionNames = new Set([\"--host\", \"--origin\", \"--out-dir\", \"--port\"]);\n\nexport type CliOptions = {\n command: \"build\" | \"help\" | \"preview\";\n host: string;\n origin?: string;\n outDir: string;\n port: number;\n};\n\ntype StaticBuildRuntime = {\n build: (config: InlineConfig) => Promise<unknown>;\n generate: (\n options: GenerateStaticOutputOptions,\n ) => Promise<StaticOutputManifest>;\n importModule: (specifier: string) => Promise<Record<string, unknown>>;\n now: () => number;\n readText: (file: string) => Promise<string>;\n resolveConfig: () => Promise<{\n plugins?: Array<{\n api?: unknown;\n name: string;\n }>;\n publicDir: false | string;\n root: string;\n }>;\n};\n\nexport function parseCliArguments(\n arguments_: string[],\n environment: CliEnvironment = {},\n): CliOptions {\n const command = arguments_[0];\n if (!command || command === \"--help\" || command === \"-h\" || command === \"help\") {\n return {\n command: \"help\",\n host: \"localhost\",\n outDir: \"dist\",\n port: 4173,\n };\n }\n if (command !== \"build\" && command !== \"preview\") {\n throw new Error(`Unknown command: ${command}`);\n }\n\n const options: CliOptions = {\n command,\n host: \"localhost\",\n origin: environment.SITE_ORIGIN,\n outDir: \"dist\",\n port: 4173,\n };\n\n for (let index = 1; index < arguments_.length; index += 1) {\n const argument = arguments_[index]!;\n const [name, inlineValue] = argument.split(\"=\", 2);\n if (!cliOptionNames.has(name!)) {\n throw new Error(`Unknown option: ${argument}`);\n }\n const value = inlineValue ?? arguments_[++index];\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`Option ${name} requires a value.`);\n }\n\n if (name === \"--host\") options.host = value;\n if (name === \"--origin\") options.origin = value;\n if (name === \"--out-dir\") options.outDir = value;\n if (name === \"--port\") {\n const port = Number(value);\n if (!Number.isSafeInteger(port) || port < 0 || port > 65_535) {\n throw new Error(\"Preview port must be an integer from 0 through 65535.\");\n }\n options.port = port;\n }\n }\n\n return options;\n}\n\nexport const helpText = `Usage: demiurge <command> [options]\n\nCommands:\n build Build static production output\n preview Serve static output with its declared headers\n\nOptions:\n --host <host> Set the preview host (default: localhost)\n --origin <origin> Set the build origin (default: SITE_ORIGIN)\n --out-dir <directory> Set the output directory (default: dist)\n --port <port> Set the preview port (default: 4173)\n -h, --help Show this help`;\n\nexport async function buildStaticSite(\n options: CliOptions,\n runtime?: StaticBuildRuntime,\n) {\n const vite = runtime ? undefined : await import(\"vite\");\n const config = runtime\n ? await runtime.resolveConfig()\n : await vite!.resolveConfig({}, \"build\", \"production\");\n const root = config.root;\n const outDir = resolve(root, options.outDir);\n const serverOutDir = resolve(root, \".demiurge/server\");\n const build = runtime?.build ?? vite!.build;\n\n await validateBuildOutputDirectory(\n root,\n outDir,\n config.publicDir,\n serverOutDir,\n );\n\n await build({\n build: {\n emptyOutDir: true,\n outDir,\n rollupOptions: { input: \"virtual:demiurge/client-entry\" },\n },\n });\n await build({\n build: {\n copyPublicDir: false,\n emptyOutDir: true,\n outDir: serverOutDir,\n rollupOptions: {\n input: \"virtual:demiurge/server-entry\",\n output: { entryFileNames: \"server-entry.js\" },\n },\n ssr: true,\n },\n });\n\n const clientManifest = parseClientManifest(\n runtime\n ? await runtime.readText(resolve(outDir, \"demiurge-manifest.json\"))\n : await readFile(resolve(outDir, \"demiurge-manifest.json\"), \"utf8\"),\n );\n const serverEntryUrl = `${\n pathToFileURL(resolve(serverOutDir, \"server-entry.js\")).href\n }?build=${runtime?.now() ?? Date.now()}`;\n const serverEntry = runtime\n ? await runtime.importModule(serverEntryUrl)\n : await import(serverEntryUrl);\n if (!isRouteImporterRecord(serverEntry.routes)) {\n throw new Error(\"The framework server bundle does not export routes.\");\n }\n\n const manifest = await (runtime?.generate ?? generateStaticOutput)({\n origin: options.origin,\n outDir,\n routes: serverEntry.routes,\n ssr: clientManifest,\n staticFileHeaders: findStaticFileHeaderPatterns(config.plugins),\n });\n\n const deployment = findVercelStaticDeployment(config.plugins);\n const deploymentOutDir = deployment\n ? await generateVercelStaticOutput({\n deployment,\n manifest,\n outDir,\n projectRoot: process.cwd(),\n })\n : undefined;\n\n return { deploymentOutDir, manifest, outDir };\n}\n\nexport async function resolvePreviewOutputDirectory(\n outDir: string,\n resolveConfig?: () => Promise<{ root: string }>,\n) {\n const config = resolveConfig\n ? await resolveConfig()\n : await (await import(\"vite\")).resolveConfig({}, \"serve\", \"production\");\n return resolve(config.root, outDir);\n}\n\nexport async function validateBuildOutputDirectory(\n root: string,\n outDir: string,\n publicDir: false | string,\n serverOutDir: string,\n) {\n const pathFromRoot = relative(root, outDir);\n if (\n !pathFromRoot ||\n pathFromRoot === \"..\" ||\n pathFromRoot.startsWith(`..${sep}`) ||\n isAbsolute(pathFromRoot)\n ) {\n throw new Error(\"The static output directory must be inside the Vite root.\");\n }\n\n if (publicDir && pathsOverlap(outDir, publicDir)) {\n throw new Error(\"The static output directory must not overlap the Vite public directory.\");\n }\n\n if (pathsOverlap(outDir, serverOutDir)) {\n throw new Error(\"The static output directory must not overlap the framework server directory.\");\n }\n\n let entries: string[];\n try {\n entries = await readdir(outDir);\n } catch (error) {\n if (isMissingPath(error)) return;\n throw error;\n }\n\n if (\n entries.length &&\n !entries.includes(\"demiurge-manifest.json\") &&\n !entries.includes(\"demiurge-static-manifest.json\")\n ) {\n throw new Error(\n \"The static output directory contains files that a Demiurge build did not create.\",\n );\n }\n}\n\nexport function parseClientManifest(source: string) {\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch {\n throw new Error(\"The client build manifest is not valid JSON.\");\n }\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"clientEntry\" in value) ||\n typeof value.clientEntry !== \"string\" ||\n !(\"styles\" in value) ||\n !Array.isArray(value.styles) ||\n !value.styles.every((style) => typeof style === \"string\")\n ) {\n throw new Error(\"The client build manifest has an unsupported format.\");\n }\n return { clientEntry: value.clientEntry, styles: value.styles };\n}\n\nfunction isRouteImporterRecord(\n value: unknown,\n): value is Record<string, RouteImporter> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n return Object.values(value).every((load) => typeof load === \"function\");\n}\n\nfunction findVercelStaticDeployment(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n): VercelStaticDeployment | undefined {\n return findDemiurgePluginApi(plugins)?.staticDeployment;\n}\n\nfunction findStaticFileHeaderPatterns(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n): readonly StaticFileHeaderPatternRule[] {\n return findDemiurgePluginApi(plugins)?.staticFileHeaders ?? [];\n}\n\nfunction findDemiurgePluginApi(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n) {\n return plugins\n ?.filter((plugin) => plugin.name === \"demiurge\")\n .map((plugin) => plugin.api)\n .find(isDemiurgePluginApi);\n}\n\nfunction isDemiurgePluginApi(value: unknown): value is {\n demiurge: true;\n staticDeployment?: VercelStaticDeployment;\n staticFileHeaders?: readonly StaticFileHeaderPatternRule[];\n} {\n return Boolean(value) &&\n value !== null &&\n typeof value === \"object\" &&\n \"demiurge\" in value &&\n value.demiurge === true;\n}\n\nfunction pathsOverlap(left: string, right: string) {\n const fromLeft = relative(left, right);\n const fromRight = relative(right, left);\n return isSameOrChildPath(fromLeft) || isSameOrChildPath(fromRight);\n}\n\nfunction isSameOrChildPath(pathname: string) {\n return !pathname ||\n (pathname !== \"..\" && !pathname.startsWith(`..${sep}`) &&\n !isAbsolute(pathname));\n}\n\nfunction isMissingPath(error: unknown) {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n"],"names":["cliOptionNames","parseCliArguments","arguments_","environment","command","options","index","argument","name","inlineValue","value","port","helpText","buildStaticSite","runtime","vite","config","root","outDir","resolve","serverOutDir","build","validateBuildOutputDirectory","clientManifest","parseClientManifest","readFile","serverEntryUrl","pathToFileURL","serverEntry","isRouteImporterRecord","manifest","generateStaticOutput","findStaticFileHeaderPatterns","deployment","findVercelStaticDeployment","generateVercelStaticOutput","resolvePreviewOutputDirectory","resolveConfig","publicDir","pathFromRoot","relative","sep","isAbsolute","pathsOverlap","entries","readdir","error","isMissingPath","source","style","load","plugins","findDemiurgePluginApi","plugin","isDemiurgePluginApi","left","right","fromLeft","fromRight","isSameOrChildPath","pathname"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["import { readFile, readdir } from \"node:fs/promises\";\nimport { isAbsolute, relative, resolve, sep } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { InlineConfig } from \"vite\";\nimport type { FontContribution, ImagePolicy } from \"./platform\";\nimport type { RouteImporter } from \"./route\";\nimport {\n generateVercelStaticOutput,\n generateStaticOutput,\n type GenerateStaticOutputOptions,\n type StaticFileHeaderPatternRule,\n type StaticOutputManifest,\n type VercelStaticDeployment,\n} from \"./static\";\n\ntype CliEnvironment = Record<string, string | undefined>;\n\nconst cliOptionNames = new Set([\"--host\", \"--origin\", \"--out-dir\", \"--port\"]);\n\nexport type CliOptions = {\n command: \"build\" | \"help\" | \"preview\";\n host: string;\n origin?: string;\n outDir: string;\n port: number;\n};\n\ntype StaticBuildRuntime = {\n build: (config: InlineConfig) => Promise<unknown>;\n generate: (\n options: GenerateStaticOutputOptions,\n ) => Promise<StaticOutputManifest>;\n importModule: (specifier: string) => Promise<Record<string, unknown>>;\n now: () => number;\n readText: (file: string) => Promise<string>;\n resolveConfig: () => Promise<{\n plugins?: Array<{\n api?: unknown;\n name: string;\n }>;\n publicDir: false | string;\n root: string;\n }>;\n};\n\nexport function parseCliArguments(\n arguments_: string[],\n environment: CliEnvironment = {},\n): CliOptions {\n const command = arguments_[0];\n if (!command || command === \"--help\" || command === \"-h\" || command === \"help\") {\n return {\n command: \"help\",\n host: \"localhost\",\n outDir: \"dist\",\n port: 4173,\n };\n }\n if (command !== \"build\" && command !== \"preview\") {\n throw new Error(`Unknown command: ${command}`);\n }\n\n const options: CliOptions = {\n command,\n host: \"localhost\",\n origin: environment.SITE_ORIGIN,\n outDir: \"dist\",\n port: 4173,\n };\n\n for (let index = 1; index < arguments_.length; index += 1) {\n const argument = arguments_[index]!;\n const [name, inlineValue] = argument.split(\"=\", 2);\n if (!cliOptionNames.has(name!)) {\n throw new Error(`Unknown option: ${argument}`);\n }\n const value = inlineValue ?? arguments_[++index];\n if (!value || value.startsWith(\"--\")) {\n throw new Error(`Option ${name} requires a value.`);\n }\n\n if (name === \"--host\") options.host = value;\n if (name === \"--origin\") options.origin = value;\n if (name === \"--out-dir\") options.outDir = value;\n if (name === \"--port\") {\n const port = Number(value);\n if (!Number.isSafeInteger(port) || port < 0 || port > 65_535) {\n throw new Error(\"Preview port must be an integer from 0 through 65535.\");\n }\n options.port = port;\n }\n }\n\n return options;\n}\n\nexport const helpText = `Usage: demiurge <command> [options]\n\nCommands:\n build Build static production output\n preview Serve static output with its declared headers\n\nOptions:\n --host <host> Set the preview host (default: localhost)\n --origin <origin> Set the build origin (default: SITE_ORIGIN)\n --out-dir <directory> Set the output directory (default: dist)\n --port <port> Set the preview port (default: 4173)\n -h, --help Show this help`;\n\nexport async function buildStaticSite(\n options: CliOptions,\n runtime?: StaticBuildRuntime,\n) {\n const vite = runtime ? undefined : await import(\"vite\");\n const config = runtime\n ? await runtime.resolveConfig()\n : await vite!.resolveConfig({}, \"build\", \"production\");\n const root = config.root;\n const outDir = resolve(root, options.outDir);\n const serverOutDir = resolve(root, \".demiurge/server\");\n const build = runtime?.build ?? vite!.build;\n\n await validateBuildOutputDirectory(\n root,\n outDir,\n config.publicDir,\n serverOutDir,\n );\n\n await build({\n build: {\n emptyOutDir: true,\n outDir,\n rollupOptions: { input: \"virtual:demiurge/client-entry\" },\n },\n });\n await build({\n build: {\n copyPublicDir: false,\n emptyOutDir: true,\n outDir: serverOutDir,\n rollupOptions: {\n input: \"virtual:demiurge/server-entry\",\n output: { entryFileNames: \"server-entry.js\" },\n },\n ssr: true,\n },\n });\n\n const clientManifest = parseClientManifest(\n runtime\n ? await runtime.readText(resolve(outDir, \"demiurge-manifest.json\"))\n : await readFile(resolve(outDir, \"demiurge-manifest.json\"), \"utf8\"),\n );\n const serverEntryUrl = `${\n pathToFileURL(resolve(serverOutDir, \"server-entry.js\")).href\n }?build=${runtime?.now() ?? Date.now()}`;\n const serverEntry = runtime\n ? await runtime.importModule(serverEntryUrl)\n : await import(serverEntryUrl);\n if (!isRouteImporterRecord(serverEntry.routes)) {\n throw new Error(\"The framework server bundle does not export routes.\");\n }\n\n const manifest = await (runtime?.generate ?? generateStaticOutput)({\n fonts: findFontContribution(config.plugins),\n images: findImagePolicy(config.plugins),\n origin: options.origin,\n outDir,\n root,\n routes: serverEntry.routes,\n ssr: clientManifest,\n staticFileHeaders: findStaticFileHeaderPatterns(config.plugins),\n });\n\n const deployment = findVercelStaticDeployment(config.plugins);\n const deploymentOutDir = deployment\n ? await generateVercelStaticOutput({\n deployment,\n manifest,\n outDir,\n projectRoot: process.cwd(),\n })\n : undefined;\n\n return { deploymentOutDir, manifest, outDir };\n}\n\nexport async function resolvePreviewOutputDirectory(\n outDir: string,\n resolveConfig?: () => Promise<{ root: string }>,\n) {\n const config = resolveConfig\n ? await resolveConfig()\n : await (await import(\"vite\")).resolveConfig({}, \"serve\", \"production\");\n return resolve(config.root, outDir);\n}\n\nexport async function validateBuildOutputDirectory(\n root: string,\n outDir: string,\n publicDir: false | string,\n serverOutDir: string,\n) {\n const pathFromRoot = relative(root, outDir);\n if (\n !pathFromRoot ||\n pathFromRoot === \"..\" ||\n pathFromRoot.startsWith(`..${sep}`) ||\n isAbsolute(pathFromRoot)\n ) {\n throw new Error(\"The static output directory must be inside the Vite root.\");\n }\n\n if (publicDir && pathsOverlap(outDir, publicDir)) {\n throw new Error(\"The static output directory must not overlap the Vite public directory.\");\n }\n\n if (pathsOverlap(outDir, serverOutDir)) {\n throw new Error(\"The static output directory must not overlap the framework server directory.\");\n }\n\n let entries: string[];\n try {\n entries = await readdir(outDir);\n } catch (error) {\n if (isMissingPath(error)) return;\n throw error;\n }\n\n if (\n entries.length &&\n !entries.includes(\"demiurge-manifest.json\") &&\n !entries.includes(\"demiurge-static-manifest.json\")\n ) {\n throw new Error(\n \"The static output directory contains files that a Demiurge build did not create.\",\n );\n }\n}\n\nexport function parseClientManifest(source: string) {\n let value: unknown;\n try {\n value = JSON.parse(source);\n } catch {\n throw new Error(\"The client build manifest is not valid JSON.\");\n }\n if (\n !value ||\n typeof value !== \"object\" ||\n !(\"clientEntry\" in value) ||\n typeof value.clientEntry !== \"string\" ||\n !(\"styles\" in value) ||\n !Array.isArray(value.styles) ||\n !value.styles.every((style) => typeof style === \"string\")\n ) {\n throw new Error(\"The client build manifest has an unsupported format.\");\n }\n return { clientEntry: value.clientEntry, styles: value.styles };\n}\n\nfunction isRouteImporterRecord(\n value: unknown,\n): value is Record<string, RouteImporter> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n return Object.values(value).every((load) => typeof load === \"function\");\n}\n\nfunction findVercelStaticDeployment(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n): VercelStaticDeployment | undefined {\n return findDemiurgePluginApi(plugins)?.staticDeployment;\n}\n\nfunction findFontContribution(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n): FontContribution | undefined {\n return findDemiurgePluginApi(plugins)?.fonts;\n}\n\nfunction findImagePolicy(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n): ImagePolicy | undefined {\n return findDemiurgePluginApi(plugins)?.images;\n}\n\nfunction findStaticFileHeaderPatterns(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n): readonly StaticFileHeaderPatternRule[] {\n return findDemiurgePluginApi(plugins)?.staticFileHeaders ?? [];\n}\n\nfunction findDemiurgePluginApi(\n plugins: ReadonlyArray<{ api?: unknown; name: string }> | undefined,\n) {\n return plugins\n ?.filter((plugin) => plugin.name === \"demiurge\")\n .map((plugin) => plugin.api)\n .find(isDemiurgePluginApi);\n}\n\nfunction isDemiurgePluginApi(value: unknown): value is {\n demiurge: true;\n fonts?: FontContribution;\n images?: ImagePolicy;\n staticDeployment?: VercelStaticDeployment;\n staticFileHeaders?: readonly StaticFileHeaderPatternRule[];\n} {\n return Boolean(value) &&\n value !== null &&\n typeof value === \"object\" &&\n \"demiurge\" in value &&\n value.demiurge === true;\n}\n\nfunction pathsOverlap(left: string, right: string) {\n const fromLeft = relative(left, right);\n const fromRight = relative(right, left);\n return isSameOrChildPath(fromLeft) || isSameOrChildPath(fromRight);\n}\n\nfunction isSameOrChildPath(pathname: string) {\n return !pathname ||\n (pathname !== \"..\" && !pathname.startsWith(`..${sep}`) &&\n !isAbsolute(pathname));\n}\n\nfunction isMissingPath(error: unknown) {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n"],"names":["cliOptionNames","parseCliArguments","arguments_","environment","command","options","index","argument","name","inlineValue","value","port","helpText","buildStaticSite","runtime","vite","config","root","outDir","resolve","serverOutDir","build","validateBuildOutputDirectory","clientManifest","parseClientManifest","readFile","serverEntryUrl","pathToFileURL","serverEntry","isRouteImporterRecord","manifest","generateStaticOutput","findFontContribution","findImagePolicy","findStaticFileHeaderPatterns","deployment","findVercelStaticDeployment","generateVercelStaticOutput","resolvePreviewOutputDirectory","resolveConfig","publicDir","pathFromRoot","relative","sep","isAbsolute","pathsOverlap","entries","readdir","error","isMissingPath","source","style","load","plugins","findDemiurgePluginApi","plugin","isDemiurgePluginApi","left","right","fromLeft","fromRight","isSameOrChildPath","pathname"],"mappings":"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"}
|
package/dist/data/cache.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ type MaybePromise<T> = T | Promise<T>;
|
|
|
11
11
|
export type CacheRequest<TResult> = {
|
|
12
12
|
fn: () => MaybePromise<TResult>;
|
|
13
13
|
key: CacheKey;
|
|
14
|
+
notFoundTtl?: CacheDuration;
|
|
14
15
|
scope?: CacheScope;
|
|
15
16
|
staleWhileRevalidate?: CacheDuration;
|
|
16
17
|
tags?: readonly CacheTag[];
|
|
@@ -19,6 +20,7 @@ export type CacheRequest<TResult> = {
|
|
|
19
20
|
export type QueryDefinition<TArgs extends readonly unknown[], TResult> = {
|
|
20
21
|
fn: (...args: TArgs) => MaybePromise<TResult>;
|
|
21
22
|
key: (...args: TArgs) => CacheKey;
|
|
23
|
+
notFoundTtl?: CacheDuration;
|
|
22
24
|
scope?: CacheScope;
|
|
23
25
|
staleWhileRevalidate?: CacheDuration;
|
|
24
26
|
tags?: (...args: TArgs) => readonly CacheTag[];
|
|
@@ -37,6 +39,7 @@ export type CacheNamespace = {
|
|
|
37
39
|
};
|
|
38
40
|
export type CacheStoreEntry = {
|
|
39
41
|
expiresAt: number | null;
|
|
42
|
+
negative?: boolean;
|
|
40
43
|
staleUntil: number | null;
|
|
41
44
|
tags: readonly string[];
|
|
42
45
|
value: unknown;
|
|
@@ -81,6 +84,11 @@ export type MemoryCacheStoreOptions = {
|
|
|
81
84
|
now?: () => number;
|
|
82
85
|
};
|
|
83
86
|
export declare function query<TArgs extends readonly unknown[], TResult>(definition: QueryDefinition<TArgs, TResult>): Query<TArgs, TResult>;
|
|
87
|
+
export declare class CacheNotFoundError extends Error {
|
|
88
|
+
constructor(message?: string);
|
|
89
|
+
}
|
|
90
|
+
export declare function cacheNotFound(message?: string): never;
|
|
91
|
+
export declare function isCacheNotFoundError(error: unknown): error is CacheNotFoundError;
|
|
84
92
|
export declare function tag(id: string): CacheTag;
|
|
85
93
|
export declare function defineTags<TTags extends Record<string, (...args: never[]) => CacheTag>>(tags: TTags): TTags;
|
|
86
94
|
export declare function createCache(options: CreateCacheOptions): Cache;
|
package/dist/data/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/data/cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,OAAO,GACP,MAAM,GACN,SAAS,GACT,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,IAAI,GACJ,MAAM,GACN,MAAM,GACN;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAAA;CAAE,GACxC,SAAS,YAAY,EAAE,CAAC;AAE5B,MAAM,MAAM,QAAQ,GAAG,SAAS,YAAY,EAAE,CAAC;AAE/C,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC;AAE1E,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,YAAY,CAAC,OAAO,IAAI;IAClC,EAAE,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/data/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/data/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,SAAS,CAAC;AAEjB,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAAI;IACxC,EAAE,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,OAAO,IAAI;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,CAAC,OAAO,EACX,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,KACjC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC;AAQF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAKF,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,gBAAgB,
|
|
1
|
+
{"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/data/idempotency.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,SAAS,CAAC;AAEjB,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,kBAAkB,CAAC,OAAO,IAAI;IACxC,EAAE,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAChC,GAAG,EAAE,QAAQ,CAAC;IACd,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,OAAO,IAAI;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,CAAC,OAAO,EACX,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,KACjC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;CAC1C,CAAC;AAQF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAKF,wBAAgB,4BAA4B,CAC1C,OAAO,GAAE,6BAAkC,GAC1C,gBAAgB,CAyElB;AAwBD,wBAAgB,qBAAqB,CAAC,OAAO,EAC3C,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC,uCAGrC"}
|
package/dist/data/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { createCache, createInvalidation, createMemoryCache, createMemoryCacheStore, defineTags, parseCacheDuration, query, serializeCacheKey, serializeCacheNamespace, serializeCacheTag, tag, } from "./cache";
|
|
1
|
+
export { cacheNotFound, CacheNotFoundError, createCache, createInvalidation, createMemoryCache, createMemoryCacheStore, defineTags, isCacheNotFoundError, parseCacheDuration, query, serializeCacheKey, serializeCacheNamespace, serializeCacheTag, tag, } from "./cache";
|
|
2
2
|
export { createMemoryIdempotencyStore, runIdempotentMutation, } from "./idempotency";
|
|
3
|
+
export { createTieredCacheStore } from "./tiered";
|
|
3
4
|
export type { Cache, CacheDuration, CacheKey, CacheKeyPart, CacheRequest, CacheScope, CacheNamespace, CacheStore, CacheStoreEntry, CacheTag, CreateCacheOptions, Invalidation, InvalidationResult, Query, QueryDefinition, MemoryCacheOptions, MemoryCacheStoreOptions, } from "./cache";
|
|
5
|
+
export type { TieredCacheStoreOptions } from "./tiered";
|
|
4
6
|
export type { IdempotencyRequest, IdempotencyResult, IdempotencyStore, MemoryIdempotencyStoreOptions, } from "./idempotency";
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/data/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,KAAK,EACL,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,GAAG,GACJ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,KAAK,EACL,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,KAAK,EACL,eAAe,EACf,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,EACL,iBAAiB,EACjB,uBAAuB,EACvB,iBAAiB,EACjB,GAAG,GACJ,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,YAAY,EACV,KAAK,EACL,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,UAAU,EACV,eAAe,EACf,QAAQ,EACR,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,KAAK,EACL,eAAe,EACf,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACxD,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,6BAA6B,GAC9B,MAAM,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/data/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,SAAS,CAAC;AAE3D,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;AAE/D,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/data/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,SAAS,CAAC;AAE3D,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;AAE/D,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,iBAAiB,iBA2G/B;AAED,wBAAsB,+BAA+B,CACnD,WAAW,EAAE,iBAAiB,iBAwF/B"}
|
package/dist/data/testing.js
CHANGED
|
@@ -1,134 +1,156 @@
|
|
|
1
|
-
async function
|
|
2
|
-
const e = await i(), s = `demiurge-contract:${Date.now()}:${Math.random()}`,
|
|
3
|
-
expiresAt:
|
|
4
|
-
staleUntil:
|
|
5
|
-
tags: [
|
|
1
|
+
async function m(i) {
|
|
2
|
+
const e = await i(), s = `demiurge-contract:${Date.now()}:${Math.random()}`, a = `${s}:alpha`, o = `${s}:beta`, u = `${s}:gamma`, r = `${s}:delta`, l = `${s}:tag:alpha`, g = `${s}:tag:beta`, c = `${s}:tag:delta`, n = Date.now() + 6e4, h = {
|
|
3
|
+
expiresAt: n,
|
|
4
|
+
staleUntil: n + 5e3,
|
|
5
|
+
tags: [l],
|
|
6
6
|
value: { id: "alpha", revision: 1 }
|
|
7
7
|
};
|
|
8
8
|
try {
|
|
9
|
-
|
|
10
|
-
await e.get(
|
|
9
|
+
t(
|
|
10
|
+
await e.get(a) === void 0,
|
|
11
11
|
"get() must return undefined for a missing key"
|
|
12
|
-
), await e.set(
|
|
13
|
-
const
|
|
12
|
+
), await e.set(a, h), d(await e.get(a), h, "set() then get()");
|
|
13
|
+
const f = {
|
|
14
14
|
...h,
|
|
15
15
|
value: { id: "alpha", revision: 2 }
|
|
16
16
|
};
|
|
17
|
-
await e.set(
|
|
18
|
-
await e.get(
|
|
19
|
-
|
|
17
|
+
await e.set(a, f), d(
|
|
18
|
+
await e.get(a),
|
|
19
|
+
f,
|
|
20
20
|
"set() must replace an existing key"
|
|
21
|
-
), await e.set(
|
|
22
|
-
expiresAt:
|
|
23
|
-
staleUntil:
|
|
24
|
-
tags: [
|
|
21
|
+
), await e.set(o, {
|
|
22
|
+
expiresAt: n + 1e4,
|
|
23
|
+
staleUntil: n + 15e3,
|
|
24
|
+
tags: [g],
|
|
25
25
|
value: "beta"
|
|
26
|
-
}), await e.set(
|
|
27
|
-
expiresAt:
|
|
28
|
-
staleUntil:
|
|
29
|
-
tags: [
|
|
26
|
+
}), await e.set(u, {
|
|
27
|
+
expiresAt: n + 2e4,
|
|
28
|
+
staleUntil: n + 25e3,
|
|
29
|
+
tags: [l, g],
|
|
30
30
|
value: ["gamma"]
|
|
31
|
-
}),
|
|
32
|
-
await e.invalidateTags([
|
|
31
|
+
}), t(
|
|
32
|
+
await e.invalidateTags([l]) === 2,
|
|
33
33
|
"invalidateTags() must return the number of entries deleted, counting each entry once"
|
|
34
|
-
),
|
|
35
|
-
await e.get(
|
|
34
|
+
), t(
|
|
35
|
+
await e.get(a) === void 0 && await e.get(u) === void 0,
|
|
36
36
|
"invalidateTags() must delete every entry carrying a matching tag"
|
|
37
|
-
),
|
|
38
|
-
(await e.get(
|
|
37
|
+
), t(
|
|
38
|
+
(await e.get(o))?.value === "beta",
|
|
39
39
|
"invalidateTags() must preserve entries with no matching tag"
|
|
40
|
-
),
|
|
41
|
-
await e.delete(
|
|
40
|
+
), t(
|
|
41
|
+
await e.delete(o) === !0,
|
|
42
42
|
"delete() must report an existing key"
|
|
43
|
-
),
|
|
44
|
-
await e.delete(
|
|
43
|
+
), t(
|
|
44
|
+
await e.delete(o) === !1,
|
|
45
45
|
"delete() must report a missing key"
|
|
46
46
|
);
|
|
47
|
+
const w = {
|
|
48
|
+
expiresAt: n,
|
|
49
|
+
negative: !0,
|
|
50
|
+
staleUntil: n,
|
|
51
|
+
tags: [c],
|
|
52
|
+
value: "not found"
|
|
53
|
+
};
|
|
54
|
+
await e.set(r, w), d(
|
|
55
|
+
await e.get(r),
|
|
56
|
+
w,
|
|
57
|
+
"set() then get() for a negative entry"
|
|
58
|
+
), t(
|
|
59
|
+
await e.invalidateTags([c]) === 1,
|
|
60
|
+
"invalidateTags() must delete a negative entry carrying a matching tag"
|
|
61
|
+
), t(
|
|
62
|
+
await e.get(r) === void 0,
|
|
63
|
+
"invalidateTags() must remove a negative entry the same as a positive one"
|
|
64
|
+
);
|
|
47
65
|
} finally {
|
|
48
66
|
await Promise.all([
|
|
49
|
-
e.delete(
|
|
50
|
-
e.delete(
|
|
51
|
-
e.delete(
|
|
67
|
+
e.delete(a),
|
|
68
|
+
e.delete(o),
|
|
69
|
+
e.delete(u),
|
|
70
|
+
e.delete(r)
|
|
52
71
|
]);
|
|
53
72
|
}
|
|
54
73
|
}
|
|
55
|
-
async function
|
|
56
|
-
const e = await i(), s = `demiurge-refresh-contract:${Date.now()}:${Math.random()}`,
|
|
57
|
-
|
|
74
|
+
async function v(i) {
|
|
75
|
+
const e = await i(), s = `demiurge-refresh-contract:${Date.now()}:${Math.random()}`, a = `${s}:entry`, o = `${s}:tag`, u = `${s}:first`, r = `${s}:second`, l = Date.now() + 6e4;
|
|
76
|
+
t(
|
|
58
77
|
!!(e.acquireRefreshLease && e.publishRefresh && e.releaseRefreshLease),
|
|
59
78
|
"SWR support requires acquireRefreshLease(), publishRefresh(), and releaseRefreshLease()"
|
|
60
79
|
);
|
|
61
|
-
const
|
|
80
|
+
const g = e.acquireRefreshLease, c = e.publishRefresh, n = e.releaseRefreshLease, h = {
|
|
62
81
|
expiresAt: Date.now() - 1,
|
|
63
82
|
staleUntil: Date.now() + 12e4,
|
|
64
|
-
tags: [
|
|
83
|
+
tags: [o],
|
|
65
84
|
value: "original"
|
|
66
|
-
},
|
|
67
|
-
...
|
|
85
|
+
}, f = {
|
|
86
|
+
...h,
|
|
68
87
|
expiresAt: Date.now() + 6e4,
|
|
69
88
|
value: "refreshed"
|
|
70
89
|
};
|
|
71
90
|
try {
|
|
72
|
-
await e.set(
|
|
73
|
-
await
|
|
91
|
+
await e.set(a, h), t(
|
|
92
|
+
await g(a, u, l),
|
|
74
93
|
"acquireRefreshLease() must acquire an unowned key"
|
|
75
|
-
),
|
|
76
|
-
!await
|
|
94
|
+
), t(
|
|
95
|
+
!await g(a, r, l),
|
|
77
96
|
"acquireRefreshLease() must exclude a second owner"
|
|
78
|
-
),
|
|
79
|
-
!await
|
|
97
|
+
), t(
|
|
98
|
+
!await c(a, r, f),
|
|
80
99
|
"publishRefresh() must reject a non-owner token"
|
|
81
|
-
), await
|
|
82
|
-
!await
|
|
100
|
+
), await n(a, r), t(
|
|
101
|
+
!await g(a, r, l),
|
|
83
102
|
"releaseRefreshLease() must not release another owner's lease"
|
|
84
|
-
),
|
|
85
|
-
await
|
|
103
|
+
), t(
|
|
104
|
+
await c(a, u, f),
|
|
86
105
|
"publishRefresh() must atomically publish for the current owner"
|
|
87
|
-
),
|
|
88
|
-
await e.get(
|
|
89
|
-
|
|
106
|
+
), d(
|
|
107
|
+
await e.get(a),
|
|
108
|
+
f,
|
|
90
109
|
"publishRefresh() for the current owner"
|
|
91
|
-
),
|
|
92
|
-
await
|
|
110
|
+
), t(
|
|
111
|
+
await g(a, r, l),
|
|
93
112
|
"successful publication must release the refresh lease"
|
|
94
|
-
),
|
|
95
|
-
!await
|
|
113
|
+
), t(await e.delete(a), "delete() must remove the refreshed entry"), t(
|
|
114
|
+
!await c(a, r, h),
|
|
96
115
|
"delete() must cancel an in-flight refresh lease"
|
|
97
|
-
), await e.set(
|
|
98
|
-
await
|
|
116
|
+
), await e.set(a, h), t(
|
|
117
|
+
await g(a, u, l),
|
|
99
118
|
"a lease must be reusable after deletion"
|
|
100
|
-
),
|
|
101
|
-
await e.invalidateTags([
|
|
119
|
+
), t(
|
|
120
|
+
await e.invalidateTags([o]) === 1,
|
|
102
121
|
"invalidateTags() must remove the leased entry"
|
|
103
|
-
),
|
|
104
|
-
!await
|
|
122
|
+
), t(
|
|
123
|
+
!await c(a, u, f),
|
|
105
124
|
"tag invalidation must cancel an in-flight refresh lease"
|
|
106
125
|
);
|
|
107
126
|
} finally {
|
|
108
|
-
await e.delete(
|
|
127
|
+
await e.delete(a);
|
|
109
128
|
}
|
|
110
129
|
}
|
|
111
|
-
function
|
|
112
|
-
|
|
130
|
+
function d(i, e, s) {
|
|
131
|
+
t(!!i, `${s} must preserve the entry`), t(
|
|
113
132
|
i?.expiresAt === e.expiresAt,
|
|
114
133
|
`${s} must preserve expiresAt`
|
|
115
|
-
),
|
|
134
|
+
), t(
|
|
135
|
+
!!i?.negative == !!e.negative,
|
|
136
|
+
`${s} must preserve the negative flag`
|
|
137
|
+
), t(
|
|
116
138
|
i?.staleUntil === e.staleUntil,
|
|
117
139
|
`${s} must preserve staleUntil`
|
|
118
|
-
),
|
|
140
|
+
), t(
|
|
119
141
|
JSON.stringify(i?.tags) === JSON.stringify(e.tags),
|
|
120
142
|
`${s} must preserve tags`
|
|
121
|
-
),
|
|
143
|
+
), t(
|
|
122
144
|
JSON.stringify(i?.value) === JSON.stringify(e.value),
|
|
123
145
|
`${s} must preserve JSON-compatible values`
|
|
124
146
|
);
|
|
125
147
|
}
|
|
126
|
-
function
|
|
148
|
+
function t(i, e) {
|
|
127
149
|
if (!i)
|
|
128
150
|
throw new Error(`Cache store contract failed: ${e}.`);
|
|
129
151
|
}
|
|
130
152
|
export {
|
|
131
|
-
|
|
132
|
-
|
|
153
|
+
m as verifyCacheStoreContract,
|
|
154
|
+
v as verifyCacheStoreRefreshContract
|
|
133
155
|
};
|
|
134
156
|
//# sourceMappingURL=testing.js.map
|