@aotter/mantle 0.2.0-alpha.5 → 0.2.0-alpha.6
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 -2
- package/dist/admin/createAdminSurface.d.ts +3 -0
- package/dist/admin/createAdminSurface.d.ts.map +1 -1
- package/dist/admin/createAdminSurface.js +51 -8
- package/dist/admin/createAdminSurface.js.map +1 -1
- package/dist/admin/extensions.d.ts +290 -0
- package/dist/admin/extensions.d.ts.map +1 -0
- package/dist/admin/extensions.js +532 -0
- package/dist/admin/extensions.js.map +1 -0
- package/dist/admin/index.d.ts +1 -0
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/buildAuth.d.ts +3 -1
- package/dist/auth/buildAuth.d.ts.map +1 -1
- package/dist/auth/buildAuth.js +3 -2
- package/dist/auth/buildAuth.js.map +1 -1
- package/dist/auth/callerResolver.d.ts +4 -0
- package/dist/auth/callerResolver.d.ts.map +1 -1
- package/dist/auth/callerResolver.js +4 -1
- package/dist/auth/callerResolver.js.map +1 -1
- package/dist/auth/createMantleAuth.d.ts.map +1 -1
- package/dist/auth/createMantleAuth.js +3 -2
- package/dist/auth/createMantleAuth.js.map +1 -1
- package/dist/auth/db.d.ts +1 -0
- package/dist/auth/db.d.ts.map +1 -1
- package/dist/auth/db.js +6 -3
- package/dist/auth/db.js.map +1 -1
- package/dist/bun/index.d.ts +0 -44
- package/dist/bun/index.d.ts.map +1 -1
- package/dist/bun/index.js +0 -84
- package/dist/bun/index.js.map +1 -1
- package/dist/cli/generate.js +3 -3
- package/dist/cli/generate.js.map +1 -1
- package/dist/cli/preset.d.ts.map +1 -1
- package/dist/cli/preset.js +80 -28
- package/dist/cli/preset.js.map +1 -1
- package/dist/cloudflare/index.d.ts +4 -0
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/index.js +2 -0
- package/dist/cloudflare/index.js.map +1 -1
- package/dist/core/dialect.d.ts +13 -1
- package/dist/core/dialect.d.ts.map +1 -1
- package/dist/core/driver.d.ts +7 -0
- package/dist/core/driver.d.ts.map +1 -1
- package/dist/core/runtime/createRuntime.js +1 -1
- package/dist/core/runtime/createRuntime.js.map +1 -1
- package/dist/core/sessionUser.d.ts +14 -0
- package/dist/core/sessionUser.d.ts.map +1 -0
- package/dist/core/sessionUser.js +4 -0
- package/dist/core/sessionUser.js.map +1 -0
- package/dist/core/sql/allowlist.d.ts +2 -0
- package/dist/core/sql/allowlist.d.ts.map +1 -1
- package/dist/core/sql/allowlist.js +43 -11
- package/dist/core/sql/allowlist.js.map +1 -1
- package/dist/core/sql/ast.js +1 -1
- package/dist/core/sql/ast.js.map +1 -1
- package/dist/core/sql/compile.js +1 -1
- package/dist/core/sql/compile.js.map +1 -1
- package/dist/core/sql/policy.d.ts +2 -0
- package/dist/core/sql/policy.d.ts.map +1 -1
- package/dist/core/sql/policy.js +25 -6
- package/dist/core/sql/policy.js.map +1 -1
- package/dist/core/sql/run.d.ts +0 -8
- package/dist/core/sql/run.d.ts.map +1 -1
- package/dist/core/sql/run.js +152 -35
- package/dist/core/sql/run.js.map +1 -1
- package/dist/d1/executor.d.ts +2 -0
- package/dist/d1/executor.d.ts.map +1 -1
- package/dist/d1/executor.js +6 -1
- package/dist/d1/executor.js.map +1 -1
- package/dist/postgres/adapter.d.ts +5 -2
- package/dist/postgres/adapter.d.ts.map +1 -1
- package/dist/postgres/adapter.js +7 -1
- package/dist/postgres/adapter.js.map +1 -1
- package/dist/postgres/compile/index.d.ts +1 -1
- package/dist/postgres/compile/index.js +1 -1
- package/dist/postgres/driver.d.ts +38 -21
- package/dist/postgres/driver.d.ts.map +1 -1
- package/dist/postgres/driver.js +100 -24
- package/dist/postgres/driver.js.map +1 -1
- package/dist/postgres/executor.d.ts +8 -0
- package/dist/postgres/executor.d.ts.map +1 -1
- package/dist/postgres/executor.js +40 -13
- package/dist/postgres/executor.js.map +1 -1
- package/dist/postgres/index.d.ts +2 -1
- package/dist/postgres/index.d.ts.map +1 -1
- package/dist/postgres/index.js +1 -0
- package/dist/postgres/index.js.map +1 -1
- package/dist/postgres/lower.d.ts.map +1 -1
- package/dist/postgres/lower.js +3 -8
- package/dist/postgres/lower.js.map +1 -1
- package/dist/postgres/print.d.ts.map +1 -1
- package/dist/postgres/print.js +2 -15
- package/dist/postgres/print.js.map +1 -1
- package/dist/postgres/session.d.ts +9 -0
- package/dist/postgres/session.d.ts.map +1 -0
- package/dist/postgres/session.js +111 -0
- package/dist/postgres/session.js.map +1 -0
- package/dist/postgres/storage.d.ts +14 -1
- package/dist/postgres/storage.d.ts.map +1 -1
- package/dist/postgres/storage.js +136 -54
- package/dist/postgres/storage.js.map +1 -1
- package/dist/postgres/validator.d.ts +4 -3
- package/dist/postgres/validator.d.ts.map +1 -1
- package/dist/postgres/validator.js +13 -6
- package/dist/postgres/validator.js.map +1 -1
- package/dist/spec/domain/model/ManifestGrammar.d.ts +4 -0
- package/dist/spec/domain/model/ManifestGrammar.d.ts.map +1 -1
- package/dist/spec/domain/model/ManifestGrammar.js +4 -0
- package/dist/spec/domain/model/ManifestGrammar.js.map +1 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +2 -0
- package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +1 -1
- package/dist/spec/domain/service/SchemaAdminUiChecker.js +50 -6
- package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +1 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +1 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +1 -1
- package/dist/spec/domain/service/ViewAdminUiChecker.js +7 -2
- package/dist/spec/domain/service/ViewAdminUiChecker.js.map +1 -1
- package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +1 -1
- package/dist/spec/infrastructure/sql/compilePlan.js +5 -0
- package/dist/spec/infrastructure/sql/compilePlan.js.map +1 -1
- package/dist/spec/kernel/diagnostic.d.ts +1 -1
- package/dist/spec/kernel/diagnostic.d.ts.map +1 -1
- package/dist/spec/kernel/diagnostic.js +5 -0
- package/dist/spec/kernel/diagnostic.js.map +1 -1
- package/dist/testing/cases/corpus.d.ts +2 -0
- package/dist/testing/cases/corpus.d.ts.map +1 -1
- package/dist/testing/cases/corpus.js +7 -5
- package/dist/testing/cases/corpus.js.map +1 -1
- package/dist/testing/cases/policy.d.ts +14 -1
- package/dist/testing/cases/policy.d.ts.map +1 -1
- package/dist/testing/cases/policy.js +3 -2
- package/dist/testing/cases/policy.js.map +1 -1
- package/dist/testing/cases/printer.d.ts.map +1 -1
- package/dist/testing/cases/printer.js +3 -1
- package/dist/testing/cases/printer.js.map +1 -1
- package/dist/testing/cases/report-view.d.ts.map +1 -1
- package/dist/testing/cases/report-view.js +18 -0
- package/dist/testing/cases/report-view.js.map +1 -1
- package/docs/adr/0037-postgresql-is-the-reference-dialect.md +2 -1
- package/docs/adr/0039-postgresql-is-native.md +130 -0
- package/docs/adr/README.md +2 -0
- package/docs/adr/adr-lite-1376-admin-extensions.md +330 -0
- package/docs/examples/commerce-inventory.md +18 -1
- package/docs/examples/reference-service/package.json +2 -2
- package/docs/handbook/cloudflare/authentication.md +3 -3
- package/docs/handbook/cloudflare/deploy-and-operate.md +4 -1
- package/docs/handbook/concepts/runtime-and-adapters.md +74 -33
- package/docs/handbook/concepts/views.md +1 -1
- package/docs/handbook/guides/admin-extensions.md +191 -0
- package/docs/handbook/guides/admin-ui.md +2 -1
- package/docs/handbook/navigation.json +2 -1
- package/docs/handbook/reference/diagnostics.md +1 -0
- package/docs/handbook/reference/procedure.md +2 -1
- package/docs/handbook/reference/schema.md +6 -3
- package/docs/handbook/reference/surface.md +6 -2
- package/docs/handbook/reference/view.md +7 -5
- package/docs/handbook/releases/index.md +78 -4
- package/docs/handbook/start/project-and-cli.md +20 -12
- package/docs/skills/develop/SKILL.md +8 -2
- package/docs/skills/provision/SKILL.md +4 -1
- package/docs/skills/update/SKILL.md +3 -0
- package/docs/upgrade-0.1-to-0.2.md +1 -1
- package/package.json +6 -5
- package/dist/postgres/textRows.d.ts +0 -10
- package/dist/postgres/textRows.d.ts.map +0 -1
- package/dist/postgres/textRows.js +0 -44
- package/dist/postgres/textRows.js.map +0 -1
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin extensions (ADR-lite 1376): a declaration that is plain data, server handlers that are code, and an optional
|
|
3
|
+
* same-origin module with the renderers. Admin validates every declaration at construction, sends the caller the
|
|
4
|
+
* contributions their role reaches, and checks the session and role again on every extension route.
|
|
5
|
+
*/
|
|
6
|
+
import { DiagnosticError, makeDiagnostic } from "../spec/kernel/index.js";
|
|
7
|
+
import { UI_EXTENSION_REF, isStaffRole, meetsRole } from "../spec/domain/index.js";
|
|
8
|
+
import { json, readJsonObject, wireError } from "../core/wire.js";
|
|
9
|
+
export const ADMIN_EXTENSION_TARGETS = {
|
|
10
|
+
action: ["record/v1", "list.selection/v1", "list.toolbar/v1"],
|
|
11
|
+
panel: ["record.sidebar/v1", "home/v1"],
|
|
12
|
+
field: ["field.input/v1", "field.cell/v1"],
|
|
13
|
+
};
|
|
14
|
+
const P = "admin";
|
|
15
|
+
const ID = /^[a-z][a-z0-9-]{0,62}$/;
|
|
16
|
+
const MODULE = /^\/(?![/\\])[^\s?#]*$/;
|
|
17
|
+
const INTEGRITY = /^sha(256|384|512)-[A-Za-z0-9+/]+={0,2}$/;
|
|
18
|
+
const ROLE_ORDER = ["contributor", "editor", "owner"];
|
|
19
|
+
const invalid = (code, path, message, value) => new DiagnosticError(makeDiagnostic({ code, phase: "boot", severity: "error", path, message, ...(value === undefined ? {} : { value }) }));
|
|
20
|
+
const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
|
|
21
|
+
const isText = (v) => (typeof v === "string" && v.length > 0) || (isObject(v) && Object.keys(v).length > 0 && Object.values(v).every((x) => typeof x === "string" && x.length > 0));
|
|
22
|
+
const keysWithin = (o, allowed) => Object.keys(o).find((k) => !allowed.includes(k));
|
|
23
|
+
// ---------- the form subset (settings schemas and field options) ----------
|
|
24
|
+
const FORM_TYPES = ["string", "number", "integer", "boolean"];
|
|
25
|
+
const FORM_PROPERTY_KEYS = ["type", "title", "description", "default", "enum", "oneOf", "minimum", "maximum", "minLength", "maxLength"];
|
|
26
|
+
/** Why `schema` is outside the form subset Admin renders and checks, or `null`. */
|
|
27
|
+
export function formSchemaProblem(schema) {
|
|
28
|
+
if (!isObject(schema) || schema["type"] !== "object" || !isObject(schema["properties"]))
|
|
29
|
+
return "an object schema with properties";
|
|
30
|
+
const extra = keysWithin(schema, ["type", "properties", "required", "title", "description", "additionalProperties"]);
|
|
31
|
+
if (extra)
|
|
32
|
+
return `no '${extra}' at the top level`;
|
|
33
|
+
if (schema["additionalProperties"] !== undefined && schema["additionalProperties"] !== false)
|
|
34
|
+
return "additionalProperties false or absent";
|
|
35
|
+
const props = schema["properties"];
|
|
36
|
+
const names = Object.keys(props);
|
|
37
|
+
if (names.length === 0 || names.length > 64)
|
|
38
|
+
return "1 to 64 properties";
|
|
39
|
+
if (names.includes("__proto__"))
|
|
40
|
+
return "no property named __proto__";
|
|
41
|
+
const required = schema["required"];
|
|
42
|
+
if (required !== undefined && (!Array.isArray(required) || required.some((r) => typeof r !== "string" || !names.includes(r))))
|
|
43
|
+
return "required naming declared properties";
|
|
44
|
+
for (const [name, p] of Object.entries(props)) {
|
|
45
|
+
if (!isObject(p) || typeof p["type"] !== "string" || !FORM_TYPES.includes(p["type"]))
|
|
46
|
+
return `property '${name}' typed string, number, integer or boolean`;
|
|
47
|
+
const bad = keysWithin(p, FORM_PROPERTY_KEYS);
|
|
48
|
+
if (bad)
|
|
49
|
+
return `property '${name}' without '${bad}'`;
|
|
50
|
+
if (p["title"] !== undefined && !isText(p["title"]))
|
|
51
|
+
return `property '${name}' with a text title`;
|
|
52
|
+
if (p["description"] !== undefined && !isText(p["description"]))
|
|
53
|
+
return `property '${name}' with a text description`;
|
|
54
|
+
if (p["enum"] !== undefined && (!Array.isArray(p["enum"]) || p["enum"].length === 0 || p["enum"].some((x) => !matchesType(p["type"], x))))
|
|
55
|
+
return `property '${name}' with an enum of its type`;
|
|
56
|
+
if (p["oneOf"] !== undefined && (!Array.isArray(p["oneOf"]) || p["oneOf"].length === 0 || p["oneOf"].some((o) => !isObject(o) || keysWithin(o, ["const", "title"]) || !matchesType(p["type"], o["const"]) || (o["title"] !== undefined && !isText(o["title"])))))
|
|
57
|
+
return `property '${name}' with a oneOf of { const, title }`;
|
|
58
|
+
for (const k of ["minimum", "maximum", "minLength", "maxLength"])
|
|
59
|
+
if (p[k] !== undefined && (typeof p[k] !== "number" || !Number.isFinite(p[k])))
|
|
60
|
+
return `property '${name}' with a numeric ${k}`;
|
|
61
|
+
if (p["default"] !== undefined && checkValue(p, p["default"]) !== null)
|
|
62
|
+
return `property '${name}' with a default it accepts`;
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
function matchesType(type, v) {
|
|
67
|
+
if (type === "string")
|
|
68
|
+
return typeof v === "string";
|
|
69
|
+
if (type === "boolean")
|
|
70
|
+
return typeof v === "boolean";
|
|
71
|
+
if (type === "integer")
|
|
72
|
+
return Number.isInteger(v);
|
|
73
|
+
return typeof v === "number" && Number.isFinite(v);
|
|
74
|
+
}
|
|
75
|
+
function checkValue(p, v) {
|
|
76
|
+
const type = p["type"];
|
|
77
|
+
if (!matchesType(type, v))
|
|
78
|
+
return type === "integer" ? "an integer" : `a ${type}`;
|
|
79
|
+
if (Array.isArray(p["enum"]) && !p["enum"].includes(v))
|
|
80
|
+
return "one of the listed values";
|
|
81
|
+
if (Array.isArray(p["oneOf"]) && !p["oneOf"].some((o) => o["const"] === v))
|
|
82
|
+
return "one of the listed values";
|
|
83
|
+
if (typeof v === "number") {
|
|
84
|
+
if (typeof p["minimum"] === "number" && v < p["minimum"])
|
|
85
|
+
return `at least ${p["minimum"]}`;
|
|
86
|
+
if (typeof p["maximum"] === "number" && v > p["maximum"])
|
|
87
|
+
return `at most ${p["maximum"]}`;
|
|
88
|
+
}
|
|
89
|
+
if (typeof v === "string") {
|
|
90
|
+
const length = [...v].length;
|
|
91
|
+
if (typeof p["minLength"] === "number" && length < p["minLength"])
|
|
92
|
+
return `at least ${p["minLength"]} characters`;
|
|
93
|
+
if (typeof p["maxLength"] === "number" && length > p["maxLength"])
|
|
94
|
+
return `at most ${p["maxLength"]} characters`;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/** Checks `value` against a form-subset `schema`: the errors by field, empty when it passes. */
|
|
99
|
+
export function checkFormValue(schema, value) {
|
|
100
|
+
if (!isObject(value))
|
|
101
|
+
return { "": "an object" };
|
|
102
|
+
const props = (schema.properties ?? {});
|
|
103
|
+
// own properties only, and no prototype: `constructor` or `__proto__` is a field name like any other
|
|
104
|
+
const errors = Object.create(null);
|
|
105
|
+
const has = (name) => Object.hasOwn(value, name) && value[name] !== undefined;
|
|
106
|
+
for (const k of Object.keys(value))
|
|
107
|
+
if (!Object.hasOwn(props, k))
|
|
108
|
+
errors[k] = "no such field";
|
|
109
|
+
for (const name of schema.required ?? [])
|
|
110
|
+
if (!has(name))
|
|
111
|
+
errors[name] = "required";
|
|
112
|
+
for (const [name, p] of Object.entries(props)) {
|
|
113
|
+
// null is a value, and none of the form subset's types accepts it
|
|
114
|
+
if (!has(name) || Object.hasOwn(errors, name))
|
|
115
|
+
continue;
|
|
116
|
+
const problem = checkValue(p, value[name]);
|
|
117
|
+
if (problem)
|
|
118
|
+
errors[name] = `expected ${problem}`;
|
|
119
|
+
}
|
|
120
|
+
return errors;
|
|
121
|
+
}
|
|
122
|
+
// ---------- declarations ----------
|
|
123
|
+
function checkWhen(when, path) {
|
|
124
|
+
if (when === undefined)
|
|
125
|
+
return;
|
|
126
|
+
if (!isObject(when) || keysWithin(when, ["schema", "field", "format"]) || Object.keys(when).length === 0)
|
|
127
|
+
throw invalid("UI_EXTENSION_INVALID", path, "when has schema, field or format", when);
|
|
128
|
+
for (const [k, v] of Object.entries(when)) {
|
|
129
|
+
if (!Array.isArray(v) || v.length === 0 || v.length > 64 || v.some((x) => typeof x !== "string" || x.length === 0))
|
|
130
|
+
throw invalid("UI_EXTENSION_INVALID", `${path}/${k}`, `when.${k} is a non-empty list of names`, v);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const CONTRIBUTION_KEYS = {
|
|
134
|
+
pages: ["id", "title", "role", "nav"],
|
|
135
|
+
settings: ["id", "title", "role", "schema"],
|
|
136
|
+
actions: ["id", "title", "role", "target", "presentation", "destructive", "when"],
|
|
137
|
+
panels: ["id", "title", "role", "target", "when"],
|
|
138
|
+
fields: ["id", "target", "role", "when", "optionsSchema"],
|
|
139
|
+
};
|
|
140
|
+
const KINDS = Object.keys(CONTRIBUTION_KEYS);
|
|
141
|
+
/** Validates every declaration and their handlers; throws `UI_EXTENSION_INVALID` naming the first problem. */
|
|
142
|
+
export function validateAdminExtensions(extensions) {
|
|
143
|
+
if (!Array.isArray(extensions))
|
|
144
|
+
throw invalid("UI_EXTENSION_INVALID", "admin-extensions", "extensions is a list");
|
|
145
|
+
const seen = new Set();
|
|
146
|
+
for (const ext of extensions) {
|
|
147
|
+
const at = `admin-extension:${isObject(ext) && typeof ext["id"] === "string" ? ext["id"] : "?"}`;
|
|
148
|
+
if (!isObject(ext))
|
|
149
|
+
throw invalid("UI_EXTENSION_INVALID", at, "an extension is an object");
|
|
150
|
+
const extra = keysWithin(ext, ["apiVersion", "id", "title", "module", "integrity", "source", "contributes", "handlers"]);
|
|
151
|
+
if (extra)
|
|
152
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/${extra}`, `unknown key '${extra}'`);
|
|
153
|
+
if (ext["apiVersion"] !== 1)
|
|
154
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/apiVersion`, "apiVersion 1", ext["apiVersion"]);
|
|
155
|
+
if (typeof ext["id"] !== "string" || !ID.test(ext["id"]))
|
|
156
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/id`, "a kebab-case id", ext["id"]);
|
|
157
|
+
if (seen.has(ext["id"]))
|
|
158
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/id`, `extension id '${ext["id"]}' is used twice`, ext["id"]);
|
|
159
|
+
seen.add(ext["id"]);
|
|
160
|
+
if (!isText(ext["title"]))
|
|
161
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/title`, "a title");
|
|
162
|
+
// same origin only: an absolute path, never a scheme-relative or external URL
|
|
163
|
+
if (ext["module"] !== undefined && (typeof ext["module"] !== "string" || !MODULE.test(ext["module"])))
|
|
164
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/module`, "a same-origin absolute path", ext["module"]);
|
|
165
|
+
if (ext["source"] !== undefined && typeof ext["source"] !== "string" && typeof ext["source"] !== "function")
|
|
166
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/source`, "source is the module's code or a function returning it");
|
|
167
|
+
if (ext["source"] !== undefined && ext["module"] !== undefined)
|
|
168
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/source`, "either module (served by the host) or source (served by Admin), not both");
|
|
169
|
+
if (ext["integrity"] !== undefined && (typeof ext["integrity"] !== "string" || !INTEGRITY.test(ext["integrity"]) || ext["module"] === undefined))
|
|
170
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/integrity`, "sha256-, sha384- or sha512- integrity for a module", ext["integrity"]);
|
|
171
|
+
const contributes = ext["contributes"];
|
|
172
|
+
if (!isObject(contributes))
|
|
173
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/contributes`, "contributes is an object");
|
|
174
|
+
const extraKind = keysWithin(contributes, KINDS);
|
|
175
|
+
if (extraKind)
|
|
176
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/contributes/${extraKind}`, `unknown contribution kind '${extraKind}'`);
|
|
177
|
+
const ids = new Set();
|
|
178
|
+
let count = 0;
|
|
179
|
+
for (const kind of KINDS) {
|
|
180
|
+
const list = contributes[kind];
|
|
181
|
+
if (list === undefined)
|
|
182
|
+
continue;
|
|
183
|
+
if (!Array.isArray(list))
|
|
184
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/contributes/${kind}`, `${kind} is a list`);
|
|
185
|
+
for (const c of list) {
|
|
186
|
+
const cat = `${at}/${kind}/${isObject(c) && typeof c["id"] === "string" ? c["id"] : "?"}`;
|
|
187
|
+
if (!isObject(c))
|
|
188
|
+
throw invalid("UI_EXTENSION_INVALID", cat, "a contribution is an object");
|
|
189
|
+
const bad = keysWithin(c, CONTRIBUTION_KEYS[kind]);
|
|
190
|
+
if (bad)
|
|
191
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/${bad}`, `unknown key '${bad}'`);
|
|
192
|
+
if (typeof c["id"] !== "string" || !ID.test(c["id"]))
|
|
193
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/id`, "a kebab-case id", c["id"]);
|
|
194
|
+
// one namespace per extension, so `<extension>/<contribution>` names exactly one
|
|
195
|
+
if (ids.has(c["id"]))
|
|
196
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/id`, `contribution id '${c["id"]}' is used twice`, c["id"]);
|
|
197
|
+
ids.add(c["id"]);
|
|
198
|
+
count++;
|
|
199
|
+
if (kind !== "fields" && !isText(c["title"]))
|
|
200
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/title`, "a title");
|
|
201
|
+
if ((kind !== "fields" || c["role"] !== undefined) && (typeof c["role"] !== "string" || !isStaffRole(c["role"])))
|
|
202
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/role`, "a staff role", c["role"]);
|
|
203
|
+
if (kind === "actions" || kind === "panels" || kind === "fields") {
|
|
204
|
+
const targets = ADMIN_EXTENSION_TARGETS[kind === "actions" ? "action" : kind === "panels" ? "panel" : "field"];
|
|
205
|
+
if (!targets.includes(c["target"]))
|
|
206
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/target`, `one of ${targets.join(", ")}`, c["target"]);
|
|
207
|
+
checkWhen(c["when"], `${cat}/when`);
|
|
208
|
+
}
|
|
209
|
+
if (kind === "pages" && c["nav"] !== undefined) {
|
|
210
|
+
const nav = c["nav"];
|
|
211
|
+
if (!isObject(nav) || keysWithin(nav, ["group", "order"]) || (nav["group"] !== "more" && nav["group"] !== "settings") || (nav["order"] !== undefined && !Number.isInteger(nav["order"])))
|
|
212
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/nav`, "nav { group: more | settings, order? }", nav);
|
|
213
|
+
}
|
|
214
|
+
if (kind === "actions") {
|
|
215
|
+
if (!["run", "confirm", "dialog"].includes(c["presentation"]))
|
|
216
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/presentation`, "run, confirm or dialog", c["presentation"]);
|
|
217
|
+
if (c["destructive"] !== undefined && typeof c["destructive"] !== "boolean")
|
|
218
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/destructive`, "a boolean", c["destructive"]);
|
|
219
|
+
}
|
|
220
|
+
const formKey = kind === "settings" ? "schema" : kind === "fields" ? "optionsSchema" : null;
|
|
221
|
+
if (formKey && (kind === "settings" || c[formKey] !== undefined)) {
|
|
222
|
+
const problem = formSchemaProblem(c[formKey]);
|
|
223
|
+
if (problem)
|
|
224
|
+
throw invalid("UI_EXTENSION_INVALID", `${cat}/${formKey}`, `the form subset: ${problem}`);
|
|
225
|
+
}
|
|
226
|
+
const rendered = kind === "pages" || kind === "panels" || kind === "fields" || (kind === "actions" && c["presentation"] === "dialog");
|
|
227
|
+
if (rendered && ext["module"] === undefined && ext["source"] === undefined)
|
|
228
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/module`, `'${c["id"]}' renders, so the extension needs a module or a source`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (count === 0)
|
|
232
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/contributes`, "at least one contribution");
|
|
233
|
+
checkHandlers(ext, at);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
function checkHandlers(ext, at) {
|
|
237
|
+
const raw = ext.handlers ?? {};
|
|
238
|
+
if (!isObject(raw) || keysWithin(raw, ["api", "settings", "actions"]))
|
|
239
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/handlers`, "handlers has api, settings and actions");
|
|
240
|
+
const h = raw;
|
|
241
|
+
if (h.api !== undefined && typeof h.api !== "function")
|
|
242
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/handlers/api`, "a function");
|
|
243
|
+
const settings = ext.contributes.settings ?? [];
|
|
244
|
+
for (const s of settings) {
|
|
245
|
+
const handler = h.settings?.[s.id];
|
|
246
|
+
if (typeof handler?.load !== "function" || typeof handler.save !== "function")
|
|
247
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/handlers/settings/${s.id}`, `settings '${s.id}' needs load and save`);
|
|
248
|
+
}
|
|
249
|
+
for (const id of Object.keys(h.settings ?? {}))
|
|
250
|
+
if (!settings.some((s) => s.id === id))
|
|
251
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/handlers/settings/${id}`, `no settings contribution '${id}'`);
|
|
252
|
+
const server = (ext.contributes.actions ?? []).filter((a) => a.presentation !== "dialog");
|
|
253
|
+
for (const a of server)
|
|
254
|
+
if (typeof h.actions?.[a.id]?.run !== "function")
|
|
255
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/handlers/actions/${a.id}`, `action '${a.id}' needs run`);
|
|
256
|
+
for (const id of Object.keys(h.actions ?? {}))
|
|
257
|
+
if (!server.some((a) => a.id === id))
|
|
258
|
+
throw invalid("UI_EXTENSION_INVALID", `${at}/handlers/actions/${id}`, `no run or confirm action '${id}'`);
|
|
259
|
+
}
|
|
260
|
+
// ---------- uiSchema references (§1b) ----------
|
|
261
|
+
/** Every `<extension>/<contribution>` the plan's `uiSchema` names, with the target its key needs. */
|
|
262
|
+
export function planUiExtensionRefs(plan) {
|
|
263
|
+
const refs = [];
|
|
264
|
+
const fields = (owner, ui) => {
|
|
265
|
+
for (const [name, c] of Object.entries(isObject(ui?.["fields"]) ? ui["fields"] : {})) {
|
|
266
|
+
if (isObject(c) && typeof c["widget"] === "string" && UI_EXTENSION_REF.test(c["widget"]))
|
|
267
|
+
refs.push({ path: `${owner}/uiSchema/fields/${name}/widget`, ref: c["widget"], target: "field.input/v1", ...(c["options"] === undefined ? {} : { options: c["options"] }) });
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
const cells = (owner, ui) => {
|
|
271
|
+
const list = ui?.["list"];
|
|
272
|
+
for (const [name, ref] of Object.entries(isObject(list) && isObject(list["cells"]) ? list["cells"] : {}))
|
|
273
|
+
if (typeof ref === "string")
|
|
274
|
+
refs.push({ path: `${owner}/uiSchema/list/cells/${name}`, ref, target: "field.cell/v1" });
|
|
275
|
+
};
|
|
276
|
+
for (const [name, s] of Object.entries(plan.schemas)) {
|
|
277
|
+
const owner = `schema:${s.name ?? name}`;
|
|
278
|
+
const ui = s.uiSchema;
|
|
279
|
+
fields(owner, ui);
|
|
280
|
+
cells(owner, ui);
|
|
281
|
+
const panels = ui?.["panels"];
|
|
282
|
+
if (Array.isArray(panels))
|
|
283
|
+
for (const ref of panels)
|
|
284
|
+
if (typeof ref === "string")
|
|
285
|
+
refs.push({ path: `${owner}/uiSchema/panels`, ref, target: "record.sidebar/v1" });
|
|
286
|
+
}
|
|
287
|
+
for (const [name, p] of Object.entries(plan.procedures))
|
|
288
|
+
fields(`procedure:${name}`, p.uiSchema);
|
|
289
|
+
for (const [name, v] of Object.entries(plan.views))
|
|
290
|
+
cells(`view:${name}`, v.uiSchema);
|
|
291
|
+
return refs;
|
|
292
|
+
}
|
|
293
|
+
/** Checks that each contribution the plan names exists, has the target its key needs, and accepts its `options`. */
|
|
294
|
+
export function checkPlanUiExtensions(plan, extensions) {
|
|
295
|
+
for (const { path, ref, target, options } of planUiExtensionRefs(plan)) {
|
|
296
|
+
const [, extId, cId] = UI_EXTENSION_REF.exec(ref);
|
|
297
|
+
const ext = extensions.find((e) => e.id === extId);
|
|
298
|
+
const c = ext ? [...(ext.contributes.fields ?? []), ...(ext.contributes.panels ?? [])].find((x) => x.id === cId) : undefined;
|
|
299
|
+
if (!c)
|
|
300
|
+
throw invalid("UI_EXTENSION_UNKNOWN", path, `no Admin extension contribution '${ref}'`, ref);
|
|
301
|
+
if (c.target !== target)
|
|
302
|
+
throw invalid("UI_EXTENSION_TARGET", path, `'${ref}' is a ${c.target} contribution; this key needs ${target}`, ref);
|
|
303
|
+
if (options === undefined)
|
|
304
|
+
continue;
|
|
305
|
+
const schema = c.optionsSchema;
|
|
306
|
+
if (!schema)
|
|
307
|
+
throw invalid("UI_EXTENSION_OPTIONS", path, `'${ref}' takes no options`, options);
|
|
308
|
+
const errors = checkFormValue(schema, options);
|
|
309
|
+
const first = Object.entries(errors)[0];
|
|
310
|
+
if (first)
|
|
311
|
+
throw invalid("UI_EXTENSION_OPTIONS", `${path}/${first[0]}`, `options for '${ref}': ${first[0] || "options"} ${first[1]}`, options);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// ---------- what a caller sees ----------
|
|
315
|
+
const fieldRole = (f) => f.role ?? "contributor";
|
|
316
|
+
/** The declarations (never handlers or integrity) of the contributions `role` reaches; extensions with none are left out. */
|
|
317
|
+
export function adminExtensionsFor(extensions, role, basePath = "/admin") {
|
|
318
|
+
return extensions.flatMap((e) => {
|
|
319
|
+
const reach = (xs, roleOf) => (xs ?? []).filter((x) => meetsRole(role, roleOf(x)));
|
|
320
|
+
const contributes = {
|
|
321
|
+
pages: reach(e.contributes.pages, (x) => x.role),
|
|
322
|
+
settings: reach(e.contributes.settings, (x) => x.role),
|
|
323
|
+
actions: reach(e.contributes.actions, (x) => x.role),
|
|
324
|
+
panels: reach(e.contributes.panels, (x) => x.role),
|
|
325
|
+
fields: reach(e.contributes.fields, fieldRole),
|
|
326
|
+
};
|
|
327
|
+
if (Object.values(contributes).every((xs) => xs.length === 0))
|
|
328
|
+
return [];
|
|
329
|
+
const module = e.module ?? (e.source !== undefined ? extensionSourcePath(basePath, e.id) : undefined);
|
|
330
|
+
return [{ id: e.id, title: e.title, ...(module ? { module } : {}), contributes }];
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
export const extensionSourcePath = (basePath, id) => `${basePath}/extensions/${id}.js`;
|
|
334
|
+
const sources = new WeakMap();
|
|
335
|
+
/** The code Admin serves for a `source` extension and its sha384 integrity, read once. */
|
|
336
|
+
export function extensionSource(e) {
|
|
337
|
+
if (e.source === undefined)
|
|
338
|
+
return null;
|
|
339
|
+
let found = sources.get(e);
|
|
340
|
+
if (!found) {
|
|
341
|
+
found = (async () => {
|
|
342
|
+
const code = typeof e.source === "function" ? await e.source() : e.source;
|
|
343
|
+
if (typeof code !== "string" || code.length === 0)
|
|
344
|
+
throw invalid("UI_EXTENSION_INVALID", `admin-extension:${e.id}/source`, "source returned no code");
|
|
345
|
+
const digest = new Uint8Array(await crypto.subtle.digest("SHA-384", new TextEncoder().encode(code)));
|
|
346
|
+
return { code, integrity: `sha384-${btoa(String.fromCharCode(...digest))}` };
|
|
347
|
+
})();
|
|
348
|
+
// a failed read may succeed later (a deploy, a transient store error): do not keep the failure
|
|
349
|
+
found.catch(() => sources.delete(e));
|
|
350
|
+
sources.set(e, found);
|
|
351
|
+
}
|
|
352
|
+
return found;
|
|
353
|
+
}
|
|
354
|
+
/** `{basePath}/extensions/{id}.js`: a `source` extension's module, for staff whose role reaches one of its contributions. */
|
|
355
|
+
export async function adminExtensionModule(extensions, id, caller) {
|
|
356
|
+
const ext = extensions.find((e) => e.id === id && e.source !== undefined);
|
|
357
|
+
if (!ext)
|
|
358
|
+
throw wireError("NOT_FOUND", "no such route", P);
|
|
359
|
+
const role = apiRole(ext);
|
|
360
|
+
if (!meetsRole(caller.role, role))
|
|
361
|
+
throw denied(role);
|
|
362
|
+
const { code } = await extensionSource(ext);
|
|
363
|
+
return new Response(code, { headers: { "content-type": "text/javascript; charset=utf-8", "cache-control": "private, no-cache", "x-content-type-options": "nosniff" } });
|
|
364
|
+
}
|
|
365
|
+
/** The lowest role any of the extension's contributions needs: whoever sees one of them may call its API. */
|
|
366
|
+
function apiRole(e) {
|
|
367
|
+
const roles = [
|
|
368
|
+
...KINDS.filter((k) => k !== "fields").flatMap((k) => (e.contributes[k] ?? []).map((c) => c.role)),
|
|
369
|
+
...(e.contributes.fields ?? []).map(fieldRole),
|
|
370
|
+
];
|
|
371
|
+
return ROLE_ORDER.find((r) => roles.includes(r)) ?? "owner";
|
|
372
|
+
}
|
|
373
|
+
const denied = (role) => wireError("AUTH_DENIED", `This needs the ${role} role.`, P);
|
|
374
|
+
const noStore = (out) => {
|
|
375
|
+
// like every Admin API answer, staff data is not cached unless the extension says otherwise
|
|
376
|
+
if (out.headers.has("cache-control"))
|
|
377
|
+
return out;
|
|
378
|
+
const headers = new Headers(out.headers);
|
|
379
|
+
headers.set("cache-control", "no-store");
|
|
380
|
+
return new Response(out.body, { status: out.status, statusText: out.statusText, headers });
|
|
381
|
+
};
|
|
382
|
+
function readRef(v, path) {
|
|
383
|
+
if (!isObject(v) || typeof v["schema"] !== "string" || typeof v["id"] !== "string" || !v["id"] || (v["version"] !== undefined && !Number.isInteger(v["version"])))
|
|
384
|
+
throw wireError("INPUT_VALIDATION_FAILED", `${path} is { schema, id, version? }`, P);
|
|
385
|
+
return { schema: v["schema"], id: v["id"], ...(v["version"] === undefined ? {} : { version: v["version"] }) };
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Answers `{basePath}/api/x/{extension}/...` after Admin's session checks: `settings/{id}` (GET loads, PATCH saves),
|
|
389
|
+
* `actions/{id}` (POST runs) and `api/{path}` (the extension's own API). `null` when the path is not an extension's.
|
|
390
|
+
*/
|
|
391
|
+
export async function adminExtensionRoute(extensions, request, rest, caller) {
|
|
392
|
+
const m = /^([^/]+)\/(settings|actions|api)(?:\/(.*))?$/.exec(rest);
|
|
393
|
+
const ext = m ? extensions.find((e) => e.id === m[1]) : undefined;
|
|
394
|
+
if (!m || !ext)
|
|
395
|
+
throw wireError("NOT_FOUND", "no such route", P);
|
|
396
|
+
const [, , kind, tail = ""] = m;
|
|
397
|
+
const NO_STORE = { "cache-control": "no-store" };
|
|
398
|
+
if (kind === "api") {
|
|
399
|
+
const role = apiRole(ext);
|
|
400
|
+
if (!meetsRole(caller.role, role))
|
|
401
|
+
throw denied(role);
|
|
402
|
+
const out = ext.handlers?.api ? await ext.handlers.api(request, { caller, extension: ext.id, path: tail }) : null;
|
|
403
|
+
if (!out)
|
|
404
|
+
throw wireError("NOT_FOUND", "no such route", P);
|
|
405
|
+
return noStore(out);
|
|
406
|
+
}
|
|
407
|
+
if (kind === "settings") {
|
|
408
|
+
const s = ext.contributes.settings?.find((x) => x.id === tail);
|
|
409
|
+
const handler = s && ext.handlers?.settings?.[s.id];
|
|
410
|
+
if (!s || !handler)
|
|
411
|
+
throw wireError("NOT_FOUND", "no such route", P);
|
|
412
|
+
if (!meetsRole(caller.role, s.role))
|
|
413
|
+
throw denied(s.role);
|
|
414
|
+
if (request.method === "GET")
|
|
415
|
+
return json({ value: (await handler.load(caller)) ?? null }, 200, NO_STORE);
|
|
416
|
+
// PATCH, as Admin's own site settings: the body is the whole value, checked against the schema
|
|
417
|
+
if (request.method !== "PATCH")
|
|
418
|
+
throw wireError("METHOD_NOT_ALLOWED", "settings take GET or PATCH", P);
|
|
419
|
+
const value = (await readJsonObject(request, P))["value"];
|
|
420
|
+
const errors = checkFormValue(s.schema, value);
|
|
421
|
+
if (Object.keys(errors).length > 0)
|
|
422
|
+
return json({ error: { code: "INPUT_VALIDATION_FAILED", message: "The settings do not match their schema.", fields: errors } }, 400, NO_STORE);
|
|
423
|
+
const saved = await handler.save(caller, value);
|
|
424
|
+
return json({ value: saved ?? value }, 200, NO_STORE);
|
|
425
|
+
}
|
|
426
|
+
const a = ext.contributes.actions?.find((x) => x.id === tail && x.presentation !== "dialog");
|
|
427
|
+
const handler = a && ext.handlers?.actions?.[a.id];
|
|
428
|
+
if (!a || !handler)
|
|
429
|
+
throw wireError("NOT_FOUND", "no such route", P);
|
|
430
|
+
if (request.method !== "POST")
|
|
431
|
+
throw wireError("METHOD_NOT_ALLOWED", "actions take POST", P);
|
|
432
|
+
if (!meetsRole(caller.role, a.role))
|
|
433
|
+
throw denied(a.role);
|
|
434
|
+
const body = await readJsonObject(request, P);
|
|
435
|
+
let input;
|
|
436
|
+
if (a.target === "record/v1") {
|
|
437
|
+
input = { record: readRef(body["record"], "record") };
|
|
438
|
+
}
|
|
439
|
+
else if (a.target === "list.selection/v1") {
|
|
440
|
+
const sel = body["selection"];
|
|
441
|
+
if (!isObject(sel) || typeof sel["schema"] !== "string" || !Array.isArray(sel["ids"]) || sel["ids"].length === 0 || sel["ids"].length > 1000 || sel["ids"].some((x) => typeof x !== "string" || !x))
|
|
442
|
+
throw wireError("INPUT_VALIDATION_FAILED", "selection is { schema, ids } with 1 to 1000 ids", P);
|
|
443
|
+
input = { selection: { schema: sel["schema"], ids: sel["ids"] } };
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
if (typeof body["schema"] !== "string")
|
|
447
|
+
throw wireError("INPUT_VALIDATION_FAILED", "schema names the list", P);
|
|
448
|
+
input = { schema: body["schema"] };
|
|
449
|
+
}
|
|
450
|
+
// `when` is checked here as well as in the console, so a crafted request cannot run an action somewhere it was not offered
|
|
451
|
+
const schema = input.record?.schema ?? input.selection?.schema ?? input.schema;
|
|
452
|
+
if (a.when?.schema && !a.when.schema.includes(schema))
|
|
453
|
+
throw wireError("NOT_FOUND", "no such route", P);
|
|
454
|
+
const result = await handler.run(caller, input);
|
|
455
|
+
return json({ ok: true, result: result ?? null }, 200, NO_STORE);
|
|
456
|
+
}
|
|
457
|
+
const declaration = (e) => ({ id: e.id, title: e.title, module: e.module, integrity: e.integrity });
|
|
458
|
+
/** What changed between two sets of declarations, for review screens. Handlers are code and are not compared. */
|
|
459
|
+
export function diffAdminExtensions(previous, next) {
|
|
460
|
+
const out = [];
|
|
461
|
+
const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
462
|
+
const changedKeys = (a, b) => [...new Set([...Object.keys(a), ...Object.keys(b)])].filter((k) => !same(a[k], b[k])).sort();
|
|
463
|
+
const contributions = (e) => new Map(KINDS.flatMap((k) => (e.contributes[k] ?? []).map((c) => [c.id, { kind: k, ...c }])));
|
|
464
|
+
for (const p of previous)
|
|
465
|
+
if (!next.some((n) => n.id === p.id))
|
|
466
|
+
out.push({ change: "removed", ref: p.id });
|
|
467
|
+
for (const n of next) {
|
|
468
|
+
const p = previous.find((x) => x.id === n.id);
|
|
469
|
+
if (!p) {
|
|
470
|
+
out.push({ change: "added", ref: n.id });
|
|
471
|
+
for (const id of contributions(n).keys())
|
|
472
|
+
out.push({ change: "added", ref: `${n.id}/${id}` });
|
|
473
|
+
continue;
|
|
474
|
+
}
|
|
475
|
+
const keys = changedKeys(declaration(p), declaration(n));
|
|
476
|
+
if (keys.length)
|
|
477
|
+
out.push({ change: "changed", ref: n.id, keys });
|
|
478
|
+
const before = contributions(p);
|
|
479
|
+
const after = contributions(n);
|
|
480
|
+
for (const [id] of before)
|
|
481
|
+
if (!after.has(id))
|
|
482
|
+
out.push({ change: "removed", ref: `${n.id}/${id}` });
|
|
483
|
+
for (const [id, c] of after) {
|
|
484
|
+
const b = before.get(id);
|
|
485
|
+
if (!b)
|
|
486
|
+
out.push({ change: "added", ref: `${n.id}/${id}` });
|
|
487
|
+
else {
|
|
488
|
+
const k = changedKeys(b, c);
|
|
489
|
+
if (k.length)
|
|
490
|
+
out.push({ change: "changed", ref: `${n.id}/${id}`, keys: k });
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return out;
|
|
495
|
+
}
|
|
496
|
+
const text = { anyOf: [{ type: "string", minLength: 1 }, { type: "object", additionalProperties: { type: "string", minLength: 1 }, minProperties: 1 }] };
|
|
497
|
+
const id = { type: "string", pattern: ID.source };
|
|
498
|
+
const role = { enum: ["owner", "editor", "contributor"] };
|
|
499
|
+
const names = { type: "array", items: { type: "string", minLength: 1 }, minItems: 1, maxItems: 64 };
|
|
500
|
+
const when = { type: "object", additionalProperties: false, minProperties: 1, properties: { schema: names, field: names, format: names } };
|
|
501
|
+
const form = { type: "object", description: "The form subset: an object schema whose properties are string, number, integer or boolean with title, description, default, enum, oneOf, minimum, maximum, minLength and maxLength." };
|
|
502
|
+
const contribution = (props, required) => ({ type: "object", additionalProperties: false, required: ["id", ...required], properties: { id, ...props } });
|
|
503
|
+
/** JSON Schema of one extension's declaration (handlers excluded), for tooling and agents. */
|
|
504
|
+
export const ADMIN_EXTENSION_JSON_SCHEMA = {
|
|
505
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
506
|
+
title: "Mantle Admin extension declaration",
|
|
507
|
+
type: "object",
|
|
508
|
+
additionalProperties: false,
|
|
509
|
+
required: ["apiVersion", "id", "title", "contributes"],
|
|
510
|
+
properties: {
|
|
511
|
+
apiVersion: { const: 1 },
|
|
512
|
+
id,
|
|
513
|
+
title: text,
|
|
514
|
+
module: { type: "string", pattern: MODULE.source },
|
|
515
|
+
integrity: { type: "string", pattern: INTEGRITY.source },
|
|
516
|
+
// the module's code as a string; a function returning it is code, like the handlers, and is not described here
|
|
517
|
+
source: { type: "string", minLength: 1 },
|
|
518
|
+
contributes: {
|
|
519
|
+
type: "object",
|
|
520
|
+
additionalProperties: false,
|
|
521
|
+
minProperties: 1,
|
|
522
|
+
properties: {
|
|
523
|
+
pages: { type: "array", items: contribution({ title: text, role, nav: { type: "object", additionalProperties: false, required: ["group"], properties: { group: { enum: ["more", "settings"] }, order: { type: "integer" } } } }, ["title", "role"]) },
|
|
524
|
+
settings: { type: "array", items: contribution({ title: text, role, schema: form }, ["title", "role", "schema"]) },
|
|
525
|
+
actions: { type: "array", items: contribution({ title: text, role, target: { enum: ADMIN_EXTENSION_TARGETS.action }, presentation: { enum: ["run", "confirm", "dialog"] }, destructive: { type: "boolean" }, when }, ["title", "role", "target", "presentation"]) },
|
|
526
|
+
panels: { type: "array", items: contribution({ title: text, role, target: { enum: ADMIN_EXTENSION_TARGETS.panel }, when }, ["title", "role", "target"]) },
|
|
527
|
+
fields: { type: "array", items: contribution({ target: { enum: ADMIN_EXTENSION_TARGETS.field }, role, when, optionsSchema: form }, ["target"]) },
|
|
528
|
+
},
|
|
529
|
+
},
|
|
530
|
+
},
|
|
531
|
+
};
|
|
532
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/admin/extensions.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./consent.js";
|
|
2
2
|
export * from "./createAdminSurface.js";
|
|
3
3
|
export * from "./identity.js";
|
|
4
|
+
export * from "./extensions.js";
|
|
4
5
|
export { developerConsole, type DeveloperConsoleSnapshot } from "./developerConsole.js";
|
|
5
6
|
export * from "./design.js";
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,gBAAgB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACxF,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACxF,cAAc,aAAa,CAAC"}
|
package/dist/admin/index.js
CHANGED