initiative-plugin-sdk 4.0.0 → 4.1.1
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/LICENSE +1 -1
- package/README.md +11 -1
- package/dist/build.d.ts +33 -3
- package/dist/build.js +44 -7
- package/dist/build.js.map +1 -1
- package/dist/cli.d.ts +4 -3
- package/dist/cli.js +10 -8
- package/dist/cli.js.map +1 -1
- package/dist/pack.d.ts +4 -2
- package/dist/pack.js +4 -5
- package/dist/pack.js.map +1 -1
- package/manifest.contract.json +1 -1
- package/package.json +4 -4
- package/schemas/env-contract.json +1 -1
- package/schemas/plugin-manifest.json +1 -1
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# initiative-plugin-sdk
|
|
2
2
|
|
|
3
|
-
Build a plug-in for [Initiative](https://github.com/
|
|
3
|
+
Build a plug-in for [Initiative](https://github.com/beyonders-studio/initiative): a
|
|
4
4
|
service that reads and writes a community's content, answers Initiative's
|
|
5
5
|
calls, and draws tiles on its dashboards.
|
|
6
6
|
|
|
@@ -436,6 +436,16 @@ while `listing.version` is the package's own version: between releases the
|
|
|
436
436
|
package runs ahead of its listing, and a new version is listed at its release,
|
|
437
437
|
with its image's digest. The registry's CI checks and signs what is merged.
|
|
438
438
|
|
|
439
|
+
A plug-in written in another language builds its manifest itself and hands the
|
|
440
|
+
SDK a JSON file in place of `src/plugin.ts`: its `publicId`, `uid` and `name`,
|
|
441
|
+
its `manifest`, and its `listing` as declared above. The manifest is checked as
|
|
442
|
+
a definition's is, and the listing states the version it lists:
|
|
443
|
+
|
|
444
|
+
```sh
|
|
445
|
+
npx initiative-plugin build --manifest plugin.json --registry ../registry/sources
|
|
446
|
+
npx initiative-plugin pack --manifest plugin.json
|
|
447
|
+
```
|
|
448
|
+
|
|
439
449
|
A self-hosted deployment can also publish a plug-in that is in no registry, from
|
|
440
450
|
its listing file: see [A private plug-in](#a-private-plug-in).
|
|
441
451
|
|
package/dist/build.d.ts
CHANGED
|
@@ -15,16 +15,24 @@
|
|
|
15
15
|
* With `--check` nothing is written, and any file that differs from what would
|
|
16
16
|
* be written is a failure.
|
|
17
17
|
*
|
|
18
|
+
* A plug-in built outside TypeScript gives `--manifest <file>` in place of its
|
|
19
|
+
* definition: a JSON file holding its manifest and its listing
|
|
20
|
+
* ({@link BuiltPlugin}). It is checked as a definition's manifest is, and its
|
|
21
|
+
* registry source is written from its listing, which states the version it
|
|
22
|
+
* lists; no `manifest.json` is written beside it.
|
|
23
|
+
*
|
|
18
24
|
* Bundling uses esbuild, which the plug-in installs beside the SDK
|
|
19
25
|
* (`npm install --save-dev esbuild`). Nothing at run time needs it.
|
|
20
26
|
*/
|
|
21
|
-
import { type AnyPlugin } from "./define.js";
|
|
27
|
+
import { type AnyPlugin, type ListingDeclaration } from "./define.js";
|
|
22
28
|
import type { Manifest } from "./contract.js";
|
|
23
29
|
export interface BuildOptions {
|
|
24
30
|
/** The plug-in's package directory. */
|
|
25
31
|
root: string;
|
|
26
32
|
/** The module whose default export is the plug-in's definition, relative to `root`. */
|
|
27
33
|
plugin: string;
|
|
34
|
+
/** A plug-in built outside TypeScript, in place of `plugin`: its {@link BuiltPlugin} file, relative to `root`. */
|
|
35
|
+
manifest?: string;
|
|
28
36
|
/** Where registry sources live; the plug-in's is written under `<publisher>/<uid>/`. */
|
|
29
37
|
registry?: string;
|
|
30
38
|
check: boolean;
|
|
@@ -32,14 +40,36 @@ export interface BuildOptions {
|
|
|
32
40
|
type Esbuild = typeof import("esbuild");
|
|
33
41
|
/** esbuild, or null after saying how to install it. */
|
|
34
42
|
export declare function bundler(command: string): Promise<Esbuild | null>;
|
|
43
|
+
/**
|
|
44
|
+
* A plug-in whose manifest is built outside TypeScript, as `--manifest` reads
|
|
45
|
+
* it: what a definition names beside its manifest, and the manifest itself.
|
|
46
|
+
*/
|
|
47
|
+
export interface BuiltPlugin {
|
|
48
|
+
publicId: string;
|
|
49
|
+
uid: string;
|
|
50
|
+
name: string;
|
|
51
|
+
manifest: Manifest;
|
|
52
|
+
listing?: ListingDeclaration;
|
|
53
|
+
}
|
|
54
|
+
/** What the listing writers read of a plug-in: its definition, or a {@link BuiltPlugin}'s. */
|
|
55
|
+
export type ListedPlugin = Pick<AnyPlugin, "publicId" | "uid" | "name" | "scopes" | "hosts" | "hooks" | "listing">;
|
|
35
56
|
/** What a definition builds: the plug-in and its manifest, or every problem that stops it. */
|
|
36
57
|
export type Compiled = {
|
|
37
|
-
plugin:
|
|
58
|
+
plugin: ListedPlugin;
|
|
38
59
|
manifest: Manifest;
|
|
39
60
|
problems?: never;
|
|
40
61
|
} | {
|
|
41
62
|
problems: string[];
|
|
42
63
|
};
|
|
64
|
+
/**
|
|
65
|
+
* The plug-in `options` names, compiled: from its definition, or from the
|
|
66
|
+
* {@link BuiltPlugin} file `options.manifest` names. Null when its definition
|
|
67
|
+
* needs esbuild and it is not installed.
|
|
68
|
+
*/
|
|
69
|
+
export declare function load(command: string, root: string, options: {
|
|
70
|
+
plugin: string;
|
|
71
|
+
manifest?: string;
|
|
72
|
+
}): Promise<Compiled | null>;
|
|
43
73
|
/**
|
|
44
74
|
* Load the plug-in's definition, bundle its widgets and check the manifest they
|
|
45
75
|
* make, with nothing written.
|
|
@@ -48,5 +78,5 @@ export declare function compile(esbuild: Esbuild, root: string, entry: string):
|
|
|
48
78
|
/** Build, or check, the plug-in's files. Answers the process's exit code. */
|
|
49
79
|
export declare function build(options: BuildOptions): Promise<number>;
|
|
50
80
|
/** A listing's registration: the plug-in's kind, and a container's image and Compose service. */
|
|
51
|
-
export declare function registrationOf(plugin:
|
|
81
|
+
export declare function registrationOf(plugin: ListedPlugin): Record<string, unknown>;
|
|
52
82
|
export {};
|
package/dist/build.js
CHANGED
|
@@ -15,6 +15,12 @@
|
|
|
15
15
|
* With `--check` nothing is written, and any file that differs from what would
|
|
16
16
|
* be written is a failure.
|
|
17
17
|
*
|
|
18
|
+
* A plug-in built outside TypeScript gives `--manifest <file>` in place of its
|
|
19
|
+
* definition: a JSON file holding its manifest and its listing
|
|
20
|
+
* ({@link BuiltPlugin}). It is checked as a definition's manifest is, and its
|
|
21
|
+
* registry source is written from its listing, which states the version it
|
|
22
|
+
* lists; no `manifest.json` is written beside it.
|
|
23
|
+
*
|
|
18
24
|
* Bundling uses esbuild, which the plug-in installs beside the SDK
|
|
19
25
|
* (`npm install --save-dev esbuild`). Nothing at run time needs it.
|
|
20
26
|
*/
|
|
@@ -35,6 +41,33 @@ export async function bundler(command) {
|
|
|
35
41
|
return null;
|
|
36
42
|
}
|
|
37
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* The plug-in `options` names, compiled: from its definition, or from the
|
|
46
|
+
* {@link BuiltPlugin} file `options.manifest` names. Null when its definition
|
|
47
|
+
* needs esbuild and it is not installed.
|
|
48
|
+
*/
|
|
49
|
+
export async function load(command, root, options) {
|
|
50
|
+
if (options.manifest !== undefined)
|
|
51
|
+
return compileBuilt(root, options.manifest);
|
|
52
|
+
const esbuild = await bundler(command);
|
|
53
|
+
return esbuild ? compile(esbuild, root, options.plugin) : null;
|
|
54
|
+
}
|
|
55
|
+
/** A {@link BuiltPlugin} file, checked as a definition's manifest is. */
|
|
56
|
+
function compileBuilt(root, file) {
|
|
57
|
+
let built;
|
|
58
|
+
try {
|
|
59
|
+
built = JSON.parse(readFileSync(resolve(root, file), "utf-8"));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
return { problems: [`${file}: ${error.message}`] };
|
|
63
|
+
}
|
|
64
|
+
const missing = ["publicId", "uid", "name"].filter((key) => typeof built[key] !== "string");
|
|
65
|
+
if (missing.length || typeof built.manifest !== "object" || built.manifest === null) {
|
|
66
|
+
return { problems: [`${file}: a built plug-in names its ${[...missing, "manifest"].join(", ")}`] };
|
|
67
|
+
}
|
|
68
|
+
const { manifest, ...named } = built;
|
|
69
|
+
return checked({ ...named, scopes: manifest.service?.scopes, hosts: manifest.hosts }, manifest, []);
|
|
70
|
+
}
|
|
38
71
|
/**
|
|
39
72
|
* Load the plug-in's definition, bundle its widgets and check the manifest they
|
|
40
73
|
* make, with nothing written.
|
|
@@ -51,7 +84,10 @@ export async function compile(esbuild, root, entry) {
|
|
|
51
84
|
}
|
|
52
85
|
modules[id] = source;
|
|
53
86
|
}
|
|
54
|
-
|
|
87
|
+
return checked(plugin, manifestOf(plugin, modules), problems);
|
|
88
|
+
}
|
|
89
|
+
/** The plug-in and its manifest, or every problem with them beside `problems`. */
|
|
90
|
+
function checked(plugin, manifest, problems) {
|
|
55
91
|
problems.push(...validateManifest(manifest, { publicId: plugin.publicId }).map((problem) => `manifest${problem.where}: ${problem.message}`));
|
|
56
92
|
problems.push(...kindProblems(plugin));
|
|
57
93
|
if (plugin.listing?.compose)
|
|
@@ -60,11 +96,10 @@ export async function compile(esbuild, root, entry) {
|
|
|
60
96
|
}
|
|
61
97
|
/** Build, or check, the plug-in's files. Answers the process's exit code. */
|
|
62
98
|
export async function build(options) {
|
|
63
|
-
const esbuild = await bundler("build");
|
|
64
|
-
if (!esbuild)
|
|
65
|
-
return 1;
|
|
66
99
|
const root = resolve(options.root);
|
|
67
|
-
const compiled = await
|
|
100
|
+
const compiled = await load("build", root, options);
|
|
101
|
+
if (!compiled)
|
|
102
|
+
return 1;
|
|
68
103
|
if (compiled.problems) {
|
|
69
104
|
for (const problem of compiled.problems)
|
|
70
105
|
process.stderr.write(`${problem}\n`);
|
|
@@ -72,14 +107,16 @@ export async function build(options) {
|
|
|
72
107
|
}
|
|
73
108
|
const { plugin, manifest } = compiled;
|
|
74
109
|
const manifestText = `${JSON.stringify(manifest, null, 2)}\n`;
|
|
75
|
-
const outputs = [[join(root, "manifest.json"), manifestText]];
|
|
110
|
+
const outputs = options.manifest === undefined ? [[join(root, "manifest.json"), manifestText]] : [];
|
|
76
111
|
if (options.registry !== undefined) {
|
|
77
112
|
const listing = plugin.listing;
|
|
78
113
|
if (!listing) {
|
|
79
114
|
process.stderr.write("--registry was given, but the plug-in declares no listing\n");
|
|
80
115
|
return 1;
|
|
81
116
|
}
|
|
82
|
-
const version =
|
|
117
|
+
const version = options.manifest === undefined
|
|
118
|
+
? JSON.parse(readFileSync(join(root, "package.json"), "utf-8")).version
|
|
119
|
+
: listing.version;
|
|
83
120
|
if (version === listing.version) {
|
|
84
121
|
const avatar = readFileSync(resolve(root, listing.avatar));
|
|
85
122
|
const source = resolve(root, options.registry, listing.publisher, plugin.uid);
|
package/dist/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* manifest checks.
|
|
5
5
|
*
|
|
6
6
|
* initiative-plugin init [dir] [--example minimal]
|
|
7
|
-
* initiative-plugin build [--plugin <file>] [--registry <dir>] [--check]
|
|
8
|
-
* initiative-plugin pack [--plugin <file>] [--out <file>]
|
|
7
|
+
* initiative-plugin build [--plugin <file> | --manifest <file>] [--registry <dir>] [--check]
|
|
8
|
+
* initiative-plugin pack [--plugin <file> | --manifest <file>] [--out <file>]
|
|
9
9
|
* initiative-plugin dev --initiative <url> [--api-key <key>] [--plugin <file>]
|
|
10
10
|
* initiative-plugin keygen [--alg RS256|ES256] [--kid <id>] [--out <dir>]
|
|
11
11
|
* initiative-plugin validate <file.json> a manifest, or a served manifest document
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
*
|
|
15
15
|
* `build` reads the plug-in's definition (default `src/plugin.ts`) and writes
|
|
16
16
|
* `manifest.json`, and with `--registry` the plug-in's registry source; see
|
|
17
|
-
* `build.ts
|
|
17
|
+
* `build.ts`; `--manifest` names a plug-in built outside TypeScript in place of
|
|
18
|
+
* its definition. `pack` writes the plug-in's listing file, which a self-hosted
|
|
18
19
|
* deployment publishes as its own plug-in (`pack.ts`), and `dev` uploads it to one
|
|
19
20
|
* and again on each change (`dev.ts`); its key may be given as
|
|
20
21
|
* `INITIATIVE_API_KEY` instead. `init` copies an example (`init.ts`).
|
package/dist/cli.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
* manifest checks.
|
|
5
5
|
*
|
|
6
6
|
* initiative-plugin init [dir] [--example minimal]
|
|
7
|
-
* initiative-plugin build [--plugin <file>] [--registry <dir>] [--check]
|
|
8
|
-
* initiative-plugin pack [--plugin <file>] [--out <file>]
|
|
7
|
+
* initiative-plugin build [--plugin <file> | --manifest <file>] [--registry <dir>] [--check]
|
|
8
|
+
* initiative-plugin pack [--plugin <file> | --manifest <file>] [--out <file>]
|
|
9
9
|
* initiative-plugin dev --initiative <url> [--api-key <key>] [--plugin <file>]
|
|
10
10
|
* initiative-plugin keygen [--alg RS256|ES256] [--kid <id>] [--out <dir>]
|
|
11
11
|
* initiative-plugin validate <file.json> a manifest, or a served manifest document
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
*
|
|
15
15
|
* `build` reads the plug-in's definition (default `src/plugin.ts`) and writes
|
|
16
16
|
* `manifest.json`, and with `--registry` the plug-in's registry source; see
|
|
17
|
-
* `build.ts
|
|
17
|
+
* `build.ts`; `--manifest` names a plug-in built outside TypeScript in place of
|
|
18
|
+
* its definition. `pack` writes the plug-in's listing file, which a self-hosted
|
|
18
19
|
* deployment publishes as its own plug-in (`pack.ts`), and `dev` uploads it to one
|
|
19
20
|
* and again on each change (`dev.ts`); its key may be given as
|
|
20
21
|
* `INITIATIVE_API_KEY` instead. `init` copies an example (`init.ts`).
|
|
@@ -33,8 +34,8 @@ function usage() {
|
|
|
33
34
|
process.stderr.write([
|
|
34
35
|
"usage:",
|
|
35
36
|
" initiative-plugin init [dir] [--example minimal]",
|
|
36
|
-
" initiative-plugin build [--plugin <file>] [--registry <dir>] [--check]",
|
|
37
|
-
" initiative-plugin pack [--plugin <file>] [--out <file>]",
|
|
37
|
+
" initiative-plugin build [--plugin <file> | --manifest <file>] [--registry <dir>] [--check]",
|
|
38
|
+
" initiative-plugin pack [--plugin <file> | --manifest <file>] [--out <file>]",
|
|
38
39
|
" initiative-plugin dev --initiative <url> [--api-key <key>] [--plugin <file>]",
|
|
39
40
|
" initiative-plugin keygen [--alg RS256|ES256] [--kid <id>] [--out <dir>]",
|
|
40
41
|
" initiative-plugin validate <file.json>",
|
|
@@ -121,17 +122,18 @@ async function main(argv) {
|
|
|
121
122
|
return init({ dir, example: options.example ?? "minimal" });
|
|
122
123
|
}
|
|
123
124
|
case "build": {
|
|
124
|
-
const options = flags(rest, ["plugin", "registry"], ["check"]);
|
|
125
|
+
const options = flags(rest, ["plugin", "manifest", "registry"], ["check"]);
|
|
125
126
|
return build({
|
|
126
127
|
root: process.cwd(),
|
|
127
128
|
plugin: typeof options.plugin === "string" ? options.plugin : "src/plugin.ts",
|
|
129
|
+
...(typeof options.manifest === "string" ? { manifest: options.manifest } : {}),
|
|
128
130
|
...(typeof options.registry === "string" ? { registry: options.registry } : {}),
|
|
129
131
|
check: options.check === true,
|
|
130
132
|
});
|
|
131
133
|
}
|
|
132
134
|
case "pack": {
|
|
133
|
-
const options = flags(rest, ["plugin", "out"]);
|
|
134
|
-
return pack({ root: process.cwd(), plugin: options.plugin ?? "src/plugin.ts", out: options.out });
|
|
135
|
+
const options = flags(rest, ["plugin", "manifest", "out"]);
|
|
136
|
+
return pack({ root: process.cwd(), plugin: options.plugin ?? "src/plugin.ts", manifest: options.manifest, out: options.out });
|
|
135
137
|
}
|
|
136
138
|
case "dev": {
|
|
137
139
|
const options = flags(rest, ["initiative", "api-key", "plugin"]);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAA2B,MAAM,WAAW,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEnF,SAAS,KAAK;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,QAAQ;QACR,oDAAoD;QACpD,8FAA8F;QAC9F,+EAA+E;QAC/E,gFAAgF;QAChF,2EAA2E;QAC3E,0CAA0C;QAC1C,4BAA4B;QAC5B,yBAAyB;QACzB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,sFAAsF;AACtF,SAAS,KAAK,CAAC,IAAc,EAAE,MAAgB,EAAE,QAAQ,GAAa,EAAE;IACtE,MAAM,GAAG,GAAkC,EAAE,CAAC;IAC9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAClE,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5B,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;;YAAM,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,MAAM,CAAC,IAAc;IAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAA2B,CAAC;IAC7E,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAuB,CAAC;IAC3D,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,wBAAwB,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;QACvC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,yCAAyC,CAAC,CAAC;YACvE,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACvF,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,SAAS,OAAO,mBAAmB;QACnC,SAAS,QAAQ,0EAA0E;QAC3F,QAAQ,IAAI,CAAC,GAAG,EAAE;QAClB,QAAQ,IAAI,CAAC,GAAG,EAAE;QAClB,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,IAAwB;IACxC,IAAI,CAAC,IAAI;QAAE,KAAK,EAAE,CAAC;IACnB,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,KAAM,KAAe,CAAC,OAAO,IAAI,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC;IACX,CAAC;IACD,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,YAAY,IAAI,IAAI,CAAC;IACnF,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,qCAAqC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC;QAC1G,OAAO,CAAC,CAAC;IACX,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IACtG,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAChC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACtE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAA2B,CAAC;YACnE,OAAO,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3E,OAAO,KAAK,CAAC;gBACX,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE;gBACnB,MAAM,EAAE,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe;gBAC7E,GAAG,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,GAAG,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,IAAI;aAC9B,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,CAA2B,CAAC;YACrF,OAAO,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,eAAe,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAChI,CAAC;QACD,KAAK,KAAK,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,QAAQ,CAAC,CAA2B,CAAC;YAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;YACpE,IAAI,CAAC,OAAO,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;gBACnC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2FAA2F,CAAC,CAAC;gBAClH,OAAO,CAAC,CAAC;YACX,CAAC;YACD,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,eAAe,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QACzH,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YACvE,OAAO,CAAC,CAAC;QACX,KAAK,KAAK;YACR,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX;YACE,KAAK,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/pack.d.ts
CHANGED
|
@@ -14,13 +14,15 @@
|
|
|
14
14
|
* and WebP; any other picture is left out, and the listing shows the
|
|
15
15
|
* deployment's default mark.
|
|
16
16
|
*/
|
|
17
|
+
import { type ListedPlugin } from "./build.js";
|
|
17
18
|
import type { Manifest } from "./contract.js";
|
|
18
|
-
import type { AnyPlugin } from "./define.js";
|
|
19
19
|
export interface PackOptions {
|
|
20
20
|
/** The plug-in's package directory. */
|
|
21
21
|
root: string;
|
|
22
22
|
/** The module whose default export is the plug-in's definition, relative to `root`. */
|
|
23
23
|
plugin: string;
|
|
24
|
+
/** A plug-in built outside TypeScript, in place of `plugin`: its `BuiltPlugin` file, relative to `root`. */
|
|
25
|
+
manifest?: string;
|
|
24
26
|
/** Where to write the listing file, relative to `root`. Default: `<publicId>-<version>.json`. */
|
|
25
27
|
out?: string;
|
|
26
28
|
}
|
|
@@ -30,6 +32,6 @@ export interface Packed {
|
|
|
30
32
|
avatar: Buffer | null;
|
|
31
33
|
}
|
|
32
34
|
/** The listing file for a plug-in whose manifest `compile` made. */
|
|
33
|
-
export declare function listingFile(plugin:
|
|
35
|
+
export declare function listingFile(plugin: ListedPlugin, manifest: Manifest, root: string): Packed;
|
|
34
36
|
/** Write the plug-in's listing file. Answers the process's exit code. */
|
|
35
37
|
export declare function pack(options: PackOptions): Promise<number>;
|
package/dist/pack.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import { createHash } from "node:crypto";
|
|
18
18
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
19
19
|
import { relative, resolve } from "node:path";
|
|
20
|
-
import {
|
|
20
|
+
import { load, registrationOf } from "./build.js";
|
|
21
21
|
/** Where a deployment serves the pictures uploaded for its listings. */
|
|
22
22
|
const MEDIA_PATH = "/api/v1/marketplace/media/";
|
|
23
23
|
const KEPT_PICTURES = /\.(png|jpe?g|gif|webp)$/i;
|
|
@@ -50,11 +50,10 @@ export function listingFile(plugin, manifest, root) {
|
|
|
50
50
|
}
|
|
51
51
|
/** Write the plug-in's listing file. Answers the process's exit code. */
|
|
52
52
|
export async function pack(options) {
|
|
53
|
-
const esbuild = await bundler("pack");
|
|
54
|
-
if (!esbuild)
|
|
55
|
-
return 1;
|
|
56
53
|
const root = resolve(options.root);
|
|
57
|
-
const compiled = await
|
|
54
|
+
const compiled = await load("pack", root, options);
|
|
55
|
+
if (!compiled)
|
|
56
|
+
return 1;
|
|
58
57
|
if (compiled.problems) {
|
|
59
58
|
for (const problem of compiled.problems)
|
|
60
59
|
process.stderr.write(`${problem}\n`);
|
package/dist/pack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../src/pack.ts"],"names":[],"mappings":"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"}
|
package/manifest.contract.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "The Initiative plug-in contract: the vocabulary a plug-in manifest draws on and the shape it takes. Hand-authored HERE, in the initiative-plugin-sdk repository, and nowhere else. Running `npm run generate` in that repository rewrites schemas/plugin-manifest.json and src/contract.ts from this file. Initiative vendors this file to derive its validator's constants and hold its normalizer to the field inventory; the copies under initiative's backend/vendor/plugin-kit and frontend/src/contract are refreshed by backend/scripts/refresh_plugin_kit.py and are not edited there. Edit this; never the generated output. A manifest describes a plug-in's API and nothing about how a consumer PRESENTS it: there is no term here for a control, a picker, a default or a bound, because what a step looks like on somebody's canvas is that consumer's to decide and ours to stay out of.",
|
|
3
3
|
"schema": {
|
|
4
|
-
"$id": "https://
|
|
4
|
+
"$id": "https://initiativetasks.com/schemas/plugin-manifest-v1.json",
|
|
5
5
|
"title": "Initiative plug-in manifest (the 'definition' body)",
|
|
6
6
|
"description": "What a plug-in declares it can do. A plug-in is a container, which names its `service` and answers Initiative's calls, or declarative, which names its `hosts` and no service, and whose endpoints, connection checks and webhook events Initiative runs itself from the requests and JSONata expressions written here; one plug-in is never both. This is the 'definition' field of the document served at /.well-known/initiative-plugin.json, NOT that whole document: a registrar also requires protocol_version, public_id and kind alongside it, and refuses a definition served bare. Generated from the platform's own validator vocabulary. A manifest that satisfies this schema is well-formed, not necessarily acceptable. Cross-references (the endpoint a widget binds, a requires term's connection, an endpoint's service prefix), the direction-specific rules on an endpoint, the features/blocks cross-check in both directions, UTF-8 byte-size caps, the rules tying a connection's flow and token to its scope and fields, what a webhooks block names, what a vendor setup writes to, whether every expression parses, what a declarative request and its steps name, and the bounds and unique ids of schedules are enforced by the platform on publish and are not expressible here."
|
|
7
7
|
},
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "initiative-plugin-sdk",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.1",
|
|
4
4
|
"description": "Build a plug-in for Initiative: one typed definition of its endpoints, hooks, schedules, widgets and listing, the server Initiative calls, the client it calls Initiative with, the CLI that builds its manifest, and declarative integrations Initiative runs from the manifest alone.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/
|
|
9
|
+
"url": "git+https://github.com/beyonders-studio/initiative-plugin-sdk.git"
|
|
10
10
|
},
|
|
11
|
-
"homepage": "https://github.com/
|
|
12
|
-
"bugs": "https://github.com/
|
|
11
|
+
"homepage": "https://github.com/beyonders-studio/initiative-plugin-sdk#readme",
|
|
12
|
+
"bugs": "https://github.com/beyonders-studio/initiative-plugin-sdk/issues",
|
|
13
13
|
"keywords": [
|
|
14
14
|
"initiative",
|
|
15
15
|
"plugin",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://
|
|
3
|
+
"$id": "https://initiativetasks.com/schemas/env-contract.json",
|
|
4
4
|
"title": "Initiative app deployment contract",
|
|
5
5
|
"description": "What an app requires of whoever deploys it, published as data at env-contract.json in the app's repository root.\n\nEvery app in the set publishes one, generated from its own settings declaration and committed — because whoever reads it has a checkout, not a build. A deployment tool reads these instead of parsing each app's source, which is how a setting enforced by a validator rather than by a missing default came to be absent from the Helm chart until 2026-09-23.\n\nThe classes exist because 'required' is the distinction that misleads. An app with 131 settings and 3 mandatory ones is easy to deploy; an app that presents all 131 as configuration is not, and they look identical until someone splits them up.",
|
|
6
6
|
"type": "object",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://
|
|
3
|
+
"$id": "https://initiativetasks.com/schemas/plugin-manifest-v1.json",
|
|
4
4
|
"title": "Initiative plug-in manifest (the 'definition' body)",
|
|
5
5
|
"description": "What a plug-in declares it can do. A plug-in is a container, which names its `service` and answers Initiative's calls, or declarative, which names its `hosts` and no service, and whose endpoints, connection checks and webhook events Initiative runs itself from the requests and JSONata expressions written here; one plug-in is never both. This is the 'definition' field of the document served at /.well-known/initiative-plugin.json, NOT that whole document: a registrar also requires protocol_version, public_id and kind alongside it, and refuses a definition served bare. Generated from the platform's own validator vocabulary. A manifest that satisfies this schema is well-formed, not necessarily acceptable. Cross-references (the endpoint a widget binds, a requires term's connection, an endpoint's service prefix), the direction-specific rules on an endpoint, the features/blocks cross-check in both directions, UTF-8 byte-size caps, the rules tying a connection's flow and token to its scope and fields, what a webhooks block names, what a vendor setup writes to, whether every expression parses, what a declarative request and its steps name, and the bounds and unique ids of schedules are enforced by the platform on publish and are not expressible here.",
|
|
6
6
|
"type": "object",
|