@spacefast/common 0.0.2
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 +42 -0
- package/dist/brand.d.ts +15 -0
- package/dist/brand.js +24 -0
- package/dist/config/domains.d.ts +30 -0
- package/dist/config/domains.js +75 -0
- package/dist/config/index.d.ts +1 -0
- package/dist/config/index.js +3 -0
- package/dist/contracts/abuse.d.ts +93 -0
- package/dist/contracts/abuse.js +50 -0
- package/dist/contracts/access.d.ts +409 -0
- package/dist/contracts/access.js +396 -0
- package/dist/contracts/account.d.ts +28 -0
- package/dist/contracts/account.js +54 -0
- package/dist/contracts/activity.d.ts +118 -0
- package/dist/contracts/activity.js +180 -0
- package/dist/contracts/analytics.d.ts +56 -0
- package/dist/contracts/analytics.js +91 -0
- package/dist/contracts/annotations.d.ts +327 -0
- package/dist/contracts/annotations.js +234 -0
- package/dist/contracts/api-keys.d.ts +517 -0
- package/dist/contracts/api-keys.js +235 -0
- package/dist/contracts/archives.d.ts +332 -0
- package/dist/contracts/archives.js +120 -0
- package/dist/contracts/auth.d.ts +86 -0
- package/dist/contracts/auth.js +82 -0
- package/dist/contracts/beta.d.ts +106 -0
- package/dist/contracts/beta.js +104 -0
- package/dist/contracts/billing.d.ts +328 -0
- package/dist/contracts/billing.js +203 -0
- package/dist/contracts/builds.d.ts +504 -0
- package/dist/contracts/builds.js +248 -0
- package/dist/contracts/channels.d.ts +49 -0
- package/dist/contracts/channels.js +51 -0
- package/dist/contracts/common.d.ts +238 -0
- package/dist/contracts/common.js +175 -0
- package/dist/contracts/deployments.d.ts +574 -0
- package/dist/contracts/deployments.js +97 -0
- package/dist/contracts/device-auth.d.ts +194 -0
- package/dist/contracts/device-auth.js +162 -0
- package/dist/contracts/domains.d.ts +6115 -0
- package/dist/contracts/domains.js +1435 -0
- package/dist/contracts/enums.d.ts +196 -0
- package/dist/contracts/enums.js +211 -0
- package/dist/contracts/error-code-meta.d.ts +1560 -0
- package/dist/contracts/error-code-meta.js +400 -0
- package/dist/contracts/error-codes.d.ts +13 -0
- package/dist/contracts/error-codes.js +416 -0
- package/dist/contracts/events.d.ts +398 -0
- package/dist/contracts/events.js +320 -0
- package/dist/contracts/fast-domain-search.d.ts +19 -0
- package/dist/contracts/fast-domain-search.js +22 -0
- package/dist/contracts/features.d.ts +240 -0
- package/dist/contracts/features.js +406 -0
- package/dist/contracts/git.d.ts +288 -0
- package/dist/contracts/git.js +116 -0
- package/dist/contracts/ids.d.ts +35 -0
- package/dist/contracts/ids.js +45 -0
- package/dist/contracts/intercom.d.ts +6 -0
- package/dist/contracts/intercom.js +5 -0
- package/dist/contracts/internal.d.ts +103 -0
- package/dist/contracts/internal.js +92 -0
- package/dist/contracts/mcp.d.ts +788 -0
- package/dist/contracts/mcp.js +161 -0
- package/dist/contracts/me.d.ts +81 -0
- package/dist/contracts/me.js +104 -0
- package/dist/contracts/oauth-resources.d.ts +30 -0
- package/dist/contracts/oauth-resources.js +61 -0
- package/dist/contracts/operations.d.ts +54 -0
- package/dist/contracts/operations.js +14 -0
- package/dist/contracts/plan-policy.d.ts +85 -0
- package/dist/contracts/plan-policy.js +75 -0
- package/dist/contracts/platform.d.ts +359 -0
- package/dist/contracts/platform.js +216 -0
- package/dist/contracts/push-new.d.ts +156 -0
- package/dist/contracts/push-new.js +52 -0
- package/dist/contracts/quotas.d.ts +16 -0
- package/dist/contracts/quotas.js +36 -0
- package/dist/contracts/repository-connections.d.ts +231 -0
- package/dist/contracts/repository-connections.js +106 -0
- package/dist/contracts/resources.d.ts +529 -0
- package/dist/contracts/resources.js +209 -0
- package/dist/contracts/routes.d.ts +45 -0
- package/dist/contracts/routes.js +31 -0
- package/dist/contracts/runtime-api.d.ts +449 -0
- package/dist/contracts/runtime-api.js +513 -0
- package/dist/contracts/sites.d.ts +393 -0
- package/dist/contracts/sites.js +121 -0
- package/dist/contracts/slugs.d.ts +31 -0
- package/dist/contracts/slugs.js +47 -0
- package/dist/contracts/space-config.d.ts +216 -0
- package/dist/contracts/space-config.js +237 -0
- package/dist/contracts/space-theme.d.ts +25 -0
- package/dist/contracts/space-theme.js +49 -0
- package/dist/contracts/spaces.d.ts +2760 -0
- package/dist/contracts/spaces.js +589 -0
- package/dist/contracts/superadmin-activity.d.ts +205 -0
- package/dist/contracts/superadmin-activity.js +107 -0
- package/dist/contracts/superadmin-emails.d.ts +212 -0
- package/dist/contracts/superadmin-emails.js +112 -0
- package/dist/contracts/superadmin-queues.d.ts +414 -0
- package/dist/contracts/superadmin-queues.js +202 -0
- package/dist/contracts/superadmin-runtime.d.ts +27 -0
- package/dist/contracts/superadmin-runtime.js +38 -0
- package/dist/contracts/superadmin-spaces.d.ts +429 -0
- package/dist/contracts/superadmin-spaces.js +82 -0
- package/dist/contracts/superadmin-tenants.d.ts +180 -0
- package/dist/contracts/superadmin-tenants.js +117 -0
- package/dist/contracts/superadmin.d.ts +654 -0
- package/dist/contracts/superadmin.js +309 -0
- package/dist/contracts/tags.d.ts +1140 -0
- package/dist/contracts/tags.js +1050 -0
- package/dist/contracts/teams.d.ts +233 -0
- package/dist/contracts/teams.js +174 -0
- package/dist/contracts/telemetry.d.ts +2 -0
- package/dist/contracts/telemetry.js +1 -0
- package/dist/contracts/transfers.d.ts +105 -0
- package/dist/contracts/transfers.js +48 -0
- package/dist/contracts/variables.d.ts +189 -0
- package/dist/contracts/variables.js +82 -0
- package/dist/contracts/webhooks.d.ts +159 -0
- package/dist/contracts/webhooks.js +59 -0
- package/dist/contracts/zero.d.ts +1538 -0
- package/dist/contracts/zero.js +755 -0
- package/dist/docs/agent-prose.d.ts +35 -0
- package/dist/docs/agent-prose.js +153 -0
- package/dist/docs/agent-setup.d.ts +6 -0
- package/dist/docs/agent-setup.js +164 -0
- package/dist/docs/agent-solutions.d.ts +110 -0
- package/dist/docs/agent-solutions.js +181 -0
- package/dist/docs/error-docs.d.ts +12 -0
- package/dist/docs/error-docs.js +1601 -0
- package/dist/docs/skill-distribution.d.ts +12 -0
- package/dist/docs/skill-distribution.js +18 -0
- package/dist/domain-exploration.d.ts +108 -0
- package/dist/domain-exploration.js +488 -0
- package/dist/domain-normalize.d.ts +1 -0
- package/dist/domain-normalize.js +14 -0
- package/dist/domain-zones.d.ts +1 -0
- package/dist/domain-zones.js +5272 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/utils/access-policy.d.ts +39 -0
- package/dist/utils/access-policy.js +232 -0
- package/dist/utils/api.d.ts +4 -0
- package/dist/utils/api.js +13 -0
- package/dist/utils/auth-redirect.d.ts +1 -0
- package/dist/utils/auth-redirect.js +48 -0
- package/dist/utils/auth.d.ts +5 -0
- package/dist/utils/auth.js +13 -0
- package/dist/utils/build-settings.d.ts +49 -0
- package/dist/utils/build-settings.js +366 -0
- package/dist/utils/claim-token.d.ts +1 -0
- package/dist/utils/claim-token.js +9 -0
- package/dist/utils/collections.d.ts +1 -0
- package/dist/utils/collections.js +5 -0
- package/dist/utils/concurrency.d.ts +1 -0
- package/dist/utils/concurrency.js +18 -0
- package/dist/utils/content-type.d.ts +10 -0
- package/dist/utils/content-type.js +145 -0
- package/dist/utils/error-display.d.ts +7 -0
- package/dist/utils/error-display.js +42 -0
- package/dist/utils/error.d.ts +1 -0
- package/dist/utils/error.js +3 -0
- package/dist/utils/generate-space-name.d.ts +14 -0
- package/dist/utils/generate-space-name.js +95 -0
- package/dist/utils/git-repository.d.ts +5 -0
- package/dist/utils/git-repository.js +99 -0
- package/dist/utils/guards.d.ts +1 -0
- package/dist/utils/guards.js +3 -0
- package/dist/utils/publish-detection.d.ts +10 -0
- package/dist/utils/publish-detection.js +118 -0
- package/dist/utils/publish-policy.d.ts +69 -0
- package/dist/utils/publish-policy.js +429 -0
- package/dist/utils/query-client.d.ts +7 -0
- package/dist/utils/query-client.js +21 -0
- package/dist/utils/query-keys.d.ts +75 -0
- package/dist/utils/query-keys.js +78 -0
- package/dist/utils/runtime-paths.d.ts +7 -0
- package/dist/utils/runtime-paths.js +28 -0
- package/dist/utils/runtime-upload.d.ts +19 -0
- package/dist/utils/runtime-upload.js +27 -0
- package/dist/utils/slug.d.ts +5 -0
- package/dist/utils/slug.js +13 -0
- package/dist/utils/space-config.d.ts +75 -0
- package/dist/utils/space-config.js +415 -0
- package/dist/utils/space-theme.d.ts +16 -0
- package/dist/utils/space-theme.js +89 -0
- package/dist/utils/static-runtime-policy.d.ts +17 -0
- package/dist/utils/static-runtime-policy.js +103 -0
- package/dist/utils/upload-session.d.ts +34 -0
- package/dist/utils/upload-session.js +69 -0
- package/dist/utils/urls.d.ts +2 -0
- package/dist/utils/urls.js +7 -0
- package/dist/utils/version-path.d.ts +6 -0
- package/dist/utils/version-path.js +51 -0
- package/dist/utils/wpcom-auth-redirects.d.ts +14 -0
- package/dist/utils/wpcom-auth-redirects.js +49 -0
- package/dist/utils/zero-realtime-signature.d.ts +12 -0
- package/dist/utils/zero-realtime-signature.js +45 -0
- package/dist/vocabulary.d.ts +230 -0
- package/dist/vocabulary.js +218 -0
- package/package.json +58 -0
|
@@ -0,0 +1,755 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { dataEnvelope } from "./common.js";
|
|
3
|
+
export const ZERO_SOURCE_METADATA_KEY = "statticZero";
|
|
4
|
+
export const ZERO_RUNTIME_KIND = "zero";
|
|
5
|
+
export const ZERO_PLATFORM_ROUTE_PREFIX = "/__spacefast/zero";
|
|
6
|
+
export const ZERO_CLIENT_ENTRY = "client/index.tsx";
|
|
7
|
+
export const ZERO_SERVER_ENTRY = "server/index.ts";
|
|
8
|
+
export const ZERO_RUNTIME_ROUTE_PATHS = {
|
|
9
|
+
config: `${ZERO_PLATFORM_ROUTE_PREFIX}/config`,
|
|
10
|
+
realtime: `${ZERO_PLATFORM_ROUTE_PREFIX}/realtime`,
|
|
11
|
+
inspect: `${ZERO_PLATFORM_ROUTE_PREFIX}/inspect`,
|
|
12
|
+
db: `${ZERO_PLATFORM_ROUTE_PREFIX}/db`,
|
|
13
|
+
logs: `${ZERO_PLATFORM_ROUTE_PREFIX}/logs`,
|
|
14
|
+
run: `${ZERO_PLATFORM_ROUTE_PREFIX}/run`,
|
|
15
|
+
authStart: `${ZERO_PLATFORM_ROUTE_PREFIX}/auth/wpcom/start`,
|
|
16
|
+
authSignOut: `${ZERO_PLATFORM_ROUTE_PREFIX}/auth/sign-out`,
|
|
17
|
+
};
|
|
18
|
+
export const ZERO_RUNTIME_STORAGE_ROOT = "__spacefast/zero";
|
|
19
|
+
export const ZERO_RUNTIME_ARTIFACT_PATH = `${ZERO_RUNTIME_STORAGE_ROOT}/artifact.json`;
|
|
20
|
+
export const ZERO_RUNTIME_CONFIG_PATH = `${ZERO_RUNTIME_STORAGE_ROOT}/config.json`;
|
|
21
|
+
export const ZERO_RUNTIME_BINARY_PATH = `${ZERO_RUNTIME_STORAGE_ROOT}/bin/stattic-zero-runner`;
|
|
22
|
+
export const ZERO_RUNTIME_BINARY_COMPATIBILITY_TARGET = "wpcloud-linux-x86_64-gnu-v1";
|
|
23
|
+
export const ZERO_RUNTIME_BUNDLE_ROOT = `${ZERO_RUNTIME_STORAGE_ROOT}/bundles`;
|
|
24
|
+
export const ZERO_RUNTIME_CLIENT_BUNDLE_PATH = `${ZERO_RUNTIME_BUNDLE_ROOT}/client.js`;
|
|
25
|
+
export const ZERO_RUNTIME_SERVER_BUNDLE_PATH = `${ZERO_RUNTIME_BUNDLE_ROOT}/server.qjs.mjs`;
|
|
26
|
+
export const ZERO_SOURCE_ENV_FILE = ".env.zero.server";
|
|
27
|
+
export const ZERO_CONFIG_FILE = "zero.json";
|
|
28
|
+
export const ZERO_DEPLOY_FILE = ".zero/deploy.json";
|
|
29
|
+
export const ZERO_RUNTIME_BUNDLE_MAX_BYTES = 786_432;
|
|
30
|
+
export const ZERO_ENV_MAX_KEYS = 64;
|
|
31
|
+
export const ZERO_ENV_NAME_MAX_BYTES = 128;
|
|
32
|
+
export const ZERO_ENV_VALUE_MAX_BYTES = 16 * 1024;
|
|
33
|
+
export const ZERO_ENV_TOTAL_VALUE_MAX_BYTES = 64 * 1024;
|
|
34
|
+
export const ZERO_ENV_RESERVED_PREFIXES = ["SPACEFAST_", "ZERO_"];
|
|
35
|
+
export const ZERO_MANAGED_TABLE_COLUMNS = ["id", "createdAt", "updatedAt"];
|
|
36
|
+
export const ZERO_RESERVED_APP_ROUTE_PATHS = [
|
|
37
|
+
"/",
|
|
38
|
+
"/index.html",
|
|
39
|
+
"/client.js",
|
|
40
|
+
"/auth/callback",
|
|
41
|
+
"/__spacefast",
|
|
42
|
+
"/__span",
|
|
43
|
+
];
|
|
44
|
+
export const ZERO_RESERVED_APP_ROUTE_PREFIXES = ["/auth/", "/__spacefast/", "/__span/"];
|
|
45
|
+
export const zeroRuntimeKindSchema = z.enum(["static", "zero", "php", "node", "workers"]);
|
|
46
|
+
const zeroNameSchema = z
|
|
47
|
+
.string()
|
|
48
|
+
.min(1)
|
|
49
|
+
.max(128)
|
|
50
|
+
.regex(/^[A-Za-z_][A-Za-z0-9_]*$/);
|
|
51
|
+
const zeroEnvNameSchema = z
|
|
52
|
+
.string()
|
|
53
|
+
.min(1)
|
|
54
|
+
.max(ZERO_ENV_NAME_MAX_BYTES)
|
|
55
|
+
.regex(/^[A-Za-z_][A-Za-z0-9_]*$/)
|
|
56
|
+
.refine((name) => !ZERO_ENV_RESERVED_PREFIXES.some((prefix) => name.toUpperCase().startsWith(prefix)), { message: "Zero env variable name uses a reserved prefix." });
|
|
57
|
+
const zeroRoutePathSchema = z
|
|
58
|
+
.string()
|
|
59
|
+
.min(1)
|
|
60
|
+
.max(2048)
|
|
61
|
+
.startsWith("/")
|
|
62
|
+
.refine((path) => !path.startsWith("//") && !path.includes("\\") && !path.includes("?") && !path.includes("#"), {
|
|
63
|
+
message: "Zero capsule routes must be absolute app paths without //, \\, ?, or #.",
|
|
64
|
+
})
|
|
65
|
+
.refine((path) => !ZERO_RESERVED_APP_ROUTE_PATHS.some((reservedPath) => path === reservedPath), {
|
|
66
|
+
message: "Zero capsule route is reserved by the Zero app shell.",
|
|
67
|
+
})
|
|
68
|
+
.refine((path) => !ZERO_RESERVED_APP_ROUTE_PREFIXES.some((reservedPrefix) => path.startsWith(reservedPrefix)), {
|
|
69
|
+
message: "Zero capsule route prefix is reserved by the Zero app shell.",
|
|
70
|
+
})
|
|
71
|
+
.refine((path) => !path.startsWith(ZERO_PLATFORM_ROUTE_PREFIX), {
|
|
72
|
+
message: `Zero capsule routes cannot use ${ZERO_PLATFORM_ROUTE_PREFIX}.`,
|
|
73
|
+
})
|
|
74
|
+
.refine((path) => path !== "/__stattic" && !path.startsWith("/__stattic/"), {
|
|
75
|
+
message: "Zero capsule routes cannot use Spacefast private control paths.",
|
|
76
|
+
});
|
|
77
|
+
export const zeroHttpMethodSchema = z.enum([
|
|
78
|
+
"GET",
|
|
79
|
+
"HEAD",
|
|
80
|
+
"POST",
|
|
81
|
+
"PUT",
|
|
82
|
+
"PATCH",
|
|
83
|
+
"DELETE",
|
|
84
|
+
"OPTIONS",
|
|
85
|
+
]);
|
|
86
|
+
export const zeroEndpointSchema = z
|
|
87
|
+
.object({
|
|
88
|
+
method: zeroHttpMethodSchema,
|
|
89
|
+
path: zeroRoutePathSchema,
|
|
90
|
+
})
|
|
91
|
+
.strict();
|
|
92
|
+
function zeroDefaultMatchesColumnType(column, ctx) {
|
|
93
|
+
if (!Object.prototype.hasOwnProperty.call(column, "default") || column.default === null) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const valid = column.type === "string"
|
|
97
|
+
? typeof column.default === "string"
|
|
98
|
+
: column.type === "boolean"
|
|
99
|
+
? typeof column.default === "boolean"
|
|
100
|
+
: column.type === "number"
|
|
101
|
+
? typeof column.default === "number" && Number.isFinite(column.default)
|
|
102
|
+
: isZeroJsonDefaultValue(column.default);
|
|
103
|
+
if (!valid) {
|
|
104
|
+
ctx.addIssue({
|
|
105
|
+
code: z.ZodIssueCode.custom,
|
|
106
|
+
path: ["default"],
|
|
107
|
+
message: `Zero ${column.type} column default is invalid.`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function isZeroJsonDefaultValue(value) {
|
|
112
|
+
if (value === null || typeof value === "string" || typeof value === "boolean") {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
if (typeof value === "number") {
|
|
116
|
+
return Number.isFinite(value);
|
|
117
|
+
}
|
|
118
|
+
if (Array.isArray(value)) {
|
|
119
|
+
return value.every(isZeroJsonDefaultValue);
|
|
120
|
+
}
|
|
121
|
+
if (value && typeof value === "object") {
|
|
122
|
+
return Object.values(value).every(isZeroJsonDefaultValue);
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
126
|
+
export const zeroTableColumnSchema = z
|
|
127
|
+
.object({
|
|
128
|
+
name: zeroNameSchema.refine((name) => !ZERO_MANAGED_TABLE_COLUMNS.some((managed) => managed === name), { message: "Zero manages id, createdAt, and updatedAt." }),
|
|
129
|
+
type: z.enum(["string", "boolean", "number", "json"]),
|
|
130
|
+
nullable: z.boolean().default(false),
|
|
131
|
+
default: z.unknown().optional(),
|
|
132
|
+
})
|
|
133
|
+
.strict()
|
|
134
|
+
.superRefine(zeroDefaultMatchesColumnType);
|
|
135
|
+
export const zeroTableSchema = z
|
|
136
|
+
.object({
|
|
137
|
+
name: zeroNameSchema,
|
|
138
|
+
columns: z.array(zeroTableColumnSchema).default([]),
|
|
139
|
+
})
|
|
140
|
+
.strict();
|
|
141
|
+
export const zeroDatabaseSchema = z.record(z.string(), zeroTableSchema);
|
|
142
|
+
const zeroSha256Schema = z.string().regex(/^sha256:[a-f0-9]{64}$/);
|
|
143
|
+
const zeroBase64Schema = z
|
|
144
|
+
.string()
|
|
145
|
+
.regex(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/);
|
|
146
|
+
export const zeroRuntimeBundleSchema = z
|
|
147
|
+
.object({
|
|
148
|
+
path: z
|
|
149
|
+
.string()
|
|
150
|
+
.min(1)
|
|
151
|
+
.startsWith(`${ZERO_RUNTIME_BUNDLE_ROOT}/`)
|
|
152
|
+
.refine((bundlePath) => !bundlePath.split("/").includes(".."), {
|
|
153
|
+
message: "Zero bundle paths cannot traverse outside the runtime bundle root.",
|
|
154
|
+
}),
|
|
155
|
+
sha256: zeroSha256Schema,
|
|
156
|
+
size: z.number().int().nonnegative().max(ZERO_RUNTIME_BUNDLE_MAX_BYTES),
|
|
157
|
+
contentBase64: zeroBase64Schema,
|
|
158
|
+
})
|
|
159
|
+
.strict();
|
|
160
|
+
const zeroPublicStaticPathSchema = z
|
|
161
|
+
.string()
|
|
162
|
+
.min(1)
|
|
163
|
+
.max(2048)
|
|
164
|
+
.refine((path) => !path.startsWith("/") && !path.split("/").includes(".."), {
|
|
165
|
+
message: "Zero static file paths must be relative and cannot traverse.",
|
|
166
|
+
})
|
|
167
|
+
.refine((path) => !path.startsWith(ZERO_RUNTIME_STORAGE_ROOT + "/"), {
|
|
168
|
+
message: `Zero static files cannot use ${ZERO_RUNTIME_STORAGE_ROOT}.`,
|
|
169
|
+
})
|
|
170
|
+
.refine((path) => !path.startsWith("_") && !path.startsWith("."), {
|
|
171
|
+
message: "Zero static file paths cannot use private root prefixes.",
|
|
172
|
+
});
|
|
173
|
+
export const zeroRuntimeStaticFileSchema = z
|
|
174
|
+
.object({
|
|
175
|
+
path: zeroPublicStaticPathSchema,
|
|
176
|
+
contentType: z.string().min(1).max(255),
|
|
177
|
+
sha256: zeroSha256Schema,
|
|
178
|
+
size: z.number().int().nonnegative().max(ZERO_RUNTIME_BUNDLE_MAX_BYTES),
|
|
179
|
+
contentBase64: zeroBase64Schema,
|
|
180
|
+
})
|
|
181
|
+
.strict();
|
|
182
|
+
export const zeroRuntimeRunSourceSchema = z
|
|
183
|
+
.object({
|
|
184
|
+
runId: z.string().min(1).max(256),
|
|
185
|
+
source: z
|
|
186
|
+
.string()
|
|
187
|
+
.min(1)
|
|
188
|
+
.max(2 * 1024 * 1024),
|
|
189
|
+
schemaHash: z.string().min(1).max(256).optional(),
|
|
190
|
+
capabilities: z
|
|
191
|
+
.object({
|
|
192
|
+
db: z.boolean().default(false),
|
|
193
|
+
fetch: z.boolean().default(false),
|
|
194
|
+
auth: z.boolean().default(false),
|
|
195
|
+
env: z.boolean().default(false),
|
|
196
|
+
realtime: z.boolean().default(false),
|
|
197
|
+
logging: z.boolean().default(false),
|
|
198
|
+
})
|
|
199
|
+
.partial()
|
|
200
|
+
.default({}),
|
|
201
|
+
db: z.record(z.string(), z.unknown()).optional(),
|
|
202
|
+
})
|
|
203
|
+
.strict();
|
|
204
|
+
export const zeroMigrationOperationSchema = z.discriminatedUnion("op", [
|
|
205
|
+
z
|
|
206
|
+
.object({
|
|
207
|
+
op: z.literal("create_table"),
|
|
208
|
+
table: zeroNameSchema,
|
|
209
|
+
})
|
|
210
|
+
.strict(),
|
|
211
|
+
z
|
|
212
|
+
.object({
|
|
213
|
+
op: z.literal("add_column"),
|
|
214
|
+
table: zeroNameSchema,
|
|
215
|
+
column: zeroTableColumnSchema,
|
|
216
|
+
})
|
|
217
|
+
.strict(),
|
|
218
|
+
z
|
|
219
|
+
.object({
|
|
220
|
+
op: z.literal("add_index"),
|
|
221
|
+
table: zeroNameSchema,
|
|
222
|
+
columns: z.array(zeroNameSchema).min(1),
|
|
223
|
+
unique: z.boolean().default(false),
|
|
224
|
+
})
|
|
225
|
+
.strict(),
|
|
226
|
+
z
|
|
227
|
+
.object({
|
|
228
|
+
op: z.literal("drop_table"),
|
|
229
|
+
table: zeroNameSchema,
|
|
230
|
+
explicit: z.literal("drop"),
|
|
231
|
+
})
|
|
232
|
+
.strict(),
|
|
233
|
+
z
|
|
234
|
+
.object({
|
|
235
|
+
op: z.literal("drop_column"),
|
|
236
|
+
table: zeroNameSchema,
|
|
237
|
+
column: zeroNameSchema,
|
|
238
|
+
explicit: z.literal("drop"),
|
|
239
|
+
})
|
|
240
|
+
.strict(),
|
|
241
|
+
z
|
|
242
|
+
.object({
|
|
243
|
+
op: z.literal("rename_table"),
|
|
244
|
+
from: zeroNameSchema,
|
|
245
|
+
to: zeroNameSchema,
|
|
246
|
+
explicit: z.literal("rename"),
|
|
247
|
+
})
|
|
248
|
+
.strict(),
|
|
249
|
+
z
|
|
250
|
+
.object({
|
|
251
|
+
op: z.literal("rename_column"),
|
|
252
|
+
table: zeroNameSchema,
|
|
253
|
+
from: zeroNameSchema,
|
|
254
|
+
to: zeroNameSchema,
|
|
255
|
+
explicit: z.literal("rename"),
|
|
256
|
+
})
|
|
257
|
+
.strict(),
|
|
258
|
+
]);
|
|
259
|
+
export const zeroMigrationPlanSchema = z
|
|
260
|
+
.object({
|
|
261
|
+
format: z.literal("stattic.zero.migrations.v1"),
|
|
262
|
+
mode: z.enum(["safe", "drop", "rename"]).default("safe"),
|
|
263
|
+
schemaHash: zeroSha256Schema,
|
|
264
|
+
operations: z.array(zeroMigrationOperationSchema),
|
|
265
|
+
})
|
|
266
|
+
.strict();
|
|
267
|
+
const zeroRealtimeCanonicalModeSchema = z.enum(["stattic-central", "spacefast-cast", "local-dev"]);
|
|
268
|
+
const zeroRuntimePublicRealtimeCanonicalModeSchema = z.enum([
|
|
269
|
+
"stattic-central",
|
|
270
|
+
"spacefast-cast",
|
|
271
|
+
"local-dev",
|
|
272
|
+
"local-websocket",
|
|
273
|
+
]);
|
|
274
|
+
export const zeroRealtimeModeSchema = zeroRealtimeCanonicalModeSchema;
|
|
275
|
+
export const zeroRuntimePublicRealtimeModeSchema = zeroRuntimePublicRealtimeCanonicalModeSchema;
|
|
276
|
+
export const zeroInspectPolicySchema = z.enum(["private", "public"]);
|
|
277
|
+
const zeroRuntimePublicPathSchema = z.string().min(1).startsWith("/");
|
|
278
|
+
const zeroHttpUrlSchema = z
|
|
279
|
+
.string()
|
|
280
|
+
.url()
|
|
281
|
+
.refine((value) => {
|
|
282
|
+
const { protocol } = new URL(value);
|
|
283
|
+
return protocol === "http:" || protocol === "https:";
|
|
284
|
+
}, { message: "URL must use http or https." });
|
|
285
|
+
const zeroRealtimeUrlSchema = z
|
|
286
|
+
.string()
|
|
287
|
+
.url()
|
|
288
|
+
.refine((value) => {
|
|
289
|
+
const { protocol } = new URL(value);
|
|
290
|
+
return (protocol === "http:" || protocol === "https:" || protocol === "ws:" || protocol === "wss:");
|
|
291
|
+
}, { message: "Realtime URL must use http, https, ws, or wss." });
|
|
292
|
+
export const zeroRuntimePublicAuthConfigSchema = z
|
|
293
|
+
.object({
|
|
294
|
+
provider: z.literal("wpcom").default("wpcom"),
|
|
295
|
+
signInPath: zeroRuntimePublicPathSchema.nullable().default(null),
|
|
296
|
+
signInUrl: zeroHttpUrlSchema.nullable().default(null),
|
|
297
|
+
signOutPath: zeroRuntimePublicPathSchema.nullable().default(null),
|
|
298
|
+
signOutUrl: zeroHttpUrlSchema.nullable().default(null),
|
|
299
|
+
returnToParam: z.string().min(1).max(64).default("returnTo"),
|
|
300
|
+
})
|
|
301
|
+
.strict();
|
|
302
|
+
export const zeroRuntimePublicRealtimeConfigSchema = z
|
|
303
|
+
.object({
|
|
304
|
+
mode: zeroRuntimePublicRealtimeModeSchema,
|
|
305
|
+
centralUrl: zeroRealtimeUrlSchema.nullable().default(null),
|
|
306
|
+
path: zeroRuntimePublicPathSchema.optional(),
|
|
307
|
+
replayPath: zeroRuntimePublicPathSchema.nullable().optional(),
|
|
308
|
+
replayUrl: zeroHttpUrlSchema.nullable().optional(),
|
|
309
|
+
runPath: zeroRuntimePublicPathSchema.nullable().optional(),
|
|
310
|
+
runUrl: zeroHttpUrlSchema.nullable().optional(),
|
|
311
|
+
resourceKey: z.string().min(1).max(256).nullable().optional(),
|
|
312
|
+
socketPath: zeroRuntimePublicPathSchema.nullable().optional(),
|
|
313
|
+
spaceId: z.string().min(1).nullable().optional(),
|
|
314
|
+
versionId: z.string().min(1).nullable().optional(),
|
|
315
|
+
})
|
|
316
|
+
.strict();
|
|
317
|
+
export const zeroRuntimeClientConfigSchema = z
|
|
318
|
+
.object({
|
|
319
|
+
runtimeKind: z.literal(ZERO_RUNTIME_KIND),
|
|
320
|
+
basePath: zeroRuntimePublicPathSchema.optional(),
|
|
321
|
+
auth: zeroRuntimePublicAuthConfigSchema.optional(),
|
|
322
|
+
realtime: zeroRuntimePublicRealtimeConfigSchema.optional(),
|
|
323
|
+
})
|
|
324
|
+
.strict();
|
|
325
|
+
export const zeroRuntimeInstallProfileSchema = z
|
|
326
|
+
.object({
|
|
327
|
+
runtimeKind: z.literal(ZERO_RUNTIME_KIND),
|
|
328
|
+
engine: z.literal("quickjs-rust"),
|
|
329
|
+
storageRoot: z.literal(ZERO_RUNTIME_STORAGE_ROOT),
|
|
330
|
+
artifactPath: z.literal(ZERO_RUNTIME_ARTIFACT_PATH),
|
|
331
|
+
configPath: z.literal(ZERO_RUNTIME_CONFIG_PATH),
|
|
332
|
+
binary: z
|
|
333
|
+
.object({
|
|
334
|
+
path: z.literal(ZERO_RUNTIME_BINARY_PATH),
|
|
335
|
+
compatibilityTarget: z
|
|
336
|
+
.object({
|
|
337
|
+
profile: z.literal(ZERO_RUNTIME_BINARY_COMPATIBILITY_TARGET),
|
|
338
|
+
os: z.literal("linux"),
|
|
339
|
+
cpu: z.literal("x86_64"),
|
|
340
|
+
libc: z.literal("glibc"),
|
|
341
|
+
linking: z.literal("dynamic"),
|
|
342
|
+
requireExecutableBit: z.literal(true),
|
|
343
|
+
})
|
|
344
|
+
.strict(),
|
|
345
|
+
sha256: z
|
|
346
|
+
.string()
|
|
347
|
+
.regex(/^sha256:[a-f0-9]{64}$/)
|
|
348
|
+
.nullable()
|
|
349
|
+
.default(null),
|
|
350
|
+
required: z.literal(true),
|
|
351
|
+
})
|
|
352
|
+
.strict(),
|
|
353
|
+
mysql: z
|
|
354
|
+
.object({
|
|
355
|
+
migrateAtFinalize: z.literal(true),
|
|
356
|
+
blockIncompatibleRollback: z.literal(true),
|
|
357
|
+
})
|
|
358
|
+
.strict(),
|
|
359
|
+
realtime: z
|
|
360
|
+
.object({
|
|
361
|
+
production: z.literal("stattic-central"),
|
|
362
|
+
local: z.literal("foreground-cli-ws"),
|
|
363
|
+
})
|
|
364
|
+
.strict(),
|
|
365
|
+
})
|
|
366
|
+
.strict();
|
|
367
|
+
export const zeroRealtimeEventSchema = z
|
|
368
|
+
.object({
|
|
369
|
+
eventId: z.string().min(1),
|
|
370
|
+
spaceId: z.string().min(1),
|
|
371
|
+
versionId: z.string().min(1).nullable(),
|
|
372
|
+
runtimeKind: z.literal(ZERO_RUNTIME_KIND),
|
|
373
|
+
requestId: z.string().min(1),
|
|
374
|
+
mutationName: zeroNameSchema,
|
|
375
|
+
changedTables: z.array(zeroNameSchema).default([]),
|
|
376
|
+
changedQueries: z.array(zeroNameSchema).default([]),
|
|
377
|
+
schemaHash: zeroSha256Schema,
|
|
378
|
+
committedAt: z.string().datetime(),
|
|
379
|
+
})
|
|
380
|
+
.strict();
|
|
381
|
+
export const zeroSourceFileSchema = z
|
|
382
|
+
.object({
|
|
383
|
+
path: z.string().min(1),
|
|
384
|
+
size: z.number().int().nonnegative(),
|
|
385
|
+
sha256: z.string().regex(/^[a-f0-9]{64}$/),
|
|
386
|
+
})
|
|
387
|
+
.strict();
|
|
388
|
+
export const zeroSourceManifestSchema = z
|
|
389
|
+
.object({
|
|
390
|
+
entries: z
|
|
391
|
+
.object({
|
|
392
|
+
client: z.literal(ZERO_CLIENT_ENTRY),
|
|
393
|
+
server: z.literal(ZERO_SERVER_ENTRY),
|
|
394
|
+
})
|
|
395
|
+
.strict(),
|
|
396
|
+
sourceRoot: z.string().min(1),
|
|
397
|
+
files: z.array(zeroSourceFileSchema).default([]),
|
|
398
|
+
env: z
|
|
399
|
+
.object({
|
|
400
|
+
file: z.literal(ZERO_SOURCE_ENV_FILE),
|
|
401
|
+
names: z.array(zeroEnvNameSchema).max(ZERO_ENV_MAX_KEYS).default([]),
|
|
402
|
+
})
|
|
403
|
+
.nullable()
|
|
404
|
+
.default(null),
|
|
405
|
+
sourceConfig: z
|
|
406
|
+
.object({
|
|
407
|
+
configFile: z
|
|
408
|
+
.object({
|
|
409
|
+
path: z.literal(ZERO_CONFIG_FILE),
|
|
410
|
+
appName: z.string().nullable().default(null),
|
|
411
|
+
deployId: z.string().nullable().default(null),
|
|
412
|
+
name: z.string().nullable().default(null),
|
|
413
|
+
title: z.string().nullable().default(null),
|
|
414
|
+
})
|
|
415
|
+
.nullable()
|
|
416
|
+
.default(null),
|
|
417
|
+
deployFile: z
|
|
418
|
+
.object({
|
|
419
|
+
path: z.literal(ZERO_DEPLOY_FILE),
|
|
420
|
+
keys: z.array(z.string()).default([]),
|
|
421
|
+
})
|
|
422
|
+
.nullable()
|
|
423
|
+
.default(null),
|
|
424
|
+
})
|
|
425
|
+
.default({ configFile: null, deployFile: null }),
|
|
426
|
+
})
|
|
427
|
+
.strict();
|
|
428
|
+
export const zeroCapsuleArtifactSchema = z
|
|
429
|
+
.object({
|
|
430
|
+
format: z.literal("stattic.zero.capsule.v1"),
|
|
431
|
+
appName: z.string().min(1).max(128),
|
|
432
|
+
serverRuntime: z.literal("quickjs-rust"),
|
|
433
|
+
client: z
|
|
434
|
+
.object({
|
|
435
|
+
bundlePath: z.string().min(1),
|
|
436
|
+
basePathAware: z.boolean().default(true),
|
|
437
|
+
})
|
|
438
|
+
.strict(),
|
|
439
|
+
server: z
|
|
440
|
+
.object({
|
|
441
|
+
bundlePath: z.string().min(1),
|
|
442
|
+
schema: zeroDatabaseSchema.default({}),
|
|
443
|
+
queries: z.array(zeroNameSchema).default([]),
|
|
444
|
+
mutations: z.array(zeroNameSchema).default([]),
|
|
445
|
+
endpoints: z.array(zeroEndpointSchema).default([]),
|
|
446
|
+
sockets: z.array(zeroNameSchema).default([]),
|
|
447
|
+
})
|
|
448
|
+
.strict(),
|
|
449
|
+
db: z
|
|
450
|
+
.object({
|
|
451
|
+
backend: z.literal("wpcloud-mysql"),
|
|
452
|
+
migrations: z.array(zeroMigrationOperationSchema).default([]),
|
|
453
|
+
})
|
|
454
|
+
.strict(),
|
|
455
|
+
realtime: z
|
|
456
|
+
.object({
|
|
457
|
+
mode: zeroRealtimeModeSchema,
|
|
458
|
+
mutationEvents: z.boolean().default(true),
|
|
459
|
+
})
|
|
460
|
+
.strict(),
|
|
461
|
+
limits: z.record(z.string(), z.unknown()).default({}),
|
|
462
|
+
futureCapabilities: z.array(z.enum(["blob", "ai", "generalized-js"])).default([]),
|
|
463
|
+
sourceManifest: zeroSourceManifestSchema,
|
|
464
|
+
})
|
|
465
|
+
.strict();
|
|
466
|
+
export const zeroRuntimeFinalizePayloadSchema = z
|
|
467
|
+
.object({
|
|
468
|
+
runtimeKind: z.literal(ZERO_RUNTIME_KIND),
|
|
469
|
+
install: zeroRuntimeInstallProfileSchema,
|
|
470
|
+
artifact: zeroCapsuleArtifactSchema,
|
|
471
|
+
bundles: z.array(zeroRuntimeBundleSchema).max(8).default([]),
|
|
472
|
+
staticFiles: z.array(zeroRuntimeStaticFileSchema).max(16).default([]),
|
|
473
|
+
runSources: z.array(zeroRuntimeRunSourceSchema).max(128).default([]),
|
|
474
|
+
migrations: zeroMigrationPlanSchema.nullable().default(null),
|
|
475
|
+
variables: z
|
|
476
|
+
.object({
|
|
477
|
+
source: z.literal("stattic-variables"),
|
|
478
|
+
names: z.array(z.string().min(1)).default([]),
|
|
479
|
+
})
|
|
480
|
+
.strict(),
|
|
481
|
+
realtime: z
|
|
482
|
+
.object({
|
|
483
|
+
mode: zeroRealtimeModeSchema,
|
|
484
|
+
centralUrl: zeroRealtimeUrlSchema.nullable().default(null),
|
|
485
|
+
replayUrl: zeroHttpUrlSchema.nullable().default(null),
|
|
486
|
+
castResourceKey: z.string().min(1).max(256).nullable().optional(),
|
|
487
|
+
eventCallback: z
|
|
488
|
+
.object({
|
|
489
|
+
url: zeroHttpUrlSchema,
|
|
490
|
+
token: z.string().min(1),
|
|
491
|
+
})
|
|
492
|
+
.strict()
|
|
493
|
+
.optional(),
|
|
494
|
+
})
|
|
495
|
+
.strict(),
|
|
496
|
+
auth: z
|
|
497
|
+
.object({
|
|
498
|
+
provider: z.literal("wpcom").default("wpcom"),
|
|
499
|
+
signInPath: z.literal(ZERO_RUNTIME_ROUTE_PATHS.authStart).nullable().default(null),
|
|
500
|
+
signInUrl: zeroHttpUrlSchema.nullable().default(null),
|
|
501
|
+
signOutPath: z.literal(ZERO_RUNTIME_ROUTE_PATHS.authSignOut).nullable().default(null),
|
|
502
|
+
signOutUrl: zeroHttpUrlSchema.nullable().default(null),
|
|
503
|
+
returnToParam: z.string().min(1).max(64).default("returnTo"),
|
|
504
|
+
})
|
|
505
|
+
.strict()
|
|
506
|
+
.default({
|
|
507
|
+
provider: "wpcom",
|
|
508
|
+
signInPath: null,
|
|
509
|
+
signInUrl: null,
|
|
510
|
+
signOutPath: null,
|
|
511
|
+
signOutUrl: null,
|
|
512
|
+
returnToParam: "returnTo",
|
|
513
|
+
}),
|
|
514
|
+
inspect: z
|
|
515
|
+
.object({
|
|
516
|
+
policy: zeroInspectPolicySchema.default("private"),
|
|
517
|
+
})
|
|
518
|
+
.strict()
|
|
519
|
+
.default({ policy: "private" }),
|
|
520
|
+
})
|
|
521
|
+
.strict();
|
|
522
|
+
export const zeroDeployMetadataSchema = z
|
|
523
|
+
.object({
|
|
524
|
+
artifactId: z.string().min(1).optional(),
|
|
525
|
+
finalize: zeroRuntimeFinalizePayloadSchema,
|
|
526
|
+
})
|
|
527
|
+
.strict();
|
|
528
|
+
export const zeroInspectResponseSchema = z
|
|
529
|
+
.object({
|
|
530
|
+
versionId: z.string().min(1).nullable(),
|
|
531
|
+
artifactId: z.string().min(1).nullable(),
|
|
532
|
+
data: z
|
|
533
|
+
.object({
|
|
534
|
+
runtimeKind: z.literal(ZERO_RUNTIME_KIND),
|
|
535
|
+
appName: z.string().min(1),
|
|
536
|
+
serverRuntime: z.literal("quickjs-rust"),
|
|
537
|
+
inspect: z
|
|
538
|
+
.object({
|
|
539
|
+
policy: zeroInspectPolicySchema,
|
|
540
|
+
})
|
|
541
|
+
.strict(),
|
|
542
|
+
install: zeroRuntimeInstallProfileSchema,
|
|
543
|
+
tables: z.array(z.string()).default([]),
|
|
544
|
+
queries: z.array(z.string()).default([]),
|
|
545
|
+
mutations: z.array(z.string()).default([]),
|
|
546
|
+
endpoints: z.array(zeroEndpointSchema).default([]),
|
|
547
|
+
sockets: z.array(z.string()).default([]),
|
|
548
|
+
variables: z
|
|
549
|
+
.object({
|
|
550
|
+
source: z.literal("stattic-variables"),
|
|
551
|
+
names: z.array(z.string()).default([]),
|
|
552
|
+
})
|
|
553
|
+
.strict(),
|
|
554
|
+
realtime: zeroRuntimePublicRealtimeConfigSchema,
|
|
555
|
+
})
|
|
556
|
+
.nullable(),
|
|
557
|
+
})
|
|
558
|
+
.strict();
|
|
559
|
+
export const zeroInspectPublicResponseSchema = dataEnvelope(zeroInspectResponseSchema);
|
|
560
|
+
export const zeroDbInspectResponseSchema = z
|
|
561
|
+
.object({
|
|
562
|
+
versionId: z.string().min(1).nullable(),
|
|
563
|
+
artifactId: z.string().min(1).nullable(),
|
|
564
|
+
backend: z.literal("wpcloud-mysql").nullable(),
|
|
565
|
+
migrationMode: z.enum(["safe", "drop", "rename"]).nullable(),
|
|
566
|
+
schemaHash: zeroSha256Schema.nullable(),
|
|
567
|
+
tables: z.array(zeroTableSchema).default([]),
|
|
568
|
+
migrations: z.array(zeroMigrationOperationSchema).default([]),
|
|
569
|
+
})
|
|
570
|
+
.strict();
|
|
571
|
+
export const zeroDbInspectPublicResponseSchema = dataEnvelope(zeroDbInspectResponseSchema);
|
|
572
|
+
export const zeroDbDumpQuerySchema = z
|
|
573
|
+
.object({
|
|
574
|
+
table: zeroNameSchema.optional(),
|
|
575
|
+
limit: z.coerce.number().int().min(1).max(100).default(25),
|
|
576
|
+
})
|
|
577
|
+
.strict();
|
|
578
|
+
export const zeroDbDumpTableSchema = z
|
|
579
|
+
.object({
|
|
580
|
+
name: zeroNameSchema,
|
|
581
|
+
rows: z.array(z.record(z.string(), z.unknown())).default([]),
|
|
582
|
+
})
|
|
583
|
+
.strict();
|
|
584
|
+
export const zeroDbDumpResponseSchema = z
|
|
585
|
+
.object({
|
|
586
|
+
versionId: z.string().min(1).nullable(),
|
|
587
|
+
artifactId: z.string().min(1).nullable(),
|
|
588
|
+
schemaHash: zeroSha256Schema.nullable(),
|
|
589
|
+
tables: z.array(zeroDbDumpTableSchema).default([]),
|
|
590
|
+
})
|
|
591
|
+
.strict();
|
|
592
|
+
export const zeroDbDumpPublicResponseSchema = dataEnvelope(zeroDbDumpResponseSchema);
|
|
593
|
+
export const zeroLogListQuerySchema = z
|
|
594
|
+
.object({
|
|
595
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
596
|
+
cursor: z.string().min(1).optional(),
|
|
597
|
+
requestId: z.string().min(1).optional(),
|
|
598
|
+
mutationName: z.string().min(1).optional(),
|
|
599
|
+
})
|
|
600
|
+
.strict();
|
|
601
|
+
export const zeroLogEntrySchema = z
|
|
602
|
+
.object({
|
|
603
|
+
id: z.string().min(1),
|
|
604
|
+
timestamp: z.string().datetime(),
|
|
605
|
+
level: z.enum(["debug", "info", "warn", "error"]),
|
|
606
|
+
requestId: z.string().min(1).nullable(),
|
|
607
|
+
versionId: z.string().min(1).nullable(),
|
|
608
|
+
mutationName: z.string().min(1).nullable(),
|
|
609
|
+
message: z.string(),
|
|
610
|
+
metadata: z.record(z.string(), z.unknown()).default({}),
|
|
611
|
+
})
|
|
612
|
+
.strict();
|
|
613
|
+
export const zeroLogListResponseSchema = z
|
|
614
|
+
.object({
|
|
615
|
+
data: z.array(zeroLogEntrySchema),
|
|
616
|
+
pagination: z
|
|
617
|
+
.object({
|
|
618
|
+
nextCursor: z.string().nullable(),
|
|
619
|
+
})
|
|
620
|
+
.strict(),
|
|
621
|
+
})
|
|
622
|
+
.strict();
|
|
623
|
+
export const zeroRealtimeEventIntakeResponseSchema = z
|
|
624
|
+
.object({
|
|
625
|
+
accepted: z.literal(true),
|
|
626
|
+
eventId: z.string().min(1),
|
|
627
|
+
delivered: z.number().int().nonnegative().default(0),
|
|
628
|
+
duplicate: z.boolean().default(false),
|
|
629
|
+
})
|
|
630
|
+
.strict();
|
|
631
|
+
export const zeroRealtimeEventListQuerySchema = z
|
|
632
|
+
.object({
|
|
633
|
+
afterEventId: z.string().min(1).optional(),
|
|
634
|
+
limit: z.coerce.number().int().min(1).max(100).default(50),
|
|
635
|
+
})
|
|
636
|
+
.strict();
|
|
637
|
+
export const zeroRealtimeEventListResponseSchema = z
|
|
638
|
+
.object({
|
|
639
|
+
data: z.array(zeroRealtimeEventSchema),
|
|
640
|
+
pagination: z
|
|
641
|
+
.object({
|
|
642
|
+
nextCursor: z.string().min(1).nullable(),
|
|
643
|
+
})
|
|
644
|
+
.strict(),
|
|
645
|
+
})
|
|
646
|
+
.strict();
|
|
647
|
+
export const zeroLocalDevPlanSchema = z
|
|
648
|
+
.object({
|
|
649
|
+
runtimeKind: z.literal(ZERO_RUNTIME_KIND),
|
|
650
|
+
root: z.string().min(1),
|
|
651
|
+
httpUrl: z.string().url(),
|
|
652
|
+
realtimeUrl: z.string().url(),
|
|
653
|
+
realtimePath: z.literal(ZERO_RUNTIME_ROUTE_PATHS.realtime),
|
|
654
|
+
stateBackend: z.enum(["memory", "sqlite", "mysql"]),
|
|
655
|
+
})
|
|
656
|
+
.strict();
|
|
657
|
+
export function isDestructiveZeroMigrationOperation(operation) {
|
|
658
|
+
return (operation.op === "drop_table" ||
|
|
659
|
+
operation.op === "drop_column" ||
|
|
660
|
+
operation.op === "rename_table" ||
|
|
661
|
+
operation.op === "rename_column");
|
|
662
|
+
}
|
|
663
|
+
export function createZeroCapsuleArtifact(input) {
|
|
664
|
+
return zeroCapsuleArtifactSchema.parse({
|
|
665
|
+
format: "stattic.zero.capsule.v1",
|
|
666
|
+
appName: input.appName,
|
|
667
|
+
serverRuntime: "quickjs-rust",
|
|
668
|
+
client: {
|
|
669
|
+
bundlePath: input.clientBundlePath ?? ZERO_RUNTIME_CLIENT_BUNDLE_PATH,
|
|
670
|
+
basePathAware: true,
|
|
671
|
+
},
|
|
672
|
+
server: {
|
|
673
|
+
bundlePath: input.serverBundlePath ?? ZERO_RUNTIME_SERVER_BUNDLE_PATH,
|
|
674
|
+
schema: input.schema ?? {},
|
|
675
|
+
queries: input.queries ?? [],
|
|
676
|
+
mutations: input.mutations ?? [],
|
|
677
|
+
endpoints: input.endpoints ?? [],
|
|
678
|
+
sockets: input.sockets ?? [],
|
|
679
|
+
},
|
|
680
|
+
db: {
|
|
681
|
+
backend: "wpcloud-mysql",
|
|
682
|
+
migrations: [],
|
|
683
|
+
},
|
|
684
|
+
realtime: {
|
|
685
|
+
mode: input.realtimeMode ?? "stattic-central",
|
|
686
|
+
mutationEvents: true,
|
|
687
|
+
},
|
|
688
|
+
limits: {},
|
|
689
|
+
futureCapabilities: ["blob", "ai"],
|
|
690
|
+
sourceManifest: input.sourceManifest ?? {
|
|
691
|
+
entries: {
|
|
692
|
+
client: ZERO_CLIENT_ENTRY,
|
|
693
|
+
server: ZERO_SERVER_ENTRY,
|
|
694
|
+
},
|
|
695
|
+
sourceRoot: ".",
|
|
696
|
+
files: [],
|
|
697
|
+
},
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
export function createZeroRuntimeInstallProfile(input) {
|
|
701
|
+
return zeroRuntimeInstallProfileSchema.parse({
|
|
702
|
+
runtimeKind: ZERO_RUNTIME_KIND,
|
|
703
|
+
engine: "quickjs-rust",
|
|
704
|
+
storageRoot: ZERO_RUNTIME_STORAGE_ROOT,
|
|
705
|
+
artifactPath: ZERO_RUNTIME_ARTIFACT_PATH,
|
|
706
|
+
configPath: ZERO_RUNTIME_CONFIG_PATH,
|
|
707
|
+
binary: {
|
|
708
|
+
path: ZERO_RUNTIME_BINARY_PATH,
|
|
709
|
+
compatibilityTarget: {
|
|
710
|
+
profile: ZERO_RUNTIME_BINARY_COMPATIBILITY_TARGET,
|
|
711
|
+
os: "linux",
|
|
712
|
+
cpu: "x86_64",
|
|
713
|
+
libc: "glibc",
|
|
714
|
+
linking: "dynamic",
|
|
715
|
+
requireExecutableBit: true,
|
|
716
|
+
},
|
|
717
|
+
sha256: input?.runnerSha256 ?? null,
|
|
718
|
+
required: true,
|
|
719
|
+
},
|
|
720
|
+
mysql: {
|
|
721
|
+
migrateAtFinalize: true,
|
|
722
|
+
blockIncompatibleRollback: true,
|
|
723
|
+
},
|
|
724
|
+
realtime: {
|
|
725
|
+
production: "stattic-central",
|
|
726
|
+
local: "foreground-cli-ws",
|
|
727
|
+
},
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
export function createZeroRuntimeFinalizePayload(input) {
|
|
731
|
+
const artifact = zeroCapsuleArtifactSchema.parse(input.artifact);
|
|
732
|
+
return zeroRuntimeFinalizePayloadSchema.parse({
|
|
733
|
+
runtimeKind: ZERO_RUNTIME_KIND,
|
|
734
|
+
install: createZeroRuntimeInstallProfile({ runnerSha256: input.runnerSha256 ?? null }),
|
|
735
|
+
artifact,
|
|
736
|
+
bundles: input.bundles ?? [],
|
|
737
|
+
staticFiles: input.staticFiles ?? [],
|
|
738
|
+
runSources: input.runSources ?? [],
|
|
739
|
+
migrations: input.migrations ?? null,
|
|
740
|
+
variables: {
|
|
741
|
+
source: "stattic-variables",
|
|
742
|
+
names: artifact.sourceManifest.env?.names ?? [],
|
|
743
|
+
},
|
|
744
|
+
realtime: {
|
|
745
|
+
mode: artifact.realtime.mode,
|
|
746
|
+
centralUrl: input.centralRealtimeUrl ?? null,
|
|
747
|
+
replayUrl: input.realtimeReplayUrl ?? null,
|
|
748
|
+
...(input.realtimeEventCallback ? { eventCallback: input.realtimeEventCallback } : {}),
|
|
749
|
+
},
|
|
750
|
+
auth: input.auth ?? {},
|
|
751
|
+
inspect: {
|
|
752
|
+
policy: input.inspectPolicy ?? "private",
|
|
753
|
+
},
|
|
754
|
+
});
|
|
755
|
+
}
|