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
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure pieces of `getmyenv run`: validate and merge. Names only in any output.
|
|
3
|
+
*/
|
|
4
|
+
/** The child never sees the CLI's own settings (token, API URL, config dir). */
|
|
5
|
+
export function withoutOwnEnv(parent) {
|
|
6
|
+
const env = {};
|
|
7
|
+
for (const [k, v] of Object.entries(parent)) {
|
|
8
|
+
if (!k.toUpperCase().startsWith("GETMYENV_"))
|
|
9
|
+
env[k] = v;
|
|
10
|
+
}
|
|
11
|
+
return env;
|
|
12
|
+
}
|
|
13
|
+
function present(parent, name) {
|
|
14
|
+
const v = parent[name];
|
|
15
|
+
return v !== undefined && v !== "";
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Merge context values into the parent env.
|
|
19
|
+
* The context wins unless keepExisting is set. A key missing in the context is
|
|
20
|
+
* satisfied when the parent env already has it (for example from `op run`).
|
|
21
|
+
*/
|
|
22
|
+
export function mergeEnv(parent, values, missing, keepExisting) {
|
|
23
|
+
const env = withoutOwnEnv(parent);
|
|
24
|
+
const applied = [];
|
|
25
|
+
const overridden = [];
|
|
26
|
+
const kept = [];
|
|
27
|
+
const entries = [];
|
|
28
|
+
for (const name of Object.keys(values).sort()) {
|
|
29
|
+
if (present(parent, name)) {
|
|
30
|
+
if (keepExisting) {
|
|
31
|
+
kept.push(name);
|
|
32
|
+
entries.push({ name, origin: "parent-kept" });
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (parent[name] !== values[name]) {
|
|
36
|
+
overridden.push(name);
|
|
37
|
+
entries.push({ name, origin: "context-overrides-parent" });
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
entries.push({ name, origin: "context" });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
entries.push({ name, origin: "context" });
|
|
45
|
+
}
|
|
46
|
+
env[name] = values[name];
|
|
47
|
+
applied.push(name);
|
|
48
|
+
}
|
|
49
|
+
const filledByParent = [];
|
|
50
|
+
const unresolved = [];
|
|
51
|
+
for (const m of [...missing].sort((a, b) => a.name.localeCompare(b.name))) {
|
|
52
|
+
if (present(parent, m.name)) {
|
|
53
|
+
filledByParent.push(m.name);
|
|
54
|
+
entries.push({ name: m.name, origin: "parent-fills-missing", reason: m.reason });
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
unresolved.push(m);
|
|
58
|
+
entries.push({ name: m.name, origin: "missing", reason: m.reason });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
62
|
+
return { env, applied, overridden, kept, filledByParent, unresolved, entries };
|
|
63
|
+
}
|
|
64
|
+
/** Error text when keys are unresolved and --allow-missing is not set. Null when fine. */
|
|
65
|
+
export function validationError(result, contextSlug, allowMissing) {
|
|
66
|
+
if (allowMissing || result.unresolved.length === 0)
|
|
67
|
+
return null;
|
|
68
|
+
const lines = result.unresolved.map((m) => ` ${m.name}${m.reason === "expired" ? " (expired)" : ""}`);
|
|
69
|
+
return [
|
|
70
|
+
`${result.unresolved.length} variable(s) have no value in ${contextSlug}:`,
|
|
71
|
+
...lines,
|
|
72
|
+
`Set them: npx getmyenv set NAME -c ${contextSlug}`,
|
|
73
|
+
"Or run anyway: --allow-missing",
|
|
74
|
+
].join("\n");
|
|
75
|
+
}
|
|
76
|
+
const ORIGIN_TEXT = {
|
|
77
|
+
context: (ctx) => `getmyenv (${ctx})`,
|
|
78
|
+
"context-overrides-parent": (ctx) => `getmyenv (${ctx}), replaces parent env`,
|
|
79
|
+
"parent-kept": () => "parent env (--keep-existing)",
|
|
80
|
+
"parent-fills-missing": (ctx, reason) => `parent env (${reason === "expired" ? "expired" : "missing"} in ${ctx})`,
|
|
81
|
+
missing: (ctx, reason) => `not set (${reason === "expired" ? "expired" : "missing"} in ${ctx})`,
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* One cmd.exe command line from argv. Windows needs the shell to find `npm.cmd`
|
|
85
|
+
* and friends, and Node does not quote args passed alongside `shell: true`.
|
|
86
|
+
* cmd expands %VAR% even inside quotes, so each % is closed out of the quotes
|
|
87
|
+
* and escaped with ^.
|
|
88
|
+
*/
|
|
89
|
+
export function windowsCommandLine(args) {
|
|
90
|
+
return args
|
|
91
|
+
.map((a) => {
|
|
92
|
+
if (a === "")
|
|
93
|
+
return '""';
|
|
94
|
+
if (!/[\s"&|<>^()%]/.test(a))
|
|
95
|
+
return a;
|
|
96
|
+
const escaped = a.replace(/(\\*)"/g, '$1$1\\"').replace(/(\\+)$/, "$1$1");
|
|
97
|
+
return `"${escaped.replace(/%/g, '"^%"')}"`;
|
|
98
|
+
})
|
|
99
|
+
.join(" ");
|
|
100
|
+
}
|
|
101
|
+
/** Exit code for a child that ended by signal: 128 + signal number, like a shell. */
|
|
102
|
+
export function signalExitCode(signal, numbers) {
|
|
103
|
+
const n = numbers[signal];
|
|
104
|
+
return typeof n === "number" ? 128 + n : 1;
|
|
105
|
+
}
|
|
106
|
+
/** `--explain` output. Names and origins only, never values. */
|
|
107
|
+
export function explainLines(result, contextSlug) {
|
|
108
|
+
const width = Math.max(4, ...result.entries.map((e) => e.name.length));
|
|
109
|
+
const lines = result.entries.map((e) => ` ${e.name.padEnd(width)} ${ORIGIN_TEXT[e.origin](contextSlug, e.reason)}`);
|
|
110
|
+
lines.push("");
|
|
111
|
+
lines.push(` ${result.applied.length} from getmyenv, ${result.overridden.length} replaced, ${result.kept.length} kept, ${result.filledByParent.length} from parent env, ${result.unresolved.length} not set`);
|
|
112
|
+
return lines;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=run-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-env.js","sourceRoot":"","sources":["../../src/lib/run-env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type UnlockOpts = {
|
|
2
|
+
isGuest: boolean;
|
|
3
|
+
/** Enables the OS keychain cache for open contexts. */
|
|
4
|
+
projectId?: string;
|
|
5
|
+
/** Wrapped key from the server, or null when the project has none yet. */
|
|
6
|
+
wrapped: unknown | null;
|
|
7
|
+
/** Open contexts only: read and refresh `.getmyenv/key.json`. */
|
|
8
|
+
cache: boolean;
|
|
9
|
+
/** Create a project key when none exists (first `set` / `import`). */
|
|
10
|
+
allowCreate?: boolean;
|
|
11
|
+
vaultPasswordStdin?: boolean;
|
|
12
|
+
/** --api-url, so the keychain entry matches the one `lock --api-url` clears. */
|
|
13
|
+
apiUrl?: string;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Unwrap the project key with the Vault password (or the guest passphrase in
|
|
17
|
+
* claim.json). Retries a wrong password up to 3 times in a terminal.
|
|
18
|
+
*/
|
|
19
|
+
export declare function unlockProjectKey(opts: UnlockOpts): Promise<{
|
|
20
|
+
pek: Uint8Array;
|
|
21
|
+
wrappedRaw: string;
|
|
22
|
+
created: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
//# sourceMappingURL=unlock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unlock.d.ts","sourceRoot":"","sources":["../../src/lib/unlock.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,iEAAiE;IACjE,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCpE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
import { hasCachedKey, loadPek } from "./pek.js";
|
|
3
|
+
import { resolveVaultPassword } from "./guest-key.js";
|
|
4
|
+
import { resolveApiUrl } from "./api.js";
|
|
5
|
+
import { KEYCHAIN_TTL_MS, keychainAccount, keychainEnabled, readCachedPek, storeCachedPek, } from "./keychain.js";
|
|
6
|
+
/**
|
|
7
|
+
* Unwrap the project key with the Vault password (or the guest passphrase in
|
|
8
|
+
* claim.json). Retries a wrong password up to 3 times in a terminal.
|
|
9
|
+
*/
|
|
10
|
+
export async function unlockProjectKey(opts) {
|
|
11
|
+
const known = opts.wrapped != null
|
|
12
|
+
? typeof opts.wrapped === "string"
|
|
13
|
+
? opts.wrapped
|
|
14
|
+
: JSON.stringify(opts.wrapped)
|
|
15
|
+
: null;
|
|
16
|
+
if (memo && (known === memo.wrappedRaw || (known == null && opts.cache))) {
|
|
17
|
+
return { pek: memo.pek, wrappedRaw: memo.wrappedRaw, created: false };
|
|
18
|
+
}
|
|
19
|
+
const account = canUseKeychain(opts)
|
|
20
|
+
? keychainAccount(resolveApiUrl(opts.apiUrl), opts.projectId)
|
|
21
|
+
: null;
|
|
22
|
+
if (account && known != null) {
|
|
23
|
+
const pek = await readCachedPek(account, known);
|
|
24
|
+
if (pek) {
|
|
25
|
+
memo = { pek, wrappedRaw: known };
|
|
26
|
+
return { pek, wrappedRaw: known, created: false };
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const result = await unlockWithPassword(opts);
|
|
30
|
+
memo = { pek: result.pek, wrappedRaw: result.wrappedRaw };
|
|
31
|
+
// Stored only after a password typed at a terminal. Reading also works when
|
|
32
|
+
// stdin is piped, e.g. `printf %s "$VALUE" | getmyenv set KEY --stdin`.
|
|
33
|
+
if (account &&
|
|
34
|
+
process.stdin.isTTY === true &&
|
|
35
|
+
(await storeCachedPek(account, result.wrappedRaw, result.pek))) {
|
|
36
|
+
console.error(pc.dim(`Unlocked on this machine for ${KEYCHAIN_TTL_MS / 3_600_000} hours (OS keychain). Forget it with: npx getmyenv lock\n`));
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/** Open contexts on a real account. Never CI, servers, guests or --vault-password-stdin. */
|
|
41
|
+
function canUseKeychain(opts) {
|
|
42
|
+
return (opts.cache &&
|
|
43
|
+
!opts.isGuest &&
|
|
44
|
+
!opts.vaultPasswordStdin &&
|
|
45
|
+
Boolean(opts.projectId) &&
|
|
46
|
+
keychainEnabled());
|
|
47
|
+
}
|
|
48
|
+
/** One unlock per process: several uploads in one command prompt once. */
|
|
49
|
+
let memo = null;
|
|
50
|
+
async function unlockWithPassword(opts) {
|
|
51
|
+
const creating = opts.allowCreate === true &&
|
|
52
|
+
opts.wrapped == null &&
|
|
53
|
+
!(opts.cache && hasCachedKey());
|
|
54
|
+
if (creating && !opts.isGuest) {
|
|
55
|
+
console.error(pc.dim("Choose a Vault password. It stays on this machine. We store an encrypted key only.\n"));
|
|
56
|
+
}
|
|
57
|
+
const interactive = process.stdin.isTTY && !opts.vaultPasswordStdin && !opts.isGuest;
|
|
58
|
+
const maxAttempts = creating || !interactive ? 1 : 3;
|
|
59
|
+
for (let attempt = 1;; attempt++) {
|
|
60
|
+
const password = await resolveVaultPassword({
|
|
61
|
+
isGuest: opts.isGuest,
|
|
62
|
+
vaultPasswordStdin: opts.vaultPasswordStdin,
|
|
63
|
+
create: creating,
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
return await loadPek({
|
|
67
|
+
password,
|
|
68
|
+
cache: opts.cache,
|
|
69
|
+
wrapped: opts.wrapped ?? undefined,
|
|
70
|
+
allowCreate: opts.allowCreate,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
if (err instanceof Error && /no key yet/i.test(err.message))
|
|
75
|
+
throw err;
|
|
76
|
+
if (opts.isGuest) {
|
|
77
|
+
throw new Error("Could not unlock with the claim.json passphrase. Restore claim.json from the repo.");
|
|
78
|
+
}
|
|
79
|
+
if (attempt < maxAttempts) {
|
|
80
|
+
console.error(pc.red("Wrong Vault password. Try again.\n"));
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
throw new Error("Could not unlock. Check your Vault password.");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=unlock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unlock.js","sourceRoot":"","sources":["../../src/lib/unlock.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
/** Simple semver compare for x.y.z (no prerelease). Returns -1 / 0 / 1. */
|
|
6
6
|
export declare function compareSemver(a: string, b: string): number;
|
|
7
|
+
/** One line for the nudge, or null when up to date or unknown. */
|
|
8
|
+
export declare function updateLine(current: string, latest: string | null): string | null;
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
+
* Soft update nudge. Never blocks and never exits: one line on stderr from the
|
|
11
|
+
* cached npm version, refreshed in the background once a day. Skipped in CI.
|
|
10
12
|
*/
|
|
11
13
|
export declare function maybeSuggestUpdate(): Promise<void>;
|
|
12
14
|
//# sourceMappingURL=update-check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1D;
|
|
1
|
+
{"version":3,"file":"update-check.d.ts","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAU1D;AA8ED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAGhF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBxD"}
|
package/dist/lib/update-check.js
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* Soft update nudge: compare running CLI_VERSION to npm latest.
|
|
3
3
|
* Cache under ~/.config/getmyenv. Fail-open on network errors.
|
|
4
4
|
*/
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
5
6
|
import fs from "node:fs";
|
|
6
7
|
import os from "node:os";
|
|
7
8
|
import path from "node:path";
|
|
8
9
|
import pc from "picocolors";
|
|
9
10
|
import { CLI_VERSION } from "./api.js";
|
|
10
|
-
import { promptConfirm } from "./fs.js";
|
|
11
11
|
const CACHE_TTL_MS = 24 * 60 * 60 * 1000;
|
|
12
12
|
const FETCH_TIMEOUT_MS = 2500;
|
|
13
13
|
function configDir() {
|
|
@@ -46,43 +46,6 @@ function readCache() {
|
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
function writeCache(latest) {
|
|
50
|
-
try {
|
|
51
|
-
const dir = configDir();
|
|
52
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
53
|
-
const payload = {
|
|
54
|
-
latest,
|
|
55
|
-
checkedAt: new Date().toISOString(),
|
|
56
|
-
};
|
|
57
|
-
fs.writeFileSync(cachePath(), JSON.stringify(payload, null, 2), {
|
|
58
|
-
mode: 0o600,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
/* ignore */
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
async function fetchLatestFromNpm() {
|
|
66
|
-
const ctrl = new AbortController();
|
|
67
|
-
const timer = setTimeout(() => ctrl.abort(), FETCH_TIMEOUT_MS);
|
|
68
|
-
try {
|
|
69
|
-
const res = await fetch("https://registry.npmjs.org/getmyenv/latest", {
|
|
70
|
-
signal: ctrl.signal,
|
|
71
|
-
headers: { Accept: "application/json" },
|
|
72
|
-
});
|
|
73
|
-
if (!res.ok)
|
|
74
|
-
return null;
|
|
75
|
-
const data = (await res.json());
|
|
76
|
-
const v = data.version?.trim();
|
|
77
|
-
return v || null;
|
|
78
|
-
}
|
|
79
|
-
catch {
|
|
80
|
-
return null;
|
|
81
|
-
}
|
|
82
|
-
finally {
|
|
83
|
-
clearTimeout(timer);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
49
|
function looksLikeGlobalBin() {
|
|
87
50
|
const argv1 = (process.argv[1] ?? "").toLowerCase();
|
|
88
51
|
if (argv1.includes(`${path.sep}npx${path.sep}`) || argv1.includes("npm-cache")) {
|
|
@@ -104,46 +67,69 @@ function updateCommand() {
|
|
|
104
67
|
? "npm i -g getmyenv@latest"
|
|
105
68
|
: "npx getmyenv@latest";
|
|
106
69
|
}
|
|
70
|
+
/** Refresh the cache in a detached process so the command never waits on npm. */
|
|
71
|
+
function refreshInBackground() {
|
|
72
|
+
const script = `(${fetchAndCache.toString()})(${JSON.stringify(cachePath())}, ${FETCH_TIMEOUT_MS})`;
|
|
73
|
+
try {
|
|
74
|
+
const child = spawn(process.execPath, ["-e", script], {
|
|
75
|
+
detached: true,
|
|
76
|
+
stdio: "ignore",
|
|
77
|
+
windowsHide: true,
|
|
78
|
+
});
|
|
79
|
+
child.on("error", () => undefined);
|
|
80
|
+
child.unref();
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
/* fail open */
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/** Runs in the background child. Self-contained: no imports from this module. */
|
|
87
|
+
async function fetchAndCache(file, timeoutMs) {
|
|
88
|
+
const fs = await import("node:fs");
|
|
89
|
+
const path = await import("node:path");
|
|
90
|
+
const ctrl = new AbortController();
|
|
91
|
+
setTimeout(() => ctrl.abort(), timeoutMs).unref();
|
|
92
|
+
try {
|
|
93
|
+
const res = await fetch("https://registry.npmjs.org/getmyenv/latest", { signal: ctrl.signal });
|
|
94
|
+
if (!res.ok)
|
|
95
|
+
return;
|
|
96
|
+
const data = (await res.json());
|
|
97
|
+
if (!data.version)
|
|
98
|
+
return;
|
|
99
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
100
|
+
fs.writeFileSync(file, JSON.stringify({ latest: data.version, checkedAt: new Date().toISOString() }), {
|
|
101
|
+
mode: 0o600,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
/* fail open */
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/** One line for the nudge, or null when up to date or unknown. */
|
|
109
|
+
export function updateLine(current, latest) {
|
|
110
|
+
if (!latest || compareSemver(current, latest) >= 0)
|
|
111
|
+
return null;
|
|
112
|
+
return `getmyenv ${latest} is available (you have ${current}). Update: ${updateCommand()}`;
|
|
113
|
+
}
|
|
107
114
|
/**
|
|
108
|
-
*
|
|
109
|
-
*
|
|
115
|
+
* Soft update nudge. Never blocks and never exits: one line on stderr from the
|
|
116
|
+
* cached npm version, refreshed in the background once a day. Skipped in CI.
|
|
110
117
|
*/
|
|
111
118
|
export async function maybeSuggestUpdate() {
|
|
112
|
-
|
|
119
|
+
const ci = process.env.CI?.trim().toLowerCase();
|
|
120
|
+
if (process.env.GETMYENV_SKIP_UPDATE === "1" || (ci && ci !== "false" && ci !== "0"))
|
|
113
121
|
return;
|
|
114
|
-
// --version / -V only: skip nudge noise
|
|
115
122
|
if (process.argv.includes("-V") ||
|
|
116
123
|
process.argv.includes("--version") ||
|
|
117
124
|
process.argv.includes("-h") ||
|
|
118
125
|
process.argv.includes("--help")) {
|
|
119
126
|
return;
|
|
120
127
|
}
|
|
121
|
-
let latest = null;
|
|
122
128
|
const cached = readCache();
|
|
123
|
-
if (cached)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (latest)
|
|
129
|
-
writeCache(latest);
|
|
130
|
-
}
|
|
131
|
-
if (!latest)
|
|
132
|
-
return;
|
|
133
|
-
if (compareSemver(CLI_VERSION, latest) >= 0)
|
|
134
|
-
return;
|
|
135
|
-
const cmd = updateCommand();
|
|
136
|
-
const line = `Newer getmyenv: ${latest} (you have ${CLI_VERSION}). Update first: ${cmd}`;
|
|
137
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
138
|
-
console.error(pc.yellow(`getmyenv: ${line}`));
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
console.log(pc.yellow(`\n${line}\n`));
|
|
142
|
-
const cont = await promptConfirm(`Continue with ${CLI_VERSION} anyway?`, { defaultYes: false });
|
|
143
|
-
if (!cont) {
|
|
144
|
-
console.log(pc.dim(`Run: ${cmd}\n`));
|
|
145
|
-
process.exit(0);
|
|
146
|
-
}
|
|
147
|
-
console.log("");
|
|
129
|
+
if (!cached)
|
|
130
|
+
refreshInBackground();
|
|
131
|
+
const line = updateLine(CLI_VERSION, cached?.latest ?? null);
|
|
132
|
+
if (line)
|
|
133
|
+
console.error(pc.yellow(line));
|
|
148
134
|
}
|
|
149
135
|
//# sourceMappingURL=update-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { ContextInfo } from "./api.js";
|
|
2
|
+
import type { Linked } from "./bootstrap.js";
|
|
3
|
+
/** Fail fast before prompting or encrypting. Mirrors the server's `checkWrite`, which still enforces it. */
|
|
4
|
+
export declare function assertWritable(linked: Linked, ctx: ContextInfo): void;
|
|
5
|
+
/**
|
|
6
|
+
* Encrypt values locally and upload ciphertext to one open context.
|
|
7
|
+
* Empty values are declared as keys with no value in this context.
|
|
8
|
+
*/
|
|
9
|
+
export declare function uploadValues(input: {
|
|
10
|
+
linked: Linked;
|
|
11
|
+
context: ContextInfo;
|
|
12
|
+
pairs: Record<string, string>;
|
|
13
|
+
prune?: boolean;
|
|
14
|
+
expiresAt?: string | null;
|
|
15
|
+
vaultPasswordStdin?: boolean;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
set: string[];
|
|
18
|
+
pruned: string[];
|
|
19
|
+
declared: string[];
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAG7C,4GAA4G;AAC5G,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CASrE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8CnE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { encryptSecret, serializePayload } from "@getmyenv/crypto";
|
|
2
|
+
import { unlockProjectKey } from "./unlock.js";
|
|
3
|
+
/** Fail fast before prompting or encrypting. Mirrors the server's `checkWrite`, which still enforces it. */
|
|
4
|
+
export function assertWritable(linked, ctx) {
|
|
5
|
+
if (linked.who.token.kind === "server") {
|
|
6
|
+
throw new Error("Server tokens are read-only. Set values in the dashboard.");
|
|
7
|
+
}
|
|
8
|
+
if (ctx.protection === "locked") {
|
|
9
|
+
throw new Error(`${ctx.slug} is locked. The CLI is read-only there. Set values in the dashboard.`);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Encrypt values locally and upload ciphertext to one open context.
|
|
14
|
+
* Empty values are declared as keys with no value in this context.
|
|
15
|
+
*/
|
|
16
|
+
export async function uploadValues(input) {
|
|
17
|
+
const { linked, context } = input;
|
|
18
|
+
assertWritable(linked, context);
|
|
19
|
+
const filled = Object.entries(input.pairs).filter(([, v]) => v !== "");
|
|
20
|
+
const declare = Object.entries(input.pairs)
|
|
21
|
+
.filter(([, v]) => v === "")
|
|
22
|
+
.map(([k]) => k);
|
|
23
|
+
let values = [];
|
|
24
|
+
let wrappedProjectKey;
|
|
25
|
+
if (filled.length > 0) {
|
|
26
|
+
const { wrappedProjectKey: serverWrapped } = await linked.client.request("GET", "/api/cli/vault");
|
|
27
|
+
const { pek, wrappedRaw, created } = await unlockProjectKey({
|
|
28
|
+
isGuest: linked.who.isGuest,
|
|
29
|
+
projectId: linked.who.project.id,
|
|
30
|
+
wrapped: serverWrapped,
|
|
31
|
+
cache: true,
|
|
32
|
+
allowCreate: true,
|
|
33
|
+
vaultPasswordStdin: input.vaultPasswordStdin,
|
|
34
|
+
apiUrl: linked.apiUrl,
|
|
35
|
+
});
|
|
36
|
+
if (serverWrapped == null || created) {
|
|
37
|
+
wrappedProjectKey = JSON.parse(wrappedRaw);
|
|
38
|
+
}
|
|
39
|
+
values = filled.map(([name, value]) => ({
|
|
40
|
+
name,
|
|
41
|
+
ciphertext: serializePayload(encryptSecret(pek, value)),
|
|
42
|
+
...(input.expiresAt !== undefined ? { expiresAt: input.expiresAt } : {}),
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
return linked.client.request("POST", "/api/cli/values", {
|
|
46
|
+
context: context.slug,
|
|
47
|
+
...(wrappedProjectKey ? { wrappedProjectKey } : {}),
|
|
48
|
+
values,
|
|
49
|
+
...(input.prune ? { prune: true } : {}),
|
|
50
|
+
...(declare.length > 0 ? { declare } : {}),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/lib/upload.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "getmyenv",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "CLI for getmyenv - encrypted environment variables for any language",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -33,8 +33,9 @@
|
|
|
33
33
|
"access": "public"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@getmyenv/crypto": "0.
|
|
37
|
-
"@getmyenv/shared": "0.
|
|
36
|
+
"@getmyenv/crypto": "0.2.0",
|
|
37
|
+
"@getmyenv/shared": "0.2.0",
|
|
38
|
+
"@napi-rs/keyring": "^2.1.0",
|
|
38
39
|
"commander": "^13.1.0",
|
|
39
40
|
"dotenv": "^16.4.7",
|
|
40
41
|
"ora": "^8.2.0",
|
|
@@ -49,6 +50,7 @@
|
|
|
49
50
|
"node": ">=24"
|
|
50
51
|
},
|
|
51
52
|
"scripts": {
|
|
53
|
+
"prebuild": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
52
54
|
"build": "tsc -p tsconfig.json",
|
|
53
55
|
"dev": "tsc -p tsconfig.json --watch",
|
|
54
56
|
"start": "node dist/bin.js",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/commands/delete.ts"],"names":[],"mappings":"AAYA;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDnD"}
|