@intentic/providers 1.18.0
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 +21 -0
- package/README.md +26 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +72 -0
- package/dist/app.js.map +1 -0
- package/dist/authentik-api.d.ts +23 -0
- package/dist/authentik-api.d.ts.map +1 -0
- package/dist/authentik-api.js +67 -0
- package/dist/authentik-api.js.map +1 -0
- package/dist/authentik-client.d.ts +4 -0
- package/dist/authentik-client.d.ts.map +1 -0
- package/dist/authentik-client.js +50 -0
- package/dist/authentik-client.js.map +1 -0
- package/dist/authentik.d.ts +4 -0
- package/dist/authentik.d.ts.map +1 -0
- package/dist/authentik.js +132 -0
- package/dist/authentik.js.map +1 -0
- package/dist/backing-ssh.d.ts +8 -0
- package/dist/backing-ssh.d.ts.map +1 -0
- package/dist/backing-ssh.js +44 -0
- package/dist/backing-ssh.js.map +1 -0
- package/dist/backup-restore.d.ts +15 -0
- package/dist/backup-restore.d.ts.map +1 -0
- package/dist/backup-restore.js +49 -0
- package/dist/backup-restore.js.map +1 -0
- package/dist/backup.d.ts +4 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +150 -0
- package/dist/backup.js.map +1 -0
- package/dist/cf-route.d.ts +5 -0
- package/dist/cf-route.d.ts.map +1 -0
- package/dist/cf-route.js +74 -0
- package/dist/cf-route.js.map +1 -0
- package/dist/ci.d.ts +4 -0
- package/dist/ci.d.ts.map +1 -0
- package/dist/ci.js +151 -0
- package/dist/ci.js.map +1 -0
- package/dist/cloudflare-api.d.ts +85 -0
- package/dist/cloudflare-api.d.ts.map +1 -0
- package/dist/cloudflare-api.js +110 -0
- package/dist/cloudflare-api.js.map +1 -0
- package/dist/cloudflare.d.ts +4 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +29 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/deploy-hook.d.ts +4 -0
- package/dist/deploy-hook.d.ts.map +1 -0
- package/dist/deploy-hook.js +79 -0
- package/dist/deploy-hook.js.map +1 -0
- package/dist/deployment.d.ts +4 -0
- package/dist/deployment.d.ts.map +1 -0
- package/dist/deployment.js +103 -0
- package/dist/deployment.js.map +1 -0
- package/dist/discord-api.d.ts +31 -0
- package/dist/discord-api.d.ts.map +1 -0
- package/dist/discord-api.js +85 -0
- package/dist/discord-api.js.map +1 -0
- package/dist/discord.d.ts +4 -0
- package/dist/discord.d.ts.map +1 -0
- package/dist/discord.js +133 -0
- package/dist/discord.js.map +1 -0
- package/dist/forgejo-api.d.ts +209 -0
- package/dist/forgejo-api.d.ts.map +1 -0
- package/dist/forgejo-api.fake.d.ts +3 -0
- package/dist/forgejo-api.fake.d.ts.map +1 -0
- package/dist/forgejo-api.fake.js +31 -0
- package/dist/forgejo-api.fake.js.map +1 -0
- package/dist/forgejo-api.js +181 -0
- package/dist/forgejo-api.js.map +1 -0
- package/dist/forgejo-notify.d.ts +4 -0
- package/dist/forgejo-notify.d.ts.map +1 -0
- package/dist/forgejo-notify.js +103 -0
- package/dist/forgejo-notify.js.map +1 -0
- package/dist/forgejo-org.d.ts +4 -0
- package/dist/forgejo-org.d.ts.map +1 -0
- package/dist/forgejo-org.js +43 -0
- package/dist/forgejo-org.js.map +1 -0
- package/dist/forgejo-runner.d.ts +4 -0
- package/dist/forgejo-runner.d.ts.map +1 -0
- package/dist/forgejo-runner.js +111 -0
- package/dist/forgejo-runner.js.map +1 -0
- package/dist/forgejo-team.d.ts +4 -0
- package/dist/forgejo-team.d.ts.map +1 -0
- package/dist/forgejo-team.js +68 -0
- package/dist/forgejo-team.js.map +1 -0
- package/dist/forgejo-user.d.ts +4 -0
- package/dist/forgejo-user.d.ts.map +1 -0
- package/dist/forgejo-user.js +50 -0
- package/dist/forgejo-user.js.map +1 -0
- package/dist/forgejo.d.ts +4 -0
- package/dist/forgejo.d.ts.map +1 -0
- package/dist/forgejo.js +169 -0
- package/dist/forgejo.js.map +1 -0
- package/dist/garage-bucket.d.ts +4 -0
- package/dist/garage-bucket.d.ts.map +1 -0
- package/dist/garage-bucket.js +92 -0
- package/dist/garage-bucket.js.map +1 -0
- package/dist/garage.d.ts +4 -0
- package/dist/garage.d.ts.map +1 -0
- package/dist/garage.js +124 -0
- package/dist/garage.js.map +1 -0
- package/dist/gh-ci.d.ts +4 -0
- package/dist/gh-ci.d.ts.map +1 -0
- package/dist/gh-ci.js +153 -0
- package/dist/gh-ci.js.map +1 -0
- package/dist/gh-deployment.d.ts +4 -0
- package/dist/gh-deployment.d.ts.map +1 -0
- package/dist/gh-deployment.js +92 -0
- package/dist/gh-deployment.js.map +1 -0
- package/dist/gh-repo.d.ts +4 -0
- package/dist/gh-repo.d.ts.map +1 -0
- package/dist/gh-repo.js +52 -0
- package/dist/gh-repo.js.map +1 -0
- package/dist/github-api.d.ts +70 -0
- package/dist/github-api.d.ts.map +1 -0
- package/dist/github-api.js +120 -0
- package/dist/github-api.js.map +1 -0
- package/dist/github.d.ts +4 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +34 -0
- package/dist/github.js.map +1 -0
- package/dist/guarded-update.d.ts +14 -0
- package/dist/guarded-update.d.ts.map +1 -0
- package/dist/guarded-update.js +25 -0
- package/dist/guarded-update.js.map +1 -0
- package/dist/host.d.ts +4 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +48 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs.d.ts +23 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +34 -0
- package/dist/inputs.js.map +1 -0
- package/dist/komodo-api.d.ts +150 -0
- package/dist/komodo-api.d.ts.map +1 -0
- package/dist/komodo-api.js +104 -0
- package/dist/komodo-api.js.map +1 -0
- package/dist/komodo-notify.d.ts +4 -0
- package/dist/komodo-notify.d.ts.map +1 -0
- package/dist/komodo-notify.js +88 -0
- package/dist/komodo-notify.js.map +1 -0
- package/dist/komodo-periphery.d.ts +4 -0
- package/dist/komodo-periphery.d.ts.map +1 -0
- package/dist/komodo-periphery.js +92 -0
- package/dist/komodo-periphery.js.map +1 -0
- package/dist/komodo-server.d.ts +4 -0
- package/dist/komodo-server.d.ts.map +1 -0
- package/dist/komodo-server.js +54 -0
- package/dist/komodo-server.js.map +1 -0
- package/dist/komodo-user.d.ts +4 -0
- package/dist/komodo-user.d.ts.map +1 -0
- package/dist/komodo-user.js +66 -0
- package/dist/komodo-user.js.map +1 -0
- package/dist/komodo.d.ts +4 -0
- package/dist/komodo.d.ts.map +1 -0
- package/dist/komodo.js +222 -0
- package/dist/komodo.js.map +1 -0
- package/dist/postgres-database.d.ts +4 -0
- package/dist/postgres-database.d.ts.map +1 -0
- package/dist/postgres-database.js +88 -0
- package/dist/postgres-database.js.map +1 -0
- package/dist/postgres.d.ts +4 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +95 -0
- package/dist/postgres.js.map +1 -0
- package/dist/providers.d.ts +21 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +86 -0
- package/dist/providers.js.map +1 -0
- package/dist/repo.d.ts +4 -0
- package/dist/repo.d.ts.map +1 -0
- package/dist/repo.js +80 -0
- package/dist/repo.js.map +1 -0
- package/dist/signoz.d.ts +4 -0
- package/dist/signoz.d.ts.map +1 -0
- package/dist/signoz.js +386 -0
- package/dist/signoz.js.map +1 -0
- package/dist/ssh-probe.d.ts +5 -0
- package/dist/ssh-probe.d.ts.map +1 -0
- package/dist/ssh-probe.js +22 -0
- package/dist/ssh-probe.js.map +1 -0
- package/dist/ssh.d.ts +27 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +79 -0
- package/dist/ssh.js.map +1 -0
- package/dist/tunnel.d.ts +5 -0
- package/dist/tunnel.d.ts.map +1 -0
- package/dist/tunnel.js +126 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/valkey-namespace.d.ts +4 -0
- package/dist/valkey-namespace.d.ts.map +1 -0
- package/dist/valkey-namespace.js +78 -0
- package/dist/valkey-namespace.js.map +1 -0
- package/dist/valkey.d.ts +4 -0
- package/dist/valkey.d.ts.map +1 -0
- package/dist/valkey.js +94 -0
- package/dist/valkey.js.map +1 -0
- package/dist/workspace.d.ts +4 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +97 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { parseResponse } from "./inputs.js";
|
|
3
|
+
const headers = (token) => ({
|
|
4
|
+
Authorization: `Bearer ${token}`,
|
|
5
|
+
Accept: "application/vnd.github+json",
|
|
6
|
+
"X-GitHub-Api-Version": "2022-11-28",
|
|
7
|
+
});
|
|
8
|
+
const json = async (url, init) => {
|
|
9
|
+
const response = await fetch(url, init);
|
|
10
|
+
if (!response.ok) {
|
|
11
|
+
const body = await response.text().catch(() => "");
|
|
12
|
+
throw new Error(`GitHub API ${init.method ?? "GET"} ${url}: ${response.status} ${body}`);
|
|
13
|
+
}
|
|
14
|
+
if (response.status === 204) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return response.json();
|
|
18
|
+
};
|
|
19
|
+
const userSchema = z.object({ login: z.string() });
|
|
20
|
+
const repoSchema = z.object({ clone_url: z.string(), ssh_url: z.string(), full_name: z.string() });
|
|
21
|
+
const publicKeySchema = z.object({ key_id: z.string(), key: z.string() });
|
|
22
|
+
const contentSchema = z.object({ content: z.string(), sha: z.string() });
|
|
23
|
+
const BASE = "https://api.github.com";
|
|
24
|
+
export const githubApi = {
|
|
25
|
+
getAuthenticatedUser: async ({ token }) => {
|
|
26
|
+
const data = await json(`${BASE}/user`, { headers: headers(token) });
|
|
27
|
+
return parseResponse(userSchema, data, "GitHub /user");
|
|
28
|
+
},
|
|
29
|
+
findRepo: async ({ token, owner, name }) => {
|
|
30
|
+
const response = await fetch(`${BASE}/repos/${owner}/${name}`, { headers: headers(token) });
|
|
31
|
+
if (response.status === 404) {
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
throw new Error(`GitHub API GET /repos/${owner}/${name}: ${response.status}`);
|
|
36
|
+
}
|
|
37
|
+
const data = parseResponse(repoSchema, await response.json(), "GitHub /repos");
|
|
38
|
+
return { cloneUrl: data.clone_url, sshUrl: data.ssh_url };
|
|
39
|
+
},
|
|
40
|
+
createRepo: async ({ token, owner, name, private: isPrivate, ownerIsOrg }) => {
|
|
41
|
+
const url = ownerIsOrg ? `${BASE}/orgs/${owner}/repos` : `${BASE}/user/repos`;
|
|
42
|
+
await json(url, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: { ...headers(token), "Content-Type": "application/json" },
|
|
45
|
+
body: JSON.stringify({ name, private: isPrivate, auto_init: true }),
|
|
46
|
+
});
|
|
47
|
+
},
|
|
48
|
+
deleteRepo: async ({ token, owner, name }) => {
|
|
49
|
+
const response = await fetch(`${BASE}/repos/${owner}/${name}`, { method: "DELETE", headers: headers(token) });
|
|
50
|
+
if (response.status === 404) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
throw new Error(`GitHub API DELETE /repos/${owner}/${name}: ${response.status}`);
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
readFile: async ({ token, owner, repo, path, branch }) => {
|
|
58
|
+
const response = await fetch(`${BASE}/repos/${owner}/${repo}/contents/${path}?ref=${branch}`, { headers: headers(token) });
|
|
59
|
+
if (response.status === 404) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(`GitHub API GET /repos/${owner}/${repo}/contents/${path}: ${response.status}`);
|
|
64
|
+
}
|
|
65
|
+
const data = parseResponse(contentSchema, await response.json(), "GitHub /contents");
|
|
66
|
+
return { content: Buffer.from(data.content, "base64").toString("utf-8"), sha: data.sha };
|
|
67
|
+
},
|
|
68
|
+
commitFile: async ({ token, owner, repo, path, content, branch, message, sha }) => {
|
|
69
|
+
await json(`${BASE}/repos/${owner}/${repo}/contents/${path}`, {
|
|
70
|
+
method: "PUT",
|
|
71
|
+
headers: { ...headers(token), "Content-Type": "application/json" },
|
|
72
|
+
body: JSON.stringify({
|
|
73
|
+
message,
|
|
74
|
+
content: Buffer.from(content).toString("base64"),
|
|
75
|
+
branch,
|
|
76
|
+
...(sha !== undefined ? { sha } : {}),
|
|
77
|
+
}),
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
deleteFile: async ({ token, owner, repo, path, branch, message }) => {
|
|
81
|
+
const file = await githubApi.readFile({ token, owner, repo, path, branch });
|
|
82
|
+
if (file === undefined) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
await json(`${BASE}/repos/${owner}/${repo}/contents/${path}`, {
|
|
86
|
+
method: "DELETE",
|
|
87
|
+
headers: { ...headers(token), "Content-Type": "application/json" },
|
|
88
|
+
body: JSON.stringify({ message, sha: file.sha, branch }),
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
setRepoSecret: async ({ token, owner, repo, secretName, value }) => {
|
|
92
|
+
const keyData = await json(`${BASE}/repos/${owner}/${repo}/actions/secrets/public-key`, { headers: headers(token) });
|
|
93
|
+
const parsed = parseResponse(publicKeySchema, keyData, "GitHub /actions/secrets/public-key");
|
|
94
|
+
const sodium = await import("libsodium-wrappers").then((m) => m.default ?? m, () => {
|
|
95
|
+
throw new Error("libsodium-wrappers is required for GitHub Actions secrets; install it: pnpm add libsodium-wrappers");
|
|
96
|
+
});
|
|
97
|
+
await sodium.ready;
|
|
98
|
+
const keyBytes = sodium.from_base64(parsed.key, sodium.base64_variants.ORIGINAL);
|
|
99
|
+
const encrypted = sodium.crypto_box_seal(Buffer.from(value), keyBytes);
|
|
100
|
+
const encryptedBase64 = sodium.to_base64(encrypted, sodium.base64_variants.ORIGINAL);
|
|
101
|
+
await json(`${BASE}/repos/${owner}/${repo}/actions/secrets/${secretName}`, {
|
|
102
|
+
method: "PUT",
|
|
103
|
+
headers: { ...headers(token), "Content-Type": "application/json" },
|
|
104
|
+
body: JSON.stringify({ encrypted_value: encryptedBase64, key_id: parsed.key_id }),
|
|
105
|
+
});
|
|
106
|
+
},
|
|
107
|
+
deleteRepoSecret: async ({ token, owner, repo, secretName }) => {
|
|
108
|
+
const response = await fetch(`${BASE}/repos/${owner}/${repo}/actions/secrets/${secretName}`, {
|
|
109
|
+
method: "DELETE",
|
|
110
|
+
headers: headers(token),
|
|
111
|
+
});
|
|
112
|
+
if (response.status === 404) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (!response.ok) {
|
|
116
|
+
throw new Error(`GitHub API DELETE secret ${secretName}: ${response.status}`);
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
//# sourceMappingURL=github-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-api.js","sourceRoot":"","sources":["../src/github-api.ts"],"names":[],"mappings":"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"}
|
package/dist/github.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAEjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAcjD,eAAO,MAAM,oBAAoB,GAAI,MAAK,SAAqB,KAAG,QAwBhE,CAAC"}
|
package/dist/github.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { githubApi } from "./github-api.js";
|
|
3
|
+
import { parseInputs } from "./inputs.js";
|
|
4
|
+
const githubSchema = z.object({
|
|
5
|
+
token: z.string(),
|
|
6
|
+
owner: z.string().optional(),
|
|
7
|
+
});
|
|
8
|
+
const parse = (inputs) => parseInputs(githubSchema, inputs, "github");
|
|
9
|
+
export const createGitHubProvider = (api = githubApi) => ({
|
|
10
|
+
read: async (inputs, ctx) => {
|
|
11
|
+
if (typeof inputs["token"] !== "string") {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const parsed = parse(inputs);
|
|
15
|
+
try {
|
|
16
|
+
const user = await api.getAuthenticatedUser({ token: parsed.token });
|
|
17
|
+
const owner = parsed.owner ?? user.login;
|
|
18
|
+
return { outputs: { owner } };
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
ctx.log(`github "${ctx.id}": not reachable yet: ${String(error)}`);
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
diff: () => ({ action: "noop" }),
|
|
26
|
+
apply: async (inputs) => {
|
|
27
|
+
const parsed = parse(inputs);
|
|
28
|
+
const user = await api.getAuthenticatedUser({ token: parsed.token });
|
|
29
|
+
return { owner: parsed.owner ?? user.login };
|
|
30
|
+
},
|
|
31
|
+
delete: async () => {
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IAEjB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC/B,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,CAAC,MAAsB,EAAgB,EAAE,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAIpG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAAiB,SAAS,EAAY,EAAE,CAAC,CAAC;IAC3E,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACxB,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,EAAE,yBAAyB,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACrE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,EAAE,KAAK,IAAI,EAAE;IAEnB,CAAC;CACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SshSession } from "./ssh.js";
|
|
2
|
+
export interface GuardedUpdateOpts {
|
|
3
|
+
readonly session: SshSession;
|
|
4
|
+
readonly repo: string;
|
|
5
|
+
readonly resticImage: string;
|
|
6
|
+
readonly volumes: readonly string[];
|
|
7
|
+
readonly tag: string;
|
|
8
|
+
readonly recreate: () => Promise<void>;
|
|
9
|
+
readonly stop: () => Promise<void>;
|
|
10
|
+
readonly rollback: () => Promise<void>;
|
|
11
|
+
readonly log: (message: string) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const guardedUpdate: (opts: GuardedUpdateOpts) => Promise<void>;
|
|
14
|
+
//# sourceMappingURL=guarded-update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guarded-update.d.ts","sourceRoot":"","sources":["../src/guarded-update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAEpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAWD,eAAO,MAAM,aAAa,GAAU,MAAM,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAuBzE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const RESTIC_ENV = "/opt/intentic/backup/restic.env";
|
|
2
|
+
const resticRun = (opts, volume, mode, args) => `docker run --rm --env-file ${RESTIC_ENV} -v ${volume}:/v${mode} ${opts.resticImage} -r '${opts.repo}' ${args}`;
|
|
3
|
+
export const guardedUpdate = async (opts) => {
|
|
4
|
+
for (const volume of opts.volumes) {
|
|
5
|
+
const snapshot = await opts.session.exec(resticRun(opts, volume, ":ro", `backup /v --tag ${opts.tag}`));
|
|
6
|
+
if (snapshot.code !== 0) {
|
|
7
|
+
throw new Error(`guarded update: pre-update snapshot of ${volume} failed (exit ${snapshot.code}): ${snapshot.stderr.trim()} — ` +
|
|
8
|
+
"refusing to update without a recovery point (is i.have.backup applied?)");
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
opts.log(`guarded update: snapshotted ${opts.volumes.length} volume(s) as tag "${opts.tag}"`);
|
|
12
|
+
try {
|
|
13
|
+
await opts.recreate();
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
opts.log(`guarded update: new image failed health — rolling back image + data: ${String(error)}`);
|
|
17
|
+
await opts.stop();
|
|
18
|
+
for (const volume of opts.volumes) {
|
|
19
|
+
await opts.session.exec(resticRun(opts, volume, "", `restore latest --tag ${opts.tag} --target /`));
|
|
20
|
+
}
|
|
21
|
+
await opts.rollback();
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=guarded-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guarded-update.js","sourceRoot":"","sources":["../src/guarded-update.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,GAAG,iCAAiC,CAAC;AAmBrD,MAAM,SAAS,GAAG,CAAC,IAAuB,EAAE,MAAc,EAAE,IAAgB,EAAE,IAAY,EAAU,EAAE,CAClG,8BAA8B,UAAU,OAAO,MAAM,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,QAAQ,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;AAQpH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAuB,EAAiB,EAAE;IAC1E,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxG,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACX,0CAA0C,MAAM,iBAAiB,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK;gBAC3G,yEAAyE,CAChF,CAAC;QACN,CAAC;IACL,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,OAAO,CAAC,MAAM,sBAAsB,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;IAC9F,IAAI,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,wEAAwE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAEhC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,wBAAwB,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC;QACxG,CAAC;QACD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC,CAAC"}
|
package/dist/host.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,UAAU,CAAC;AAyBxD,eAAO,MAAM,kBAAkB,GAAI,WAAU,WAAyB,KAAG,QA+BvE,CAAC"}
|
package/dist/host.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { parseInputs, sshSchema, sshTarget } from "./inputs.js";
|
|
2
|
+
import { sshExecutor } from "./ssh.js";
|
|
3
|
+
const parse = (inputs) => parseInputs(sshSchema, inputs, "host");
|
|
4
|
+
const gather = async (session, address) => {
|
|
5
|
+
const docker = await session.exec("docker version --format '{{.Server.Version}}'");
|
|
6
|
+
if (docker.code !== 0) {
|
|
7
|
+
throw new Error(`host is not Docker-ready: \`docker version\` exited ${docker.code}: ${docker.stderr.trim()}`);
|
|
8
|
+
}
|
|
9
|
+
const route = await session.exec("ip -4 -o route get 1.1.1.1 | awk '{print $7; exit}'");
|
|
10
|
+
if (route.code !== 0) {
|
|
11
|
+
throw new Error(`failed to read host internal ip: exited ${route.code}: ${route.stderr.trim()}`);
|
|
12
|
+
}
|
|
13
|
+
return { internalIp: route.stdout.trim(), publicIp: address };
|
|
14
|
+
};
|
|
15
|
+
export const createHostProvider = (executor = sshExecutor) => ({
|
|
16
|
+
read: async (inputs, ctx) => {
|
|
17
|
+
const parsed = parse(inputs);
|
|
18
|
+
let session;
|
|
19
|
+
try {
|
|
20
|
+
session = await executor.connect(sshTarget(parsed));
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
ctx.log(`host "${ctx.id}" is not reachable over SSH, treating as not-yet-created: ${String(error)}`);
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
return { outputs: await gather(session, parsed.address) };
|
|
28
|
+
}
|
|
29
|
+
finally {
|
|
30
|
+
await session.dispose();
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
diff: () => ({ action: "noop" }),
|
|
34
|
+
apply: async (inputs) => {
|
|
35
|
+
const parsed = parse(inputs);
|
|
36
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
37
|
+
try {
|
|
38
|
+
return await gather(session, parsed.address);
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await session.dispose();
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
delete: async (_inputs, ctx) => {
|
|
45
|
+
ctx.log(`host "${ctx.id}" removed from desired state — owned infra is never torn down by intentic`);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=host.js.map
|
package/dist/host.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,KAAK,GAAG,CAAC,MAAsB,EAAc,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAK7F,MAAM,MAAM,GAAG,KAAK,EAAE,OAAmB,EAAE,OAAe,EAAoC,EAAE;IAC5F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IACnF,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,uDAAuD,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACxF,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,2CAA2C,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAClE,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,WAAwB,WAAW,EAAY,EAAE,CAAC,CAAC;IAClF,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACD,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,6DAA6D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACrG,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACD,OAAO,MAAM,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAGD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE;QAC3B,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,2EAA2E,CAAC,CAAC;IACxG,CAAC;CACJ,CAAC,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export { createAuthentikProvider } from "./authentik.js";
|
|
2
|
+
export { type AuthentikApi, authentikApi } from "./authentik-api.js";
|
|
3
|
+
export { createAuthentikClientProvider } from "./authentik-client.js";
|
|
4
|
+
export { createBackupProvider } from "./backup.js";
|
|
5
|
+
export { type RestoreArgs, type RestoreScope, restoreBackup } from "./backup-restore.js";
|
|
6
|
+
export { createCfRouteProvider } from "./cf-route.js";
|
|
7
|
+
export { createCiProvider } from "./ci.js";
|
|
8
|
+
export { createCloudflareProvider } from "./cloudflare.js";
|
|
9
|
+
export type { CloudflareApi, IngressRule } from "./cloudflare-api.js";
|
|
10
|
+
export { cloudflareApi } from "./cloudflare-api.js";
|
|
11
|
+
export { createDeploymentProvider } from "./deployment.js";
|
|
12
|
+
export { createDiscordProvider } from "./discord.js";
|
|
13
|
+
export type { DiscordApi, DiscordChannel, DiscordGuild, DiscordWebhook } from "./discord-api.js";
|
|
14
|
+
export { discordApi } from "./discord-api.js";
|
|
15
|
+
export { createForgejoProvider } from "./forgejo.js";
|
|
16
|
+
export { fakeForgejoApi } from "./forgejo-api.fake.js";
|
|
17
|
+
export type { ForgejoApi, ForgejoHook, ForgejoRepo } from "./forgejo-api.js";
|
|
18
|
+
export { forgejoApi } from "./forgejo-api.js";
|
|
19
|
+
export { createForgejoNotifyProvider } from "./forgejo-notify.js";
|
|
20
|
+
export { createForgejoRunnerProvider } from "./forgejo-runner.js";
|
|
21
|
+
export { createGarageProvider } from "./garage.js";
|
|
22
|
+
export { createGarageBucketProvider } from "./garage-bucket.js";
|
|
23
|
+
export { createGhCiProvider } from "./gh-ci.js";
|
|
24
|
+
export { createGhDeploymentProvider } from "./gh-deployment.js";
|
|
25
|
+
export { createGhRepoProvider } from "./gh-repo.js";
|
|
26
|
+
export { createGitHubProvider } from "./github.js";
|
|
27
|
+
export type { GitHubApi } from "./github-api.js";
|
|
28
|
+
export { githubApi } from "./github-api.js";
|
|
29
|
+
export { createHostProvider } from "./host.js";
|
|
30
|
+
export { parseInputs } from "./inputs.js";
|
|
31
|
+
export { createKomodoProvider } from "./komodo.js";
|
|
32
|
+
export type { AlerterConfig, AlerterEndpoint, DeploymentConfig, KomodoApi, KomodoResource, ResourceTarget } from "./komodo-api.js";
|
|
33
|
+
export { komodoApi } from "./komodo-api.js";
|
|
34
|
+
export { createKomodoNotifyProvider } from "./komodo-notify.js";
|
|
35
|
+
export type { ProviderDeps } from "./providers.js";
|
|
36
|
+
export { createProviders } from "./providers.js";
|
|
37
|
+
export { createRepoProvider } from "./repo.js";
|
|
38
|
+
export type { HostKeyStore, SshExecutor, SshResult, SshSession, SshTarget } from "./ssh.js";
|
|
39
|
+
export { createSshExecutor, inMemoryHostKeyStore, sshExecutor, verifyHostKey } from "./ssh.js";
|
|
40
|
+
export { createSshProbe, hostTarget } from "./ssh-probe.js";
|
|
41
|
+
export { createTunnelProvider } from "./tunnel.js";
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export { createAuthentikProvider } from "./authentik.js";
|
|
2
|
+
export { authentikApi } from "./authentik-api.js";
|
|
3
|
+
export { createAuthentikClientProvider } from "./authentik-client.js";
|
|
4
|
+
export { createBackupProvider } from "./backup.js";
|
|
5
|
+
export { restoreBackup } from "./backup-restore.js";
|
|
6
|
+
export { createCfRouteProvider } from "./cf-route.js";
|
|
7
|
+
export { createCiProvider } from "./ci.js";
|
|
8
|
+
export { createCloudflareProvider } from "./cloudflare.js";
|
|
9
|
+
export { cloudflareApi } from "./cloudflare-api.js";
|
|
10
|
+
export { createDeploymentProvider } from "./deployment.js";
|
|
11
|
+
export { createDiscordProvider } from "./discord.js";
|
|
12
|
+
export { discordApi } from "./discord-api.js";
|
|
13
|
+
export { createForgejoProvider } from "./forgejo.js";
|
|
14
|
+
export { fakeForgejoApi } from "./forgejo-api.fake.js";
|
|
15
|
+
export { forgejoApi } from "./forgejo-api.js";
|
|
16
|
+
export { createForgejoNotifyProvider } from "./forgejo-notify.js";
|
|
17
|
+
export { createForgejoRunnerProvider } from "./forgejo-runner.js";
|
|
18
|
+
export { createGarageProvider } from "./garage.js";
|
|
19
|
+
export { createGarageBucketProvider } from "./garage-bucket.js";
|
|
20
|
+
export { createGhCiProvider } from "./gh-ci.js";
|
|
21
|
+
export { createGhDeploymentProvider } from "./gh-deployment.js";
|
|
22
|
+
export { createGhRepoProvider } from "./gh-repo.js";
|
|
23
|
+
export { createGitHubProvider } from "./github.js";
|
|
24
|
+
export { githubApi } from "./github-api.js";
|
|
25
|
+
export { createHostProvider } from "./host.js";
|
|
26
|
+
export { parseInputs } from "./inputs.js";
|
|
27
|
+
export { createKomodoProvider } from "./komodo.js";
|
|
28
|
+
export { komodoApi } from "./komodo-api.js";
|
|
29
|
+
export { createKomodoNotifyProvider } from "./komodo-notify.js";
|
|
30
|
+
export { createProviders } from "./providers.js";
|
|
31
|
+
export { createRepoProvider } from "./repo.js";
|
|
32
|
+
export { createSshExecutor, inMemoryHostKeyStore, sshExecutor, verifyHostKey } from "./ssh.js";
|
|
33
|
+
export { createSshProbe, hostTarget } from "./ssh-probe.js";
|
|
34
|
+
export { createTunnelProvider } from "./tunnel.js";
|
|
35
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAqB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAuC,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/inputs.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ResolvedInputs } from "@intentic/engine";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import type { SshTarget } from "./ssh.js";
|
|
4
|
+
export declare const sshSchema: z.ZodObject<{
|
|
5
|
+
address: z.ZodString;
|
|
6
|
+
user: z.ZodString;
|
|
7
|
+
sshKey: z.ZodString;
|
|
8
|
+
port: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export declare const parseInputs: <S extends z.ZodType>(schema: S, inputs: ResolvedInputs, label: string) => z.infer<S>;
|
|
11
|
+
export declare const parseResponse: <S extends z.ZodType>(schema: S, value: unknown, label: string) => z.infer<S>;
|
|
12
|
+
export declare const sshTarget: (parsed: z.infer<typeof sshSchema>) => SshTarget;
|
|
13
|
+
export declare const gitProvider: (forgejoUrl: string) => {
|
|
14
|
+
domain: string;
|
|
15
|
+
https: boolean;
|
|
16
|
+
};
|
|
17
|
+
export declare const registryImage: (args: {
|
|
18
|
+
registry: string;
|
|
19
|
+
owner: string;
|
|
20
|
+
repoName: string;
|
|
21
|
+
tag: string;
|
|
22
|
+
}) => string;
|
|
23
|
+
//# sourceMappingURL=inputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../src/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,eAAO,MAAM,SAAS;;;;;iBAKpB,CAAC;AAOH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,QAAQ,cAAc,EAAE,OAAO,MAAM,KAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAM5G,CAAC;AAMF,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,OAAO,OAAO,EAAE,OAAO,MAAM,KAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAMtG,CAAC;AAGF,eAAO,MAAM,SAAS,GAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,KAAG,SAK5D,CAAC;AAQH,eAAO,MAAM,WAAW,GAAI,YAAY,MAAM,KAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAG/E,CAAC;AAMH,eAAO,MAAM,aAAa,GAAI,MAAM;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,KAAG,MACxC,CAAC"}
|
package/dist/inputs.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const sshSchema = z.object({
|
|
3
|
+
address: z.string(),
|
|
4
|
+
user: z.string(),
|
|
5
|
+
sshKey: z.string(),
|
|
6
|
+
port: z.number().default(22),
|
|
7
|
+
});
|
|
8
|
+
const issues = (error) => error.issues.map((issue) => `${issue.path.join(".")} ${issue.message}`).join("; ");
|
|
9
|
+
export const parseInputs = (schema, inputs, label) => {
|
|
10
|
+
const result = schema.safeParse(inputs);
|
|
11
|
+
if (!result.success) {
|
|
12
|
+
throw new Error(`${label} inputs malformed: ${issues(result.error)}`);
|
|
13
|
+
}
|
|
14
|
+
return result.data;
|
|
15
|
+
};
|
|
16
|
+
export const parseResponse = (schema, value, label) => {
|
|
17
|
+
const result = schema.safeParse(value);
|
|
18
|
+
if (!result.success) {
|
|
19
|
+
throw new Error(`${label} returned an unexpected response: ${issues(result.error)}`);
|
|
20
|
+
}
|
|
21
|
+
return result.data;
|
|
22
|
+
};
|
|
23
|
+
export const sshTarget = (parsed) => ({
|
|
24
|
+
address: parsed.address,
|
|
25
|
+
user: parsed.user,
|
|
26
|
+
privateKey: parsed.sshKey,
|
|
27
|
+
port: parsed.port,
|
|
28
|
+
});
|
|
29
|
+
export const gitProvider = (forgejoUrl) => ({
|
|
30
|
+
domain: forgejoUrl.replace(/^https?:\/\//, "").replace(/\/+$/, ""),
|
|
31
|
+
https: forgejoUrl.startsWith("https://"),
|
|
32
|
+
});
|
|
33
|
+
export const registryImage = (args) => `${args.registry}/${args.owner}/${args.repoName}:${args.tag}`;
|
|
34
|
+
//# sourceMappingURL=inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.js","sourceRoot":"","sources":["../src/inputs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CAC/B,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAU,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAKjI,MAAM,CAAC,MAAM,WAAW,GAAG,CAAsB,MAAS,EAAE,MAAsB,EAAE,KAAa,EAAc,EAAE;IAC7G,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,sBAAsB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACvB,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAsB,MAAS,EAAE,KAAc,EAAE,KAAa,EAAc,EAAE;IACvG,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qCAAqC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACvB,CAAC,CAAC;AAGF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAiC,EAAa,EAAE,CAAC,CAAC;IACxE,OAAO,EAAE,MAAM,CAAC,OAAO;IACvB,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,UAAU,EAAE,MAAM,CAAC,MAAM;IACzB,IAAI,EAAE,MAAM,CAAC,IAAI;CACpB,CAAC,CAAC;AAQH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAkB,EAAsC,EAAE,CAAC,CAAC;IACpF,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAClE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,UAAU,CAAC;CAC3C,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAwE,EAAU,EAAE,CAC9G,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export interface KomodoResource {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly name: string;
|
|
5
|
+
}
|
|
6
|
+
export interface KomodoUser {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly username: string;
|
|
9
|
+
readonly enabled: boolean;
|
|
10
|
+
}
|
|
11
|
+
export type KomodoPermissionLevel = "Read" | "Execute" | "Write";
|
|
12
|
+
declare const deploymentConfigSchema: z.ZodObject<{
|
|
13
|
+
environment: z.ZodDefault<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodObject<{
|
|
14
|
+
variable: z.ZodString;
|
|
15
|
+
value: z.ZodString;
|
|
16
|
+
}, z.core.$strip>>]>>;
|
|
17
|
+
}, z.core.$loose>;
|
|
18
|
+
export type DeploymentConfig = z.infer<typeof deploymentConfigSchema>;
|
|
19
|
+
declare const alerterEndpointSchema: z.ZodObject<{
|
|
20
|
+
type: z.ZodEnum<{
|
|
21
|
+
Discord: "Discord";
|
|
22
|
+
Slack: "Slack";
|
|
23
|
+
Custom: "Custom";
|
|
24
|
+
}>;
|
|
25
|
+
params: z.ZodObject<{
|
|
26
|
+
url: z.ZodString;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
}, z.core.$strip>;
|
|
29
|
+
declare const resourceTargetSchema: z.ZodObject<{
|
|
30
|
+
type: z.ZodString;
|
|
31
|
+
id: z.ZodString;
|
|
32
|
+
}, z.core.$strip>;
|
|
33
|
+
declare const alerterConfigSchema: z.ZodObject<{
|
|
34
|
+
enabled: z.ZodBoolean;
|
|
35
|
+
endpoint: z.ZodObject<{
|
|
36
|
+
type: z.ZodEnum<{
|
|
37
|
+
Discord: "Discord";
|
|
38
|
+
Slack: "Slack";
|
|
39
|
+
Custom: "Custom";
|
|
40
|
+
}>;
|
|
41
|
+
params: z.ZodObject<{
|
|
42
|
+
url: z.ZodString;
|
|
43
|
+
}, z.core.$strip>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
alert_types: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
46
|
+
resources: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
47
|
+
type: z.ZodString;
|
|
48
|
+
id: z.ZodString;
|
|
49
|
+
}, z.core.$strip>>>;
|
|
50
|
+
except_resources: z.ZodReadonly<z.ZodArray<z.ZodObject<{
|
|
51
|
+
type: z.ZodString;
|
|
52
|
+
id: z.ZodString;
|
|
53
|
+
}, z.core.$strip>>>;
|
|
54
|
+
}, z.core.$strip>;
|
|
55
|
+
export type AlerterEndpoint = z.infer<typeof alerterEndpointSchema>;
|
|
56
|
+
export type ResourceTarget = z.infer<typeof resourceTargetSchema>;
|
|
57
|
+
export type AlerterConfig = z.infer<typeof alerterConfigSchema>;
|
|
58
|
+
export interface KomodoApi {
|
|
59
|
+
readonly login: (args: {
|
|
60
|
+
readonly baseUrl: string;
|
|
61
|
+
readonly username: string;
|
|
62
|
+
readonly password: string;
|
|
63
|
+
}) => Promise<string>;
|
|
64
|
+
readonly listServers: (args: {
|
|
65
|
+
readonly baseUrl: string;
|
|
66
|
+
readonly jwt: string;
|
|
67
|
+
}) => Promise<readonly KomodoResource[]>;
|
|
68
|
+
readonly listDeployments: (args: {
|
|
69
|
+
readonly baseUrl: string;
|
|
70
|
+
readonly jwt: string;
|
|
71
|
+
}) => Promise<readonly KomodoResource[]>;
|
|
72
|
+
readonly getDeployment: (args: {
|
|
73
|
+
readonly baseUrl: string;
|
|
74
|
+
readonly jwt: string;
|
|
75
|
+
readonly deployment: string;
|
|
76
|
+
}) => Promise<DeploymentConfig>;
|
|
77
|
+
readonly createDeployment: (args: {
|
|
78
|
+
readonly baseUrl: string;
|
|
79
|
+
readonly jwt: string;
|
|
80
|
+
readonly name: string;
|
|
81
|
+
readonly config: Readonly<Record<string, unknown>>;
|
|
82
|
+
}) => Promise<void>;
|
|
83
|
+
readonly updateDeployment: (args: {
|
|
84
|
+
readonly baseUrl: string;
|
|
85
|
+
readonly jwt: string;
|
|
86
|
+
readonly id: string;
|
|
87
|
+
readonly config: Readonly<Record<string, unknown>>;
|
|
88
|
+
}) => Promise<void>;
|
|
89
|
+
readonly deleteDeployment: (args: {
|
|
90
|
+
readonly baseUrl: string;
|
|
91
|
+
readonly jwt: string;
|
|
92
|
+
readonly id: string;
|
|
93
|
+
}) => Promise<void>;
|
|
94
|
+
readonly listUsers: (args: {
|
|
95
|
+
readonly baseUrl: string;
|
|
96
|
+
readonly jwt: string;
|
|
97
|
+
}) => Promise<readonly KomodoUser[]>;
|
|
98
|
+
readonly deleteUser: (args: {
|
|
99
|
+
readonly baseUrl: string;
|
|
100
|
+
readonly jwt: string;
|
|
101
|
+
readonly userId: string;
|
|
102
|
+
}) => Promise<void>;
|
|
103
|
+
readonly createUser: (args: {
|
|
104
|
+
readonly baseUrl: string;
|
|
105
|
+
readonly jwt: string;
|
|
106
|
+
readonly username: string;
|
|
107
|
+
readonly password: string;
|
|
108
|
+
}) => Promise<void>;
|
|
109
|
+
readonly enableUser: (args: {
|
|
110
|
+
readonly baseUrl: string;
|
|
111
|
+
readonly jwt: string;
|
|
112
|
+
readonly userId: string;
|
|
113
|
+
}) => Promise<void>;
|
|
114
|
+
readonly setPermissionOnTarget: (args: {
|
|
115
|
+
readonly baseUrl: string;
|
|
116
|
+
readonly jwt: string;
|
|
117
|
+
readonly userId: string;
|
|
118
|
+
readonly deployment: string;
|
|
119
|
+
readonly level: KomodoPermissionLevel;
|
|
120
|
+
}) => Promise<void>;
|
|
121
|
+
readonly listAlerters: (args: {
|
|
122
|
+
readonly baseUrl: string;
|
|
123
|
+
readonly jwt: string;
|
|
124
|
+
}) => Promise<readonly KomodoResource[]>;
|
|
125
|
+
readonly getAlerter: (args: {
|
|
126
|
+
readonly baseUrl: string;
|
|
127
|
+
readonly jwt: string;
|
|
128
|
+
readonly id: string;
|
|
129
|
+
}) => Promise<AlerterConfig>;
|
|
130
|
+
readonly createAlerter: (args: {
|
|
131
|
+
readonly baseUrl: string;
|
|
132
|
+
readonly jwt: string;
|
|
133
|
+
readonly name: string;
|
|
134
|
+
readonly config: AlerterConfig;
|
|
135
|
+
}) => Promise<void>;
|
|
136
|
+
readonly updateAlerter: (args: {
|
|
137
|
+
readonly baseUrl: string;
|
|
138
|
+
readonly jwt: string;
|
|
139
|
+
readonly id: string;
|
|
140
|
+
readonly config: AlerterConfig;
|
|
141
|
+
}) => Promise<void>;
|
|
142
|
+
readonly deleteAlerter: (args: {
|
|
143
|
+
readonly baseUrl: string;
|
|
144
|
+
readonly jwt: string;
|
|
145
|
+
readonly id: string;
|
|
146
|
+
}) => Promise<void>;
|
|
147
|
+
}
|
|
148
|
+
export declare const komodoApi: KomodoApi;
|
|
149
|
+
export {};
|
|
150
|
+
//# sourceMappingURL=komodo-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"komodo-api.d.ts","sourceRoot":"","sources":["../src/komodo-api.ts"],"names":[],"mappings":"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"}
|