@skillcdn/console 0.4.1 → 0.4.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 +19 -2
- package/SKILLCDN.md +7 -5
- package/dist/api.d.ts +5 -4
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +5 -4
- package/dist/api.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +569 -48
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/format.d.ts +34 -3
- package/dist/cli/format.d.ts.map +1 -1
- package/dist/cli/format.js +283 -7
- package/dist/cli/format.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +44 -7
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/plugin-check.d.ts +26 -0
- package/dist/cli/plugin-check.d.ts.map +1 -0
- package/dist/cli/plugin-check.js +396 -0
- package/dist/cli/plugin-check.js.map +1 -0
- package/dist/cli/plugin-cli.d.ts +20 -0
- package/dist/cli/plugin-cli.d.ts.map +1 -0
- package/dist/cli/plugin-cli.js +189 -0
- package/dist/cli/plugin-cli.js.map +1 -0
- package/dist/cli/plugin-init.d.ts +37 -0
- package/dist/cli/plugin-init.d.ts.map +1 -0
- package/dist/cli/plugin-init.js +206 -0
- package/dist/cli/plugin-init.js.map +1 -0
- package/dist/cli/plugin-main.d.ts +3 -0
- package/dist/cli/plugin-main.d.ts.map +1 -0
- package/dist/cli/plugin-main.js +28 -0
- package/dist/cli/plugin-main.js.map +1 -0
- package/dist/client.d.ts +100 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +79 -7
- package/dist/client.js.map +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/compat.js +2 -2
- package/dist/components/board.d.ts +8 -0
- package/dist/components/board.d.ts.map +1 -1
- package/dist/components/board.js +59 -15
- package/dist/components/board.js.map +1 -1
- package/dist/components/comments.d.ts.map +1 -1
- package/dist/components/comments.js +1 -1
- package/dist/components/comments.js.map +1 -1
- package/dist/components/decision-form.d.ts +2 -1
- package/dist/components/decision-form.d.ts.map +1 -1
- package/dist/components/decision-form.js +36 -4
- package/dist/components/decision-form.js.map +1 -1
- package/dist/components/decision-list.d.ts +4 -0
- package/dist/components/decision-list.d.ts.map +1 -1
- package/dist/components/decision-list.js +29 -3
- package/dist/components/decision-list.js.map +1 -1
- package/dist/components/event-feed.d.ts +1 -1
- package/dist/components/event-feed.d.ts.map +1 -1
- package/dist/components/event-feed.js +33 -1
- package/dist/components/event-feed.js.map +1 -1
- package/dist/components/my-decisions.d.ts +2 -0
- package/dist/components/my-decisions.d.ts.map +1 -1
- package/dist/components/my-decisions.js +2 -2
- package/dist/components/my-decisions.js.map +1 -1
- package/dist/components/plugin-frame.d.ts +52 -0
- package/dist/components/plugin-frame.d.ts.map +1 -0
- package/dist/components/plugin-frame.js +314 -0
- package/dist/components/plugin-frame.js.map +1 -0
- package/dist/components/plugin-settings.d.ts +38 -0
- package/dist/components/plugin-settings.d.ts.map +1 -0
- package/dist/components/plugin-settings.js +348 -0
- package/dist/components/plugin-settings.js.map +1 -0
- package/dist/components/shell.d.ts +2 -0
- package/dist/components/shell.d.ts.map +1 -1
- package/dist/components/shell.js +26 -1
- package/dist/components/shell.js.map +1 -1
- package/dist/components/task-view.d.ts +2 -1
- package/dist/components/task-view.d.ts.map +1 -1
- package/dist/components/task-view.js.map +1 -1
- package/dist/components/workspace.d.ts +7 -1
- package/dist/components/workspace.d.ts.map +1 -1
- package/dist/components/workspace.js +1 -1
- package/dist/components/workspace.js.map +1 -1
- package/dist/console.css +330 -1
- package/dist/console.d.ts.map +1 -1
- package/dist/console.js +152 -41
- package/dist/console.js.map +1 -1
- package/dist/data.d.ts +9 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +45 -9
- package/dist/data.js.map +1 -1
- package/dist/i18n/en.d.ts +155 -0
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +166 -0
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/ko.d.ts.map +1 -1
- package/dist/i18n/ko.js +150 -0
- package/dist/i18n/ko.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/limits.d.ts +2 -0
- package/dist/limits.d.ts.map +1 -1
- package/dist/limits.js +2 -0
- package/dist/limits.js.map +1 -1
- package/dist/plugin/args.d.ts +148 -0
- package/dist/plugin/args.d.ts.map +1 -0
- package/dist/plugin/args.js +369 -0
- package/dist/plugin/args.js.map +1 -0
- package/dist/plugin/bridge.d.ts +146 -0
- package/dist/plugin/bridge.d.ts.map +1 -0
- package/dist/plugin/bridge.js +125 -0
- package/dist/plugin/bridge.js.map +1 -0
- package/dist/plugin/capabilities.d.ts +20 -0
- package/dist/plugin/capabilities.d.ts.map +1 -0
- package/dist/plugin/capabilities.js +133 -0
- package/dist/plugin/capabilities.js.map +1 -0
- package/dist/plugin/context.d.ts +380 -0
- package/dist/plugin/context.d.ts.map +1 -0
- package/dist/plugin/context.js +2 -0
- package/dist/plugin/context.js.map +1 -0
- package/dist/plugin/define.d.ts +208 -0
- package/dist/plugin/define.d.ts.map +1 -0
- package/dist/plugin/define.js +482 -0
- package/dist/plugin/define.js.map +1 -0
- package/dist/plugin/definition-error.d.ts +11 -0
- package/dist/plugin/definition-error.d.ts.map +1 -0
- package/dist/plugin/definition-error.js +17 -0
- package/dist/plugin/definition-error.js.map +1 -0
- package/dist/plugin/limits.d.ts +67 -0
- package/dist/plugin/limits.d.ts.map +1 -0
- package/dist/plugin/limits.js +70 -0
- package/dist/plugin/limits.js.map +1 -0
- package/dist/plugin/load-worker.d.ts +7 -0
- package/dist/plugin/load-worker.d.ts.map +1 -0
- package/dist/plugin/load-worker.js +41 -0
- package/dist/plugin/load-worker.js.map +1 -0
- package/dist/plugin/load.d.ts +18 -0
- package/dist/plugin/load.d.ts.map +1 -0
- package/dist/plugin/load.js +62 -0
- package/dist/plugin/load.js.map +1 -0
- package/dist/plugin/manifest.d.ts +237 -0
- package/dist/plugin/manifest.d.ts.map +1 -0
- package/dist/plugin/manifest.js +411 -0
- package/dist/plugin/manifest.js.map +1 -0
- package/dist/plugin/refusals.d.ts +49 -0
- package/dist/plugin/refusals.d.ts.map +1 -0
- package/dist/plugin/refusals.js +79 -0
- package/dist/plugin/refusals.js.map +1 -0
- package/dist/plugin/rest-schemas.d.ts +556 -0
- package/dist/plugin/rest-schemas.d.ts.map +1 -0
- package/dist/plugin/rest-schemas.js +262 -0
- package/dist/plugin/rest-schemas.js.map +1 -0
- package/dist/plugin/sandbox.d.ts +23 -0
- package/dist/plugin/sandbox.d.ts.map +1 -0
- package/dist/plugin/sandbox.js +99 -0
- package/dist/plugin/sandbox.js.map +1 -0
- package/dist/plugin/testing.d.ts +45 -0
- package/dist/plugin/testing.d.ts.map +1 -0
- package/dist/plugin/testing.js +420 -0
- package/dist/plugin/testing.js.map +1 -0
- package/dist/plugin/web-react.d.ts +11 -0
- package/dist/plugin/web-react.d.ts.map +1 -0
- package/dist/plugin/web-react.js +34 -0
- package/dist/plugin/web-react.js.map +1 -0
- package/dist/plugin/web.d.ts +95 -0
- package/dist/plugin/web.d.ts.map +1 -0
- package/dist/plugin/web.js +245 -0
- package/dist/plugin/web.js.map +1 -0
- package/dist/plugin-nav.d.ts +29 -0
- package/dist/plugin-nav.d.ts.map +1 -0
- package/dist/plugin-nav.js +92 -0
- package/dist/plugin-nav.js.map +1 -0
- package/dist/plugin-testing.d.ts +2 -0
- package/dist/plugin-testing.d.ts.map +1 -0
- package/dist/plugin-testing.js +4 -0
- package/dist/plugin-testing.js.map +1 -0
- package/dist/plugin-web-react.d.ts +3 -0
- package/dist/plugin-web-react.d.ts.map +1 -0
- package/dist/plugin-web-react.js +3 -0
- package/dist/plugin-web-react.js.map +1 -0
- package/dist/plugin-web.d.ts +4 -0
- package/dist/plugin-web.d.ts.map +1 -0
- package/dist/plugin-web.js +5 -0
- package/dist/plugin-web.js.map +1 -0
- package/dist/plugin.d.ts +11 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +15 -0
- package/dist/plugin.js.map +1 -0
- package/dist/router.d.ts +28 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +47 -0
- package/dist/router.js.map +1 -1
- package/dist/routes.d.ts +4 -0
- package/dist/routes.d.ts.map +1 -1
- package/dist/routes.js +6 -0
- package/dist/routes.js.map +1 -1
- package/dist/schemas.d.ts +194 -9
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +98 -17
- package/dist/schemas.js.map +1 -1
- package/dist/tokens.d.ts +2 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +101 -0
- package/dist/tokens.js.map +1 -0
- package/dist/vocabulary.d.ts +11 -1
- package/dist/vocabulary.d.ts.map +1 -1
- package/dist/vocabulary.js +24 -0
- package/dist/vocabulary.js.map +1 -1
- package/dist/web.d.ts.map +1 -1
- package/dist/web.js +2 -0
- package/dist/web.js.map +1 -1
- package/docs/specs/cli.md +12 -5
- package/docs/specs/plugins.md +488 -0
- package/docs/specs/rest.md +11 -9
- package/package.json +26 -8
- package/skills/building-a-console/SKILL.md +25 -26
- package/skills/building-a-console/references/configuring.md +40 -0
- package/skills/building-a-console/references/the-default-console.md +1 -1
- package/skills/building-a-console/references/the-look-from-a-website.md +5 -5
- package/skills/building-a-plugin/SKILL.md +137 -0
- package/skills/deploying-a-console/SKILL.md +24 -26
- package/skills/deploying-a-console/references/access.md +13 -9
- package/skills/deploying-a-console/references/resources.md +25 -10
- package/skills/deploying-a-console/references/running-it-again.md +15 -0
- package/skills/deploying-a-console/references/sizing.md +2 -0
- package/skills/planning-the-board/SKILL.md +96 -0
- package/skills/planning-the-board/references/a-task.md +36 -0
- package/skills/planning-the-board/references/setting-up.md +44 -0
- package/skills/working-the-board/SKILL.md +43 -34
- package/skills/working-the-board/references/the-pack.md +19 -0
- package/src/api.ts +12 -0
- package/src/cli/cli.ts +737 -55
- package/src/cli/format.ts +368 -10
- package/src/cli/help.ts +50 -6
- package/src/cli/plugin-check.ts +497 -0
- package/src/cli/plugin-cli.ts +237 -0
- package/src/cli/plugin-init.ts +257 -0
- package/src/cli/plugin-main.ts +30 -0
- package/src/client.ts +322 -9
- package/src/compat.ts +2 -2
- package/src/components/board.tsx +62 -14
- package/src/components/comments.tsx +1 -0
- package/src/components/decision-form.tsx +92 -11
- package/src/components/decision-list.tsx +71 -2
- package/src/components/event-feed.tsx +42 -1
- package/src/components/my-decisions.tsx +4 -1
- package/src/components/plugin-frame.tsx +437 -0
- package/src/components/plugin-settings.tsx +1111 -0
- package/src/components/shell.tsx +82 -14
- package/src/components/task-view.tsx +2 -1
- package/src/components/workspace.tsx +18 -0
- package/src/console.tsx +304 -31
- package/src/data.ts +59 -11
- package/src/i18n/en.ts +175 -0
- package/src/i18n/ko.ts +155 -0
- package/src/index.ts +12 -0
- package/src/limits.ts +2 -0
- package/src/plugin/args.ts +526 -0
- package/src/plugin/bridge.ts +314 -0
- package/src/plugin/capabilities.ts +150 -0
- package/src/plugin/context.ts +421 -0
- package/src/plugin/define.ts +792 -0
- package/src/plugin/definition-error.ts +19 -0
- package/src/plugin/limits.ts +70 -0
- package/src/plugin/load-worker.ts +50 -0
- package/src/plugin/load.ts +82 -0
- package/src/plugin/manifest.ts +561 -0
- package/src/plugin/refusals.ts +94 -0
- package/src/plugin/rest-schemas.ts +354 -0
- package/src/plugin/sandbox.ts +123 -0
- package/src/plugin/testing.ts +612 -0
- package/src/plugin/web-react.ts +45 -0
- package/src/plugin/web.ts +403 -0
- package/src/plugin-nav.ts +132 -0
- package/src/plugin-testing.ts +10 -0
- package/src/plugin-web-react.ts +4 -0
- package/src/plugin-web.ts +35 -0
- package/src/plugin.ts +126 -0
- package/src/router.ts +73 -0
- package/src/routes.ts +7 -0
- package/src/schemas.ts +115 -18
- package/src/styles/console.css +330 -1
- package/src/tokens.ts +101 -0
- package/src/vocabulary.ts +30 -0
- package/src/web.ts +2 -0
- package/template/plugin/.gitignore +2 -0
- package/template/plugin/README.md +26 -0
- package/template/plugin/SKILLCDN.md +13 -0
- package/template/plugin/build.mjs +40 -0
- package/template/plugin/console-plugin.json +50 -0
- package/template/plugin/package.json +27 -0
- package/template/plugin/skills/__key__/SKILL.md +23 -0
- package/template/plugin/src/check.test.ts +34 -0
- package/template/plugin/src/server/index.test.ts +41 -0
- package/template/plugin/src/server/index.ts +72 -0
- package/template/plugin/src/web/index.css +51 -0
- package/template/plugin/src/web/index.ts +115 -0
- package/template/plugin/tsconfig.json +17 -0
- package/skills/working-the-board/references/setting-up.md +0 -3
- /package/skills/{working-the-board → planning-the-board}/references/project-rules.md +0 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
import { PluginDefinitionError } from "./definition-error.js";
|
|
2
|
+
import { MAX_PLUGIN_ABOUT_LENGTH, MAX_PLUGIN_COLLECTIONS, MAX_PLUGIN_ENDPOINTS, MAX_PLUGIN_INDEXES, MAX_PLUGIN_OPERATIONS, MIN_PLUGIN_JOB_INTERVAL_MS, } from "./limits.js";
|
|
3
|
+
import { CURRENT_PLUGIN_API, PLUGIN_KEY_PATTERN, RESERVED_ARG_NAMES, RESERVED_COMMAND_NAMES, } from "./manifest.js";
|
|
4
|
+
const FIELD = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
|
|
5
|
+
const HOOK_KIND = /^(?:console:[a-z][a-z0-9_]*(?:\.[a-z][a-z0-9_]*)*|plugin:[a-z][a-z0-9-]{1,31}:[a-z][a-z0-9-]{1,31})$/;
|
|
6
|
+
const TIME_OF_DAY = /^(?:[01]\d|2[0-3]):[0-5]\d$/;
|
|
7
|
+
const DURATION = /^P(?!$)(?:(\d+)W)?(?:(\d+)D)?(?:T(?!$)(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/;
|
|
8
|
+
const HTTP_METHODS = ["GET", "POST", "PUT", "PATCH", "DELETE"];
|
|
9
|
+
const HEADER_NAME = /^[a-z0-9-]{1,64}$/;
|
|
10
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
11
|
+
/** The milliseconds an ISO 8601 duration such as `P1D`, `PT30M` or `P1W` stands for; nothing for what is not one. */
|
|
12
|
+
export function durationMs(iso) {
|
|
13
|
+
const match = DURATION.exec(iso);
|
|
14
|
+
if (match === null) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
const [, weeks, days, hours, minutes, seconds] = match;
|
|
18
|
+
return (Number(weeks ?? 0) * 7 * DAY_MS +
|
|
19
|
+
Number(days ?? 0) * DAY_MS +
|
|
20
|
+
Number(hours ?? 0) * 60 * 60 * 1000 +
|
|
21
|
+
Number(minutes ?? 0) * 60 * 1000 +
|
|
22
|
+
Number(seconds ?? 0) * 1000);
|
|
23
|
+
}
|
|
24
|
+
function isKey(value) {
|
|
25
|
+
return typeof value === "string" && PLUGIN_KEY_PATTERN.test(value);
|
|
26
|
+
}
|
|
27
|
+
function aboutProblem(what, about) {
|
|
28
|
+
if (typeof about !== "string" ||
|
|
29
|
+
about.length === 0 ||
|
|
30
|
+
about.length > MAX_PLUGIN_ABOUT_LENGTH ||
|
|
31
|
+
/[\r\n]/.test(about)) {
|
|
32
|
+
return `${what} needs about, one line of 1 to ${MAX_PLUGIN_ABOUT_LENGTH} characters`;
|
|
33
|
+
}
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
function rolesProblem(what, roles) {
|
|
37
|
+
if (roles === undefined) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
if (!Array.isArray(roles) || roles.length === 0 || !roles.every(isKey)) {
|
|
41
|
+
return `${what} names roles that are not keys, or none at all; leave roles out for every member`;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
function fail(problems) {
|
|
46
|
+
const found = problems.filter((problem) => problem !== undefined);
|
|
47
|
+
if (found.length > 0) {
|
|
48
|
+
throw new PluginDefinitionError(found);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** A collection of records the console keeps for the plugin, by name. */
|
|
52
|
+
export function defineCollection(name, input) {
|
|
53
|
+
const problems = [];
|
|
54
|
+
if (!isKey(name)) {
|
|
55
|
+
problems.push(`the collection "${String(name)}" is not named as a key`);
|
|
56
|
+
}
|
|
57
|
+
if (typeof input?.schema !== "object" ||
|
|
58
|
+
input.schema === null ||
|
|
59
|
+
!("~standard" in input.schema)) {
|
|
60
|
+
problems.push(`the collection ${name} has no schema, or one that is not a zod schema`);
|
|
61
|
+
}
|
|
62
|
+
const indexes = input.indexes ?? [];
|
|
63
|
+
if (indexes.length > MAX_PLUGIN_INDEXES) {
|
|
64
|
+
problems.push(`the collection ${name} indexes ${indexes.length} fields; ${MAX_PLUGIN_INDEXES} at most`);
|
|
65
|
+
}
|
|
66
|
+
for (const field of [
|
|
67
|
+
...indexes,
|
|
68
|
+
...(input.search ?? []),
|
|
69
|
+
...(input.owner === undefined ? [] : [input.owner]),
|
|
70
|
+
]) {
|
|
71
|
+
if (!FIELD.test(field)) {
|
|
72
|
+
problems.push(`the collection ${name} names the field "${field}", which is not a field name`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (new Set(indexes).size !== indexes.length) {
|
|
76
|
+
problems.push(`the collection ${name} indexes a field twice`);
|
|
77
|
+
}
|
|
78
|
+
if (input.owner !== undefined && !indexes.includes(input.owner)) {
|
|
79
|
+
problems.push(`the collection ${name} has the owner field ${input.owner}, which must be indexed`);
|
|
80
|
+
}
|
|
81
|
+
if (input.project !== undefined && !["none", "optional", "required"].includes(input.project)) {
|
|
82
|
+
problems.push(`the collection ${name} has project "${String(input.project)}"; none, optional or required`);
|
|
83
|
+
}
|
|
84
|
+
problems.push(rolesProblem(`the collection ${name}'s read`, input.read));
|
|
85
|
+
problems.push(rolesProblem(`the collection ${name}'s readOwn`, input.readOwn));
|
|
86
|
+
if (input.readOwn !== undefined && input.owner === undefined) {
|
|
87
|
+
problems.push(`the collection ${name} has readOwn roles and no owner field`);
|
|
88
|
+
}
|
|
89
|
+
fail(problems);
|
|
90
|
+
return Object.freeze({
|
|
91
|
+
name,
|
|
92
|
+
schema: input.schema,
|
|
93
|
+
indexes: Object.freeze([...indexes]),
|
|
94
|
+
search: Object.freeze([...(input.search ?? [])]),
|
|
95
|
+
owner: input.owner ?? null,
|
|
96
|
+
project: input.project ?? "none",
|
|
97
|
+
read: Object.freeze([...(input.read ?? [])]),
|
|
98
|
+
readOwn: Object.freeze([...(input.readOwn ?? [])]),
|
|
99
|
+
history: input.history ?? true,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export function isQueryFile(value) {
|
|
103
|
+
if (typeof value !== "object" || value === null || !("file" in value)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const file = value.file;
|
|
107
|
+
return (typeof file === "object" &&
|
|
108
|
+
file !== null &&
|
|
109
|
+
typeof file.name === "string" &&
|
|
110
|
+
typeof file.type === "string" &&
|
|
111
|
+
file.bytes instanceof Uint8Array);
|
|
112
|
+
}
|
|
113
|
+
function argsProblems(what, args) {
|
|
114
|
+
if (args === undefined) {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
if (typeof args !== "object" || args === null || Array.isArray(args)) {
|
|
118
|
+
return [`${what} has args that are not named definers`];
|
|
119
|
+
}
|
|
120
|
+
const problems = [];
|
|
121
|
+
let positionalOptional = false;
|
|
122
|
+
for (const [name, definition] of Object.entries(args)) {
|
|
123
|
+
if (!isKey(name)) {
|
|
124
|
+
problems.push(`${what} has the argument "${name}", which is not named as a key`);
|
|
125
|
+
}
|
|
126
|
+
else if (RESERVED_ARG_NAMES.includes(name)) {
|
|
127
|
+
problems.push(`${what} has the argument "${name}", a flag the command keeps for itself (${RESERVED_ARG_NAMES.join(", ")})`);
|
|
128
|
+
}
|
|
129
|
+
if (typeof definition !== "object" ||
|
|
130
|
+
definition === null ||
|
|
131
|
+
typeof definition.type !== "string") {
|
|
132
|
+
problems.push(`${what}'s argument ${name} is not from arg.*`);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (definition.positional) {
|
|
136
|
+
if (positionalOptional && !definition.optional) {
|
|
137
|
+
problems.push(`${what}'s argument ${name} is positional and required after an optional one`);
|
|
138
|
+
}
|
|
139
|
+
positionalOptional = positionalOptional || definition.optional;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return problems;
|
|
143
|
+
}
|
|
144
|
+
function operation(kind, input) {
|
|
145
|
+
const what = `a ${kind}`;
|
|
146
|
+
fail([
|
|
147
|
+
aboutProblem(what, input?.about),
|
|
148
|
+
...argsProblems(what, input?.args),
|
|
149
|
+
rolesProblem(what, input?.roles),
|
|
150
|
+
typeof input?.run === "function" ? undefined : `${what} needs run, an async function`,
|
|
151
|
+
]);
|
|
152
|
+
return {
|
|
153
|
+
about: input.about,
|
|
154
|
+
args: Object.freeze({ ...(input.args ?? {}) }),
|
|
155
|
+
roles: input.roles === undefined ? null : Object.freeze([...input.roles]),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Plugin code that writes, run as the person who asked. */
|
|
159
|
+
export function defineCommand(input) {
|
|
160
|
+
const common = operation("command", input);
|
|
161
|
+
return Object.freeze({ kind: "command", ...common, run: input.run });
|
|
162
|
+
}
|
|
163
|
+
/** Plugin code that reads, run as the person who asked. */
|
|
164
|
+
export function defineQuery(input) {
|
|
165
|
+
const common = operation("query", input);
|
|
166
|
+
return Object.freeze({ kind: "query", ...common, run: input.run });
|
|
167
|
+
}
|
|
168
|
+
/** An inbound request the plugin accepts under `/api/v1/plugins/<key>/x/<name>`, with the `endpoints` capability. */
|
|
169
|
+
export function defineEndpoint(input) {
|
|
170
|
+
const problems = [];
|
|
171
|
+
if (input?.auth !== "person" && input?.auth !== "webhook") {
|
|
172
|
+
problems.push("an endpoint's auth is person or webhook");
|
|
173
|
+
}
|
|
174
|
+
problems.push(rolesProblem("an endpoint", input?.roles));
|
|
175
|
+
if (input?.auth === "webhook" && input.roles !== undefined) {
|
|
176
|
+
problems.push("a webhook endpoint names no roles: nobody is signed in");
|
|
177
|
+
}
|
|
178
|
+
if (input?.secret !== undefined && (!isKey(input.secret) || input.auth !== "webhook")) {
|
|
179
|
+
problems.push("an endpoint's secret names a secret setting, for a webhook alone");
|
|
180
|
+
}
|
|
181
|
+
const methods = input?.methods ?? ["POST"];
|
|
182
|
+
if (methods.length === 0 ||
|
|
183
|
+
!methods.every((method) => HTTP_METHODS.includes(method))) {
|
|
184
|
+
problems.push(`an endpoint's methods are among ${HTTP_METHODS.join(", ")}`);
|
|
185
|
+
}
|
|
186
|
+
const headers = input?.headers ?? [];
|
|
187
|
+
if (headers.length > 10 || !headers.every((header) => HEADER_NAME.test(header))) {
|
|
188
|
+
problems.push("an endpoint names up to ten request headers, in lowercase");
|
|
189
|
+
}
|
|
190
|
+
if (typeof input?.run !== "function") {
|
|
191
|
+
problems.push("an endpoint needs run, an async function");
|
|
192
|
+
}
|
|
193
|
+
fail(problems);
|
|
194
|
+
return Object.freeze({
|
|
195
|
+
kind: "endpoint",
|
|
196
|
+
auth: input.auth,
|
|
197
|
+
roles: input.roles === undefined ? null : Object.freeze([...input.roles]),
|
|
198
|
+
secret: input.secret ?? null,
|
|
199
|
+
methods: Object.freeze([...methods]),
|
|
200
|
+
headers: Object.freeze([...headers]),
|
|
201
|
+
run: input.run,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function namedProblems(what, record, kind) {
|
|
205
|
+
const problems = [];
|
|
206
|
+
for (const [name, value] of Object.entries(record ?? {})) {
|
|
207
|
+
if (!isKey(name)) {
|
|
208
|
+
problems.push(`the ${what} "${name}" is not named as a key`);
|
|
209
|
+
}
|
|
210
|
+
if (kind !== undefined &&
|
|
211
|
+
(typeof value !== "object" || value === null || value.kind !== kind)) {
|
|
212
|
+
problems.push(`the ${what} ${name} is not from define${kind[0]?.toUpperCase()}${kind.slice(1)}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return problems;
|
|
216
|
+
}
|
|
217
|
+
/** The whole of a plugin's server module, checked once when it loads. */
|
|
218
|
+
export function definePlugin(parts) {
|
|
219
|
+
const problems = [];
|
|
220
|
+
const collections = parts.collections ?? [];
|
|
221
|
+
if (!Array.isArray(collections)) {
|
|
222
|
+
problems.push("collections is a list of defineCollection");
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
if (collections.length > MAX_PLUGIN_COLLECTIONS) {
|
|
226
|
+
problems.push(`${collections.length} collections; ${MAX_PLUGIN_COLLECTIONS} at most`);
|
|
227
|
+
}
|
|
228
|
+
const names = collections.map((collection) => collection?.name);
|
|
229
|
+
if (new Set(names).size !== names.length) {
|
|
230
|
+
problems.push("two collections have one name");
|
|
231
|
+
}
|
|
232
|
+
for (const collection of collections) {
|
|
233
|
+
if (typeof collection?.name !== "string" || !("schema" in collection)) {
|
|
234
|
+
problems.push("a collection is not from defineCollection");
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
problems.push(...namedProblems("command", parts.commands, "command"));
|
|
239
|
+
problems.push(...namedProblems("query", parts.queries, "query"));
|
|
240
|
+
problems.push(...namedProblems("endpoint", parts.endpoints, "endpoint"));
|
|
241
|
+
problems.push(...namedProblems("job", parts.jobs));
|
|
242
|
+
problems.push(...namedProblems("api call", parts.api));
|
|
243
|
+
const operations = [...Object.keys(parts.commands ?? {}), ...Object.keys(parts.queries ?? {})];
|
|
244
|
+
if (operations.length > MAX_PLUGIN_OPERATIONS) {
|
|
245
|
+
problems.push(`${operations.length} commands and queries; ${MAX_PLUGIN_OPERATIONS} at most`);
|
|
246
|
+
}
|
|
247
|
+
if (new Set(operations).size !== operations.length) {
|
|
248
|
+
problems.push("a command and a query have one name");
|
|
249
|
+
}
|
|
250
|
+
for (const name of operations) {
|
|
251
|
+
if (RESERVED_COMMAND_NAMES.includes(name)) {
|
|
252
|
+
problems.push(`${name} is a subcommand of console plugin <key>, and not a name for a command or a query`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
if (Object.keys(parts.endpoints ?? {}).length > MAX_PLUGIN_ENDPOINTS) {
|
|
256
|
+
problems.push(`more than ${MAX_PLUGIN_ENDPOINTS} endpoints`);
|
|
257
|
+
}
|
|
258
|
+
for (const [kind, handler] of Object.entries(parts.on ?? {})) {
|
|
259
|
+
if (!HOOK_KIND.test(kind)) {
|
|
260
|
+
problems.push(`the hook "${kind}" is neither console:<kind> nor plugin:<key>:<kind>`);
|
|
261
|
+
}
|
|
262
|
+
if (typeof handler !== "function") {
|
|
263
|
+
problems.push(`the hook ${kind} is not a function`);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
for (const [name, job] of Object.entries(parts.jobs ?? {})) {
|
|
267
|
+
problems.push(aboutProblem(`the job ${name}`, job?.about));
|
|
268
|
+
const every = typeof job?.every === "string" ? durationMs(job.every) : undefined;
|
|
269
|
+
if (every === undefined || every < MIN_PLUGIN_JOB_INTERVAL_MS) {
|
|
270
|
+
problems.push(`the job ${name} runs every "${String(job?.every)}", which is not an ISO 8601 duration of five minutes or more`);
|
|
271
|
+
}
|
|
272
|
+
else if (job.at !== undefined && (!TIME_OF_DAY.test(job.at) || every < DAY_MS)) {
|
|
273
|
+
problems.push(`the job ${name} has at, which is HH:MM for a job that runs daily or less often`);
|
|
274
|
+
}
|
|
275
|
+
if (typeof job?.run !== "function") {
|
|
276
|
+
problems.push(`the job ${name} needs run, an async function`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const upgrades = parts.upgrades ?? [];
|
|
280
|
+
let last = 1;
|
|
281
|
+
for (const upgrade of upgrades) {
|
|
282
|
+
if (!Number.isInteger(upgrade?.to) || upgrade.to !== last + 1) {
|
|
283
|
+
problems.push(`the upgrades go up one dataVersion at a time from 2: "${String(upgrade?.to)}" after ${last} does not`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
last = upgrade.to;
|
|
287
|
+
}
|
|
288
|
+
problems.push(aboutProblem(`the upgrade to ${String(upgrade?.to)}`, upgrade?.about));
|
|
289
|
+
if (typeof upgrade?.run !== "function") {
|
|
290
|
+
problems.push(`the upgrade to ${String(upgrade?.to)} needs run, an async function`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
for (const [name, call] of Object.entries(parts.api ?? {})) {
|
|
294
|
+
problems.push(aboutProblem(`the api call ${name}`, call?.about));
|
|
295
|
+
if (typeof call?.input !== "object" || call.input === null || !("~standard" in call.input)) {
|
|
296
|
+
problems.push(`the api call ${name} needs input, a zod schema`);
|
|
297
|
+
}
|
|
298
|
+
if (typeof call?.run !== "function") {
|
|
299
|
+
problems.push(`the api call ${name} needs run, an async function`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
for (const [name, hook] of [
|
|
303
|
+
["onEnable", parts.onEnable],
|
|
304
|
+
["onDisable", parts.onDisable],
|
|
305
|
+
]) {
|
|
306
|
+
if (hook !== undefined && typeof hook !== "function") {
|
|
307
|
+
problems.push(`${name} is not a function`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
fail(problems);
|
|
311
|
+
return Object.freeze({
|
|
312
|
+
pluginApi: CURRENT_PLUGIN_API,
|
|
313
|
+
collections: Object.freeze([...collections]),
|
|
314
|
+
commands: Object.freeze({ ...(parts.commands ?? {}) }),
|
|
315
|
+
queries: Object.freeze({ ...(parts.queries ?? {}) }),
|
|
316
|
+
endpoints: Object.freeze({ ...(parts.endpoints ?? {}) }),
|
|
317
|
+
on: Object.freeze({ ...(parts.on ?? {}) }),
|
|
318
|
+
jobs: Object.freeze({ ...(parts.jobs ?? {}) }),
|
|
319
|
+
upgrades: Object.freeze([...upgrades]),
|
|
320
|
+
api: Object.freeze({ ...(parts.api ?? {}) }),
|
|
321
|
+
onEnable: parts.onEnable ?? null,
|
|
322
|
+
onDisable: parts.onDisable ?? null,
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/** True for what `definePlugin` yields, whichever copy of this package built it. */
|
|
326
|
+
export function isPluginDefinition(value) {
|
|
327
|
+
if (typeof value !== "object" || value === null) {
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
const candidate = value;
|
|
331
|
+
return (typeof candidate.pluginApi === "number" &&
|
|
332
|
+
Array.isArray(candidate.collections) &&
|
|
333
|
+
typeof candidate.commands === "object" &&
|
|
334
|
+
candidate.commands !== null &&
|
|
335
|
+
typeof candidate.queries === "object" &&
|
|
336
|
+
candidate.queries !== null &&
|
|
337
|
+
typeof candidate.endpoints === "object" &&
|
|
338
|
+
candidate.endpoints !== null &&
|
|
339
|
+
typeof candidate.on === "object" &&
|
|
340
|
+
candidate.on !== null &&
|
|
341
|
+
typeof candidate.jobs === "object" &&
|
|
342
|
+
candidate.jobs !== null &&
|
|
343
|
+
Array.isArray(candidate.upgrades) &&
|
|
344
|
+
typeof candidate.api === "object" &&
|
|
345
|
+
candidate.api !== null);
|
|
346
|
+
}
|
|
347
|
+
function describeArg(description) {
|
|
348
|
+
const copy = {
|
|
349
|
+
type: description.type,
|
|
350
|
+
optional: description.optional,
|
|
351
|
+
positional: description.positional,
|
|
352
|
+
};
|
|
353
|
+
for (const field of [
|
|
354
|
+
"about",
|
|
355
|
+
"secret",
|
|
356
|
+
"max",
|
|
357
|
+
"min",
|
|
358
|
+
"integer",
|
|
359
|
+
"options",
|
|
360
|
+
"collection",
|
|
361
|
+
]) {
|
|
362
|
+
if (description[field] !== undefined) {
|
|
363
|
+
copy[field] = description[field];
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
if (description.of !== undefined) {
|
|
367
|
+
copy.of = describeArg(description.of);
|
|
368
|
+
}
|
|
369
|
+
return copy;
|
|
370
|
+
}
|
|
371
|
+
function describeOperation(operation) {
|
|
372
|
+
return {
|
|
373
|
+
about: operation.about,
|
|
374
|
+
args: Object.fromEntries(Object.entries(operation.args).map(([name, definition]) => [name, describeArg(definition)])),
|
|
375
|
+
roles: operation.roles,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/** The definition as JSON, functions and schemas left behind. */
|
|
379
|
+
export function describePlugin(definition) {
|
|
380
|
+
return {
|
|
381
|
+
pluginApi: definition.pluginApi,
|
|
382
|
+
collections: definition.collections.map((collection) => ({
|
|
383
|
+
name: collection.name,
|
|
384
|
+
indexes: [...collection.indexes],
|
|
385
|
+
search: [...collection.search],
|
|
386
|
+
owner: collection.owner,
|
|
387
|
+
project: collection.project,
|
|
388
|
+
read: [...collection.read],
|
|
389
|
+
readOwn: [...collection.readOwn],
|
|
390
|
+
history: collection.history,
|
|
391
|
+
})),
|
|
392
|
+
commands: Object.fromEntries(Object.entries(definition.commands).map(([name, command]) => [
|
|
393
|
+
name,
|
|
394
|
+
describeOperation(command),
|
|
395
|
+
])),
|
|
396
|
+
queries: Object.fromEntries(Object.entries(definition.queries).map(([name, query]) => [name, describeOperation(query)])),
|
|
397
|
+
endpoints: Object.fromEntries(Object.entries(definition.endpoints).map(([name, endpoint]) => [
|
|
398
|
+
name,
|
|
399
|
+
{
|
|
400
|
+
auth: endpoint.auth,
|
|
401
|
+
roles: endpoint.roles,
|
|
402
|
+
secret: endpoint.secret,
|
|
403
|
+
methods: [...endpoint.methods],
|
|
404
|
+
headers: [...endpoint.headers],
|
|
405
|
+
},
|
|
406
|
+
])),
|
|
407
|
+
hooks: Object.keys(definition.on),
|
|
408
|
+
jobs: Object.fromEntries(Object.entries(definition.jobs).map(([name, job]) => [
|
|
409
|
+
name,
|
|
410
|
+
{ about: job.about, every: job.every, at: job.at ?? null },
|
|
411
|
+
])),
|
|
412
|
+
upgrades: definition.upgrades.map((upgrade) => ({ to: upgrade.to, about: upgrade.about })),
|
|
413
|
+
api: Object.fromEntries(Object.entries(definition.api).map(([name, call]) => [name, { about: call.about }])),
|
|
414
|
+
onEnable: definition.onEnable !== null,
|
|
415
|
+
onDisable: definition.onDisable !== null,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
/** What a manifest must declare for a description to hold: the problems, or none. */
|
|
419
|
+
export function descriptionProblems(description, manifest) {
|
|
420
|
+
const problems = [];
|
|
421
|
+
const roles = Object.keys(manifest.roles);
|
|
422
|
+
const collections = new Set(description.collections.map((collection) => collection.name));
|
|
423
|
+
const undeclared = (where, named) => {
|
|
424
|
+
for (const role of named ?? []) {
|
|
425
|
+
if (!roles.includes(role)) {
|
|
426
|
+
problems.push(`${where} names the role ${role}, which the manifest does not declare`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
const needs = (where, capability) => {
|
|
431
|
+
if (!manifest.capabilities.includes(capability)) {
|
|
432
|
+
problems.push(`${where} needs the capability ${capability}, which the manifest does not declare`);
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
for (const collection of description.collections) {
|
|
436
|
+
undeclared(`the collection ${collection.name}'s read`, collection.read);
|
|
437
|
+
undeclared(`the collection ${collection.name}'s readOwn`, collection.readOwn);
|
|
438
|
+
}
|
|
439
|
+
const checkArgs = (where, args) => {
|
|
440
|
+
for (const [name, description] of Object.entries(args)) {
|
|
441
|
+
const inner = description.type === "list" ? description.of : description;
|
|
442
|
+
if (inner?.type === "record" &&
|
|
443
|
+
inner.collection !== undefined &&
|
|
444
|
+
!collections.has(inner.collection)) {
|
|
445
|
+
problems.push(`${where}'s argument ${name} names the collection ${inner.collection}, which is not defined`);
|
|
446
|
+
}
|
|
447
|
+
if (inner?.type === "file") {
|
|
448
|
+
needs(`${where}'s argument ${name}`, "files");
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
};
|
|
452
|
+
for (const [name, command] of Object.entries(description.commands)) {
|
|
453
|
+
undeclared(`the command ${name}`, command.roles);
|
|
454
|
+
checkArgs(`the command ${name}`, command.args);
|
|
455
|
+
}
|
|
456
|
+
for (const [name, query] of Object.entries(description.queries)) {
|
|
457
|
+
undeclared(`the query ${name}`, query.roles);
|
|
458
|
+
checkArgs(`the query ${name}`, query.args);
|
|
459
|
+
}
|
|
460
|
+
for (const [name, endpoint] of Object.entries(description.endpoints)) {
|
|
461
|
+
needs(`the endpoint ${name}`, "endpoints");
|
|
462
|
+
undeclared(`the endpoint ${name}`, endpoint.roles);
|
|
463
|
+
if (endpoint.secret !== null) {
|
|
464
|
+
const setting = manifest.settings.find((candidate) => candidate.key === endpoint.secret);
|
|
465
|
+
if (setting === undefined || setting.type !== "secret") {
|
|
466
|
+
problems.push(`the endpoint ${name} verifies with the setting ${endpoint.secret}, which is not a secret setting of the manifest`);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
for (const hook of description.hooks) {
|
|
471
|
+
needs(`the hook ${hook}`, hook.startsWith("console:") ? "events:console" : "events:plugins");
|
|
472
|
+
}
|
|
473
|
+
for (const name of Object.keys(description.jobs)) {
|
|
474
|
+
needs(`the job ${name}`, "jobs");
|
|
475
|
+
}
|
|
476
|
+
const reached = description.upgrades.at(-1)?.to ?? 1;
|
|
477
|
+
if (reached !== manifest.dataVersion) {
|
|
478
|
+
problems.push(`the manifest's dataVersion is ${manifest.dataVersion} and the upgrades reach ${reached}: an upgrade brings the records to every version after 1`);
|
|
479
|
+
}
|
|
480
|
+
return problems;
|
|
481
|
+
}
|
|
482
|
+
//# sourceMappingURL=define.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/plugin/define.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `definePlugin` and its definers throw when a definition is not one the console can hold: a
|
|
3
|
+
* name that is not a key, a command named as a subcommand, more of something than the bound. It
|
|
4
|
+
* is thrown when the server module loads, so that a plugin's own tests and `console-plugin check`
|
|
5
|
+
* meet it before any console does; `problems` names every one found.
|
|
6
|
+
*/
|
|
7
|
+
export declare class PluginDefinitionError extends Error {
|
|
8
|
+
readonly problems: readonly string[];
|
|
9
|
+
constructor(problems: readonly string[]);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=definition-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-error.d.ts","sourceRoot":"","sources":["../../src/plugin/definition-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAErC,YAAY,QAAQ,EAAE,SAAS,MAAM,EAAE,EAQtC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `definePlugin` and its definers throw when a definition is not one the console can hold: a
|
|
3
|
+
* name that is not a key, a command named as a subcommand, more of something than the bound. It
|
|
4
|
+
* is thrown when the server module loads, so that a plugin's own tests and `console-plugin check`
|
|
5
|
+
* meet it before any console does; `problems` names every one found.
|
|
6
|
+
*/
|
|
7
|
+
export class PluginDefinitionError extends Error {
|
|
8
|
+
problems;
|
|
9
|
+
constructor(problems) {
|
|
10
|
+
super(problems.length === 1
|
|
11
|
+
? `the plugin's definition is invalid: ${problems[0]}`
|
|
12
|
+
: `the plugin's definition is invalid:\n${problems.map((problem) => ` - ${problem}`).join("\n")}`);
|
|
13
|
+
this.name = "PluginDefinitionError";
|
|
14
|
+
this.problems = problems;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=definition-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definition-error.js","sourceRoot":"","sources":["../../src/plugin/definition-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IACrC,QAAQ,CAAoB;IAErC,YAAY,QAA2B;QACrC,KAAK,CACH,QAAQ,CAAC,MAAM,KAAK,CAAC;YACnB,CAAC,CAAC,uCAAuC,QAAQ,CAAC,CAAC,CAAC,EAAE;YACtD,CAAC,CAAC,wCAAwC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/** A plugin's name in one language, its description, and the sentence agents read with the rules. */
|
|
2
|
+
export declare const MAX_PLUGIN_NAME_LENGTH = 40;
|
|
3
|
+
export declare const MAX_PLUGIN_DESCRIPTION_LENGTH = 200;
|
|
4
|
+
export declare const MAX_PLUGIN_AGENT_NOTE_LENGTH = 200;
|
|
5
|
+
/** A plugin's key, a role's, a page's, a widget's, a setting's, a collection's, a command's: `^[a-z][a-z0-9-]{1,31}$`. */
|
|
6
|
+
export declare const MAX_PLUGIN_KEY_LENGTH = 32;
|
|
7
|
+
/** How many roles, settings, pages and widgets one manifest declares. */
|
|
8
|
+
export declare const MAX_PLUGIN_ROLES = 10;
|
|
9
|
+
export declare const MAX_PLUGIN_SETTINGS = 50;
|
|
10
|
+
export declare const MAX_PLUGIN_PAGES = 12;
|
|
11
|
+
export declare const MAX_PLUGIN_WIDGETS = 4;
|
|
12
|
+
/** How many collections, commands and queries together, endpoints, and indexes of one collection a server module defines. */
|
|
13
|
+
export declare const MAX_PLUGIN_COLLECTIONS = 50;
|
|
14
|
+
export declare const MAX_PLUGIN_OPERATIONS = 100;
|
|
15
|
+
export declare const MAX_PLUGIN_ENDPOINTS = 20;
|
|
16
|
+
export declare const MAX_PLUGIN_INDEXES = 8;
|
|
17
|
+
/** One line about a command, a query, a job or an argument, as help prints it. */
|
|
18
|
+
export declare const MAX_PLUGIN_ABOUT_LENGTH = 200;
|
|
19
|
+
/** The options of an `enum` setting or argument. */
|
|
20
|
+
export declare const MAX_PLUGIN_OPTIONS = 50;
|
|
21
|
+
/** A record, how many a plugin keeps, and how many versions one record keeps. */
|
|
22
|
+
export declare const MAX_PLUGIN_RECORD_BYTES: number;
|
|
23
|
+
export declare const MAX_PLUGIN_RECORDS = 100000;
|
|
24
|
+
export declare const MAX_PLUGIN_RECORD_VERSIONS = 100;
|
|
25
|
+
/** A message between the host and the parent, a query's answer, an endpoint's answer. */
|
|
26
|
+
export declare const MAX_PLUGIN_MESSAGE_BYTES: number;
|
|
27
|
+
/** What an endpoint takes in. */
|
|
28
|
+
export declare const MAX_PLUGIN_ENDPOINT_BODY_BYTES: number;
|
|
29
|
+
/** The words of one command line sent to `invoke`, and the characters of one word. */
|
|
30
|
+
export declare const MAX_PLUGIN_ARGV_WORDS = 200;
|
|
31
|
+
export declare const MAX_PLUGIN_ARGV_WORD_LENGTH = 50000;
|
|
32
|
+
/** The files one command takes at once. */
|
|
33
|
+
export declare const MAX_PLUGIN_COMMAND_FILES = 20;
|
|
34
|
+
/** An event of the plugin's own, how many are kept, and for how long. */
|
|
35
|
+
export declare const MAX_PLUGIN_EVENT_BYTES: number;
|
|
36
|
+
export declare const PLUGIN_EVENTS_KEPT = 100000;
|
|
37
|
+
export declare const PLUGIN_EVENT_DAYS = 90;
|
|
38
|
+
/** How many records one page of a list carries at most. */
|
|
39
|
+
export declare const PLUGIN_LIST_LIMIT = 200;
|
|
40
|
+
/** How long plugin code may run: a command; a query or an endpoint; a hook; a job; `onEnable`, `onDisable` and an upgrade. */
|
|
41
|
+
export declare const PLUGIN_COMMAND_MS = 30000;
|
|
42
|
+
export declare const PLUGIN_QUERY_MS = 10000;
|
|
43
|
+
export declare const PLUGIN_ENDPOINT_MS = 10000;
|
|
44
|
+
export declare const PLUGIN_HOOK_MS = 30000;
|
|
45
|
+
export declare const PLUGIN_JOB_MS: number;
|
|
46
|
+
export declare const PLUGIN_LIFECYCLE_MS: number;
|
|
47
|
+
/** A job runs no more often than this. */
|
|
48
|
+
export declare const MIN_PLUGIN_JOB_INTERVAL_MS: number;
|
|
49
|
+
/** Outbound requests a minute per plugin, the bytes of an answer, and its time. */
|
|
50
|
+
export declare const PLUGIN_OUTBOUND_PER_MINUTE = 60;
|
|
51
|
+
export declare const MAX_PLUGIN_OUTBOUND_BYTES: number;
|
|
52
|
+
export declare const PLUGIN_OUTBOUND_MS = 10000;
|
|
53
|
+
/** Webhook requests a minute per plugin. */
|
|
54
|
+
export declare const PLUGIN_WEBHOOKS_PER_MINUTE = 600;
|
|
55
|
+
/** Lines `ctx.log` writes a minute. */
|
|
56
|
+
export declare const PLUGIN_LOG_LINES_PER_MINUTE = 100;
|
|
57
|
+
/** SQL, with `storage:sql`: a statement's time, a result's rows, the connections of the plugin's role. */
|
|
58
|
+
export declare const PLUGIN_SQL_STATEMENT_MS = 10000;
|
|
59
|
+
export declare const MAX_PLUGIN_SQL_ROWS = 10000;
|
|
60
|
+
export declare const PLUGIN_SQL_CONNECTIONS = 4;
|
|
61
|
+
/** The memory a plugin's thread may hold, in megabytes, where the deployment says nothing. */
|
|
62
|
+
export declare const DEFAULT_PLUGIN_MEMORY_MB = 256;
|
|
63
|
+
/** How tall a widget's frame may grow, in pixels. */
|
|
64
|
+
export declare const MAX_PLUGIN_WIDGET_HEIGHT = 480;
|
|
65
|
+
/** How many retries a hook gets before its event is skipped with a `plugin.failed` event. */
|
|
66
|
+
export declare const PLUGIN_HOOK_RETRIES = 5;
|
|
67
|
+
//# sourceMappingURL=limits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/plugin/limits.ts"],"names":[],"mappings":"AAIA,qGAAqG;AACrG,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,6BAA6B,MAAM,CAAC;AACjD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAChD,0HAA0H;AAC1H,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,6HAA6H;AAC7H,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,kBAAkB,IAAI,CAAC;AACpC,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AACrC,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,QAAY,CAAC;AACjD,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAC1C,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,yFAAyF;AACzF,eAAO,MAAM,wBAAwB,QAAkB,CAAC;AACxD,iCAAiC;AACjC,eAAO,MAAM,8BAA8B,QAAc,CAAC;AAC1D,sFAAsF;AACtF,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAClD,2CAA2C;AAC3C,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,yEAAyE;AACzE,eAAO,MAAM,sBAAsB,QAAY,CAAC;AAChD,eAAO,MAAM,kBAAkB,SAAU,CAAC;AAC1C,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,2DAA2D;AAC3D,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,8HAA8H;AAC9H,eAAO,MAAM,iBAAiB,QAAS,CAAC;AACxC,eAAO,MAAM,eAAe,QAAS,CAAC;AACtC,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,cAAc,QAAS,CAAC;AACrC,eAAO,MAAM,aAAa,QAAa,CAAC;AACxC,eAAO,MAAM,mBAAmB,QAAc,CAAC;AAC/C,0CAA0C;AAC1C,eAAO,MAAM,0BAA0B,QAAa,CAAC;AACrD,mFAAmF;AACnF,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAC1D,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,4CAA4C;AAC5C,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,uCAAuC;AACvC,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,0GAA0G;AAC1G,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAC1C,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,8FAA8F;AAC9F,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,qDAAqD;AACrD,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,6FAA6F;AAC7F,eAAO,MAAM,mBAAmB,IAAI,CAAC"}
|