@intentic/cli 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 +80 -0
- package/dist/access.d.ts +16 -0
- package/dist/access.d.ts.map +1 -0
- package/dist/access.js +81 -0
- package/dist/access.js.map +1 -0
- package/dist/adopt-pipelines.d.ts +33 -0
- package/dist/adopt-pipelines.d.ts.map +1 -0
- package/dist/adopt-pipelines.js +97 -0
- package/dist/adopt-pipelines.js.map +1 -0
- package/dist/adopt.d.ts +23 -0
- package/dist/adopt.d.ts.map +1 -0
- package/dist/adopt.js +34 -0
- package/dist/adopt.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +341 -0
- package/dist/app.js.map +1 -0
- package/dist/artifact.d.ts +18 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +32 -0
- package/dist/artifact.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/control-plane-sync.d.ts +24 -0
- package/dist/control-plane-sync.d.ts.map +1 -0
- package/dist/control-plane-sync.js +61 -0
- package/dist/control-plane-sync.js.map +1 -0
- package/dist/demo.d.ts +2 -0
- package/dist/demo.d.ts.map +1 -0
- package/dist/demo.js +309 -0
- package/dist/demo.js.map +1 -0
- package/dist/generated-secrets.d.ts +5 -0
- package/dist/generated-secrets.d.ts.map +1 -0
- package/dist/generated-secrets.js +31 -0
- package/dist/generated-secrets.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +5 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +63 -0
- package/dist/init.js.map +1 -0
- package/dist/known-hosts.d.ts +3 -0
- package/dist/known-hosts.d.ts.map +1 -0
- package/dist/known-hosts.js +18 -0
- package/dist/known-hosts.js.map +1 -0
- package/dist/output.d.ts +16 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +50 -0
- package/dist/output.js.map +1 -0
- package/dist/resolve.d.ts +4 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +30 -0
- package/dist/resolve.js.map +1 -0
- package/dist/secrets.d.ts +11 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +53 -0
- package/dist/secrets.js.map +1 -0
- package/package.json +61 -0
package/dist/app.js
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { createStore, plan, prune, reconcile, resolveInputs } from "@intentic/engine";
|
|
6
|
+
import { createProviders, createSshExecutor, createSshProbe, forgejoApi, hostTarget, restoreBackup } from "@intentic/providers";
|
|
7
|
+
import { resolveState } from "@intentic/state-resolver";
|
|
8
|
+
import { buildApplication, buildCommand, buildRouteMap, numberParser } from "@stricli/core";
|
|
9
|
+
import { collectAccess, formatAccessSummary, writeAccessFile } from "./access.js";
|
|
10
|
+
import { adoptRepos } from "./adopt.js";
|
|
11
|
+
import { GIT_TOKEN_ENV, GIT_TOKEN_SECRET, GIT_USER_SECRET, setRepoSecrets, writeControlPlaneWorkflows, } from "./adopt-pipelines.js";
|
|
12
|
+
import { ACCESS_FILE, ARTIFACT_FILE, ARTIFACT_PATH, CONFIG_FILE, CONFIG_PATH, ENV_FILE, INTENT_DIR, LAST_APPLIED_FILE, loadEnvFile, readArtifact, STATUS_FILE, TARGET_DIR, writeArtifact, writeStatus, } from "./artifact.js";
|
|
13
|
+
import { forgejoIdentity, syncControlPlaneSecrets } from "./control-plane-sync.js";
|
|
14
|
+
import { ensureGeneratedSecrets, readGeneratedSecrets } from "./generated-secrets.js";
|
|
15
|
+
import { scaffold } from "./init.js";
|
|
16
|
+
import { createKnownHostsStore } from "./known-hosts.js";
|
|
17
|
+
import { createOutput, outputMode } from "./output.js";
|
|
18
|
+
import { discoverZone, loadIntent } from "./resolve.js";
|
|
19
|
+
import { collectSecrets, writeEnvExample } from "./secrets.js";
|
|
20
|
+
const { version } = createRequire(import.meta.url)("../package.json");
|
|
21
|
+
const DEFAULT_MAX_ITERATIONS = 5;
|
|
22
|
+
const init = buildCommand({
|
|
23
|
+
docs: { brief: "Scaffold local intent and desired-state git repos" },
|
|
24
|
+
parameters: {
|
|
25
|
+
flags: {
|
|
26
|
+
dir: { kind: "parsed", parse: String, optional: true, brief: "Directory to scaffold in (default: .)" },
|
|
27
|
+
link: { kind: "boolean", brief: "Link @intentic/* to this monorepo's _libs for local development against unpublished packages" },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
async func(flags) {
|
|
31
|
+
const out = createOutput(this.process.stdout, outputMode(process.env));
|
|
32
|
+
const { intentDir, targetDir } = await scaffold(flags.dir ?? ".", version, flags.link);
|
|
33
|
+
out.text(`initialized ${intentDir} (with ${CONFIG_FILE}) and ${targetDir}`);
|
|
34
|
+
out.result({ intentDir, targetDir });
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const resolveCommand = buildCommand({
|
|
38
|
+
docs: { brief: "Resolve a deploy.config.ts into the desired-state artifact" },
|
|
39
|
+
parameters: {
|
|
40
|
+
flags: {
|
|
41
|
+
config: { kind: "parsed", parse: String, optional: true, brief: `Path to the intent config (default: ${CONFIG_PATH})` },
|
|
42
|
+
out: { kind: "parsed", parse: String, optional: true, brief: `Path to write the artifact (default: ${ARTIFACT_PATH})` },
|
|
43
|
+
syncControlPlane: {
|
|
44
|
+
kind: "boolean",
|
|
45
|
+
brief: "Push newly-required generated secrets into Forgejo and regenerate apply.yaml (run by the resolve pipeline post-adopt; needs GIT_TOKEN)",
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
async func(flags) {
|
|
50
|
+
const out = createOutput(this.process.stdout, outputMode(process.env));
|
|
51
|
+
const intent = await loadIntent(flags.config ?? CONFIG_PATH);
|
|
52
|
+
const artifactOut = flags.out ?? ARTIFACT_PATH;
|
|
53
|
+
const dir = dirname(artifactOut);
|
|
54
|
+
const previousGraph = flags.syncControlPlane && existsSync(artifactOut) ? await readArtifact(artifactOut) : undefined;
|
|
55
|
+
const zone = await discoverZone(intent, dir);
|
|
56
|
+
const graph = resolveState(intent, zone);
|
|
57
|
+
await writeArtifact(artifactOut, graph);
|
|
58
|
+
const count = Object.keys(graph.resources).length;
|
|
59
|
+
out.text(`resolved desired state (${count} resources) → ${artifactOut}`);
|
|
60
|
+
if (zone !== undefined) {
|
|
61
|
+
out.text(`discovered Cloudflare zone "${zone}" from the API token`);
|
|
62
|
+
}
|
|
63
|
+
const { env: envKeys, generated } = collectSecrets(graph);
|
|
64
|
+
if (envKeys.length > 0) {
|
|
65
|
+
await writeEnvExample(join(dir, `${ENV_FILE}.example`), envKeys);
|
|
66
|
+
out.text(`set these in ${ENV_FILE} before apply (see ${ENV_FILE}.example): ${envKeys.join(", ")}`);
|
|
67
|
+
}
|
|
68
|
+
if (generated.length > 0) {
|
|
69
|
+
await ensureGeneratedSecrets(dir, generated, process.env);
|
|
70
|
+
out.text(`generated these (stored in .secrets.json): ${generated.join(", ")}`);
|
|
71
|
+
}
|
|
72
|
+
let synced;
|
|
73
|
+
if (flags.syncControlPlane) {
|
|
74
|
+
const password = process.env[GIT_TOKEN_ENV];
|
|
75
|
+
if (password === undefined || password === "") {
|
|
76
|
+
throw new Error(`set ${GIT_TOKEN_ENV} (the Forgejo admin password) to use --sync-control-plane`);
|
|
77
|
+
}
|
|
78
|
+
synced = await syncControlPlaneSecrets({
|
|
79
|
+
previousGraph,
|
|
80
|
+
newGraph: graph,
|
|
81
|
+
env: process.env,
|
|
82
|
+
dir,
|
|
83
|
+
password,
|
|
84
|
+
cliVersion: version,
|
|
85
|
+
log: out.log,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
out.result({
|
|
89
|
+
resources: count,
|
|
90
|
+
...(zone !== undefined ? { zone } : {}),
|
|
91
|
+
envSecrets: envKeys,
|
|
92
|
+
generatedSecrets: generated,
|
|
93
|
+
...(synced !== undefined ? { synced } : {}),
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
const planCommand = buildCommand({
|
|
98
|
+
docs: { brief: "Show what applying the artifact would create/update (read-only)" },
|
|
99
|
+
parameters: {
|
|
100
|
+
flags: { artifact: { kind: "parsed", parse: String, optional: true, brief: `Path to the artifact (default: ${ARTIFACT_PATH})` } },
|
|
101
|
+
},
|
|
102
|
+
async func(flags) {
|
|
103
|
+
const out = createOutput(this.process.stdout, outputMode(process.env));
|
|
104
|
+
const artifact = flags.artifact ?? ARTIFACT_PATH;
|
|
105
|
+
const dir = dirname(artifact);
|
|
106
|
+
loadEnvFile(dir);
|
|
107
|
+
const graph = await readArtifact(artifact);
|
|
108
|
+
await ensureGeneratedSecrets(dir, collectSecrets(graph).generated, process.env);
|
|
109
|
+
const ssh = createSshExecutor(createKnownHostsStore(dir));
|
|
110
|
+
const outcome = await plan(graph, { providers: createProviders({ ssh }), log: out.log, onEvent: out.onEvent });
|
|
111
|
+
for (const step of outcome.steps) {
|
|
112
|
+
out.text(`${step.action}\t${step.type}\t${step.id}${step.reason !== undefined ? `\t(${step.reason})` : ""}`);
|
|
113
|
+
}
|
|
114
|
+
out.result({ steps: outcome.steps, orphans: outcome.orphans });
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
const apply = buildCommand({
|
|
118
|
+
docs: { brief: "Execute the desired-state artifact until state reads true" },
|
|
119
|
+
parameters: {
|
|
120
|
+
flags: {
|
|
121
|
+
artifact: { kind: "parsed", parse: String, optional: true, brief: `Path to the artifact (default: ${ARTIFACT_PATH})` },
|
|
122
|
+
maxIterations: {
|
|
123
|
+
kind: "parsed",
|
|
124
|
+
parse: numberParser,
|
|
125
|
+
optional: true,
|
|
126
|
+
brief: `Max reconcile iterations (default ${DEFAULT_MAX_ITERATIONS})`,
|
|
127
|
+
},
|
|
128
|
+
previous: {
|
|
129
|
+
kind: "parsed",
|
|
130
|
+
parse: String,
|
|
131
|
+
optional: true,
|
|
132
|
+
brief: "Path to the last successfully-applied artifact; resources absent from the new one are pruned after convergence",
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
async func(flags) {
|
|
137
|
+
const out = createOutput(this.process.stdout, outputMode(process.env));
|
|
138
|
+
const artifact = flags.artifact ?? ARTIFACT_PATH;
|
|
139
|
+
const dir = dirname(artifact);
|
|
140
|
+
loadEnvFile(dir);
|
|
141
|
+
const graph = await readArtifact(artifact);
|
|
142
|
+
await ensureGeneratedSecrets(dir, collectSecrets(graph).generated, process.env);
|
|
143
|
+
const ssh = createSshExecutor(createKnownHostsStore(dir));
|
|
144
|
+
const hostNodes = Object.values(graph.resources).filter((node) => node.type === "host");
|
|
145
|
+
const probes = hostNodes.map((node) => createSshProbe(hostTarget(resolveInputs(node.inputs, createStore(), process.env, { lenient: false })), ssh));
|
|
146
|
+
const probe = probes.length === 0
|
|
147
|
+
? undefined
|
|
148
|
+
: async (url, status) => {
|
|
149
|
+
for (const p of probes) {
|
|
150
|
+
if (await p(url, status)) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return false;
|
|
155
|
+
};
|
|
156
|
+
const result = await reconcile(graph, { providers: createProviders({ ssh }), log: out.log, onEvent: out.onEvent, ...(probe !== undefined ? { probe } : {}) }, { maxIterations: flags.maxIterations ?? DEFAULT_MAX_ITERATIONS });
|
|
157
|
+
await writeStatus(join(dir, STATUS_FILE), {
|
|
158
|
+
converged: result.converged,
|
|
159
|
+
iterations: result.iterations,
|
|
160
|
+
steps: result.outcome.steps,
|
|
161
|
+
});
|
|
162
|
+
const previousPath = flags.previous ?? join(dir, LAST_APPLIED_FILE);
|
|
163
|
+
let pruned = { deleted: [], skipped: [] };
|
|
164
|
+
if (existsSync(previousPath)) {
|
|
165
|
+
const previous = await readArtifact(previousPath);
|
|
166
|
+
pruned = await prune(previous, graph, { providers: createProviders({ ssh }), log: out.log, onEvent: out.onEvent, env: process.env });
|
|
167
|
+
if (pruned.deleted.length > 0 || pruned.skipped.length > 0) {
|
|
168
|
+
out.text(`pruned ${pruned.deleted.length} resource(s)${pruned.skipped.length > 0 ? `, ${pruned.skipped.length} left in place` : ""}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await writeFile(join(dir, LAST_APPLIED_FILE), await readFile(artifact, "utf8"));
|
|
172
|
+
const access = collectAccess(graph, result.outcome.outputs, process.env);
|
|
173
|
+
out.text(`${result.converged ? "converged" : "did not converge"} in ${result.iterations} iteration(s)`);
|
|
174
|
+
if (access.length > 0) {
|
|
175
|
+
await writeAccessFile(join(dir, ACCESS_FILE), access);
|
|
176
|
+
out.text(formatAccessSummary(access));
|
|
177
|
+
}
|
|
178
|
+
out.result({
|
|
179
|
+
converged: result.converged,
|
|
180
|
+
iterations: result.iterations,
|
|
181
|
+
steps: result.outcome.steps,
|
|
182
|
+
outputs: result.outcome.outputs,
|
|
183
|
+
orphans: result.outcome.orphans,
|
|
184
|
+
pruned,
|
|
185
|
+
access,
|
|
186
|
+
});
|
|
187
|
+
const reconcileWebhook = result.outcome.outputs["discord"]?.["reconcileWebhook"];
|
|
188
|
+
if (typeof reconcileWebhook === "string" && reconcileWebhook !== "") {
|
|
189
|
+
const creates = result.outcome.steps.filter((s) => s.action === "create").length;
|
|
190
|
+
const updates = result.outcome.steps.filter((s) => s.action === "update").length;
|
|
191
|
+
const noops = result.outcome.steps.filter((s) => s.action === "noop").length;
|
|
192
|
+
const summary = [
|
|
193
|
+
`**intentic apply** — ${result.converged ? "✅ converged" : "⚠️ did not converge"} in ${result.iterations} iteration(s)`,
|
|
194
|
+
`📊 ${result.outcome.steps.length} resources: ${creates} created, ${updates} updated, ${noops} unchanged`,
|
|
195
|
+
...(result.outcome.orphans.length > 0 ? [`🗑️ ${result.outcome.orphans.length} orphan(s) detected`] : []),
|
|
196
|
+
].join("\n");
|
|
197
|
+
try {
|
|
198
|
+
await fetch(reconcileWebhook, {
|
|
199
|
+
method: "POST",
|
|
200
|
+
headers: { "Content-Type": "application/json" },
|
|
201
|
+
body: JSON.stringify({ content: summary }),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
out.log("discord: failed to post reconcile summary (non-fatal)");
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
const adopt = buildCommand({
|
|
211
|
+
docs: { brief: "Push the local intent and desired-state repos to the provisioned Forgejo" },
|
|
212
|
+
parameters: {
|
|
213
|
+
flags: { artifact: { kind: "parsed", parse: String, optional: true, brief: `Path to the artifact (default: ${ARTIFACT_PATH})` } },
|
|
214
|
+
},
|
|
215
|
+
async func(flags) {
|
|
216
|
+
const out = createOutput(this.process.stdout, outputMode(process.env));
|
|
217
|
+
const artifact = flags.artifact ?? ARTIFACT_PATH;
|
|
218
|
+
const targetDir = dirname(artifact);
|
|
219
|
+
const intentDir = join(dirname(targetDir), INTENT_DIR);
|
|
220
|
+
loadEnvFile(targetDir);
|
|
221
|
+
const graph = await readArtifact(artifact);
|
|
222
|
+
const { domain, user, adminPasswordRef: ref } = forgejoIdentity(graph);
|
|
223
|
+
const generatedValues = await readGeneratedSecrets(targetDir);
|
|
224
|
+
const password = ref.source === "generated" ? generatedValues[ref.key] : process.env[ref.key];
|
|
225
|
+
if (password === undefined || password === "") {
|
|
226
|
+
throw new Error(`forgejo admin password (${ref.source} secret ${ref.key}) is not available`);
|
|
227
|
+
}
|
|
228
|
+
const { env: envKeys, generated: generatedKeys } = collectSecrets(graph);
|
|
229
|
+
const desiredStateSecrets = {};
|
|
230
|
+
for (const key of envKeys) {
|
|
231
|
+
const value = process.env[key];
|
|
232
|
+
if (value !== undefined && value !== "") {
|
|
233
|
+
desiredStateSecrets[key] = value;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
for (const key of generatedKeys) {
|
|
237
|
+
const value = generatedValues[key];
|
|
238
|
+
if (value !== undefined) {
|
|
239
|
+
desiredStateSecrets[key] = value;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
const inputs = {
|
|
243
|
+
cliVersion: version,
|
|
244
|
+
user,
|
|
245
|
+
domain,
|
|
246
|
+
configFile: CONFIG_FILE,
|
|
247
|
+
artifactFile: ARTIFACT_FILE,
|
|
248
|
+
intentRepo: INTENT_DIR,
|
|
249
|
+
desiredStateRepo: TARGET_DIR,
|
|
250
|
+
applySecretKeys: Object.keys(desiredStateSecrets).sort(),
|
|
251
|
+
forgejoPasswordKey: ref.key,
|
|
252
|
+
};
|
|
253
|
+
await writeControlPlaneWorkflows(intentDir, targetDir, inputs);
|
|
254
|
+
const baseUrl = `https://${domain}`;
|
|
255
|
+
const repos = await adoptRepos({
|
|
256
|
+
baseUrl,
|
|
257
|
+
user,
|
|
258
|
+
password,
|
|
259
|
+
repos: [
|
|
260
|
+
{ dir: intentDir, name: INTENT_DIR },
|
|
261
|
+
{ dir: targetDir, name: TARGET_DIR },
|
|
262
|
+
],
|
|
263
|
+
log: out.log,
|
|
264
|
+
});
|
|
265
|
+
const intentSecrets = { [GIT_USER_SECRET]: user, [GIT_TOKEN_SECRET]: password };
|
|
266
|
+
if (desiredStateSecrets["CLOUDFLARE_API_TOKEN"] !== undefined) {
|
|
267
|
+
intentSecrets["CLOUDFLARE_API_TOKEN"] = desiredStateSecrets["CLOUDFLARE_API_TOKEN"];
|
|
268
|
+
}
|
|
269
|
+
await setRepoSecrets({ api: forgejoApi, baseUrl, user, password, owner: user, name: INTENT_DIR, secrets: intentSecrets });
|
|
270
|
+
await setRepoSecrets({ api: forgejoApi, baseUrl, user, password, owner: user, name: TARGET_DIR, secrets: desiredStateSecrets });
|
|
271
|
+
out.text(`set ${Object.keys(intentSecrets).length} secret(s) on ${user}/${INTENT_DIR}, ${Object.keys(desiredStateSecrets).length} on ${user}/${TARGET_DIR}`);
|
|
272
|
+
out.result({
|
|
273
|
+
repos,
|
|
274
|
+
intentSecrets: Object.keys(intentSecrets).sort(),
|
|
275
|
+
desiredStateSecrets: Object.keys(desiredStateSecrets).sort(),
|
|
276
|
+
});
|
|
277
|
+
},
|
|
278
|
+
});
|
|
279
|
+
const restore = buildCommand({
|
|
280
|
+
docs: { brief: "Restore Forgejo/Komodo from a restic backup snapshot, then re-apply (one-shot recovery)" },
|
|
281
|
+
parameters: {
|
|
282
|
+
flags: {
|
|
283
|
+
artifact: { kind: "parsed", parse: String, optional: true, brief: `Path to the artifact (default: ${ARTIFACT_PATH})` },
|
|
284
|
+
snapshot: { kind: "parsed", parse: String, optional: true, brief: "restic snapshot id to restore (default: latest)" },
|
|
285
|
+
only: { kind: "parsed", parse: String, optional: true, brief: "Which to restore: forgejo | komodo | all (default: all)" },
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
async func(flags) {
|
|
289
|
+
const out = createOutput(this.process.stdout, outputMode(process.env));
|
|
290
|
+
const artifact = flags.artifact ?? ARTIFACT_PATH;
|
|
291
|
+
const dir = dirname(artifact);
|
|
292
|
+
loadEnvFile(dir);
|
|
293
|
+
const graph = await readArtifact(artifact);
|
|
294
|
+
await ensureGeneratedSecrets(dir, collectSecrets(graph).generated, process.env);
|
|
295
|
+
const backupNode = Object.values(graph.resources).find((node) => node.type === "backup");
|
|
296
|
+
if (backupNode === undefined) {
|
|
297
|
+
throw new Error("no backup resource in the artifact — declare one with i.have.backup and apply it first");
|
|
298
|
+
}
|
|
299
|
+
const scope = flags.only ?? "all";
|
|
300
|
+
if (scope !== "forgejo" && scope !== "komodo" && scope !== "all") {
|
|
301
|
+
throw new Error(`--only must be one of forgejo|komodo|all, got "${scope}"`);
|
|
302
|
+
}
|
|
303
|
+
const resolved = resolveInputs(backupNode.inputs, createStore(), process.env, { lenient: false });
|
|
304
|
+
const repo = resolved["repo"];
|
|
305
|
+
const password = resolved["password"];
|
|
306
|
+
const image = resolved["image"];
|
|
307
|
+
if (typeof repo !== "string" || typeof password !== "string" || typeof image !== "string") {
|
|
308
|
+
throw new Error("backup resource is missing its repo/password/image inputs");
|
|
309
|
+
}
|
|
310
|
+
const credsRaw = resolved["credentials"];
|
|
311
|
+
const credentials = {};
|
|
312
|
+
if (typeof credsRaw === "object" && credsRaw !== null) {
|
|
313
|
+
for (const [key, value] of Object.entries(credsRaw)) {
|
|
314
|
+
if (typeof value === "string") {
|
|
315
|
+
credentials[key] = value;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
await restoreBackup({
|
|
320
|
+
target: hostTarget(resolved),
|
|
321
|
+
image,
|
|
322
|
+
repo,
|
|
323
|
+
password,
|
|
324
|
+
credentials,
|
|
325
|
+
snapshot: flags.snapshot ?? "latest",
|
|
326
|
+
scope: scope,
|
|
327
|
+
log: out.log,
|
|
328
|
+
executor: createSshExecutor(createKnownHostsStore(dir)),
|
|
329
|
+
});
|
|
330
|
+
out.result({ snapshot: flags.snapshot ?? "latest", scope });
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
export const app = buildApplication(buildRouteMap({
|
|
334
|
+
routes: { init, resolve: resolveCommand, plan: planCommand, apply, adopt, restore },
|
|
335
|
+
docs: { brief: "intentic — intent-driven deployment" },
|
|
336
|
+
}), {
|
|
337
|
+
name: "intentic",
|
|
338
|
+
versionInfo: { currentVersion: version },
|
|
339
|
+
scanner: { caseStyle: "allow-kebab-for-camel" },
|
|
340
|
+
});
|
|
341
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAqB,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU,EAAqB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACnJ,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACH,aAAa,EACb,gBAAgB,EAChB,eAAe,EAEf,cAAc,EACd,0BAA0B,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,WAAW,EACX,aAAa,EACb,aAAa,EACb,WAAW,EACX,WAAW,EACX,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAwB,CAAC;AAE7F,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAEjC,MAAM,IAAI,GAAG,YAAY,CAAkC;IACvD,IAAI,EAAE,EAAE,KAAK,EAAE,mDAAmD,EAAE;IACpE,UAAU,EAAE;QACR,KAAK,EAAE;YACH,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,uCAAuC,EAAE;YACtG,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,8FAA8F,EAAE;SACnI;KACJ;IACD,KAAK,CAAC,IAAI,CAAuB,KAAsC;QACnE,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACvF,GAAG,CAAC,IAAI,CAAC,eAAe,SAAS,UAAU,WAAW,SAAS,SAAS,EAAE,CAAC,CAAC;QAC5E,GAAG,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACzC,CAAC;CACJ,CAAC,CAAC;AAQH,MAAM,cAAc,GAAG,YAAY,CAAe;IAC9C,IAAI,EAAE,EAAE,KAAK,EAAE,4DAA4D,EAAE;IAC7E,UAAU,EAAE;QACR,KAAK,EAAE;YACH,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,uCAAuC,WAAW,GAAG,EAAE;YACvH,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,wCAAwC,aAAa,GAAG,EAAE;YACvH,gBAAgB,EAAE;gBACd,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,wIAAwI;aAClJ;SACJ;KACJ;IACD,KAAK,CAAC,IAAI,CAAuB,KAAmB;QAChD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,IAAI,aAAa,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAEjC,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,2BAA2B,KAAK,iBAAiB,WAAW,EAAE,CAAC,CAAC;QACzE,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACrB,GAAG,CAAC,IAAI,CAAC,+BAA+B,IAAI,sBAAsB,CAAC,CAAC;QACxE,CAAC;QAKD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC,gBAAgB,QAAQ,sBAAsB,QAAQ,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1D,GAAG,CAAC,IAAI,CAAC,8CAA8C,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,MAA8F,CAAC;QACnG,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC5C,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CAAC,OAAO,aAAa,2DAA2D,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,GAAG,MAAM,uBAAuB,CAAC;gBACnC,aAAa;gBACb,QAAQ,EAAE,KAAK;gBACf,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG;gBACH,QAAQ;gBACR,UAAU,EAAE,OAAO;gBACnB,GAAG,EAAE,GAAG,CAAC,GAAG;aACf,CAAC,CAAC;QACP,CAAC;QACD,GAAG,CAAC,MAAM,CAAC;YACP,SAAS,EAAE,KAAK;YAChB,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,UAAU,EAAE,OAAO;YACnB,gBAAgB,EAAE,SAAS;YAC3B,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9C,CAAC,CAAC;IACP,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,WAAW,GAAG,YAAY,CAAwB;IACpD,IAAI,EAAE,EAAE,KAAK,EAAE,iEAAiE,EAAE;IAClF,UAAU,EAAE;QACR,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,kCAAkC,aAAa,GAAG,EAAE,EAAE;KACpI;IACD,KAAK,CAAC,IAAI,CAAuB,KAA4B;QACzD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC;QACjD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,sBAAsB,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/G,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACjH,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;CACJ,CAAC,CAAC;AAQH,MAAM,KAAK,GAAG,YAAY,CAAa;IACnC,IAAI,EAAE,EAAE,KAAK,EAAE,2DAA2D,EAAE;IAC5E,UAAU,EAAE;QACR,KAAK,EAAE;YACH,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,kCAAkC,aAAa,GAAG,EAAE;YACtH,aAAa,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,YAAY;gBACnB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,qCAAqC,sBAAsB,GAAG;aACxE;YACD,QAAQ,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,MAAM;gBACb,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,gHAAgH;aAC1H;SACJ;KACJ;IACD,KAAK,CAAC,IAAI,CAAuB,KAAiB;QAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC;QACjD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,sBAAsB,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;QAK1D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACxF,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAClC,cAAc,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAC9G,CAAC;QACF,MAAM,KAAK,GACP,MAAM,CAAC,MAAM,KAAK,CAAC;YACf,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,KAAK,EAAE,GAAW,EAAE,MAAc,EAAoB,EAAE;gBACpD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;oBACrB,IAAI,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC;wBACvB,OAAO,IAAI,CAAC;oBAChB,CAAC;gBACL,CAAC;gBACD,OAAO,KAAK,CAAC;YACjB,CAAC,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,SAAS,CAC1B,KAAK,EACL,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EACtH,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,sBAAsB,EAAE,CACnE,CAAC;QACF,MAAM,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE;YACtC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;SAC9B,CAAC,CAAC;QAKH,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACpE,IAAI,MAAM,GAAiB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACxD,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;YAClD,MAAM,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACrI,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,GAAG,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,eAAe,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1I,CAAC;QACL,CAAC;QAED,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzE,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,OAAO,MAAM,CAAC,UAAU,eAAe,CAAC,CAAC;QACxG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,eAAe,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;YACtD,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,GAAG,CAAC,MAAM,CAAC;YACP,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;YAC3B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO;YAC/B,MAAM;YACN,MAAM;SACT,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC;QACjF,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,KAAK,EAAE,EAAE,CAAC;YAClE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;YACjF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;YACjF,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YAC7E,MAAM,OAAO,GAAG;gBACZ,wBAAwB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,qBAAqB,OAAO,MAAM,CAAC,UAAU,eAAe;gBACvH,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,eAAe,OAAO,aAAa,OAAO,aAAa,KAAK,YAAY;gBACzG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,IAAI,CAAC;gBACD,MAAM,KAAK,CAAC,gBAAgB,EAAE;oBAC1B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;iBAC7C,CAAC,CAAC;YACP,CAAC;YAAC,MAAM,CAAC;gBACL,GAAG,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,CAAC;QACL,CAAC;IACL,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,YAAY,CAAwB;IAC9C,IAAI,EAAE,EAAE,KAAK,EAAE,0EAA0E,EAAE;IAC3F,UAAU,EAAE;QACR,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,kCAAkC,aAAa,GAAG,EAAE,EAAE;KACpI;IACD,KAAK,CAAC,IAAI,CAAuB,KAA4B;QACzD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC;QACjD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;QACvD,WAAW,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAE3C,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9F,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,oBAAoB,CAAC,CAAC;QACjG,CAAC;QAKD,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACzE,MAAM,mBAAmB,GAA2B,EAAE,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACtC,mBAAmB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtB,mBAAmB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACrC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAmB;YAC3B,UAAU,EAAE,OAAO;YACnB,IAAI;YACJ,MAAM;YACN,UAAU,EAAE,WAAW;YACvB,YAAY,EAAE,aAAa;YAC3B,UAAU,EAAE,UAAU;YACtB,gBAAgB,EAAE,UAAU;YAC5B,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE;YACxD,kBAAkB,EAAE,GAAG,CAAC,GAAG;SAC9B,CAAC;QAEF,MAAM,0BAA0B,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAE/D,MAAM,OAAO,GAAG,WAAW,MAAM,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC;YAC3B,OAAO;YACP,IAAI;YACJ,QAAQ;YACR,KAAK,EAAE;gBACH,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;gBACpC,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;aACvC;YACD,GAAG,EAAE,GAAG,CAAC,GAAG;SACf,CAAC,CAAC;QAIH,MAAM,aAAa,GAA2B,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC;QACxG,IAAI,mBAAmB,CAAC,sBAAsB,CAAC,KAAK,SAAS,EAAE,CAAC;YAC5D,aAAa,CAAC,sBAAsB,CAAC,GAAG,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;QACxF,CAAC;QACD,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QAC1H,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAChI,GAAG,CAAC,IAAI,CACJ,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,iBAAiB,IAAI,IAAI,UAAU,KAAK,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,OAAO,IAAI,IAAI,UAAU,EAAE,CACrJ,CAAC;QACF,GAAG,CAAC,MAAM,CAAC;YACP,KAAK;YACL,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE;YAChD,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,EAAE;SAC/D,CAAC,CAAC;IACP,CAAC;CACJ,CAAC,CAAC;AAQH,MAAM,OAAO,GAAG,YAAY,CAAe;IACvC,IAAI,EAAE,EAAE,KAAK,EAAE,yFAAyF,EAAE;IAC1G,UAAU,EAAE;QACR,KAAK,EAAE;YACH,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,kCAAkC,aAAa,GAAG,EAAE;YACtH,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,iDAAiD,EAAE;YACrH,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,yDAAyD,EAAE;SAC5H;KACJ;IACD,KAAK,CAAC,IAAI,CAAuB,KAAmB;QAChD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,aAAa,CAAC;QACjD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,sBAAsB,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAChF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACzF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;QAC9G,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,kDAAkD,KAAK,GAAG,CAAC,CAAC;QAChF,CAAC;QAGD,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAClG,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5B,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC7B,CAAC;YACL,CAAC;QACL,CAAC;QACD,MAAM,aAAa,CAAC;YAChB,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC5B,KAAK;YACL,IAAI;YACJ,QAAQ;YACR,WAAW;YACX,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ;YACpC,KAAK,EAAE,KAAqB;YAC5B,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,QAAQ,EAAE,iBAAiB,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;SAC1D,CAAC,CAAC;QACH,GAAG,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG,gBAAgB,CAC/B,aAAa,CAAC;IACV,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;IACnF,IAAI,EAAE,EAAE,KAAK,EAAE,qCAAqC,EAAE;CACzD,CAAC,EACF;IACI,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE;IACxC,OAAO,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE;CAClD,CACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DesiredStateGraph } from "@intentic/graph";
|
|
2
|
+
export declare const INTENT_DIR = "intent";
|
|
3
|
+
export declare const TARGET_DIR = "desired-state";
|
|
4
|
+
export declare const CONFIG_FILE = "deploy.config.ts";
|
|
5
|
+
export declare const ARTIFACT_FILE = "desired-state.json";
|
|
6
|
+
export declare const LAST_APPLIED_FILE = ".last-applied.json";
|
|
7
|
+
export declare const STATUS_FILE = "status.json";
|
|
8
|
+
export declare const ACCESS_FILE = "access.md";
|
|
9
|
+
export declare const ENV_FILE = ".env";
|
|
10
|
+
export declare const SECRETS_FILE = ".secrets.json";
|
|
11
|
+
export declare const KNOWN_HOSTS_FILE = ".known-hosts.json";
|
|
12
|
+
export declare const CONFIG_PATH: string;
|
|
13
|
+
export declare const ARTIFACT_PATH: string;
|
|
14
|
+
export declare const readArtifact: (path: string) => Promise<DesiredStateGraph>;
|
|
15
|
+
export declare const writeArtifact: (path: string, graph: DesiredStateGraph) => Promise<void>;
|
|
16
|
+
export declare const writeStatus: (path: string, status: unknown) => Promise<void>;
|
|
17
|
+
export declare const loadEnvFile: (dir: string) => void;
|
|
18
|
+
//# sourceMappingURL=artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.d.ts","sourceRoot":"","sources":["../src/artifact.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAIzD,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAC1C,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,eAAO,MAAM,aAAa,uBAAuB,CAAC;AAClD,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AACtD,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,eAAO,MAAM,WAAW,cAAc,CAAC;AACvC,eAAO,MAAM,QAAQ,SAAS,CAAC;AAC/B,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAG5C,eAAO,MAAM,gBAAgB,sBAAsB,CAAC;AAIpD,eAAO,MAAM,WAAW,QAAgC,CAAC;AACzD,eAAO,MAAM,aAAa,QAAkC,CAAC;AAE7D,eAAO,MAAM,YAAY,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,iBAAiB,CAM1E,CAAC;AAEF,eAAO,MAAM,aAAa,GAAU,MAAM,MAAM,EAAE,OAAO,iBAAiB,KAAG,OAAO,CAAC,IAAI,CAC1B,CAAC;AAEhE,eAAO,MAAM,WAAW,GAAU,MAAM,MAAM,EAAE,QAAQ,OAAO,KAAG,OAAO,CAAC,IAAI,CAAiE,CAAC;AAIhJ,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,IAMzC,CAAC"}
|
package/dist/artifact.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
export const INTENT_DIR = "intent";
|
|
5
|
+
export const TARGET_DIR = "desired-state";
|
|
6
|
+
export const CONFIG_FILE = "deploy.config.ts";
|
|
7
|
+
export const ARTIFACT_FILE = "desired-state.json";
|
|
8
|
+
export const LAST_APPLIED_FILE = ".last-applied.json";
|
|
9
|
+
export const STATUS_FILE = "status.json";
|
|
10
|
+
export const ACCESS_FILE = "access.md";
|
|
11
|
+
export const ENV_FILE = ".env";
|
|
12
|
+
export const SECRETS_FILE = ".secrets.json";
|
|
13
|
+
export const KNOWN_HOSTS_FILE = ".known-hosts.json";
|
|
14
|
+
export const CONFIG_PATH = join(INTENT_DIR, CONFIG_FILE);
|
|
15
|
+
export const ARTIFACT_PATH = join(TARGET_DIR, ARTIFACT_FILE);
|
|
16
|
+
export const readArtifact = async (path) => {
|
|
17
|
+
const graph = JSON.parse(await readFile(path, "utf8"));
|
|
18
|
+
if (graph.version !== 1) {
|
|
19
|
+
throw new Error(`${path} is not a desired-state artifact (expected version 1)`);
|
|
20
|
+
}
|
|
21
|
+
return graph;
|
|
22
|
+
};
|
|
23
|
+
export const writeArtifact = async (path, graph) => writeFile(path, `${JSON.stringify(graph, undefined, 4)}\n`);
|
|
24
|
+
export const writeStatus = async (path, status) => writeFile(path, `${JSON.stringify(status, undefined, 4)}\n`);
|
|
25
|
+
export const loadEnvFile = (dir) => {
|
|
26
|
+
const path = join(dir, ENV_FILE);
|
|
27
|
+
if (!existsSync(path)) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
process.loadEnvFile(path);
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact.js","sourceRoot":"","sources":["../src/artifact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAKjC,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAC1C,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC;AAC9C,MAAM,CAAC,MAAM,aAAa,GAAG,oBAAoB,CAAC;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AACtD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,CAAC;AACvC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAG5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAIpD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAY,EAA8B,EAAE;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAsB,CAAC;IAC5E,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,uDAAuD,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAE,KAAwB,EAAiB,EAAE,CACzF,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,IAAY,EAAE,MAAe,EAAiB,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAIhJ,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAQ,EAAE;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO;IACX,CAAC;IACD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAI/B,MAAM,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,OAAyB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { DesiredStateGraph, SecretSource } from "@intentic/graph";
|
|
2
|
+
import { type ForgejoApi } from "@intentic/providers";
|
|
3
|
+
export declare const forgejoIdentity: (graph: DesiredStateGraph) => {
|
|
4
|
+
readonly domain: string;
|
|
5
|
+
readonly user: string;
|
|
6
|
+
readonly adminPasswordRef: {
|
|
7
|
+
readonly source: SecretSource;
|
|
8
|
+
readonly key: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare const syncControlPlaneSecrets: (args: {
|
|
12
|
+
readonly previousGraph: DesiredStateGraph | undefined;
|
|
13
|
+
readonly newGraph: DesiredStateGraph;
|
|
14
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
15
|
+
readonly dir: string;
|
|
16
|
+
readonly password: string;
|
|
17
|
+
readonly cliVersion: string;
|
|
18
|
+
readonly log: (message: string) => void;
|
|
19
|
+
readonly api?: ForgejoApi;
|
|
20
|
+
}) => Promise<{
|
|
21
|
+
readonly pushed: readonly string[];
|
|
22
|
+
readonly newEnv: readonly string[];
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=control-plane-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane-sync.d.ts","sourceRoot":"","sources":["../src/control-plane-sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,qBAAqB,CAAC;AAOlE,eAAO,MAAM,eAAe,GACxB,OAAO,iBAAiB,KACzB;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAetI,CAAC;AASF,eAAO,MAAM,uBAAuB,GAAU,MAAM;IAChD,QAAQ,CAAC,aAAa,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAE3D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;CAC7B,KAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAgDrF,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { forgejoApi } from "@intentic/providers";
|
|
2
|
+
import { APPLY_WORKFLOW_PATH, applyWorkflowYaml, setRepoSecrets, writeWorkflow } from "./adopt-pipelines.js";
|
|
3
|
+
import { ARTIFACT_FILE, CONFIG_FILE, INTENT_DIR, TARGET_DIR } from "./artifact.js";
|
|
4
|
+
import { collectSecrets, secretRef } from "./secrets.js";
|
|
5
|
+
export const forgejoIdentity = (graph) => {
|
|
6
|
+
const forgejo = Object.values(graph.resources).find((node) => node.type === "forgejo");
|
|
7
|
+
if (forgejo === undefined) {
|
|
8
|
+
throw new Error("no forgejo resource in the artifact — run `intentic apply` first");
|
|
9
|
+
}
|
|
10
|
+
const domain = forgejo.inputs["domain"];
|
|
11
|
+
const user = forgejo.inputs["adminUser"];
|
|
12
|
+
if (typeof domain !== "string" || typeof user !== "string") {
|
|
13
|
+
throw new Error("forgejo resource is missing its domain/adminUser inputs");
|
|
14
|
+
}
|
|
15
|
+
const adminPasswordRef = secretRef(forgejo.inputs["adminPassword"]);
|
|
16
|
+
if (adminPasswordRef === undefined) {
|
|
17
|
+
throw new Error("forgejo resource is missing its adminPassword secret");
|
|
18
|
+
}
|
|
19
|
+
return { domain, user, adminPasswordRef };
|
|
20
|
+
};
|
|
21
|
+
export const syncControlPlaneSecrets = async (args) => {
|
|
22
|
+
if (args.previousGraph === undefined) {
|
|
23
|
+
args.log("sync-control-plane: no previous artifact to diff against — skipping secret sync");
|
|
24
|
+
return { pushed: [], newEnv: [] };
|
|
25
|
+
}
|
|
26
|
+
const api = args.api ?? forgejoApi;
|
|
27
|
+
const { domain, user, adminPasswordRef } = forgejoIdentity(args.newGraph);
|
|
28
|
+
const previous = collectSecrets(args.previousGraph);
|
|
29
|
+
const next = collectSecrets(args.newGraph);
|
|
30
|
+
const addedGenerated = next.generated.filter((key) => !previous.generated.includes(key));
|
|
31
|
+
const newEnv = next.env.filter((key) => !previous.env.includes(key));
|
|
32
|
+
if (addedGenerated.length > 0) {
|
|
33
|
+
const secrets = {};
|
|
34
|
+
for (const key of addedGenerated) {
|
|
35
|
+
const value = args.env[key];
|
|
36
|
+
if (value === undefined || value === "") {
|
|
37
|
+
throw new Error(`generated secret ${key} has no value to push to Forgejo`);
|
|
38
|
+
}
|
|
39
|
+
secrets[key] = value;
|
|
40
|
+
}
|
|
41
|
+
await setRepoSecrets({ api, baseUrl: `https://${domain}`, user, password: args.password, owner: user, name: TARGET_DIR, secrets });
|
|
42
|
+
args.log(`sync-control-plane: pushed ${addedGenerated.length} new generated secret(s) to ${user}/${TARGET_DIR}: ${addedGenerated.join(", ")}`);
|
|
43
|
+
}
|
|
44
|
+
const inputs = {
|
|
45
|
+
cliVersion: args.cliVersion,
|
|
46
|
+
user,
|
|
47
|
+
domain,
|
|
48
|
+
configFile: CONFIG_FILE,
|
|
49
|
+
artifactFile: ARTIFACT_FILE,
|
|
50
|
+
intentRepo: INTENT_DIR,
|
|
51
|
+
desiredStateRepo: TARGET_DIR,
|
|
52
|
+
applySecretKeys: [...next.generated, ...next.env].sort(),
|
|
53
|
+
forgejoPasswordKey: adminPasswordRef.key,
|
|
54
|
+
};
|
|
55
|
+
await writeWorkflow(args.dir, APPLY_WORKFLOW_PATH, applyWorkflowYaml(inputs));
|
|
56
|
+
if (newEnv.length > 0) {
|
|
57
|
+
args.log(`sync-control-plane: add these user secret(s) to ${user}/${TARGET_DIR} in Forgejo — apply fails until set: ${newEnv.join(", ")}`);
|
|
58
|
+
}
|
|
59
|
+
return { pushed: addedGenerated, newEnv };
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=control-plane-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-plane-sync.js","sourceRoot":"","sources":["../src/control-plane-sync.ts"],"names":[],"mappings":"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"}
|
package/dist/demo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":""}
|