getmyenv 0.5.2 → 0.6.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/README.md +57 -13
- package/dist/bin.js +1 -24
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +179 -101
- package/dist/cli.js.map +1 -1
- package/dist/commands/backup.d.ts +2 -1
- package/dist/commands/backup.d.ts.map +1 -1
- package/dist/commands/backup.js +15 -25
- package/dist/commands/backup.js.map +1 -1
- package/dist/commands/claim.d.ts +2 -1
- package/dist/commands/claim.d.ts.map +1 -1
- package/dist/commands/claim.js +114 -82
- package/dist/commands/claim.js.map +1 -1
- package/dist/commands/context.d.ts +11 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +53 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/export.d.ts +11 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +67 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/guest.d.ts +9 -3
- package/dist/commands/guest.d.ts.map +1 -1
- package/dist/commands/guest.js +32 -30
- package/dist/commands/guest.js.map +1 -1
- package/dist/commands/import.d.ts +26 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +168 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/lock.d.ts +5 -0
- package/dist/commands/lock.d.ts.map +1 -0
- package/dist/commands/lock.js +18 -0
- package/dist/commands/lock.js.map +1 -0
- package/dist/commands/ls.d.ts +6 -0
- package/dist/commands/ls.d.ts.map +1 -0
- package/dist/commands/ls.js +37 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/restore.d.ts +7 -2
- package/dist/commands/restore.d.ts.map +1 -1
- package/dist/commands/restore.js +58 -51
- package/dist/commands/restore.js.map +1 -1
- package/dist/commands/run.d.ts +7 -5
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +97 -185
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/set.d.ts +16 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +111 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/start.d.ts +16 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +118 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +40 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/unlink.d.ts +9 -0
- package/dist/commands/unlink.d.ts.map +1 -0
- package/dist/commands/unlink.js +70 -0
- package/dist/commands/unlink.js.map +1 -0
- package/dist/lib/api-url.d.ts +12 -0
- package/dist/lib/api-url.d.ts.map +1 -1
- package/dist/lib/api-url.js +32 -0
- package/dist/lib/api-url.js.map +1 -1
- package/dist/lib/api.d.ts +35 -23
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +23 -59
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/authorize.d.ts +13 -6
- package/dist/lib/authorize.d.ts.map +1 -1
- package/dist/lib/authorize.js +68 -63
- package/dist/lib/authorize.js.map +1 -1
- package/dist/lib/bootstrap.d.ts +18 -15
- package/dist/lib/bootstrap.d.ts.map +1 -1
- package/dist/lib/bootstrap.js +59 -58
- package/dist/lib/bootstrap.js.map +1 -1
- package/dist/lib/confirm.js +4 -4
- package/dist/lib/confirm.js.map +1 -1
- package/dist/lib/context.d.ts +12 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +43 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/credentials.d.ts +8 -9
- package/dist/lib/credentials.d.ts.map +1 -1
- package/dist/lib/credentials.js +2 -10
- package/dist/lib/credentials.js.map +1 -1
- package/dist/lib/fs.d.ts +26 -37
- package/dist/lib/fs.d.ts.map +1 -1
- package/dist/lib/fs.js +112 -327
- package/dist/lib/fs.js.map +1 -1
- package/dist/lib/guest-key.d.ts +8 -6
- package/dist/lib/guest-key.d.ts.map +1 -1
- package/dist/lib/guest-key.js +26 -3
- package/dist/lib/guest-key.js.map +1 -1
- package/dist/lib/identity.d.ts +9 -11
- package/dist/lib/identity.d.ts.map +1 -1
- package/dist/lib/identity.js +34 -24
- package/dist/lib/identity.js.map +1 -1
- package/dist/lib/keychain.d.ts +21 -0
- package/dist/lib/keychain.d.ts.map +1 -0
- package/dist/lib/keychain.js +124 -0
- package/dist/lib/keychain.js.map +1 -0
- package/dist/lib/pek.d.ts +15 -22
- package/dist/lib/pek.d.ts.map +1 -1
- package/dist/lib/pek.js +31 -51
- package/dist/lib/pek.js.map +1 -1
- package/dist/lib/run-env.d.ts +50 -0
- package/dist/lib/run-env.d.ts.map +1 -0
- package/dist/lib/run-env.js +114 -0
- package/dist/lib/run-env.js.map +1 -0
- package/dist/lib/unlock.d.ts +24 -0
- package/dist/lib/unlock.d.ts.map +1 -0
- package/dist/lib/unlock.js +87 -0
- package/dist/lib/unlock.js.map +1 -0
- package/dist/lib/update-check.d.ts +4 -2
- package/dist/lib/update-check.d.ts.map +1 -1
- package/dist/lib/update-check.js +54 -68
- package/dist/lib/update-check.js.map +1 -1
- package/dist/lib/upload.d.ts +21 -0
- package/dist/lib/upload.d.ts.map +1 -0
- package/dist/lib/upload.js +53 -0
- package/dist/lib/upload.js.map +1 -0
- package/package.json +5 -3
- package/dist/commands/delete.d.ts +0 -6
- package/dist/commands/delete.d.ts.map +0 -1
- package/dist/commands/delete.js +0 -55
- package/dist/commands/delete.js.map +0 -1
- package/dist/commands/link.d.ts +0 -16
- package/dist/commands/link.d.ts.map +0 -1
- package/dist/commands/link.js +0 -142
- package/dist/commands/link.js.map +0 -1
- package/dist/commands/pull.d.ts +0 -15
- package/dist/commands/pull.d.ts.map +0 -1
- package/dist/commands/pull.js +0 -159
- package/dist/commands/pull.js.map +0 -1
- package/dist/commands/push.d.ts +0 -15
- package/dist/commands/push.d.ts.map +0 -1
- package/dist/commands/push.js +0 -262
- package/dist/commands/push.js.map +0 -1
- package/dist/commands/remove.d.ts +0 -11
- package/dist/commands/remove.d.ts.map +0 -1
- package/dist/commands/remove.js +0 -39
- package/dist/commands/remove.js.map +0 -1
- package/dist/commands/token.d.ts +0 -14
- package/dist/commands/token.d.ts.map +0 -1
- package/dist/commands/token.js +0 -132
- package/dist/commands/token.js.map +0 -1
- package/dist/commands/whoami.d.ts +0 -6
- package/dist/commands/whoami.d.ts.map +0 -1
- package/dist/commands/whoami.js +0 -46
- package/dist/commands/whoami.js.map +0 -1
- package/dist/lib/env-name.d.ts +0 -3
- package/dist/lib/env-name.d.ts.map +0 -1
- package/dist/lib/env-name.js +0 -5
- package/dist/lib/env-name.js.map +0 -1
- package/dist/lib/guest-key.test.d.ts +0 -2
- package/dist/lib/guest-key.test.d.ts.map +0 -1
- package/dist/lib/guest-key.test.js.map +0 -1
package/dist/commands/run.js
CHANGED
|
@@ -1,213 +1,125 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import os from "node:os";
|
|
2
3
|
import pc from "picocolors";
|
|
3
|
-
import { decryptSecret, parsePayload
|
|
4
|
-
import {
|
|
5
|
-
import { ApiClient, isDefaultApiUrl } from "../lib/api.js";
|
|
4
|
+
import { decryptSecret, parsePayload } from "@getmyenv/crypto";
|
|
5
|
+
import { ApiError } from "../lib/api.js";
|
|
6
6
|
import { ensureTokenAndLink } from "../lib/bootstrap.js";
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
environment = who.cliScope;
|
|
7
|
+
import { resolveContext } from "../lib/context.js";
|
|
8
|
+
import { signMachineProof } from "../lib/identity.js";
|
|
9
|
+
import { unlockProjectKey } from "../lib/unlock.js";
|
|
10
|
+
import { sleep } from "../lib/authorize.js";
|
|
11
|
+
import { explainLines, mergeEnv, signalExitCode, validationError, windowsCommandLine, } from "../lib/run-env.js";
|
|
12
|
+
const GRANT_HEADER = "X-Getmyenv-Grant";
|
|
13
|
+
/** Status lines go to stderr so the child's stdout stays clean for pipes. */
|
|
14
|
+
const log = (line = "") => console.error(line);
|
|
15
|
+
async function resolveOnce(client, projectId, slug, grant) {
|
|
16
|
+
return client.request("POST", "/api/cli/resolve", { context: slug, machine: signMachineProof(projectId, slug) }, grant ? { [GRANT_HEADER]: grant } : undefined);
|
|
17
|
+
}
|
|
18
|
+
async function waitForGrant(client, pending) {
|
|
19
|
+
log(`Waiting for approval in the dashboard: ${pending.reviewUrl}`);
|
|
20
|
+
log(pc.dim("Trust this machine there to skip approval next time.\n"));
|
|
21
|
+
const deadline = new Date(pending.expiresAt).getTime();
|
|
22
|
+
while (Date.now() < deadline) {
|
|
23
|
+
await sleep(1500);
|
|
24
|
+
const s = await client.request("GET", `/api/cli/requests/${pending.requestId}`);
|
|
25
|
+
if (s.status === "approved" && s.grantToken) {
|
|
26
|
+
log(`${pc.green("✓")} Approved\n`);
|
|
27
|
+
return s.grantToken;
|
|
29
28
|
}
|
|
30
|
-
|
|
31
|
-
throw new Error(
|
|
32
|
-
`Token scope is ${who.cliScope}, but you passed -e ${environment}.`,
|
|
33
|
-
who.cliScope === "development"
|
|
34
|
-
? "Use: npx getmyenv run -e development -- <cmd>"
|
|
35
|
-
: "Use: npx getmyenv run -e production -- <cmd>",
|
|
36
|
-
"Or create a matching Development/Production token on /cli.",
|
|
37
|
-
].join("\n"));
|
|
29
|
+
if (s.status === "approved") {
|
|
30
|
+
throw new Error("This approval was already used. Run the command again.");
|
|
38
31
|
}
|
|
32
|
+
if (s.status === "denied")
|
|
33
|
+
throw new Error("Access denied in the dashboard.");
|
|
34
|
+
if (s.status === "expired")
|
|
35
|
+
break;
|
|
39
36
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (!
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
console.log("");
|
|
48
|
-
const envInfo = await client.request("GET", `/api/cli/projects/${projectId}`);
|
|
49
|
-
const envRow = envInfo.environments.find((e) => e.name.toLowerCase() === environment.toLowerCase());
|
|
50
|
-
if (!envRow) {
|
|
51
|
-
throw new Error(`Environment not found: ${environment}`);
|
|
37
|
+
throw new Error("Approval request expired. Run the command again.");
|
|
38
|
+
}
|
|
39
|
+
/** Resolve, validate, merge, spawn. */
|
|
40
|
+
export async function runCommand(opts, childArgs) {
|
|
41
|
+
if (childArgs.length === 0 && !opts.explain) {
|
|
42
|
+
throw new Error("Usage: npx getmyenv run [context] -- <command>");
|
|
52
43
|
}
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const
|
|
58
|
-
const message = [
|
|
59
|
-
projectId,
|
|
60
|
-
environmentId,
|
|
61
|
-
identity.publicKey,
|
|
62
|
-
timestamp,
|
|
63
|
-
].join(":");
|
|
64
|
-
const signature = signAccessRequest(identity.privateKey, message);
|
|
65
|
-
let request;
|
|
44
|
+
const { who, client, meta, apiUrl } = await ensureTokenAndLink({ apiUrl: opts.apiUrl });
|
|
45
|
+
const ctx = resolveContext(who, meta, opts.context);
|
|
46
|
+
let res = await resolveOnce(client, who.project.id, ctx.slug);
|
|
47
|
+
if (res.status === "pending") {
|
|
48
|
+
const grant = await waitForGrant(client, res);
|
|
66
49
|
try {
|
|
67
|
-
|
|
68
|
-
projectId,
|
|
69
|
-
environmentId: envRow.id,
|
|
70
|
-
identityPublicKey: identity.publicKey,
|
|
71
|
-
identityLabel: process.env.GETMYENV_MACHINE_LABEL ??
|
|
72
|
-
`${process.env.USERNAME ?? process.env.USER ?? "dev"}'s machine`,
|
|
73
|
-
signature,
|
|
74
|
-
message,
|
|
75
|
-
timestamp,
|
|
76
|
-
requestedSecretNames: requestedSecretNames.length > 0 ? requestedSecretNames : undefined,
|
|
77
|
-
});
|
|
50
|
+
res = await resolveOnce(client, who.project.id, ctx.slug, grant);
|
|
78
51
|
}
|
|
79
52
|
catch (err) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
console.log(`\n${pc.red("✗")} Access requests are disabled for this project.\n`);
|
|
83
|
-
process.exit(1);
|
|
53
|
+
if (err instanceof ApiError && err.status === 401) {
|
|
54
|
+
throw new Error(`${err.message}. Run the command again.`);
|
|
84
55
|
}
|
|
85
56
|
throw err;
|
|
86
57
|
}
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
-
request.grantExpiresAt) {
|
|
90
|
-
grant = {
|
|
91
|
-
grantToken: request.grantToken,
|
|
92
|
-
expiresAt: request.grantExpiresAt,
|
|
93
|
-
projectId,
|
|
94
|
-
environmentId,
|
|
95
|
-
};
|
|
96
|
-
saveGrant(grant);
|
|
97
|
-
console.log(`${pc.green("✓")} ${needsDashboardWait
|
|
98
|
-
? "Trusted device - access granted"
|
|
99
|
-
: "Access granted (development)"}\n`);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
const appOrigin = apiUrl.replace(/\/$/, "");
|
|
103
|
-
console.log(`Waiting for dashboard approval (production). Open ${appOrigin}/requests\n`);
|
|
104
|
-
console.log(pc.dim("Tip: choose Trust this device in the dashboard to skip approval next time on this machine.\n"));
|
|
105
|
-
console.log(pc.dim("Waiting..."));
|
|
106
|
-
const deadline = new Date(request.expiresAt).getTime();
|
|
107
|
-
let approved = false;
|
|
108
|
-
while (Date.now() < deadline) {
|
|
109
|
-
const remaining = Math.max(0, Math.ceil((deadline - Date.now()) / 1000));
|
|
110
|
-
process.stdout.write(`\r${pc.dim(`Waiting... ${String(remaining).padStart(2, "0")}s`)} `);
|
|
111
|
-
await sleep(1500);
|
|
112
|
-
const status = await client.request("GET", `/api/cli/requests/${request.id}`);
|
|
113
|
-
if (status.status === "approved" &&
|
|
114
|
-
status.grantToken &&
|
|
115
|
-
status.grantExpiresAt) {
|
|
116
|
-
grant = {
|
|
117
|
-
grantToken: status.grantToken,
|
|
118
|
-
expiresAt: status.grantExpiresAt,
|
|
119
|
-
projectId,
|
|
120
|
-
environmentId,
|
|
121
|
-
};
|
|
122
|
-
saveGrant(grant);
|
|
123
|
-
approved = true;
|
|
124
|
-
break;
|
|
125
|
-
}
|
|
126
|
-
if (status.status === "denied") {
|
|
127
|
-
console.log(`\n\n${pc.red("✗")} Access denied\n`);
|
|
128
|
-
process.exit(1);
|
|
129
|
-
}
|
|
130
|
-
if (status.status === "expired" || status.status === "consumed") {
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
if (!approved || !grant) {
|
|
135
|
-
console.log(`\n\n${pc.red("✗")} Approval request expired\n`);
|
|
136
|
-
console.log("Run the command again to request access.\n");
|
|
137
|
-
process.exit(1);
|
|
138
|
-
}
|
|
139
|
-
console.log(`\n\n${pc.green("✓")} Access approved\n`);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
console.log("Loading secrets...\n");
|
|
143
|
-
let bundle;
|
|
144
|
-
try {
|
|
145
|
-
bundle = await client.request("POST", `/api/cli/grants/secrets`, {
|
|
146
|
-
projectId,
|
|
147
|
-
environmentId: envRow.id,
|
|
148
|
-
}, { "X-Getmyenv-Grant": grant.grantToken });
|
|
58
|
+
if (res.status !== "ok")
|
|
59
|
+
throw new Error("Approval did not complete. Run the command again.");
|
|
149
60
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (
|
|
153
|
-
|
|
61
|
+
const values = {};
|
|
62
|
+
if (res.values.length > 0) {
|
|
63
|
+
if (res.wrappedProjectKey == null) {
|
|
64
|
+
throw new Error("This project has values but no key. Restore the key from a backup.");
|
|
154
65
|
}
|
|
155
|
-
|
|
156
|
-
}
|
|
157
|
-
// Guest uses claim.json passphrase (no prompt). Claimed projects prompt.
|
|
158
|
-
// Production always prompts; development also prompts when not guest.
|
|
159
|
-
const maxAttempts = opts.vaultPasswordStdin || who.isGuest ? 1 : 3;
|
|
160
|
-
let pek = null;
|
|
161
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
162
|
-
const password = await resolveVaultPassword({
|
|
66
|
+
const { pek } = await unlockProjectKey({
|
|
163
67
|
isGuest: who.isGuest,
|
|
68
|
+
projectId: who.project.id,
|
|
69
|
+
wrapped: res.wrappedProjectKey,
|
|
70
|
+
cache: res.cacheKey,
|
|
164
71
|
vaultPasswordStdin: opts.vaultPasswordStdin,
|
|
72
|
+
apiUrl,
|
|
165
73
|
});
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
password,
|
|
169
|
-
scope: who.cliScope,
|
|
170
|
-
wrapped: bundle.wrappedProjectKey,
|
|
171
|
-
});
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
if (who.isGuest) {
|
|
176
|
-
clearGrant(projectId, environmentId);
|
|
177
|
-
throw new Error("Could not decrypt secrets with claim.json passphrase. Restore claim.json or run: npx getmyenv claim");
|
|
178
|
-
}
|
|
179
|
-
if (attempt < maxAttempts) {
|
|
180
|
-
console.log(pc.red("Wrong Vault password. Try again.\n"));
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
clearGrant(projectId, environmentId);
|
|
184
|
-
throw new Error("Could not decrypt secrets. Check your vault password.");
|
|
74
|
+
for (const v of res.values) {
|
|
75
|
+
values[v.name] = decryptSecret(pek, parsePayload(v.ciphertext));
|
|
185
76
|
}
|
|
186
77
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
78
|
+
const merged = mergeEnv(process.env, values, res.missing, opts.keepExisting === true);
|
|
79
|
+
const label = `${res.context.name} (${res.context.slug}${res.context.protection === "locked" ? ", locked" : ""})`;
|
|
80
|
+
if (opts.explain) {
|
|
81
|
+
log(pc.bold(`${who.project.name} / ${label}`));
|
|
82
|
+
for (const line of explainLines(merged, res.context.slug))
|
|
83
|
+
log(line);
|
|
84
|
+
log();
|
|
85
|
+
}
|
|
86
|
+
const invalid = validationError(merged, res.context.slug, opts.allowMissing === true);
|
|
87
|
+
if (invalid)
|
|
88
|
+
throw new Error(invalid);
|
|
89
|
+
if (childArgs.length === 0)
|
|
90
|
+
return;
|
|
91
|
+
if (!opts.explain) {
|
|
92
|
+
log(`${pc.green("✓")} ${who.project.name} / ${label}: ${merged.applied.length} variable${merged.applied.length === 1 ? "" : "s"}`);
|
|
190
93
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
94
|
+
if (merged.overridden.length > 0) {
|
|
95
|
+
log(pc.yellow(`Replaced from parent env: ${merged.overridden.join(", ")}`));
|
|
96
|
+
}
|
|
97
|
+
if (merged.kept.length > 0 && !opts.explain) {
|
|
98
|
+
log(pc.dim(`Kept from parent env: ${merged.kept.join(", ")}`));
|
|
99
|
+
}
|
|
100
|
+
if (merged.unresolved.length > 0) {
|
|
101
|
+
log(pc.yellow(`Not set: ${merged.unresolved.map((m) => m.name).join(", ")}`));
|
|
196
102
|
}
|
|
197
|
-
console.log(`${pc.green("✓")} Loaded ${loadedNames.length} secret${loadedNames.length === 1 ? "" : "s"}: ${loadedNames.join(", ") || "(none)"}\n`);
|
|
198
|
-
console.log("Starting application...\n");
|
|
199
103
|
const [cmd, ...args] = childArgs;
|
|
200
|
-
const child =
|
|
201
|
-
env,
|
|
202
|
-
stdio: "inherit"
|
|
203
|
-
|
|
204
|
-
|
|
104
|
+
const child = process.platform === "win32"
|
|
105
|
+
? spawn(windowsCommandLine(childArgs), { env: merged.env, stdio: "inherit", shell: true })
|
|
106
|
+
: spawn(cmd, args, { env: merged.env, stdio: "inherit" });
|
|
107
|
+
// Ctrl+C already reaches the child through the terminal. Only wait for it.
|
|
108
|
+
process.on("SIGINT", () => undefined);
|
|
109
|
+
// SIGTERM / SIGHUP are sent to this process only. Pass them on.
|
|
110
|
+
for (const sig of ["SIGTERM", "SIGHUP"]) {
|
|
111
|
+
process.on(sig, () => {
|
|
112
|
+
if (child.exitCode === null && child.signalCode === null)
|
|
113
|
+
child.kill(sig);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
205
116
|
const code = await new Promise((resolve) => {
|
|
206
|
-
child.on("
|
|
117
|
+
child.on("error", (err) => {
|
|
118
|
+
log(pc.red(`Could not start ${cmd}: ${err.message}`));
|
|
119
|
+
resolve(127);
|
|
120
|
+
});
|
|
121
|
+
child.on("exit", (c, signal) => resolve(c ?? (signal ? signalExitCode(signal, os.constants.signals) : 0)));
|
|
207
122
|
});
|
|
208
123
|
process.exit(code);
|
|
209
124
|
}
|
|
210
|
-
function sleep(ms) {
|
|
211
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
212
|
-
}
|
|
213
125
|
//# sourceMappingURL=run.js.map
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type SetOpts = {
|
|
2
|
+
context?: string;
|
|
3
|
+
apiUrl?: string;
|
|
4
|
+
expires?: string;
|
|
5
|
+
vaultPasswordStdin?: boolean;
|
|
6
|
+
/** Read the one value from stdin, so it never lands in argv or shell history. */
|
|
7
|
+
stdin?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/** `set KEY[=VALUE] ...` Omitted values are prompted without echo. */
|
|
10
|
+
export declare function setCommand(args: string[], opts: SetOpts): Promise<void>;
|
|
11
|
+
export declare function unsetCommand(names: string[], opts: {
|
|
12
|
+
context?: string;
|
|
13
|
+
apiUrl?: string;
|
|
14
|
+
all?: boolean;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=set.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../../src/commands/set.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iFAAiF;IACjF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AA0BF,sEAAsE;AACtE,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA0D7E;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACzD,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { variableNameSchema } from "@getmyenv/shared";
|
|
3
|
+
import { promptHidden } from "../lib/fs.js";
|
|
4
|
+
import { presetVaultPassword } from "../lib/guest-key.js";
|
|
5
|
+
import { ensureTokenAndLink } from "../lib/bootstrap.js";
|
|
6
|
+
import { resolveContext } from "../lib/context.js";
|
|
7
|
+
import { assertWritable, uploadValues } from "../lib/upload.js";
|
|
8
|
+
async function readStdinValue() {
|
|
9
|
+
const chunks = [];
|
|
10
|
+
for await (const chunk of process.stdin) {
|
|
11
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
12
|
+
}
|
|
13
|
+
return Buffer.concat(chunks).toString("utf8").replace(/\r?\n$/, "");
|
|
14
|
+
}
|
|
15
|
+
function parsePair(arg) {
|
|
16
|
+
const eq = arg.indexOf("=");
|
|
17
|
+
if (eq <= 0)
|
|
18
|
+
return { name: arg.trim() };
|
|
19
|
+
return { name: arg.slice(0, eq).trim(), value: arg.slice(eq + 1) };
|
|
20
|
+
}
|
|
21
|
+
function parseExpires(raw) {
|
|
22
|
+
if (raw === undefined)
|
|
23
|
+
return undefined;
|
|
24
|
+
if (raw === "never" || raw === "")
|
|
25
|
+
return null;
|
|
26
|
+
const d = new Date(raw);
|
|
27
|
+
if (Number.isNaN(d.getTime())) {
|
|
28
|
+
throw new Error("--expires takes a date like 2026-12-31, or never.");
|
|
29
|
+
}
|
|
30
|
+
return d.toISOString();
|
|
31
|
+
}
|
|
32
|
+
/** `set KEY[=VALUE] ...` Omitted values are prompted without echo. */
|
|
33
|
+
export async function setCommand(args, opts) {
|
|
34
|
+
const pairs = args.map(parsePair);
|
|
35
|
+
for (const p of pairs) {
|
|
36
|
+
if (!variableNameSchema.safeParse(p.name).success) {
|
|
37
|
+
throw new Error(`Invalid name: ${p.name}. Use an environment variable name like API_KEY.`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const expiresAt = parseExpires(opts.expires);
|
|
41
|
+
if (opts.stdin) {
|
|
42
|
+
if (pairs.length !== 1 || pairs[0].value !== undefined) {
|
|
43
|
+
throw new Error("--stdin sets one variable: printf %s \"$VALUE\" | npx getmyenv set KEY --stdin");
|
|
44
|
+
}
|
|
45
|
+
if (process.stdin.isTTY) {
|
|
46
|
+
throw new Error("--stdin reads a piped value: printf %s \"$VALUE\" | npx getmyenv set KEY --stdin");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const linked = await ensureTokenAndLink({ apiUrl: opts.apiUrl });
|
|
50
|
+
const ctx = resolveContext(linked.who, linked.meta, opts.context);
|
|
51
|
+
assertWritable(linked, ctx);
|
|
52
|
+
const values = {};
|
|
53
|
+
if (opts.stdin) {
|
|
54
|
+
const input = await readStdinValue();
|
|
55
|
+
if (opts.vaultPasswordStdin) {
|
|
56
|
+
const nl = input.indexOf("\n");
|
|
57
|
+
if (nl < 0) {
|
|
58
|
+
throw new Error("With --vault-password-stdin, send the password on the first line and the value after it.");
|
|
59
|
+
}
|
|
60
|
+
presetVaultPassword(input.slice(0, nl).replace(/\r$/, ""));
|
|
61
|
+
values[pairs[0].name] = input.slice(nl + 1);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
values[pairs[0].name] = input;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
for (const p of pairs) {
|
|
68
|
+
if (opts.stdin)
|
|
69
|
+
break;
|
|
70
|
+
if (p.value !== undefined) {
|
|
71
|
+
values[p.name] = p.value;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (!process.stdin.isTTY) {
|
|
75
|
+
throw new Error(`No value for ${p.name}. Pipe it with --stdin, pass ${p.name}=VALUE, or run in a terminal to be prompted.`);
|
|
76
|
+
}
|
|
77
|
+
values[p.name] = await promptHidden(`${p.name} (hidden): `);
|
|
78
|
+
}
|
|
79
|
+
const res = await uploadValues({
|
|
80
|
+
linked,
|
|
81
|
+
context: ctx,
|
|
82
|
+
pairs: values,
|
|
83
|
+
expiresAt,
|
|
84
|
+
vaultPasswordStdin: opts.vaultPasswordStdin,
|
|
85
|
+
});
|
|
86
|
+
for (const name of res.set)
|
|
87
|
+
console.log(`${pc.green("✓")} ${name} ${pc.dim(`set in ${ctx.slug}`)}`);
|
|
88
|
+
for (const name of res.declared)
|
|
89
|
+
console.log(`${pc.yellow("○")} ${name} ${pc.dim(`declared, no value in ${ctx.slug}`)}`);
|
|
90
|
+
}
|
|
91
|
+
export async function unsetCommand(names, opts) {
|
|
92
|
+
for (const n of names) {
|
|
93
|
+
if (!variableNameSchema.safeParse(n).success)
|
|
94
|
+
throw new Error(`Invalid name: ${n}`);
|
|
95
|
+
}
|
|
96
|
+
const linked = await ensureTokenAndLink({ apiUrl: opts.apiUrl });
|
|
97
|
+
const ctx = resolveContext(linked.who, linked.meta, opts.context);
|
|
98
|
+
assertWritable(linked, ctx);
|
|
99
|
+
const res = await linked.client.request("DELETE", "/api/cli/values", {
|
|
100
|
+
context: ctx.slug,
|
|
101
|
+
names,
|
|
102
|
+
...(opts.all ? { deleteKey: true } : {}),
|
|
103
|
+
});
|
|
104
|
+
const where = opts.all ? "removed from every context" : `unset in ${ctx.slug}`;
|
|
105
|
+
for (const name of res.removed)
|
|
106
|
+
console.log(`${pc.green("✓")} ${name} ${pc.dim(where)}`);
|
|
107
|
+
const skipped = names.filter((n) => !res.removed.includes(n));
|
|
108
|
+
if (skipped.length > 0)
|
|
109
|
+
console.log(pc.dim(`No change: ${skipped.join(", ")}`));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=set.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.js","sourceRoot":"","sources":["../../src/commands/set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAWhE,KAAK,UAAU,cAAc;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IACzC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,YAAY,CAAC,GAAuB;IAC3C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAc,EAAE,IAAa;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC,IAAI,kDAAkD,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,gFAAgF,CAAC,CAAC;QACpG,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAC;QACtG,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE5B,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,0FAA0F,CAAC,CAAC;YAC9G,CAAC;YACD,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM;QACtB,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YACzB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CACb,gBAAgB,CAAC,CAAC,IAAI,gCAAgC,CAAC,CAAC,IAAI,8CAA8C,CAC3G,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC;QAC7B,MAAM;QACN,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,MAAM;QACb,SAAS;QACT,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;KAC5C,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACpG,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC3H,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAe,EACf,IAA0D;IAE1D,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAClE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC5B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,CAAwB,QAAQ,EAAE,iBAAiB,EAAE;QAC1F,OAAO,EAAE,GAAG,CAAC,IAAI;QACjB,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/E,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzF,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Best guess at the app's start command, for the printed `run` line. */
|
|
2
|
+
export declare function suggestedStartCommand(cwd?: string): string;
|
|
3
|
+
export declare function runLine(context: string | null, cwd?: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* Guided setup for an unlinked folder, in a terminal.
|
|
6
|
+
* Start without an account, or sign in. Then offer to import a detected .env.
|
|
7
|
+
*/
|
|
8
|
+
export declare function startSetup(opts: {
|
|
9
|
+
apiUrl?: string;
|
|
10
|
+
thenContinue?: boolean;
|
|
11
|
+
}): Promise<void>;
|
|
12
|
+
/** Bare `getmyenv`: setup when unlinked (terminal only), status when linked. */
|
|
13
|
+
export declare function startCommand(opts: {
|
|
14
|
+
apiUrl?: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=start.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAmBA,yEAAyE;AACzE,wBAAgB,qBAAqB,CAAC,GAAG,SAAgB,GAAG,MAAM,CAkBjE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,SAAgB,GAAG,MAAM,CAG3E;AA4BD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDjG;AAED,gFAAgF;AAChF,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU3E"}
|