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 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/project/init.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { getClient } from \"../../lib/client.js\";\nimport { saveProjectConfig } from \"../../lib/project-config.js\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\nimport { detectProjectInfo, parseEnvFile } from \"@envpush/shared\";\n\nexport default defineCommand({\n meta: { name: \"init\", description: \"Initialize project (smart detection)\" },\n async run() {\n try {\n p.intro(chalk.bold(\"evp init\"));\n\n const cwd = process.cwd();\n const info = await detectProjectInfo(cwd);\n\n // Show detection results\n const lines = [];\n if (info.name) lines.push(`Name: ${info.name}`);\n if (info.branch) lines.push(`Branch: ${info.branch}`);\n if (info.hasEnvFile) lines.push(`.env: found (${info.envVarCount} variables)`);\n else lines.push(`.env: not found`);\n\n if (lines.length) p.note(lines.join(\"\\n\"), \"Detected project info\");\n\n // Get teams\n const { client } = await getClient();\n const teamsRes = await client.teams.mine.$get();\n await handleApiResponse(teamsRes);\n const teamsData = await teamsRes.json() as {\n teams: { id: string; name: string; slug: string }[];\n };\n\n if (teamsData.teams.length === 0) {\n p.cancel(\"No teams. Create one with `evp team create` first.\");\n process.exit(1);\n }\n\n let teamId: string;\n let teamSlug: string;\n if (teamsData.teams.length === 1) {\n teamId = teamsData.teams[0]!.id;\n teamSlug = teamsData.teams[0]!.slug;\n } else {\n const selected = await p.select({\n message: \"Select team\",\n options: teamsData.teams.map((t) => ({ value: t.id, label: t.name })),\n });\n handleCancel(selected);\n teamId = selected as string;\n teamSlug = teamsData.teams.find((t) => t.id === teamId)!.slug;\n }\n\n const projectName = await p.text({\n message: \"Project name\",\n initialValue: info.name || \"\",\n });\n handleCancel(projectName);\n\n // Map branch to environment\n const suggestedEnv = info.suggestedEnv || \"development\";\n\n const envName = await p.text({\n message: `Environment name for branch \"${info.branch || \"unknown\"}\"`,\n initialValue: suggestedEnv,\n validate: (v) => {\n if (!v || v.trim().length === 0) return \"Environment name is required\";\n },\n });\n handleCancel(envName);\n\n // Create project\n const s = p.spinner();\n s.start(\"Creating project...\");\n\n const projectRes = await client.projects.$post({\n json: { team_id: teamId, name: projectName },\n });\n await handleApiResponse(projectRes);\n const projectData = await projectRes.json() as {\n project: { id: string; slug: string };\n environments: { id: string; name: string; slug: string }[];\n };\n s.stop(\"Project created!\");\n\n // Find or create the selected environment\n let targetEnv = projectData.environments.find(\n (e) => e.slug === envName || e.name.toLowerCase() === envName.toLowerCase()\n );\n if (!targetEnv) {\n s.start(`Creating environment \"${envName}\"...`);\n const envRes = await client.environments[\":projectId\"].environments.$post({\n param: { projectId: projectData.project.id },\n json: { name: envName },\n });\n await handleApiResponse(envRes);\n const envData = await envRes.json() as {\n environment: { id: string; name: string; slug: string };\n };\n targetEnv = envData.environment;\n s.stop(`Created environment \"${targetEnv.name}\"`);\n }\n\n // Import .env if exists\n if (info.hasEnvFile && info.envVarCount && info.envVarCount > 0) {\n const importEnv = await p.confirm({\n message: `Import ${info.envVarCount} variables from .env to ${envName}?`,\n initialValue: true,\n });\n handleCancel(importEnv);\n\n if (importEnv) {\n s.start(`Pushing ${info.envVarCount} secrets to ${envName}...`);\n const envContent = await readFile(join(cwd, \".env\"), \"utf-8\");\n const vars = parseEnvFile(envContent);\n const secrets = Object.entries(vars).map(([key, value]) => ({ key, value }));\n\n const pushRes = await client.secrets[\":id\"].secrets.$put({\n param: { id: targetEnv.id },\n json: { secrets },\n });\n await handleApiResponse(pushRes);\n s.stop(`Pushed ${secrets.length} secrets!`);\n }\n }\n\n // Write .evp.json\n await saveProjectConfig({\n team: teamSlug,\n project: projectData.project.slug,\n environment: targetEnv.slug,\n });\n p.log.success(\"Created .evp.json\");\n\n // Suggest .gitignore\n p.log.info(chalk.dim(\"Add .evp.json and .env to your .gitignore\"));\n\n p.note(\n [\n `Project: ${projectName}`,\n `Environment: ${targetEnv.name}`,\n info.envVarCount ? `Secrets: ${info.envVarCount} synced` : \"\",\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n \"Summary\"\n );\n\n p.outro(\"Done! Use `evp pull` and `evp push` to sync.\");\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,78 @@
|
|
|
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 "./chunk-Z23MVAIZ.js";
|
|
15
|
+
import "./chunk-2H7UOFLK.js";
|
|
16
|
+
|
|
17
|
+
// src/commands/team/invite-code.ts
|
|
18
|
+
import { defineCommand } from "citty";
|
|
19
|
+
var invite_code_default = defineCommand({
|
|
20
|
+
meta: { name: "invite-code", description: "Show or regenerate invite code" },
|
|
21
|
+
async run() {
|
|
22
|
+
try {
|
|
23
|
+
p.intro(chalk.bold("evp team invite-code"));
|
|
24
|
+
const { client } = await getClient();
|
|
25
|
+
const teamsRes = await client.teams.mine.$get();
|
|
26
|
+
await handleApiResponse(teamsRes);
|
|
27
|
+
const teamsData = await teamsRes.json();
|
|
28
|
+
if (teamsData.teams.length === 0) {
|
|
29
|
+
p.cancel("No teams. Create one with `evp team create`.");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let teamId;
|
|
33
|
+
if (teamsData.teams.length === 1) {
|
|
34
|
+
teamId = teamsData.teams[0].id;
|
|
35
|
+
} else {
|
|
36
|
+
const selected = await p.select({
|
|
37
|
+
message: "Select team",
|
|
38
|
+
options: teamsData.teams.map((t) => ({ value: t.id, label: t.name }))
|
|
39
|
+
});
|
|
40
|
+
handleCancel(selected);
|
|
41
|
+
teamId = selected;
|
|
42
|
+
}
|
|
43
|
+
const team = teamsData.teams.find((t) => t.id === teamId);
|
|
44
|
+
const teamRes = await client.teams[":slug"].$get({ param: { slug: team.slug } });
|
|
45
|
+
await handleApiResponse(teamRes);
|
|
46
|
+
const teamData = await teamRes.json();
|
|
47
|
+
p.note(`Current invite code: ${chalk.bold(teamData.team.invite_code)}`, team.name);
|
|
48
|
+
const action = await p.select({
|
|
49
|
+
message: "What do you want to do?",
|
|
50
|
+
options: [
|
|
51
|
+
{ value: "keep", label: "Keep current code" },
|
|
52
|
+
{ value: "regenerate", label: "Regenerate new code" }
|
|
53
|
+
]
|
|
54
|
+
});
|
|
55
|
+
handleCancel(action);
|
|
56
|
+
if (action === "regenerate") {
|
|
57
|
+
const s = p.spinner();
|
|
58
|
+
s.start("Regenerating...");
|
|
59
|
+
const regenRes = await client.teams[":id"]["regenerate-invite"].$post({
|
|
60
|
+
param: { id: teamId }
|
|
61
|
+
});
|
|
62
|
+
await handleApiResponse(regenRes);
|
|
63
|
+
const regenData = await regenRes.json();
|
|
64
|
+
s.stop("Regenerated!");
|
|
65
|
+
p.note(`New invite code: ${chalk.bold(regenData.invite_code)}`, "Updated");
|
|
66
|
+
p.outro("Old code is now invalid.");
|
|
67
|
+
} else {
|
|
68
|
+
p.outro("Done!");
|
|
69
|
+
}
|
|
70
|
+
} catch (err) {
|
|
71
|
+
handleError(err);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
export {
|
|
76
|
+
invite_code_default as default
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=invite-code-LVWE5FMM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/team/invite-code.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"invite-code\", description: \"Show or regenerate invite code\" },\n async run() {\n try {\n p.intro(chalk.bold(\"evp team invite-code\"));\n\n const { client } = await getClient();\n const teamsRes = await client.teams.mine.$get();\n await handleApiResponse(teamsRes);\n const teamsData = await teamsRes.json() as {\n teams: { id: string; name: string; slug: string; role: string }[];\n };\n\n if (teamsData.teams.length === 0) {\n p.cancel(\"No teams. Create one with `evp team create`.\");\n return;\n }\n\n let teamId: string;\n if (teamsData.teams.length === 1) {\n teamId = teamsData.teams[0]!.id;\n } else {\n const selected = await p.select({\n message: \"Select team\",\n options: teamsData.teams.map((t) => ({ value: t.id, label: t.name })),\n });\n handleCancel(selected);\n teamId = selected as string;\n }\n\n const team = teamsData.teams.find((t) => t.id === teamId)!;\n const teamRes = await client.teams[\":slug\"].$get({ param: { slug: team.slug } });\n await handleApiResponse(teamRes);\n const teamData = await teamRes.json() as { team: { invite_code: string } };\n\n p.note(`Current invite code: ${chalk.bold(teamData.team.invite_code)}`, team.name);\n\n const action = await p.select({\n message: \"What do you want to do?\",\n options: [\n { value: \"keep\", label: \"Keep current code\" },\n { value: \"regenerate\", label: \"Regenerate new code\" },\n ],\n });\n handleCancel(action);\n\n if (action === \"regenerate\") {\n const s = p.spinner();\n s.start(\"Regenerating...\");\n\n const regenRes = await client.teams[\":id\"][\"regenerate-invite\"].$post({\n param: { id: teamId },\n });\n await handleApiResponse(regenRes);\n const regenData = await regenRes.json() as { invite_code: string };\n\n s.stop(\"Regenerated!\");\n p.note(`New invite code: ${chalk.bold(regenData.invite_code)}`, \"Updated\");\n p.outro(\"Old code is now invalid.\");\n } else {\n p.outro(\"Done!\");\n }\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAK9B,IAAO,sBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,eAAe,aAAa,iCAAiC;AAAA,EAC3E,MAAM,MAAM;AACV,QAAI;AACF,QAAE,MAAM,MAAM,KAAK,sBAAsB,CAAC;AAE1C,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU;AACnC,YAAM,WAAW,MAAM,OAAO,MAAM,KAAK,KAAK;AAC9C,YAAM,kBAAkB,QAAQ;AAChC,YAAM,YAAY,MAAM,SAAS,KAAK;AAItC,UAAI,UAAU,MAAM,WAAW,GAAG;AAChC,UAAE,OAAO,8CAA8C;AACvD;AAAA,MACF;AAEA,UAAI;AACJ,UAAI,UAAU,MAAM,WAAW,GAAG;AAChC,iBAAS,UAAU,MAAM,CAAC,EAAG;AAAA,MAC/B,OAAO;AACL,cAAM,WAAW,MAAM,EAAE,OAAO;AAAA,UAC9B,SAAS;AAAA,UACT,SAAS,UAAU,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE;AAAA,QACtE,CAAC;AACD,qBAAa,QAAQ;AACrB,iBAAS;AAAA,MACX;AAEA,YAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACxD,YAAM,UAAU,MAAM,OAAO,MAAM,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,KAAK,EAAE,CAAC;AAC/E,YAAM,kBAAkB,OAAO;AAC/B,YAAM,WAAW,MAAM,QAAQ,KAAK;AAEpC,QAAE,KAAK,wBAAwB,MAAM,KAAK,SAAS,KAAK,WAAW,CAAC,IAAI,KAAK,IAAI;AAEjF,YAAM,SAAS,MAAM,EAAE,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,OAAO,QAAQ,OAAO,oBAAoB;AAAA,UAC5C,EAAE,OAAO,cAAc,OAAO,sBAAsB;AAAA,QACtD;AAAA,MACF,CAAC;AACD,mBAAa,MAAM;AAEnB,UAAI,WAAW,cAAc;AAC3B,cAAM,IAAI,EAAE,QAAQ;AACpB,UAAE,MAAM,iBAAiB;AAEzB,cAAM,WAAW,MAAM,OAAO,MAAM,KAAK,EAAE,mBAAmB,EAAE,MAAM;AAAA,UACpE,OAAO,EAAE,IAAI,OAAO;AAAA,QACtB,CAAC;AACD,cAAM,kBAAkB,QAAQ;AAChC,cAAM,YAAY,MAAM,SAAS,KAAK;AAEtC,UAAE,KAAK,cAAc;AACrB,UAAE,KAAK,oBAAoB,MAAM,KAAK,UAAU,WAAW,CAAC,IAAI,SAAS;AACzE,UAAE,MAAM,0BAA0B;AAAA,MACpC,OAAO;AACL,UAAE,MAAM,OAAO;AAAA,MACjB;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
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 "./chunk-Z23MVAIZ.js";
|
|
15
|
+
import "./chunk-2H7UOFLK.js";
|
|
16
|
+
|
|
17
|
+
// src/commands/team/join.ts
|
|
18
|
+
import { defineCommand } from "citty";
|
|
19
|
+
var join_default = defineCommand({
|
|
20
|
+
meta: { name: "join", description: "Join a team by invite code" },
|
|
21
|
+
args: {
|
|
22
|
+
code: { type: "positional", required: false, description: "Invite code" }
|
|
23
|
+
},
|
|
24
|
+
async run({ args }) {
|
|
25
|
+
try {
|
|
26
|
+
let code = args.code;
|
|
27
|
+
if (!code) {
|
|
28
|
+
p.intro(chalk.bold("evp team join"));
|
|
29
|
+
const input = await p.text({ message: "Invite code" });
|
|
30
|
+
handleCancel(input);
|
|
31
|
+
code = input;
|
|
32
|
+
}
|
|
33
|
+
const s = p.spinner();
|
|
34
|
+
s.start("Joining team...");
|
|
35
|
+
const { client } = await getClient();
|
|
36
|
+
const res = await client.teams.join.$post({
|
|
37
|
+
json: { invite_code: code }
|
|
38
|
+
});
|
|
39
|
+
await handleApiResponse(res);
|
|
40
|
+
const data = await res.json();
|
|
41
|
+
s.stop(`Joined "${data.team.name}"!`);
|
|
42
|
+
} catch (err) {
|
|
43
|
+
handleError(err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
export {
|
|
48
|
+
join_default as default
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=join-XR6STHVE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/team/join.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"join\", description: \"Join a team by invite code\" },\n args: {\n code: { type: \"positional\", required: false, description: \"Invite code\" },\n },\n async run({ args }) {\n try {\n let code = args.code;\n if (!code) {\n p.intro(chalk.bold(\"evp team join\"));\n const input = await p.text({ message: \"Invite code\" });\n handleCancel(input);\n code = input;\n }\n\n const s = p.spinner();\n s.start(\"Joining team...\");\n\n const { client } = await getClient();\n const res = await client.teams.join.$post({\n json: { invite_code: code },\n });\n await handleApiResponse(res);\n\n const data = await res.json() as { team: { name: string } };\n s.stop(`Joined \"${data.team.name}\"!`);\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAK9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,6BAA6B;AAAA,EAChE,MAAM;AAAA,IACJ,MAAM,EAAE,MAAM,cAAc,UAAU,OAAO,aAAa,cAAc;AAAA,EAC1E;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AACF,UAAI,OAAO,KAAK;AAChB,UAAI,CAAC,MAAM;AACT,UAAE,MAAM,MAAM,KAAK,eAAe,CAAC;AACnC,cAAM,QAAQ,MAAM,EAAE,KAAK,EAAE,SAAS,cAAc,CAAC;AACrD,qBAAa,KAAK;AAClB,eAAO;AAAA,MACT;AAEA,YAAM,IAAI,EAAE,QAAQ;AACpB,QAAE,MAAM,iBAAiB;AAEzB,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU;AACnC,YAAM,MAAM,MAAM,OAAO,MAAM,KAAK,MAAM;AAAA,QACxC,MAAM,EAAE,aAAa,KAAK;AAAA,MAC5B,CAAC;AACD,YAAM,kBAAkB,GAAG;AAE3B,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAE,KAAK,WAAW,KAAK,KAAK,IAAI,IAAI;AAAA,IACtC,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
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
|
+
saveProjectConfig
|
|
16
|
+
} from "./chunk-TSUQGF7F.js";
|
|
17
|
+
import "./chunk-Z23MVAIZ.js";
|
|
18
|
+
import "./chunk-2H7UOFLK.js";
|
|
19
|
+
|
|
20
|
+
// src/commands/project/link.ts
|
|
21
|
+
import { defineCommand } from "citty";
|
|
22
|
+
var link_default = defineCommand({
|
|
23
|
+
meta: { name: "link", description: "Link to existing project/environment" },
|
|
24
|
+
async run() {
|
|
25
|
+
try {
|
|
26
|
+
p.intro(chalk.bold("evp link"));
|
|
27
|
+
const { client } = await getClient();
|
|
28
|
+
const teamsRes = await client.teams.mine.$get();
|
|
29
|
+
await handleApiResponse(teamsRes);
|
|
30
|
+
const teamsData = await teamsRes.json();
|
|
31
|
+
if (teamsData.teams.length === 0) {
|
|
32
|
+
p.cancel("No teams.");
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
const teamId = await p.select({
|
|
36
|
+
message: "Select team",
|
|
37
|
+
options: teamsData.teams.map((t) => ({ value: t.id, label: t.name }))
|
|
38
|
+
});
|
|
39
|
+
handleCancel(teamId);
|
|
40
|
+
const team = teamsData.teams.find((t) => t.id === teamId);
|
|
41
|
+
const projectsRes = await client.projects.teams[":teamId"].projects.$get({
|
|
42
|
+
param: { teamId }
|
|
43
|
+
});
|
|
44
|
+
await handleApiResponse(projectsRes);
|
|
45
|
+
const projectsData = await projectsRes.json();
|
|
46
|
+
if (projectsData.projects.length === 0) {
|
|
47
|
+
p.cancel("No projects in this team. Use `evp init` to create one.");
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const projectId = await p.select({
|
|
51
|
+
message: "Select project",
|
|
52
|
+
options: projectsData.projects.map((pr) => ({ value: pr.id, label: pr.name }))
|
|
53
|
+
});
|
|
54
|
+
handleCancel(projectId);
|
|
55
|
+
const project = projectsData.projects.find((pr) => pr.id === projectId);
|
|
56
|
+
const envsRes = await client.environments[":projectId"].environments.$get({
|
|
57
|
+
param: { projectId }
|
|
58
|
+
});
|
|
59
|
+
await handleApiResponse(envsRes);
|
|
60
|
+
const envsData = await envsRes.json();
|
|
61
|
+
const envId = await p.select({
|
|
62
|
+
message: "Select environment",
|
|
63
|
+
options: envsData.environments.map((e) => ({ value: e.slug, label: e.name }))
|
|
64
|
+
});
|
|
65
|
+
handleCancel(envId);
|
|
66
|
+
await saveProjectConfig({
|
|
67
|
+
team: team.slug,
|
|
68
|
+
project: project.slug,
|
|
69
|
+
environment: envId
|
|
70
|
+
});
|
|
71
|
+
p.log.success("Created .evp.json");
|
|
72
|
+
p.outro("Linked! Run `evp pull` to fetch secrets.");
|
|
73
|
+
} catch (err) {
|
|
74
|
+
handleError(err);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
export {
|
|
79
|
+
link_default as default
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=link-YLGQQZQE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/project/link.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { 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: \"link\", description: \"Link to existing project/environment\" },\n async run() {\n try {\n p.intro(chalk.bold(\"evp link\"));\n\n const { client } = await getClient();\n\n // Select team\n const teamsRes = await client.teams.mine.$get();\n await handleApiResponse(teamsRes);\n const teamsData = await teamsRes.json() as {\n teams: { id: string; name: string; slug: string }[];\n };\n\n if (teamsData.teams.length === 0) {\n p.cancel(\"No teams.\");\n process.exit(1);\n }\n\n const teamId = await p.select({\n message: \"Select team\",\n options: teamsData.teams.map((t) => ({ value: t.id, label: t.name })),\n });\n handleCancel(teamId);\n const team = teamsData.teams.find((t) => t.id === teamId)!;\n\n // Select project\n const projectsRes = await client.projects.teams[\":teamId\"].projects.$get({\n param: { teamId: teamId as string },\n });\n await handleApiResponse(projectsRes);\n const projectsData = await projectsRes.json() as {\n projects: { id: string; name: string; slug: string }[];\n };\n\n if (projectsData.projects.length === 0) {\n p.cancel(\"No projects in this team. Use `evp init` to create one.\");\n process.exit(1);\n }\n\n const projectId = await p.select({\n message: \"Select project\",\n options: projectsData.projects.map((pr) => ({ value: pr.id, label: pr.name })),\n });\n handleCancel(projectId);\n const project = projectsData.projects.find((pr) => pr.id === projectId)!;\n\n // Select environment\n const envsRes = await client.environments[\":projectId\"].environments.$get({\n param: { projectId: projectId as string },\n });\n await handleApiResponse(envsRes);\n const envsData = await envsRes.json() as {\n environments: { id: string; name: string; slug: string }[];\n };\n\n const envId = await p.select({\n message: \"Select environment\",\n options: envsData.environments.map((e) => ({ value: e.slug, label: e.name })),\n });\n handleCancel(envId);\n\n await saveProjectConfig({\n team: team.slug,\n project: project.slug,\n environment: envId as string,\n });\n\n p.log.success(\"Created .evp.json\");\n p.outro(\"Linked! Run `evp pull` to fetch secrets.\");\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,uCAAuC;AAAA,EAC1E,MAAM,MAAM;AACV,QAAI;AACF,QAAE,MAAM,MAAM,KAAK,UAAU,CAAC;AAE9B,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU;AAGnC,YAAM,WAAW,MAAM,OAAO,MAAM,KAAK,KAAK;AAC9C,YAAM,kBAAkB,QAAQ;AAChC,YAAM,YAAY,MAAM,SAAS,KAAK;AAItC,UAAI,UAAU,MAAM,WAAW,GAAG;AAChC,UAAE,OAAO,WAAW;AACpB,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,MAAM,EAAE,OAAO;AAAA,QAC5B,SAAS;AAAA,QACT,SAAS,UAAU,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,KAAK,EAAE;AAAA,MACtE,CAAC;AACD,mBAAa,MAAM;AACnB,YAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AAGxD,YAAM,cAAc,MAAM,OAAO,SAAS,MAAM,SAAS,EAAE,SAAS,KAAK;AAAA,QACvE,OAAO,EAAE,OAAyB;AAAA,MACpC,CAAC;AACD,YAAM,kBAAkB,WAAW;AACnC,YAAM,eAAe,MAAM,YAAY,KAAK;AAI5C,UAAI,aAAa,SAAS,WAAW,GAAG;AACtC,UAAE,OAAO,yDAAyD;AAClE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,YAAY,MAAM,EAAE,OAAO;AAAA,QAC/B,SAAS;AAAA,QACT,SAAS,aAAa,SAAS,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,OAAO,GAAG,KAAK,EAAE;AAAA,MAC/E,CAAC;AACD,mBAAa,SAAS;AACtB,YAAM,UAAU,aAAa,SAAS,KAAK,CAAC,OAAO,GAAG,OAAO,SAAS;AAGtE,YAAM,UAAU,MAAM,OAAO,aAAa,YAAY,EAAE,aAAa,KAAK;AAAA,QACxE,OAAO,EAAE,UAA+B;AAAA,MAC1C,CAAC;AACD,YAAM,kBAAkB,OAAO;AAC/B,YAAM,WAAW,MAAM,QAAQ,KAAK;AAIpC,YAAM,QAAQ,MAAM,EAAE,OAAO;AAAA,QAC3B,SAAS;AAAA,QACT,SAAS,SAAS,aAAa,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,EAAE,KAAK,EAAE;AAAA,MAC9E,CAAC;AACD,mBAAa,KAAK;AAElB,YAAM,kBAAkB;AAAA,QACtB,MAAM,KAAK;AAAA,QACX,SAAS,QAAQ;AAAA,QACjB,aAAa;AAAA,MACf,CAAC;AAED,QAAE,IAAI,QAAQ,mBAAmB;AACjC,QAAE,MAAM,0CAA0C;AAAA,IACpD,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
chalk,
|
|
4
|
+
formatTable,
|
|
5
|
+
maskValue,
|
|
6
|
+
timeAgo
|
|
7
|
+
} from "./chunk-BWPCYXXL.js";
|
|
8
|
+
import {
|
|
9
|
+
resolveEnvironmentId
|
|
10
|
+
} from "./chunk-HQFY6BB6.js";
|
|
11
|
+
import "./chunk-HL2WXSVD.js";
|
|
12
|
+
import {
|
|
13
|
+
handleApiResponse,
|
|
14
|
+
handleError
|
|
15
|
+
} from "./chunk-UWVCYS24.js";
|
|
16
|
+
import "./chunk-TSUQGF7F.js";
|
|
17
|
+
import "./chunk-Z23MVAIZ.js";
|
|
18
|
+
import "./chunk-2H7UOFLK.js";
|
|
19
|
+
|
|
20
|
+
// src/commands/secrets/list.ts
|
|
21
|
+
import { defineCommand } from "citty";
|
|
22
|
+
var list_default = defineCommand({
|
|
23
|
+
meta: { name: "list", description: "List all secrets" },
|
|
24
|
+
args: {
|
|
25
|
+
reveal: { type: "boolean", description: "Show actual values" }
|
|
26
|
+
},
|
|
27
|
+
async run({ args }) {
|
|
28
|
+
try {
|
|
29
|
+
const { client, envId, envName, projectName } = await resolveEnvironmentId();
|
|
30
|
+
const res = await client.secrets[":id"].secrets.$get({
|
|
31
|
+
param: { id: envId }
|
|
32
|
+
});
|
|
33
|
+
await handleApiResponse(res);
|
|
34
|
+
const data = await res.json();
|
|
35
|
+
console.log(`
|
|
36
|
+
Environment: ${chalk.bold(envName)} (${projectName})
|
|
37
|
+
`);
|
|
38
|
+
if (data.secrets.length === 0) {
|
|
39
|
+
console.log(chalk.dim(" No secrets yet. Use `evp push` or `evp set` to add some.\n"));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const table = formatTable(
|
|
43
|
+
["KEY", "VALUE", "VERSION", "UPDATED"],
|
|
44
|
+
data.secrets.map((s) => [
|
|
45
|
+
s.key,
|
|
46
|
+
args.reveal ? s.value : maskValue(s.value),
|
|
47
|
+
`v${s.version}`,
|
|
48
|
+
timeAgo(s.updated_at)
|
|
49
|
+
])
|
|
50
|
+
);
|
|
51
|
+
console.log(" " + table.split("\n").join("\n "));
|
|
52
|
+
console.log(chalk.dim(`
|
|
53
|
+
${data.secrets.length} secrets total
|
|
54
|
+
`));
|
|
55
|
+
} catch (err) {
|
|
56
|
+
handleError(err);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
export {
|
|
61
|
+
list_default as default
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=list-4OS4UHKS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { resolveEnvironmentId } from \"../../lib/resolve-env.js\";\nimport { formatTable, timeAgo, maskValue, chalk } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"list\", description: \"List all secrets\" },\n args: {\n reveal: { type: \"boolean\", description: \"Show actual values\" },\n },\n async run({ args }) {\n try {\n const { client, envId, envName, projectName } = await resolveEnvironmentId();\n\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; version: number; updated_by: string; updated_at: string }[];\n };\n\n console.log(`\\nEnvironment: ${chalk.bold(envName)} (${projectName})\\n`);\n\n if (data.secrets.length === 0) {\n console.log(chalk.dim(\" No secrets yet. Use `evp push` or `evp set` to add some.\\n\"));\n return;\n }\n\n const table = formatTable(\n [\"KEY\", \"VALUE\", \"VERSION\", \"UPDATED\"],\n data.secrets.map((s) => [\n s.key,\n args.reveal ? s.value : maskValue(s.value),\n `v${s.version}`,\n timeAgo(s.updated_at),\n ])\n );\n console.log(\" \" + table.split(\"\\n\").join(\"\\n \"));\n console.log(chalk.dim(`\\n ${data.secrets.length} secrets total\\n`));\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAK9B,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,mBAAmB;AAAA,EACtD,MAAM;AAAA,IACJ,QAAQ,EAAE,MAAM,WAAW,aAAa,qBAAqB;AAAA,EAC/D;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,SAAS,YAAY,IAAI,MAAM,qBAAqB;AAE3E,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;AAI5B,cAAQ,IAAI;AAAA,eAAkB,MAAM,KAAK,OAAO,CAAC,KAAK,WAAW;AAAA,CAAK;AAEtE,UAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,gBAAQ,IAAI,MAAM,IAAI,8DAA8D,CAAC;AACrF;AAAA,MACF;AAEA,YAAM,QAAQ;AAAA,QACZ,CAAC,OAAO,SAAS,WAAW,SAAS;AAAA,QACrC,KAAK,QAAQ,IAAI,CAAC,MAAM;AAAA,UACtB,EAAE;AAAA,UACF,KAAK,SAAS,EAAE,QAAQ,UAAU,EAAE,KAAK;AAAA,UACzC,IAAI,EAAE,OAAO;AAAA,UACb,QAAQ,EAAE,UAAU;AAAA,QACtB,CAAC;AAAA,MACH;AACA,cAAQ,IAAI,OAAO,MAAM,MAAM,IAAI,EAAE,KAAK,MAAM,CAAC;AACjD,cAAQ,IAAI,MAAM,IAAI;AAAA,IAAO,KAAK,QAAQ,MAAM;AAAA,CAAkB,CAAC;AAAA,IACrE,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,51 @@
|
|
|
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 {
|
|
10
|
+
loadProjectConfig
|
|
11
|
+
} from "./chunk-TSUQGF7F.js";
|
|
12
|
+
import "./chunk-Z23MVAIZ.js";
|
|
13
|
+
import "./chunk-2H7UOFLK.js";
|
|
14
|
+
|
|
15
|
+
// src/commands/env/list.ts
|
|
16
|
+
import { defineCommand } from "citty";
|
|
17
|
+
import chalk from "chalk";
|
|
18
|
+
var list_default = defineCommand({
|
|
19
|
+
meta: { name: "list", description: "List environments" },
|
|
20
|
+
async run() {
|
|
21
|
+
try {
|
|
22
|
+
const projectConfig = await loadProjectConfig();
|
|
23
|
+
if (!projectConfig) {
|
|
24
|
+
console.error(chalk.red("No .evp.json found. Run `evp init` or `evp link` first."));
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
const { client } = await getClient();
|
|
28
|
+
const projectRes = await client.projects[":teamSlug"][":projectSlug"].$get({
|
|
29
|
+
param: { teamSlug: projectConfig.team, projectSlug: projectConfig.project }
|
|
30
|
+
});
|
|
31
|
+
await handleApiResponse(projectRes);
|
|
32
|
+
const projectData = await projectRes.json();
|
|
33
|
+
console.log(`
|
|
34
|
+
Project: ${chalk.bold(projectData.project.name)}
|
|
35
|
+
`);
|
|
36
|
+
for (const env of projectData.environments) {
|
|
37
|
+
const isCurrent = env.slug === projectConfig.environment;
|
|
38
|
+
const marker = isCurrent ? chalk.green("\u25CF") : chalk.dim("\u25CB");
|
|
39
|
+
const name = isCurrent ? chalk.bold(env.name) : env.name;
|
|
40
|
+
console.log(` ${marker} ${name}`);
|
|
41
|
+
}
|
|
42
|
+
console.log();
|
|
43
|
+
} catch (err) {
|
|
44
|
+
handleError(err);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
export {
|
|
49
|
+
list_default as default
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=list-YU2RHCZP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/env/list.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { loadProjectConfig } from \"../../lib/project-config.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\nimport chalk from \"chalk\";\n\nexport default defineCommand({\n meta: { name: \"list\", description: \"List environments\" },\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\n // Resolve project\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 project: { name: string };\n environments: { id: string; name: string; slug: string }[];\n };\n\n console.log(`\\nProject: ${chalk.bold(projectData.project.name)}\\n`);\n for (const env of projectData.environments) {\n const isCurrent = env.slug === projectConfig.environment;\n const marker = isCurrent ? chalk.green(\"●\") : chalk.dim(\"○\");\n const name = isCurrent ? chalk.bold(env.name) : env.name;\n console.log(` ${marker} ${name}`);\n }\n console.log();\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAI9B,OAAO,WAAW;AAElB,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,oBAAoB;AAAA,EACvD,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;AAGnC,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;AAK1C,cAAQ,IAAI;AAAA,WAAc,MAAM,KAAK,YAAY,QAAQ,IAAI,CAAC;AAAA,CAAI;AAClE,iBAAW,OAAO,YAAY,cAAc;AAC1C,cAAM,YAAY,IAAI,SAAS,cAAc;AAC7C,cAAM,SAAS,YAAY,MAAM,MAAM,QAAG,IAAI,MAAM,IAAI,QAAG;AAC3D,cAAM,OAAO,YAAY,MAAM,KAAK,IAAI,IAAI,IAAI,IAAI;AACpD,gBAAQ,IAAI,KAAK,MAAM,IAAI,IAAI,EAAE;AAAA,MACnC;AACA,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
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/login.ts
|
|
19
|
+
import { defineCommand } from "citty";
|
|
20
|
+
var login_default = defineCommand({
|
|
21
|
+
meta: { name: "login", description: "Login to server" },
|
|
22
|
+
async run() {
|
|
23
|
+
try {
|
|
24
|
+
p.intro(chalk.bold("evp login"));
|
|
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 email = await p.text({
|
|
40
|
+
message: "Email",
|
|
41
|
+
validate: (v) => {
|
|
42
|
+
if (!v || !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v)) return "Invalid email address";
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
handleCancel(email);
|
|
46
|
+
const password = await p.password({
|
|
47
|
+
message: "Password",
|
|
48
|
+
validate: (v) => {
|
|
49
|
+
if (!v || v.length === 0) return "Password is required";
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
handleCancel(password);
|
|
53
|
+
const s = p.spinner();
|
|
54
|
+
s.start("Authenticating...");
|
|
55
|
+
const client = createClient(serverUrl);
|
|
56
|
+
const res = await client.auth.login.$post({
|
|
57
|
+
json: { email, password }
|
|
58
|
+
});
|
|
59
|
+
await handleApiResponse(res);
|
|
60
|
+
const data = await res.json();
|
|
61
|
+
await saveConfig({ server_url: serverUrl, token: data.token });
|
|
62
|
+
s.stop("Authenticated!");
|
|
63
|
+
p.outro("Logged in! Token saved to ~/.envpush/config.json");
|
|
64
|
+
} catch (err) {
|
|
65
|
+
handleError(err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
export {
|
|
70
|
+
login_default as default
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=login-ZH5PD5PW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/auth/login.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { createClient } from \"@envpush/client\";\nimport { p, handleCancel, chalk } from \"../../lib/ui.js\";\nimport { loadConfig, saveConfig, saveServerUrl } from \"../../lib/config.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"login\", description: \"Login to server\" },\n async run() {\n try {\n p.intro(chalk.bold(\"evp login\"));\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 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\",\n validate: (v) => {\n if (!v || v.length === 0) return \"Password is required\";\n },\n });\n handleCancel(password);\n\n const s = p.spinner();\n s.start(\"Authenticating...\");\n\n const client = createClient(serverUrl);\n const res = await client.auth.login.$post({\n json: { email, password },\n });\n await handleApiResponse(res);\n\n const data = await res.json() as { token: string };\n await saveConfig({ server_url: serverUrl, token: data.token });\n\n s.stop(\"Authenticated!\");\n p.outro(\"Logged in! Token saved to ~/.envpush/config.json\");\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,SAAS,aAAa,kBAAkB;AAAA,EACtD,MAAM,MAAM;AACV,QAAI;AACF,QAAE,MAAM,MAAM,KAAK,WAAW,CAAC;AAE/B,YAAM,SAAS,MAAM,WAAW;AAChC,UAAI;AAEJ,UAAI,QAAQ,YAAY;AACtB,oBAAY,OAAO;AACnB,UAAE,IAAI,KAAK,WAAW,MAAM,KAAK,SAAS,CAAC,EAAE;AAAA,MAC/C,OAAO;AACL,cAAM,QAAQ,MAAM,EAAE,KAAK;AAAA,UACzB,SAAS;AAAA,UACT,aAAa;AAAA,UACb,cAAc;AAAA,QAChB,CAAC;AACD,qBAAa,KAAK;AAClB,oBAAY;AAAA,MACd;AAEA,YAAM,QAAQ,MAAM,EAAE,KAAK;AAAA,QACzB,SAAS;AAAA,QACT,UAAU,CAAC,MAAM;AACf,cAAI,CAAC,KAAK,CAAC,6BAA6B,KAAK,CAAC,EAAG,QAAO;AAAA,QAC1D;AAAA,MACF,CAAC;AACD,mBAAa,KAAK;AAElB,YAAM,WAAW,MAAM,EAAE,SAAS;AAAA,QAChC,SAAS;AAAA,QACT,UAAU,CAAC,MAAM;AACf,cAAI,CAAC,KAAK,EAAE,WAAW,EAAG,QAAO;AAAA,QACnC;AAAA,MACF,CAAC;AACD,mBAAa,QAAQ;AAErB,YAAM,IAAI,EAAE,QAAQ;AACpB,QAAE,MAAM,mBAAmB;AAE3B,YAAM,SAAS,aAAa,SAAS;AACrC,YAAM,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM;AAAA,QACxC,MAAM,EAAE,OAAO,SAAS;AAAA,MAC1B,CAAC;AACD,YAAM,kBAAkB,GAAG;AAE3B,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,WAAW,EAAE,YAAY,WAAW,OAAO,KAAK,MAAM,CAAC;AAE7D,QAAE,KAAK,gBAAgB;AACvB,QAAE,MAAM,kDAAkD;AAAA,IAC5D,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
clearConfig,
|
|
4
|
+
getConfigPath
|
|
5
|
+
} from "./chunk-Z23MVAIZ.js";
|
|
6
|
+
import "./chunk-2H7UOFLK.js";
|
|
7
|
+
|
|
8
|
+
// src/commands/auth/logout.ts
|
|
9
|
+
import { defineCommand } from "citty";
|
|
10
|
+
import chalk from "chalk";
|
|
11
|
+
var logout_default = defineCommand({
|
|
12
|
+
meta: { name: "logout", description: "Clear credentials" },
|
|
13
|
+
async run() {
|
|
14
|
+
await clearConfig();
|
|
15
|
+
console.log(chalk.green(`Logged out. Removed ${getConfigPath()}`));
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
export {
|
|
19
|
+
logout_default as default
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=logout-XROX3UVL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/auth/logout.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { clearConfig, getConfigPath } from \"../../lib/config.js\";\nimport chalk from \"chalk\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Clear credentials\" },\n async run() {\n await clearConfig();\n console.log(chalk.green(`Logged out. Removed ${getConfigPath()}`));\n },\n});\n"],"mappings":";;;;;;;;AAAA,SAAS,qBAAqB;AAE9B,OAAO,WAAW;AAElB,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,UAAU,aAAa,oBAAoB;AAAA,EACzD,MAAM,MAAM;AACV,UAAM,YAAY;AAClB,YAAQ,IAAI,MAAM,MAAM,uBAAuB,cAAc,CAAC,EAAE,CAAC;AAAA,EACnE;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
chalk,
|
|
4
|
+
formatTable,
|
|
5
|
+
handleCancel,
|
|
6
|
+
p,
|
|
7
|
+
timeAgo
|
|
8
|
+
} from "./chunk-BWPCYXXL.js";
|
|
9
|
+
import {
|
|
10
|
+
getClient
|
|
11
|
+
} from "./chunk-HL2WXSVD.js";
|
|
12
|
+
import {
|
|
13
|
+
handleApiResponse,
|
|
14
|
+
handleError
|
|
15
|
+
} from "./chunk-UWVCYS24.js";
|
|
16
|
+
import "./chunk-Z23MVAIZ.js";
|
|
17
|
+
import "./chunk-2H7UOFLK.js";
|
|
18
|
+
|
|
19
|
+
// src/commands/team/members.ts
|
|
20
|
+
import { defineCommand } from "citty";
|
|
21
|
+
var members_default = defineCommand({
|
|
22
|
+
meta: { name: "members", description: "List team members" },
|
|
23
|
+
async run() {
|
|
24
|
+
try {
|
|
25
|
+
const { client } = await getClient();
|
|
26
|
+
const teamsRes = await client.teams.mine.$get();
|
|
27
|
+
await handleApiResponse(teamsRes);
|
|
28
|
+
const teamsData = await teamsRes.json();
|
|
29
|
+
if (teamsData.teams.length === 0) {
|
|
30
|
+
console.log(chalk.dim("No teams. Create one with `evp team create`."));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
let teamId;
|
|
34
|
+
if (teamsData.teams.length === 1) {
|
|
35
|
+
teamId = teamsData.teams[0].id;
|
|
36
|
+
} else {
|
|
37
|
+
const selected = await p.select({
|
|
38
|
+
message: "Select team",
|
|
39
|
+
options: teamsData.teams.map((t) => ({ value: t.id, label: `${t.name} (${t.role})` }))
|
|
40
|
+
});
|
|
41
|
+
handleCancel(selected);
|
|
42
|
+
teamId = selected;
|
|
43
|
+
}
|
|
44
|
+
const team = teamsData.teams.find((t) => t.id === teamId);
|
|
45
|
+
const membersRes = await client.teams[":id"].members.$get({
|
|
46
|
+
param: { id: teamId }
|
|
47
|
+
});
|
|
48
|
+
await handleApiResponse(membersRes);
|
|
49
|
+
const data = await membersRes.json();
|
|
50
|
+
console.log(`
|
|
51
|
+
Team: ${chalk.bold(team.name)}
|
|
52
|
+
`);
|
|
53
|
+
const table = formatTable(
|
|
54
|
+
["NAME", "EMAIL", "ROLE", "JOINED"],
|
|
55
|
+
data.members.map((m) => [
|
|
56
|
+
m.user_name,
|
|
57
|
+
m.user_email,
|
|
58
|
+
m.role,
|
|
59
|
+
timeAgo(m.joined_at)
|
|
60
|
+
])
|
|
61
|
+
);
|
|
62
|
+
console.log(" " + table.split("\n").join("\n "));
|
|
63
|
+
console.log();
|
|
64
|
+
} catch (err) {
|
|
65
|
+
handleError(err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
export {
|
|
70
|
+
members_default as default
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=members-ADBLZZLN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/team/members.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { getClient } from \"../../lib/client.js\";\nimport { p, handleCancel, chalk, formatTable, timeAgo } from \"../../lib/ui.js\";\nimport { handleApiResponse, handleError } from \"../../lib/errors.js\";\n\nexport default defineCommand({\n meta: { name: \"members\", description: \"List team members\" },\n async run() {\n try {\n const { client } = await getClient();\n\n // Get teams\n const teamsRes = await client.teams.mine.$get();\n await handleApiResponse(teamsRes);\n const teamsData = await teamsRes.json() as {\n teams: { id: string; name: string; slug: string; role: string }[];\n };\n\n if (teamsData.teams.length === 0) {\n console.log(chalk.dim(\"No teams. Create one with `evp team create`.\"));\n return;\n }\n\n let teamId: string;\n if (teamsData.teams.length === 1) {\n teamId = teamsData.teams[0]!.id;\n } else {\n const selected = await p.select({\n message: \"Select team\",\n options: teamsData.teams.map((t) => ({ value: t.id, label: `${t.name} (${t.role})` })),\n });\n handleCancel(selected);\n teamId = selected as string;\n }\n\n const team = teamsData.teams.find((t) => t.id === teamId)!;\n const membersRes = await client.teams[\":id\"].members.$get({\n param: { id: teamId },\n });\n await handleApiResponse(membersRes);\n\n const data = await membersRes.json() as {\n members: {\n user_name: string;\n user_email: string;\n role: string;\n joined_at: string;\n }[];\n };\n\n console.log(`\\nTeam: ${chalk.bold(team.name)}\\n`);\n const table = formatTable(\n [\"NAME\", \"EMAIL\", \"ROLE\", \"JOINED\"],\n data.members.map((m) => [\n m.user_name,\n m.user_email,\n m.role,\n timeAgo(m.joined_at),\n ])\n );\n console.log(\" \" + table.split(\"\\n\").join(\"\\n \"));\n console.log();\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAK9B,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,WAAW,aAAa,oBAAoB;AAAA,EAC1D,MAAM,MAAM;AACV,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,MAAM,UAAU;AAGnC,YAAM,WAAW,MAAM,OAAO,MAAM,KAAK,KAAK;AAC9C,YAAM,kBAAkB,QAAQ;AAChC,YAAM,YAAY,MAAM,SAAS,KAAK;AAItC,UAAI,UAAU,MAAM,WAAW,GAAG;AAChC,gBAAQ,IAAI,MAAM,IAAI,8CAA8C,CAAC;AACrE;AAAA,MACF;AAEA,UAAI;AACJ,UAAI,UAAU,MAAM,WAAW,GAAG;AAChC,iBAAS,UAAU,MAAM,CAAC,EAAG;AAAA,MAC/B,OAAO;AACL,cAAM,WAAW,MAAM,EAAE,OAAO;AAAA,UAC9B,SAAS;AAAA,UACT,SAAS,UAAU,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,OAAO,GAAG,EAAE,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE;AAAA,QACvF,CAAC;AACD,qBAAa,QAAQ;AACrB,iBAAS;AAAA,MACX;AAEA,YAAM,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM;AACxD,YAAM,aAAa,MAAM,OAAO,MAAM,KAAK,EAAE,QAAQ,KAAK;AAAA,QACxD,OAAO,EAAE,IAAI,OAAO;AAAA,MACtB,CAAC;AACD,YAAM,kBAAkB,UAAU;AAElC,YAAM,OAAO,MAAM,WAAW,KAAK;AASnC,cAAQ,IAAI;AAAA,QAAW,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,CAAI;AAChD,YAAM,QAAQ;AAAA,QACZ,CAAC,QAAQ,SAAS,QAAQ,QAAQ;AAAA,QAClC,KAAK,QAAQ,IAAI,CAAC,MAAM;AAAA,UACtB,EAAE;AAAA,UACF,EAAE;AAAA,UACF,EAAE;AAAA,UACF,QAAQ,EAAE,SAAS;AAAA,QACrB,CAAC;AAAA,MACH;AACA,cAAQ,IAAI,OAAO,MAAM,MAAM,IAAI,EAAE,KAAK,MAAM,CAAC;AACjD,cAAQ,IAAI;AAAA,IACd,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
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/pull.ts
|
|
15
|
+
import { defineCommand } from "citty";
|
|
16
|
+
import { writeFile } from "fs/promises";
|
|
17
|
+
import { join } from "path";
|
|
18
|
+
import chalk from "chalk";
|
|
19
|
+
var pull_default = defineCommand({
|
|
20
|
+
meta: { name: "pull", description: "Pull remote secrets to .env" },
|
|
21
|
+
args: {
|
|
22
|
+
env: { type: "string", description: "Environment name" },
|
|
23
|
+
stdout: { type: "boolean", description: "Print to stdout instead of writing file" }
|
|
24
|
+
},
|
|
25
|
+
async run({ args }) {
|
|
26
|
+
try {
|
|
27
|
+
const { client, envId, envName } = await resolveEnvironmentId(args.env);
|
|
28
|
+
const res = await client.secrets[":id"].secrets.export.$get({
|
|
29
|
+
param: { id: envId }
|
|
30
|
+
});
|
|
31
|
+
await handleApiResponse(res);
|
|
32
|
+
const content = await res.text();
|
|
33
|
+
if (args.stdout) {
|
|
34
|
+
process.stdout.write(content);
|
|
35
|
+
} else {
|
|
36
|
+
const path = join(process.cwd(), ".env");
|
|
37
|
+
await writeFile(path, content);
|
|
38
|
+
const count = content.split("\n").filter((l) => l.trim() && !l.startsWith("#")).length;
|
|
39
|
+
console.log(chalk.green(` ${count} secrets -> .env (${envName})`));
|
|
40
|
+
console.log(chalk.green("Done"));
|
|
41
|
+
}
|
|
42
|
+
} catch (err) {
|
|
43
|
+
handleError(err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
export {
|
|
48
|
+
pull_default as default
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=pull-MVF276VO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/secrets/pull.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\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: \"pull\", description: \"Pull remote secrets to .env\" },\n args: {\n env: { type: \"string\", description: \"Environment name\" },\n stdout: { type: \"boolean\", description: \"Print to stdout instead of writing file\" },\n },\n async run({ args }) {\n try {\n const { client, envId, envName } = await resolveEnvironmentId(args.env);\n\n const res = await client.secrets[\":id\"].secrets.export.$get({\n param: { id: envId },\n });\n await handleApiResponse(res);\n const content = await res.text();\n\n if (args.stdout) {\n process.stdout.write(content);\n } else {\n const path = join(process.cwd(), \".env\");\n await writeFile(path, content);\n const count = content.split(\"\\n\").filter((l) => l.trim() && !l.startsWith(\"#\")).length;\n console.log(chalk.green(` ${count} secrets -> .env (${envName})`));\n console.log(chalk.green(\"Done\"));\n }\n } catch (err) {\n handleError(err);\n }\n },\n});\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAC9B,SAAS,iBAAiB;AAC1B,SAAS,YAAY;AAGrB,OAAO,WAAW;AAElB,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM,EAAE,MAAM,QAAQ,aAAa,8BAA8B;AAAA,EACjE,MAAM;AAAA,IACJ,KAAK,EAAE,MAAM,UAAU,aAAa,mBAAmB;AAAA,IACvD,QAAQ,EAAE,MAAM,WAAW,aAAa,0CAA0C;AAAA,EACpF;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,QAAI;AACF,YAAM,EAAE,QAAQ,OAAO,QAAQ,IAAI,MAAM,qBAAqB,KAAK,GAAG;AAEtE,YAAM,MAAM,MAAM,OAAO,QAAQ,KAAK,EAAE,QAAQ,OAAO,KAAK;AAAA,QAC1D,OAAO,EAAE,IAAI,MAAM;AAAA,MACrB,CAAC;AACD,YAAM,kBAAkB,GAAG;AAC3B,YAAM,UAAU,MAAM,IAAI,KAAK;AAE/B,UAAI,KAAK,QAAQ;AACf,gBAAQ,OAAO,MAAM,OAAO;AAAA,MAC9B,OAAO;AACL,cAAM,OAAO,KAAK,QAAQ,IAAI,GAAG,MAAM;AACvC,cAAM,UAAU,MAAM,OAAO;AAC7B,cAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE;AAChF,gBAAQ,IAAI,MAAM,MAAM,KAAK,KAAK,qBAAqB,OAAO,GAAG,CAAC;AAClE,gBAAQ,IAAI,MAAM,MAAM,MAAM,CAAC;AAAA,MACjC;AAAA,IACF,SAAS,KAAK;AACZ,kBAAY,GAAG;AAAA,IACjB;AAAA,EACF;AACF,CAAC;","names":[]}
|