envpush 0.2.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/dist/chunk-2H7UOFLK.js +11 -0
- package/dist/chunk-2H7UOFLK.js.map +1 -0
- package/dist/chunk-BWPCYXXL.js +50 -0
- package/dist/chunk-BWPCYXXL.js.map +1 -0
- package/dist/chunk-HL2WXSVD.js +22 -0
- package/dist/chunk-HL2WXSVD.js.map +1 -0
- package/dist/chunk-HQFY6BB6.js +44 -0
- package/dist/chunk-HQFY6BB6.js.map +1 -0
- package/dist/chunk-TSUQGF7F.js +27 -0
- package/dist/chunk-TSUQGF7F.js.map +1 -0
- package/dist/chunk-UWVCYS24.js +63 -0
- package/dist/chunk-UWVCYS24.js.map +1 -0
- package/dist/chunk-Z23MVAIZ.js +4194 -0
- package/dist/chunk-Z23MVAIZ.js.map +1 -0
- package/dist/create-ET6VM5GG.js +82 -0
- package/dist/create-ET6VM5GG.js.map +1 -0
- package/dist/create-M22SN3AK.js +47 -0
- package/dist/create-M22SN3AK.js.map +1 -0
- package/dist/diff-3BVIP6CW.js +82 -0
- package/dist/diff-3BVIP6CW.js.map +1 -0
- package/dist/env-JDEDJCKM.js +17 -0
- package/dist/env-JDEDJCKM.js.map +1 -0
- package/dist/index.js +206 -0
- package/dist/index.js.map +1 -0
- package/dist/init-JIDH7ICC.js +141 -0
- package/dist/init-JIDH7ICC.js.map +1 -0
- package/dist/invite-code-LVWE5FMM.js +78 -0
- package/dist/invite-code-LVWE5FMM.js.map +1 -0
- package/dist/join-XR6STHVE.js +50 -0
- package/dist/join-XR6STHVE.js.map +1 -0
- package/dist/link-YLGQQZQE.js +81 -0
- package/dist/link-YLGQQZQE.js.map +1 -0
- package/dist/list-4OS4UHKS.js +63 -0
- package/dist/list-4OS4UHKS.js.map +1 -0
- package/dist/list-YU2RHCZP.js +51 -0
- package/dist/list-YU2RHCZP.js.map +1 -0
- package/dist/login-ZH5PD5PW.js +72 -0
- package/dist/login-ZH5PD5PW.js.map +1 -0
- package/dist/logout-XROX3UVL.js +21 -0
- package/dist/logout-XROX3UVL.js.map +1 -0
- package/dist/members-ADBLZZLN.js +72 -0
- package/dist/members-ADBLZZLN.js.map +1 -0
- package/dist/pull-MVF276VO.js +50 -0
- package/dist/pull-MVF276VO.js.map +1 -0
- package/dist/push-WJ2WQRE7.js +111 -0
- package/dist/push-WJ2WQRE7.js.map +1 -0
- package/dist/register-U2RDF5PD.js +123 -0
- package/dist/register-U2RDF5PD.js.map +1 -0
- package/dist/server-C2XU2NWC.js +49 -0
- package/dist/server-C2XU2NWC.js.map +1 -0
- package/dist/set-BDI2SUDG.js +53 -0
- package/dist/set-BDI2SUDG.js.map +1 -0
- package/dist/switch-5B3A4YIX.js +57 -0
- package/dist/switch-5B3A4YIX.js.map +1 -0
- package/dist/team-V2D7J34H.js +18 -0
- package/dist/team-V2D7J34H.js.map +1 -0
- package/dist/unset-5XBSSZX5.js +45 -0
- package/dist/unset-5XBSSZX5.js.map +1 -0
- package/dist/whoami-7H25CWKV.js +39 -0
- package/dist/whoami-7H25CWKV.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
chalk,
|
|
4
|
+
handleCancel,
|
|
5
|
+
p
|
|
6
|
+
} from "./chunk-BWPCYXXL.js";
|
|
7
|
+
import {
|
|
8
|
+
resolveEnvironmentId
|
|
9
|
+
} from "./chunk-HQFY6BB6.js";
|
|
10
|
+
import "./chunk-HL2WXSVD.js";
|
|
11
|
+
import {
|
|
12
|
+
handleApiResponse,
|
|
13
|
+
handleError
|
|
14
|
+
} from "./chunk-UWVCYS24.js";
|
|
15
|
+
import "./chunk-TSUQGF7F.js";
|
|
16
|
+
import {
|
|
17
|
+
parseEnvFile
|
|
18
|
+
} from "./chunk-Z23MVAIZ.js";
|
|
19
|
+
import "./chunk-2H7UOFLK.js";
|
|
20
|
+
|
|
21
|
+
// src/commands/secrets/push.ts
|
|
22
|
+
import { defineCommand } from "citty";
|
|
23
|
+
import { readFile } from "fs/promises";
|
|
24
|
+
import { join } from "path";
|
|
25
|
+
var push_default = defineCommand({
|
|
26
|
+
meta: { name: "push", description: "Push .env to remote (with diff)" },
|
|
27
|
+
async run() {
|
|
28
|
+
try {
|
|
29
|
+
const { client, envId, envName, projectName } = await resolveEnvironmentId();
|
|
30
|
+
let localContent;
|
|
31
|
+
try {
|
|
32
|
+
localContent = await readFile(join(process.cwd(), ".env"), "utf-8");
|
|
33
|
+
} catch {
|
|
34
|
+
console.error(chalk.red("No .env file found in current directory."));
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const localVars = parseEnvFile(localContent);
|
|
38
|
+
const remoteRes = await client.secrets[":id"].secrets.$get({
|
|
39
|
+
param: { id: envId }
|
|
40
|
+
});
|
|
41
|
+
await handleApiResponse(remoteRes);
|
|
42
|
+
const remoteData = await remoteRes.json();
|
|
43
|
+
const remoteVars = {};
|
|
44
|
+
for (const s2 of remoteData.secrets) {
|
|
45
|
+
remoteVars[s2.key] = s2.value;
|
|
46
|
+
}
|
|
47
|
+
const allKeys = /* @__PURE__ */ new Set([...Object.keys(localVars), ...Object.keys(remoteVars)]);
|
|
48
|
+
const added = [];
|
|
49
|
+
const removed = [];
|
|
50
|
+
const changed = [];
|
|
51
|
+
let unchanged = 0;
|
|
52
|
+
for (const key of allKeys) {
|
|
53
|
+
const inLocal = key in localVars;
|
|
54
|
+
const inRemote = key in remoteVars;
|
|
55
|
+
if (inLocal && !inRemote) {
|
|
56
|
+
added.push(key);
|
|
57
|
+
} else if (!inLocal && inRemote) {
|
|
58
|
+
removed.push(key);
|
|
59
|
+
} else if (localVars[key] !== remoteVars[key]) {
|
|
60
|
+
changed.push(key);
|
|
61
|
+
} else {
|
|
62
|
+
unchanged++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
console.log(chalk.dim(`
|
|
66
|
+
Comparing local .env with remote (${envName})...
|
|
67
|
+
`));
|
|
68
|
+
if (added.length === 0 && removed.length === 0 && changed.length === 0) {
|
|
69
|
+
console.log(chalk.green(" Already in sync! No changes to push.\n"));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
for (const key of added) {
|
|
73
|
+
console.log(chalk.green(` + ${key} (new)`));
|
|
74
|
+
}
|
|
75
|
+
for (const key of changed) {
|
|
76
|
+
console.log(chalk.yellow(` ~ ${key} (changed)`));
|
|
77
|
+
}
|
|
78
|
+
for (const key of removed) {
|
|
79
|
+
console.log(chalk.red(` - ${key} (removed)`));
|
|
80
|
+
}
|
|
81
|
+
if (unchanged > 0) {
|
|
82
|
+
console.log(chalk.dim(` = ${unchanged} unchanged`));
|
|
83
|
+
}
|
|
84
|
+
console.log();
|
|
85
|
+
const confirm = await p.confirm({
|
|
86
|
+
message: `Push these changes to ${envName}?`
|
|
87
|
+
});
|
|
88
|
+
handleCancel(confirm);
|
|
89
|
+
if (!confirm) {
|
|
90
|
+
console.log(chalk.dim("Cancelled."));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const s = p.spinner();
|
|
94
|
+
s.start("Pushing...");
|
|
95
|
+
const secrets = Object.entries(localVars).map(([key, value]) => ({ key, value }));
|
|
96
|
+
const pushRes = await client.secrets[":id"].secrets.$put({
|
|
97
|
+
param: { id: envId },
|
|
98
|
+
json: { secrets }
|
|
99
|
+
});
|
|
100
|
+
await handleApiResponse(pushRes);
|
|
101
|
+
const totalChanges = added.length + changed.length + removed.length;
|
|
102
|
+
s.stop(chalk.green(`${totalChanges} changes pushed`));
|
|
103
|
+
} catch (err) {
|
|
104
|
+
handleError(err);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
export {
|
|
109
|
+
push_default as default
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=push-WJ2WQRE7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/push.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseEnvFile } from \"@envpush/shared\";\nimport { resolveEnvironmentId } from \"../../lib/resolve-env.js\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"push\", description: \"Push .env to remote (with diff)\" },\n async run() {\n try {\n const { client, envId, envName, projectName } = await resolveEnvironmentId();\n\n // Read local .env\n let localContent: string;\n try {\n localContent = await readFile(join(process.cwd(), \".env\"), \"utf-8\");\n } catch {\n console.error(chalk.red(\"No .env file found in current directory.\"));\n process.exit(1);\n }\n const localVars = parseEnvFile(localContent);\n\n // Get remote secrets\n const remoteRes = await client.secrets[\":id\"].secrets.$get({\n param: { id: envId },\n });\n await handleApiResponse(remoteRes);\n const remoteData = await remoteRes.json() as {\n secrets: { key: string; value: string }[];\n };\n const remoteVars: Record<string, string> = {};\n for (const s of remoteData.secrets) {\n remoteVars[s.key] = s.value;\n }\n\n // Compute diff\n const allKeys = new Set([...Object.keys(localVars), ...Object.keys(remoteVars)]);\n const added: string[] = [];\n const removed: string[] = [];\n const changed: string[] = [];\n let unchanged = 0;\n\n for (const key of allKeys) {\n const inLocal = key in localVars;\n const inRemote = key in remoteVars;\n if (inLocal && !inRemote) {\n added.push(key);\n } else if (!inLocal && inRemote) {\n removed.push(key);\n } else if (localVars[key] !== remoteVars[key]) {\n changed.push(key);\n } else {\n unchanged++;\n }\n }\n\n console.log(chalk.dim(`\\nComparing local .env with remote (${envName})...\\n`));\n\n if (added.length === 0 && removed.length === 0 && changed.length === 0) {\n console.log(chalk.green(\" Already in sync! No changes to push.\\n\"));\n return;\n }\n\n for (const key of added) {\n console.log(chalk.green(` + ${key} (new)`));\n }\n for (const key of changed) {\n console.log(chalk.yellow(` ~ ${key} (changed)`));\n }\n for (const key of removed) {\n console.log(chalk.red(` - ${key} (removed)`));\n }\n if (unchanged > 0) {\n console.log(chalk.dim(` = ${unchanged} unchanged`));\n }\n console.log();\n\n const confirm = await p.confirm({\n message: `Push these changes to ${envName}?`,\n });\n handleCancel(confirm);\n\n if (!confirm) {\n console.log(chalk.dim(\"Cancelled.\"));\n return;\n }\n\n const s = p.spinner();\n s.start(\"Pushing...\");\n\n const secrets = Object.entries(localVars).map(([key, value]) => ({ key, value }));\n const pushRes = await client.secrets[\":id\"].secrets.$put({\n param: { id: envId },\n json: { secrets },\n });\n await handleApiResponse(pushRes);\n\n const totalChanges = added.length + changed.length + removed.length;\n s.stop(chalk.green(`${totalChanges} changes pushed`));\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAMrB,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,kCAAkC;AAAA,EACrE,MAAM,MAAM;AACV,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,SAAS,YAAY,IAAI,MAAM,qBAAqB;AAG3E,UAAI;AACJ,UAAI;AACF,uBAAe,MAAM,SAAS,KAAK,QAAQ,IAAI,GAAG,MAAM,GAAG,OAAO;AAAA,MACpE,QAAQ;AACN,gBAAQ,MAAM,MAAM,IAAI,0CAA0C,CAAC;AACnE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,YAAY,aAAa,YAAY;AAG3C,YAAM,YAAY,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,QACzD,OAAO,EAAE,IAAI,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,kBAAkB,SAAS;AACjC,YAAM,aAAa,MAAM,UAAU,KAAK;AAGxC,YAAM,aAAqC,CAAC;AAC5C,iBAAWA,MAAK,WAAW,SAAS;AAClC,mBAAWA,GAAE,GAAG,IAAIA,GAAE;AAAA,MACxB;AAGA,YAAM,UAAU,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,SAAS,GAAG,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC;AAC/E,YAAM,QAAkB,CAAC;AACzB,YAAM,UAAoB,CAAC;AAC3B,YAAM,UAAoB,CAAC;AAC3B,UAAI,YAAY;AAEhB,iBAAW,OAAO,SAAS;AACzB,cAAM,UAAU,OAAO;AACvB,cAAM,WAAW,OAAO;AACxB,YAAI,WAAW,CAAC,UAAU;AACxB,gBAAM,KAAK,GAAG;AAAA,QAChB,WAAW,CAAC,WAAW,UAAU;AAC/B,kBAAQ,KAAK,GAAG;AAAA,QAClB,WAAW,UAAU,GAAG,MAAM,WAAW,GAAG,GAAG;AAC7C,kBAAQ,KAAK,GAAG;AAAA,QAClB,OAAO;AACL;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,IAAI;AAAA,oCAAuC,OAAO;AAAA,CAAQ,CAAC;AAE7E,UAAI,MAAM,WAAW,KAAK,QAAQ,WAAW,KAAK,QAAQ,WAAW,GAAG;AACtE,gBAAQ,IAAI,MAAM,MAAM,0CAA0C,CAAC;AACnE;AAAA,MACF;AAEA,iBAAW,OAAO,OAAO;AACvB,gBAAQ,IAAI,MAAM,MAAM,OAAO,GAAG,SAAS,CAAC;AAAA,MAC9C;AACA,iBAAW,OAAO,SAAS;AACzB,gBAAQ,IAAI,MAAM,OAAO,OAAO,GAAG,aAAa,CAAC;AAAA,MACnD;AACA,iBAAW,OAAO,SAAS;AACzB,gBAAQ,IAAI,MAAM,IAAI,OAAO,GAAG,aAAa,CAAC;AAAA,MAChD;AACA,UAAI,YAAY,GAAG;AACjB,gBAAQ,IAAI,MAAM,IAAI,OAAO,SAAS,YAAY,CAAC;AAAA,MACrD;AACA,cAAQ,IAAI;AAEZ,YAAM,UAAU,MAAM,EAAE,QAAQ;AAAA,QAC9B,SAAS,yBAAyB,OAAO;AAAA,MAC3C,CAAC;AACD,mBAAa,OAAO;AAEpB,UAAI,CAAC,SAAS;AACZ,gBAAQ,IAAI,MAAM,IAAI,YAAY,CAAC;AACnC;AAAA,MACF;AAEA,YAAM,IAAI,EAAE,QAAQ;AACpB,QAAE,MAAM,YAAY;AAEpB,YAAM,UAAU,OAAO,QAAQ,SAAS,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE;AAChF,YAAM,UAAU,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,QACvD,OAAO,EAAE,IAAI,MAAM;AAAA,QACnB,MAAM,EAAE,QAAQ;AAAA,MAClB,CAAC;AACD,YAAM,kBAAkB,OAAO;AAE/B,YAAM,eAAe,MAAM,SAAS,QAAQ,SAAS,QAAQ;AAC7D,QAAE,KAAK,MAAM,MAAM,GAAG,YAAY,iBAAiB,CAAC;AAAA,IACtD,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":["s"]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
chalk,
|
|
4
|
+
handleCancel,
|
|
5
|
+
p
|
|
6
|
+
} from "./chunk-BWPCYXXL.js";
|
|
7
|
+
import {
|
|
8
|
+
createClient,
|
|
9
|
+
handleApiResponse,
|
|
10
|
+
handleError
|
|
11
|
+
} from "./chunk-UWVCYS24.js";
|
|
12
|
+
import {
|
|
13
|
+
loadConfig,
|
|
14
|
+
saveConfig
|
|
15
|
+
} from "./chunk-Z23MVAIZ.js";
|
|
16
|
+
import "./chunk-2H7UOFLK.js";
|
|
17
|
+
|
|
18
|
+
// src/commands/auth/register.ts
|
|
19
|
+
import { defineCommand } from "citty";
|
|
20
|
+
var register_default = defineCommand({
|
|
21
|
+
meta: { name: "register", description: "Create a new account" },
|
|
22
|
+
async run() {
|
|
23
|
+
try {
|
|
24
|
+
p.intro(chalk.bold("evp register"));
|
|
25
|
+
const config = await loadConfig();
|
|
26
|
+
let serverUrl;
|
|
27
|
+
if (config?.server_url) {
|
|
28
|
+
serverUrl = config.server_url;
|
|
29
|
+
p.log.info(`Server: ${chalk.bold(serverUrl)}`);
|
|
30
|
+
} else {
|
|
31
|
+
const input = await p.text({
|
|
32
|
+
message: "Server URL",
|
|
33
|
+
placeholder: "http://localhost:8787",
|
|
34
|
+
defaultValue: "http://localhost:8787"
|
|
35
|
+
});
|
|
36
|
+
handleCancel(input);
|
|
37
|
+
serverUrl = input;
|
|
38
|
+
}
|
|
39
|
+
const name = await p.text({
|
|
40
|
+
message: "Name",
|
|
41
|
+
validate: (v) => {
|
|
42
|
+
if (!v || v.trim().length === 0) return "Name is required";
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
handleCancel(name);
|
|
46
|
+
const email = await p.text({
|
|
47
|
+
message: "Email",
|
|
48
|
+
validate: (v) => {
|
|
49
|
+
if (!v || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)) return "Invalid email address";
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
handleCancel(email);
|
|
53
|
+
const password = await p.password({
|
|
54
|
+
message: "Password (min 6 chars)",
|
|
55
|
+
validate: (v) => {
|
|
56
|
+
if (!v || v.length < 6) return "Password must be at least 6 characters";
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
handleCancel(password);
|
|
60
|
+
const confirmPassword = await p.password({
|
|
61
|
+
message: "Confirm password",
|
|
62
|
+
validate: (v) => {
|
|
63
|
+
if (!v || v.length === 0) return "Please confirm your password";
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
handleCancel(confirmPassword);
|
|
67
|
+
if (password !== confirmPassword) {
|
|
68
|
+
p.cancel("Passwords do not match.");
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
const s = p.spinner();
|
|
72
|
+
s.start("Creating account...");
|
|
73
|
+
const client = createClient(serverUrl);
|
|
74
|
+
const registerRes = await client.auth.register.$post({
|
|
75
|
+
json: { name, email, password }
|
|
76
|
+
});
|
|
77
|
+
await handleApiResponse(registerRes);
|
|
78
|
+
s.stop("Account created!");
|
|
79
|
+
s.start("Logging in...");
|
|
80
|
+
const loginRes = await client.auth.login.$post({
|
|
81
|
+
json: { email, password }
|
|
82
|
+
});
|
|
83
|
+
await handleApiResponse(loginRes);
|
|
84
|
+
const loginData = await loginRes.json();
|
|
85
|
+
await saveConfig({ server_url: serverUrl, token: loginData.token });
|
|
86
|
+
s.stop("Logged in!");
|
|
87
|
+
const createTeam = await p.confirm({
|
|
88
|
+
message: "Create a team now?",
|
|
89
|
+
initialValue: true
|
|
90
|
+
});
|
|
91
|
+
handleCancel(createTeam);
|
|
92
|
+
if (createTeam) {
|
|
93
|
+
const teamName = await p.text({
|
|
94
|
+
message: "Team name",
|
|
95
|
+
validate: (v) => {
|
|
96
|
+
if (!v || v.trim().length === 0) return "Team name is required";
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
handleCancel(teamName);
|
|
100
|
+
s.start("Creating team...");
|
|
101
|
+
const authedClient = createClient(serverUrl, loginData.token);
|
|
102
|
+
const teamRes = await authedClient.teams.$post({
|
|
103
|
+
json: { name: teamName }
|
|
104
|
+
});
|
|
105
|
+
await handleApiResponse(teamRes);
|
|
106
|
+
const teamData = await teamRes.json();
|
|
107
|
+
s.stop("Team created!");
|
|
108
|
+
p.note(
|
|
109
|
+
`Invite code: ${chalk.bold(teamData.team.invite_code)}
|
|
110
|
+
Share this with your teammates`,
|
|
111
|
+
"Team Invite"
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
p.outro("All set! Token saved to ~/.envpush/config.json");
|
|
115
|
+
} catch (err) {
|
|
116
|
+
handleError(err);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
export {
|
|
121
|
+
register_default as default
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=register-U2RDF5PD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/auth/register.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { createClient } from \"@envpush/client\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { loadConfig, saveConfig } from \"../../lib/config.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"register\", description: \"Create a new account\" },\n async run() {\n try {\n p.intro(chalk.bold(\"evp register\"));\n\n const config = await loadConfig();\n let serverUrl: string;\n\n if (config?.server_url) {\n serverUrl = config.server_url;\n p.log.info(`Server: ${chalk.bold(serverUrl)}`);\n } else {\n const input = await p.text({\n message: \"Server URL\",\n placeholder: \"http://localhost:8787\",\n defaultValue: \"http://localhost:8787\",\n });\n handleCancel(input);\n serverUrl = input;\n }\n\n const name = await p.text({\n message: \"Name\",\n validate: (v) => {\n if (!v || v.trim().length === 0) return \"Name is required\";\n },\n });\n handleCancel(name);\n\n const email = await p.text({\n message: \"Email\",\n validate: (v) => {\n if (!v || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(v)) return \"Invalid email address\";\n },\n });\n handleCancel(email);\n\n const password = await p.password({\n message: \"Password (min 6 chars)\",\n validate: (v) => {\n if (!v || v.length < 6) return \"Password must be at least 6 characters\";\n },\n });\n handleCancel(password);\n\n const confirmPassword = await p.password({\n message: \"Confirm password\",\n validate: (v) => {\n if (!v || v.length === 0) return \"Please confirm your password\";\n },\n });\n handleCancel(confirmPassword);\n\n if (password !== confirmPassword) {\n p.cancel(\"Passwords do not match.\");\n process.exit(1);\n }\n\n const s = p.spinner();\n s.start(\"Creating account...\");\n\n const client = createClient(serverUrl);\n const registerRes = await client.auth.register.$post({\n json: { name, email, password },\n });\n await handleApiResponse(registerRes);\n s.stop(\"Account created!\");\n\n // Auto-login\n s.start(\"Logging in...\");\n const loginRes = await client.auth.login.$post({\n json: { email, password },\n });\n await handleApiResponse(loginRes);\n const loginData = await loginRes.json() as { token: string };\n await saveConfig({ server_url: serverUrl, token: loginData.token });\n s.stop(\"Logged in!\");\n\n // Offer to create team\n const createTeam = await p.confirm({\n message: \"Create a team now?\",\n initialValue: true,\n });\n handleCancel(createTeam);\n\n if (createTeam) {\n const teamName = await p.text({\n message: \"Team name\",\n validate: (v) => {\n if (!v || v.trim().length === 0) return \"Team name is required\";\n },\n });\n handleCancel(teamName);\n\n s.start(\"Creating team...\");\n const authedClient = createClient(serverUrl, loginData.token);\n const teamRes = await authedClient.teams.$post({\n json: { name: teamName },\n });\n await handleApiResponse(teamRes);\n const teamData = await teamRes.json() as { team: { invite_code: string } };\n s.stop(\"Team created!\");\n\n p.note(\n `Invite code: ${chalk.bold(teamData.team.invite_code)}\\nShare this with your teammates`,\n \"Team Invite\"\n );\n }\n\n p.outro(\"All set! Token saved to ~/.envpush/config.json\");\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
chalk,
|
|
4
|
+
handleCancel,
|
|
5
|
+
p
|
|
6
|
+
} from "./chunk-BWPCYXXL.js";
|
|
7
|
+
import {
|
|
8
|
+
loadConfig,
|
|
9
|
+
saveServerUrl
|
|
10
|
+
} from "./chunk-Z23MVAIZ.js";
|
|
11
|
+
import "./chunk-2H7UOFLK.js";
|
|
12
|
+
|
|
13
|
+
// src/commands/server.ts
|
|
14
|
+
import { defineCommand } from "citty";
|
|
15
|
+
var server_default = defineCommand({
|
|
16
|
+
meta: { name: "server", description: "Set or show the server URL" },
|
|
17
|
+
args: {
|
|
18
|
+
url: {
|
|
19
|
+
type: "positional",
|
|
20
|
+
description: "Server URL to save",
|
|
21
|
+
required: false
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
async run({ args }) {
|
|
25
|
+
const url = args.url;
|
|
26
|
+
if (url) {
|
|
27
|
+
await saveServerUrl(url);
|
|
28
|
+
p.log.success(`Server URL saved: ${chalk.bold(url)}`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const config = await loadConfig();
|
|
32
|
+
if (config?.server_url) {
|
|
33
|
+
p.log.info(`Current server URL: ${chalk.bold(config.server_url)}`);
|
|
34
|
+
} else {
|
|
35
|
+
const newUrl = await p.text({
|
|
36
|
+
message: "Server URL",
|
|
37
|
+
placeholder: "http://localhost:8787",
|
|
38
|
+
defaultValue: "http://localhost:8787"
|
|
39
|
+
});
|
|
40
|
+
handleCancel(newUrl);
|
|
41
|
+
await saveServerUrl(newUrl);
|
|
42
|
+
p.log.success(`Server URL saved: ${chalk.bold(newUrl)}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
export {
|
|
47
|
+
server_default as default
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=server-C2XU2NWC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/server.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { loadConfig, saveServerUrl } from \"../lib/config.js\";\nimport { p, handleCancel, chalk } from \"../lib/ui.js\";\n\nexport default defineCommand({\n meta: { name: \"server\", description: \"Set or show the server URL\" },\n args: {\n url: {\n type: \"positional\",\n description: \"Server URL to save\",\n required: false,\n },\n },\n async run({ args }) {\n const url = args.url as string | undefined;\n\n if (url) {\n await saveServerUrl(url);\n p.log.success(`Server URL saved: ${chalk.bold(url)}`);\n return;\n }\n\n const config = await loadConfig();\n if (config?.server_url) {\n p.log.info(`Current server URL: ${chalk.bold(config.server_url)}`);\n } else {\n const newUrl = await p.text({\n message: \"Server URL\",\n placeholder: \"http://localhost:8787\",\n defaultValue: \"http://localhost:8787\",\n });\n handleCancel(newUrl);\n await saveServerUrl(newUrl);\n p.log.success(`Server URL saved: ${chalk.bold(newUrl)}`);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAI9B,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,6BAA6B;AAAA,EAClE,MAAM;AAAA,IACJ,KAAK;AAAA,MACH,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,MAAM,KAAK;AAEjB,QAAI,KAAK;AACP,YAAM,cAAc,GAAG;AACvB,QAAE,IAAI,QAAQ,qBAAqB,MAAM,KAAK,GAAG,CAAC,EAAE;AACpD;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,WAAW;AAChC,QAAI,QAAQ,YAAY;AACtB,QAAE,IAAI,KAAK,uBAAuB,MAAM,KAAK,OAAO,UAAU,CAAC,EAAE;AAAA,IACnE,OAAO;AACL,YAAM,SAAS,MAAM,EAAE,KAAK;AAAA,QAC1B,SAAS;AAAA,QACT,aAAa;AAAA,QACb,cAAc;AAAA,MAChB,CAAC;AACD,mBAAa,MAAM;AACnB,YAAM,cAAc,MAAM;AAC1B,QAAE,IAAI,QAAQ,qBAAqB,MAAM,KAAK,MAAM,CAAC,EAAE;AAAA,IACzD;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveEnvironmentId
|
|
4
|
+
} from "./chunk-HQFY6BB6.js";
|
|
5
|
+
import "./chunk-HL2WXSVD.js";
|
|
6
|
+
import {
|
|
7
|
+
handleApiResponse,
|
|
8
|
+
handleError
|
|
9
|
+
} from "./chunk-UWVCYS24.js";
|
|
10
|
+
import "./chunk-TSUQGF7F.js";
|
|
11
|
+
import "./chunk-Z23MVAIZ.js";
|
|
12
|
+
import "./chunk-2H7UOFLK.js";
|
|
13
|
+
|
|
14
|
+
// src/commands/secrets/set.ts
|
|
15
|
+
import { defineCommand } from "citty";
|
|
16
|
+
import chalk from "chalk";
|
|
17
|
+
var set_default = defineCommand({
|
|
18
|
+
meta: { name: "set", description: "Set a single secret (KEY=VALUE)" },
|
|
19
|
+
args: {
|
|
20
|
+
keyvalue: { type: "positional", required: true, description: "KEY=VALUE" }
|
|
21
|
+
},
|
|
22
|
+
async run({ args }) {
|
|
23
|
+
try {
|
|
24
|
+
const eqIndex = args.keyvalue.indexOf("=");
|
|
25
|
+
if (eqIndex === -1) {
|
|
26
|
+
console.error(chalk.red("Usage: evp set KEY=VALUE"));
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const key = args.keyvalue.slice(0, eqIndex);
|
|
30
|
+
const value = args.keyvalue.slice(eqIndex + 1);
|
|
31
|
+
const { client, envId, envName } = await resolveEnvironmentId();
|
|
32
|
+
const res = await client.secrets[":id"].secrets.$get({
|
|
33
|
+
param: { id: envId }
|
|
34
|
+
});
|
|
35
|
+
await handleApiResponse(res);
|
|
36
|
+
const data = await res.json();
|
|
37
|
+
const secrets = data.secrets.filter((s) => s.key !== key).map((s) => ({ key: s.key, value: s.value }));
|
|
38
|
+
secrets.push({ key, value });
|
|
39
|
+
const pushRes = await client.secrets[":id"].secrets.$put({
|
|
40
|
+
param: { id: envId },
|
|
41
|
+
json: { secrets }
|
|
42
|
+
});
|
|
43
|
+
await handleApiResponse(pushRes);
|
|
44
|
+
console.log(chalk.green(`Set ${key} in ${envName}`));
|
|
45
|
+
} catch (err) {
|
|
46
|
+
handleError(err);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
export {
|
|
51
|
+
set_default as default
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=set-BDI2SUDG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/set.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { resolveEnvironmentId } from \"../../lib/resolve-env.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\nimport chalk from \"chalk\";\n\nexport default defineCommand({\n meta: { name: \"set\", description: \"Set a single secret (KEY=VALUE)\" },\n args: {\n keyvalue: { type: \"positional\", required: true, description: \"KEY=VALUE\" },\n },\n async run({ args }) {\n try {\n const eqIndex = args.keyvalue.indexOf(\"=\");\n if (eqIndex === -1) {\n console.error(chalk.red(\"Usage: evp set KEY=VALUE\"));\n process.exit(1);\n }\n\n const key = args.keyvalue.slice(0, eqIndex);\n const value = args.keyvalue.slice(eqIndex + 1);\n\n const { client, envId, envName } = await resolveEnvironmentId();\n\n // Get current secrets\n const res = await client.secrets[\":id\"].secrets.$get({\n param: { id: envId },\n });\n await handleApiResponse(res);\n const data = await res.json() as {\n secrets: { key: string; value: string }[];\n };\n\n // Build new set\n const secrets = data.secrets\n .filter((s) => s.key !== key)\n .map((s) => ({ key: s.key, value: s.value }));\n secrets.push({ key, value });\n\n const pushRes = await client.secrets[\":id\"].secrets.$put({\n param: { id: envId },\n json: { secrets },\n });\n await handleApiResponse(pushRes);\n\n console.log(chalk.green(`Set ${key} in ${envName}`));\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAG9B,OAAO,WAAW;AAElB,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,OAAO,aAAa,kCAAkC;AAAA,EACpE,MAAM;AAAA,IACJ,UAAU,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,YAAY;AAAA,EAC3E;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AACF,YAAM,UAAU,KAAK,SAAS,QAAQ,GAAG;AACzC,UAAI,YAAY,IAAI;AAClB,gBAAQ,MAAM,MAAM,IAAI,0BAA0B,CAAC;AACnD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,MAAM,KAAK,SAAS,MAAM,GAAG,OAAO;AAC1C,YAAM,QAAQ,KAAK,SAAS,MAAM,UAAU,CAAC;AAE7C,YAAM,EAAE,QAAQ,OAAO,QAAQ,IAAI,MAAM,qBAAqB;AAG9D,YAAM,MAAM,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,QACnD,OAAO,EAAE,IAAI,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,kBAAkB,GAAG;AAC3B,YAAM,OAAO,MAAM,IAAI,KAAK;AAK5B,YAAM,UAAU,KAAK,QAClB,OAAO,CAAC,MAAM,EAAE,QAAQ,GAAG,EAC3B,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE;AAC9C,cAAQ,KAAK,EAAE,KAAK,MAAM,CAAC;AAE3B,YAAM,UAAU,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,QACvD,OAAO,EAAE,IAAI,MAAM;AAAA,QACnB,MAAM,EAAE,QAAQ;AAAA,MAClB,CAAC;AACD,YAAM,kBAAkB,OAAO;AAE/B,cAAQ,IAAI,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,EAAE,CAAC;AAAA,IACrD,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
chalk,
|
|
4
|
+
handleCancel,
|
|
5
|
+
p
|
|
6
|
+
} from "./chunk-BWPCYXXL.js";
|
|
7
|
+
import {
|
|
8
|
+
getClient
|
|
9
|
+
} from "./chunk-HL2WXSVD.js";
|
|
10
|
+
import {
|
|
11
|
+
handleApiResponse,
|
|
12
|
+
handleError
|
|
13
|
+
} from "./chunk-UWVCYS24.js";
|
|
14
|
+
import {
|
|
15
|
+
loadProjectConfig,
|
|
16
|
+
saveProjectConfig
|
|
17
|
+
} from "./chunk-TSUQGF7F.js";
|
|
18
|
+
import "./chunk-Z23MVAIZ.js";
|
|
19
|
+
import "./chunk-2H7UOFLK.js";
|
|
20
|
+
|
|
21
|
+
// src/commands/env/switch.ts
|
|
22
|
+
import { defineCommand } from "citty";
|
|
23
|
+
var switch_default = defineCommand({
|
|
24
|
+
meta: { name: "switch", description: "Switch active environment" },
|
|
25
|
+
async run() {
|
|
26
|
+
try {
|
|
27
|
+
const projectConfig = await loadProjectConfig();
|
|
28
|
+
if (!projectConfig) {
|
|
29
|
+
console.error(chalk.red("No .evp.json found. Run `evp init` or `evp link` first."));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const { client } = await getClient();
|
|
33
|
+
const projectRes = await client.projects[":teamSlug"][":projectSlug"].$get({
|
|
34
|
+
param: { teamSlug: projectConfig.team, projectSlug: projectConfig.project }
|
|
35
|
+
});
|
|
36
|
+
await handleApiResponse(projectRes);
|
|
37
|
+
const projectData = await projectRes.json();
|
|
38
|
+
const selected = await p.select({
|
|
39
|
+
message: "Select environment",
|
|
40
|
+
options: projectData.environments.map((e) => ({
|
|
41
|
+
value: e.slug,
|
|
42
|
+
label: e.slug === projectConfig.environment ? `${e.name} (current)` : e.name
|
|
43
|
+
}))
|
|
44
|
+
});
|
|
45
|
+
handleCancel(selected);
|
|
46
|
+
await saveProjectConfig({ ...projectConfig, environment: selected });
|
|
47
|
+
console.log(chalk.green(`Switched to ${selected}`));
|
|
48
|
+
console.log(chalk.dim("Run `evp pull` to fetch secrets."));
|
|
49
|
+
} catch (err) {
|
|
50
|
+
handleError(err);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
export {
|
|
55
|
+
switch_default as default
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=switch-5B3A4YIX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/env/switch.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { loadProjectConfig, saveProjectConfig } from \"../../lib/project-config.js\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"switch\", description: \"Switch active environment\" },\n async run() {\n try {\n const projectConfig = await loadProjectConfig();\n if (!projectConfig) {\n console.error(chalk.red(\"No .evp.json found. Run `evp init` or `evp link` first.\"));\n process.exit(1);\n }\n\n const { client } = await getClient();\n const projectRes = await client.projects[\":teamSlug\"][\":projectSlug\"].$get({\n param: { teamSlug: projectConfig.team, projectSlug: projectConfig.project },\n });\n await handleApiResponse(projectRes);\n const projectData = await projectRes.json() as {\n environments: { id: string; name: string; slug: string }[];\n };\n\n const selected = await p.select({\n message: \"Select environment\",\n options: projectData.environments.map((e) => ({\n value: e.slug,\n label: e.slug === projectConfig.environment ? `${e.name} (current)` : e.name,\n })),\n });\n handleCancel(selected);\n\n await saveProjectConfig({ ...projectConfig, environment: selected as string });\n console.log(chalk.green(`Switched to ${selected}`));\n console.log(chalk.dim(\"Run `evp pull` to fetch secrets.\"));\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,EACjE,MAAM,MAAM;AACV,QAAI;AACF,YAAM,gBAAgB,MAAM,kBAAkB;AAC9C,UAAI,CAAC,eAAe;AAClB,gBAAQ,MAAM,MAAM,IAAI,yDAAyD,CAAC;AAClF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU;AACnC,YAAM,aAAa,MAAM,OAAO,SAAS,WAAW,EAAE,cAAc,EAAE,KAAK;AAAA,QACzE,OAAO,EAAE,UAAU,cAAc,MAAM,aAAa,cAAc,QAAQ;AAAA,MAC5E,CAAC;AACD,YAAM,kBAAkB,UAAU;AAClC,YAAM,cAAc,MAAM,WAAW,KAAK;AAI1C,YAAM,WAAW,MAAM,EAAE,OAAO;AAAA,QAC9B,SAAS;AAAA,QACT,SAAS,YAAY,aAAa,IAAI,CAAC,OAAO;AAAA,UAC5C,OAAO,EAAE;AAAA,UACT,OAAO,EAAE,SAAS,cAAc,cAAc,GAAG,EAAE,IAAI,eAAe,EAAE;AAAA,QAC1E,EAAE;AAAA,MACJ,CAAC;AACD,mBAAa,QAAQ;AAErB,YAAM,kBAAkB,EAAE,GAAG,eAAe,aAAa,SAAmB,CAAC;AAC7E,cAAQ,IAAI,MAAM,MAAM,eAAe,QAAQ,EAAE,CAAC;AAClD,cAAQ,IAAI,MAAM,IAAI,kCAAkC,CAAC;AAAA,IAC3D,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-2H7UOFLK.js";
|
|
3
|
+
|
|
4
|
+
// src/commands/team/index.ts
|
|
5
|
+
import { defineCommand } from "citty";
|
|
6
|
+
var team_default = defineCommand({
|
|
7
|
+
meta: { name: "team", description: "Team management" },
|
|
8
|
+
subCommands: {
|
|
9
|
+
create: () => import("./create-M22SN3AK.js").then((m) => m.default),
|
|
10
|
+
join: () => import("./join-XR6STHVE.js").then((m) => m.default),
|
|
11
|
+
members: () => import("./members-ADBLZZLN.js").then((m) => m.default),
|
|
12
|
+
"invite-code": () => import("./invite-code-LVWE5FMM.js").then((m) => m.default)
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export {
|
|
16
|
+
team_default as default
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=team-V2D7J34H.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/team/index.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\n\nexport default defineCommand({\n meta: { name: \"team\", description: \"Team management\" },\n subCommands: {\n create: () => import(\"./create.js\").then((m) => m.default),\n join: () => import(\"./join.js\").then((m) => m.default),\n members: () => import(\"./members.js\").then((m) => m.default),\n \"invite-code\": () => import(\"./invite-code.js\").then((m) => m.default),\n },\n});\n"],"mappings":";;;;AAAA,SAAS,qBAAqB;AAE9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,kBAAkB;AAAA,EACrD,aAAa;AAAA,IACX,QAAQ,MAAM,OAAO,sBAAa,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACzD,MAAM,MAAM,OAAO,oBAAW,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IACrD,SAAS,MAAM,OAAO,uBAAc,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,IAC3D,eAAe,MAAM,OAAO,2BAAkB,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO;AAAA,EACvE;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
resolveEnvironmentId
|
|
4
|
+
} from "./chunk-HQFY6BB6.js";
|
|
5
|
+
import "./chunk-HL2WXSVD.js";
|
|
6
|
+
import {
|
|
7
|
+
handleApiResponse,
|
|
8
|
+
handleError
|
|
9
|
+
} from "./chunk-UWVCYS24.js";
|
|
10
|
+
import "./chunk-TSUQGF7F.js";
|
|
11
|
+
import "./chunk-Z23MVAIZ.js";
|
|
12
|
+
import "./chunk-2H7UOFLK.js";
|
|
13
|
+
|
|
14
|
+
// src/commands/secrets/unset.ts
|
|
15
|
+
import { defineCommand } from "citty";
|
|
16
|
+
import chalk from "chalk";
|
|
17
|
+
var unset_default = defineCommand({
|
|
18
|
+
meta: { name: "unset", description: "Remove a single secret" },
|
|
19
|
+
args: {
|
|
20
|
+
key: { type: "positional", required: true, description: "Secret key to remove" }
|
|
21
|
+
},
|
|
22
|
+
async run({ args }) {
|
|
23
|
+
try {
|
|
24
|
+
const { client, envId, envName } = await resolveEnvironmentId();
|
|
25
|
+
const res = await client.secrets[":id"].secrets.$get({
|
|
26
|
+
param: { id: envId }
|
|
27
|
+
});
|
|
28
|
+
await handleApiResponse(res);
|
|
29
|
+
const data = await res.json();
|
|
30
|
+
const secrets = data.secrets.filter((s) => s.key !== args.key).map((s) => ({ key: s.key, value: s.value }));
|
|
31
|
+
const pushRes = await client.secrets[":id"].secrets.$put({
|
|
32
|
+
param: { id: envId },
|
|
33
|
+
json: { secrets }
|
|
34
|
+
});
|
|
35
|
+
await handleApiResponse(pushRes);
|
|
36
|
+
console.log(chalk.green(`Removed ${args.key} from ${envName}`));
|
|
37
|
+
} catch (err) {
|
|
38
|
+
handleError(err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
export {
|
|
43
|
+
unset_default as default
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=unset-5XBSSZX5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/unset.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { resolveEnvironmentId } from \"../../lib/resolve-env.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\nimport chalk from \"chalk\";\n\nexport default defineCommand({\n meta: { name: \"unset\", description: \"Remove a single secret\" },\n args: {\n key: { type: \"positional\", required: true, description: \"Secret key to remove\" },\n },\n async run({ args }) {\n try {\n const { client, envId, envName } = await resolveEnvironmentId();\n\n // Get current secrets\n const res = await client.secrets[\":id\"].secrets.$get({\n param: { id: envId },\n });\n await handleApiResponse(res);\n const data = await res.json() as {\n secrets: { key: string; value: string }[];\n };\n\n // Remove the key and push remaining\n const secrets = data.secrets\n .filter((s) => s.key !== args.key)\n .map((s) => ({ key: s.key, value: s.value }));\n\n const pushRes = await client.secrets[\":id\"].secrets.$put({\n param: { id: envId },\n json: { secrets },\n });\n await handleApiResponse(pushRes);\n\n console.log(chalk.green(`Removed ${args.key} from ${envName}`));\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAG9B,OAAO,WAAW;AAElB,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,yBAAyB;AAAA,EAC7D,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,cAAc,UAAU,MAAM,aAAa,uBAAuB;AAAA,EACjF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,QAAQ,IAAI,MAAM,qBAAqB;AAG9D,YAAM,MAAM,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,QACnD,OAAO,EAAE,IAAI,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,kBAAkB,GAAG;AAC3B,YAAM,OAAO,MAAM,IAAI,KAAK;AAK5B,YAAM,UAAU,KAAK,QAClB,OAAO,CAAC,MAAM,EAAE,QAAQ,KAAK,GAAG,EAChC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE;AAE9C,YAAM,UAAU,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK;AAAA,QACvD,OAAO,EAAE,IAAI,MAAM;AAAA,QACnB,MAAM,EAAE,QAAQ;AAAA,MAClB,CAAC;AACD,YAAM,kBAAkB,OAAO;AAE/B,cAAQ,IAAI,MAAM,MAAM,WAAW,KAAK,GAAG,SAAS,OAAO,EAAE,CAAC;AAAA,IAChE,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
getClient
|
|
4
|
+
} from "./chunk-HL2WXSVD.js";
|
|
5
|
+
import {
|
|
6
|
+
handleApiResponse,
|
|
7
|
+
handleError
|
|
8
|
+
} from "./chunk-UWVCYS24.js";
|
|
9
|
+
import "./chunk-Z23MVAIZ.js";
|
|
10
|
+
import "./chunk-2H7UOFLK.js";
|
|
11
|
+
|
|
12
|
+
// src/commands/auth/whoami.ts
|
|
13
|
+
import { defineCommand } from "citty";
|
|
14
|
+
import chalk from "chalk";
|
|
15
|
+
var whoami_default = defineCommand({
|
|
16
|
+
meta: { name: "whoami", description: "Show current user & teams" },
|
|
17
|
+
async run() {
|
|
18
|
+
try {
|
|
19
|
+
const { client, config } = await getClient();
|
|
20
|
+
const res = await client.auth.me.$get();
|
|
21
|
+
await handleApiResponse(res);
|
|
22
|
+
const data = await res.json();
|
|
23
|
+
console.log(`User: ${chalk.bold(data.user.name)} (${data.user.email})`);
|
|
24
|
+
console.log(`Server: ${config.server_url}`);
|
|
25
|
+
if (data.teams.length > 0) {
|
|
26
|
+
const teamList = data.teams.map((t) => t.name).join(", ");
|
|
27
|
+
console.log(`Teams: ${teamList}`);
|
|
28
|
+
} else {
|
|
29
|
+
console.log(`Teams: ${chalk.dim("(none)")}`);
|
|
30
|
+
}
|
|
31
|
+
} catch (err) {
|
|
32
|
+
handleError(err);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
export {
|
|
37
|
+
whoami_default as default
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=whoami-7H25CWKV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/auth/whoami.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\nimport chalk from \"chalk\";\n\nexport default defineCommand({\n meta: { name: \"whoami\", description: \"Show current user & teams\" },\n async run() {\n try {\n const { client, config } = await getClient();\n const res = await client.auth.me.$get();\n await handleApiResponse(res);\n\n const data = await res.json() as {\n user: { name: string; email: string };\n teams: { name: string; slug: string }[];\n };\n\n console.log(`User: ${chalk.bold(data.user.name)} (${data.user.email})`);\n console.log(`Server: ${config.server_url}`);\n\n if (data.teams.length > 0) {\n const teamList = data.teams.map((t) => t.name).join(\", \");\n console.log(`Teams: ${teamList}`);\n } else {\n console.log(`Teams: ${chalk.dim(\"(none)\")}`);\n }\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAG9B,OAAO,WAAW;AAElB,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,4BAA4B;AAAA,EACjE,MAAM,MAAM;AACV,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,UAAU;AAC3C,YAAM,MAAM,MAAM,OAAO,KAAK,GAAG,KAAK;AACtC,YAAM,kBAAkB,GAAG;AAE3B,YAAM,OAAO,MAAM,IAAI,KAAK;AAK5B,cAAQ,IAAI,YAAY,MAAM,KAAK,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG;AACzE,cAAQ,IAAI,YAAY,OAAO,UAAU,EAAE;AAE3C,UAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAM,WAAW,KAAK,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AACxD,gBAAQ,IAAI,YAAY,QAAQ,EAAE;AAAA,MACpC,OAAO;AACL,gBAAQ,IAAI,YAAY,MAAM,IAAI,QAAQ,CAAC,EAAE;AAAA,MAC/C;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "envpush",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Push and pull environment variables securely across your team",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"evp": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "https://github.com/71zone/envpush.git",
|
|
16
|
+
"directory": "apps/cli"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@clack/prompts": "^0.9.0",
|
|
20
|
+
"chalk": "^5.4.0",
|
|
21
|
+
"citty": "^0.1.6",
|
|
22
|
+
"hono": "^4.7.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/node": "^22.0.0",
|
|
26
|
+
"tsup": "^8.0.0",
|
|
27
|
+
"typescript": "^5.7.0",
|
|
28
|
+
"@envpush/client": "0.1.0",
|
|
29
|
+
"@envpush/shared": "0.1.0",
|
|
30
|
+
"@envpush/tsconfig": "0.0.0"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsup",
|
|
34
|
+
"dev": "tsup --watch"
|
|
35
|
+
}
|
|
36
|
+
}
|