envhub-cli 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +72 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +3 -1
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/push.d.ts.map +1 -1
- package/dist/commands/push.js +3 -2
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/tui.d.ts +6 -0
- package/dist/commands/tui.d.ts.map +1 -0
- package/dist/commands/tui.js +30 -0
- package/dist/commands/tui.js.map +1 -0
- package/dist/config/config.schema.d.ts +2 -2
- package/dist/config/config.schema.d.ts.map +1 -1
- package/dist/config/config.schema.js +27 -0
- package/dist/config/config.schema.js.map +1 -1
- package/dist/providers/azure/azure-key-vault.provider.d.ts +27 -0
- package/dist/providers/azure/azure-key-vault.provider.d.ts.map +1 -0
- package/dist/providers/azure/azure-key-vault.provider.js +190 -0
- package/dist/providers/azure/azure-key-vault.provider.js.map +1 -0
- package/dist/providers/gcp/gcp-secret-manager.provider.d.ts +26 -0
- package/dist/providers/gcp/gcp-secret-manager.provider.d.ts.map +1 -0
- package/dist/providers/gcp/gcp-secret-manager.provider.js +199 -0
- package/dist/providers/gcp/gcp-secret-manager.provider.js.map +1 -0
- package/dist/providers/provider.factory.d.ts.map +1 -1
- package/dist/providers/provider.factory.js +12 -4
- package/dist/providers/provider.factory.js.map +1 -1
- package/dist/tui/app.d.ts +12 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +220 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/utils/envhub-header.d.ts +9 -0
- package/dist/utils/envhub-header.d.ts.map +1 -0
- package/dist/utils/envhub-header.js +35 -0
- package/dist/utils/envhub-header.js.map +1 -0
- package/package.json +23 -1
package/dist/tui/app.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { Box, Text, useApp, useInput } from "ink";
|
|
4
|
+
import { configManager } from "../config/config.js";
|
|
5
|
+
import { parseEnvContent, writeEnvFileRaw } from "../utils/env-parser.js";
|
|
6
|
+
import { addEnvhubHeader } from "../utils/envhub-header.js";
|
|
7
|
+
function formatDate(value) {
|
|
8
|
+
if (!value)
|
|
9
|
+
return "-";
|
|
10
|
+
return value.toLocaleString("de-DE", {
|
|
11
|
+
year: "numeric",
|
|
12
|
+
month: "2-digit",
|
|
13
|
+
day: "2-digit",
|
|
14
|
+
hour: "2-digit",
|
|
15
|
+
minute: "2-digit",
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export function EnvhubTuiApp({ config, provider, versionControl, }) {
|
|
19
|
+
const { exit } = useApp();
|
|
20
|
+
const [items, setItems] = useState([]);
|
|
21
|
+
const [selected, setSelected] = useState(0);
|
|
22
|
+
const [busy, setBusy] = useState("Lade Secrets...");
|
|
23
|
+
const [error, setError] = useState(null);
|
|
24
|
+
const [status, setStatus] = useState("↑/↓ auswählen, Enter öffnen, r refresh, p pull, d delete, q quit");
|
|
25
|
+
const [detailsContent, setDetailsContent] = useState(null);
|
|
26
|
+
const [detailsLoading, setDetailsLoading] = useState(false);
|
|
27
|
+
const [showDetails, setShowDetails] = useState(false);
|
|
28
|
+
const [revealValues, setRevealValues] = useState(false);
|
|
29
|
+
const [pullInputMode, setPullInputMode] = useState(false);
|
|
30
|
+
const [pullPath, setPullPath] = useState("");
|
|
31
|
+
const [deleteMode, setDeleteMode] = useState(false);
|
|
32
|
+
const selectedItem = items[selected] ?? null;
|
|
33
|
+
const refresh = useCallback(async () => {
|
|
34
|
+
setBusy("Lade Secrets...");
|
|
35
|
+
setError(null);
|
|
36
|
+
try {
|
|
37
|
+
const secrets = await provider.list();
|
|
38
|
+
setItems(secrets);
|
|
39
|
+
setSelected((prev) => {
|
|
40
|
+
if (secrets.length === 0)
|
|
41
|
+
return 0;
|
|
42
|
+
return Math.min(prev, secrets.length - 1);
|
|
43
|
+
});
|
|
44
|
+
setStatus(`${secrets.length} Secret(s) geladen.`);
|
|
45
|
+
}
|
|
46
|
+
catch (loadError) {
|
|
47
|
+
setError(loadError instanceof Error
|
|
48
|
+
? loadError.message
|
|
49
|
+
: "Fehler beim Laden der Secrets.");
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
setBusy(null);
|
|
53
|
+
}
|
|
54
|
+
}, [provider]);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
void refresh();
|
|
57
|
+
}, [refresh]);
|
|
58
|
+
const parsedDetails = useMemo(() => {
|
|
59
|
+
if (!detailsContent)
|
|
60
|
+
return [];
|
|
61
|
+
return Array.from(parseEnvContent(detailsContent).entries());
|
|
62
|
+
}, [detailsContent]);
|
|
63
|
+
const loadDetails = useCallback(async (name) => {
|
|
64
|
+
setDetailsLoading(true);
|
|
65
|
+
setError(null);
|
|
66
|
+
try {
|
|
67
|
+
const content = await provider.cat(name);
|
|
68
|
+
setDetailsContent(content);
|
|
69
|
+
setShowDetails(true);
|
|
70
|
+
setRevealValues(false);
|
|
71
|
+
setStatus(`Secret '${name}' geöffnet.`);
|
|
72
|
+
}
|
|
73
|
+
catch (detailsError) {
|
|
74
|
+
setError(detailsError instanceof Error
|
|
75
|
+
? detailsError.message
|
|
76
|
+
: "Secret konnte nicht geladen werden.");
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
setDetailsLoading(false);
|
|
80
|
+
}
|
|
81
|
+
}, [provider]);
|
|
82
|
+
const pullSelected = useCallback(async (targetFile) => {
|
|
83
|
+
if (!selectedItem)
|
|
84
|
+
return;
|
|
85
|
+
setBusy(`Pull '${selectedItem.name}'...`);
|
|
86
|
+
setError(null);
|
|
87
|
+
try {
|
|
88
|
+
const result = await provider.pull(selectedItem.name);
|
|
89
|
+
const withHeader = addEnvhubHeader(selectedItem.name, result.content);
|
|
90
|
+
await writeEnvFileRaw(targetFile, withHeader);
|
|
91
|
+
await versionControl.recordPull(selectedItem.name, result.version, targetFile);
|
|
92
|
+
setStatus(`Pulled '${selectedItem.name}' (v${result.version}) -> ${targetFile}`);
|
|
93
|
+
setPullInputMode(false);
|
|
94
|
+
setPullPath("");
|
|
95
|
+
}
|
|
96
|
+
catch (pullError) {
|
|
97
|
+
setError(pullError instanceof Error ? pullError.message : "Pull fehlgeschlagen.");
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
setBusy(null);
|
|
101
|
+
}
|
|
102
|
+
}, [provider, selectedItem, versionControl]);
|
|
103
|
+
const deleteSelected = useCallback(async () => {
|
|
104
|
+
if (!selectedItem)
|
|
105
|
+
return;
|
|
106
|
+
setBusy(`Delete '${selectedItem.name}'...`);
|
|
107
|
+
setError(null);
|
|
108
|
+
try {
|
|
109
|
+
await provider.delete(selectedItem.name, { force: true });
|
|
110
|
+
const cfg = configManager.getConfig();
|
|
111
|
+
if (cfg.secrets[selectedItem.name]) {
|
|
112
|
+
delete cfg.secrets[selectedItem.name];
|
|
113
|
+
await configManager.save(cfg);
|
|
114
|
+
}
|
|
115
|
+
setStatus(`'${selectedItem.name}' wurde gelöscht.`);
|
|
116
|
+
setDeleteMode(false);
|
|
117
|
+
await refresh();
|
|
118
|
+
}
|
|
119
|
+
catch (deleteError) {
|
|
120
|
+
setError(deleteError instanceof Error
|
|
121
|
+
? deleteError.message
|
|
122
|
+
: "Delete fehlgeschlagen.");
|
|
123
|
+
}
|
|
124
|
+
finally {
|
|
125
|
+
setBusy(null);
|
|
126
|
+
}
|
|
127
|
+
}, [refresh, selectedItem, provider]);
|
|
128
|
+
useInput((input, key) => {
|
|
129
|
+
if (key.ctrl && input === "c") {
|
|
130
|
+
exit();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (busy)
|
|
134
|
+
return;
|
|
135
|
+
if (pullInputMode) {
|
|
136
|
+
if (key.escape) {
|
|
137
|
+
setPullInputMode(false);
|
|
138
|
+
setPullPath("");
|
|
139
|
+
setStatus("Pull abgebrochen.");
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (key.return) {
|
|
143
|
+
const file = pullPath.trim() || `.env.${selectedItem?.name ?? "secret"}`;
|
|
144
|
+
void pullSelected(file);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (key.backspace || key.delete) {
|
|
148
|
+
setPullPath((prev) => prev.slice(0, -1));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (input &&
|
|
152
|
+
!key.upArrow &&
|
|
153
|
+
!key.downArrow &&
|
|
154
|
+
!key.leftArrow &&
|
|
155
|
+
!key.rightArrow) {
|
|
156
|
+
setPullPath((prev) => prev + input);
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (deleteMode) {
|
|
161
|
+
if (input.toLowerCase() === "y") {
|
|
162
|
+
void deleteSelected();
|
|
163
|
+
}
|
|
164
|
+
if (input.toLowerCase() === "n" || key.escape) {
|
|
165
|
+
setDeleteMode(false);
|
|
166
|
+
setStatus("Delete abgebrochen.");
|
|
167
|
+
}
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (showDetails) {
|
|
171
|
+
if (input.toLowerCase() === "v") {
|
|
172
|
+
setRevealValues((prev) => !prev);
|
|
173
|
+
}
|
|
174
|
+
if (key.escape || input.toLowerCase() === "b") {
|
|
175
|
+
setShowDetails(false);
|
|
176
|
+
setStatus("Zurück zur Liste.");
|
|
177
|
+
}
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
if (items.length > 0 && (key.downArrow || input === "j")) {
|
|
181
|
+
setSelected((prev) => Math.min(prev + 1, items.length - 1));
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (items.length > 0 && (key.upArrow || input === "k")) {
|
|
185
|
+
setSelected((prev) => Math.max(prev - 1, 0));
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (key.return && selectedItem) {
|
|
189
|
+
void loadDetails(selectedItem.name);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (input.toLowerCase() === "r") {
|
|
193
|
+
void refresh();
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
if (input.toLowerCase() === "p" && selectedItem) {
|
|
197
|
+
const tracked = config.secrets[selectedItem.name]?.file ?? `.env.${selectedItem.name}`;
|
|
198
|
+
setPullPath(tracked);
|
|
199
|
+
setPullInputMode(true);
|
|
200
|
+
setStatus("Zielpfad eingeben und Enter drücken.");
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
if (input.toLowerCase() === "d" && selectedItem) {
|
|
204
|
+
setDeleteMode(true);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (input.toLowerCase() === "q") {
|
|
208
|
+
exit();
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
return (_jsxs(Box, { flexDirection: "column", paddingX: 1, children: [_jsx(Text, { color: "cyanBright", children: "envhub tui" }), _jsxs(Text, { color: "gray", children: ["Provider: ", provider.name, " | Prefix: ", config.prefix] }), _jsx(Text, { children: " " }), busy ? _jsx(Text, { color: "yellow", children: busy }) : null, error ? _jsxs(Text, { color: "red", children: ["Fehler: ", error] }) : null, detailsLoading ? _jsx(Text, { color: "yellow", children: "Lade Secret-Inhalt..." }) : null, !showDetails ? (_jsx(Box, { flexDirection: "column", children: items.length === 0 && !busy ? (_jsx(Text, { color: "gray", children: "Keine Secrets gefunden." })) : (items.map((item, index) => {
|
|
212
|
+
const active = index === selected;
|
|
213
|
+
const marker = active ? ">" : " ";
|
|
214
|
+
return (_jsxs(Text, { color: active ? "green" : undefined, children: [marker, " ", item.name.padEnd(30), " ", String(item.secretsCount).padStart(3), " keys ", formatDate(item.updatedAt)] }, item.name));
|
|
215
|
+
})) })) : null, showDetails && selectedItem ? (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { color: "green", children: ["Secret: ", selectedItem.name] }), _jsx(Text, { color: "gray", children: "v: values anzeigen/verbergen | b/esc: zur\u00FCck" }), _jsx(Text, { children: " " }), parsedDetails.length === 0 ? (_jsx(Text, { color: "gray", children: "(leer)" })) : (parsedDetails.map(([key, value]) => {
|
|
216
|
+
const masked = value.length <= 3 ? "***" : `${value.slice(0, 3)}***`;
|
|
217
|
+
return (_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: key }), _jsx(Text, { color: "gray", children: " = " }), _jsx(Text, { children: revealValues ? value : masked })] }, key));
|
|
218
|
+
}))] })) : null, pullInputMode ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "yellow", children: "Pull-Zielpfad (Enter best\u00E4tigen, Esc abbrechen):" }), _jsx(Text, { children: pullPath || "_" })] })) : null, deleteMode && selectedItem ? (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: "red", children: ["Secret '", selectedItem.name, "' wirklich l\u00F6schen? (y/n)"] }) })) : null, _jsx(Text, { children: " " }), _jsx(Text, { color: "gray", children: status })] }));
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=app.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove an envhub local header from the beginning of .env content.
|
|
3
|
+
*/
|
|
4
|
+
export declare function stripEnvhubHeader(content: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Add (or replace) the envhub local header at the top of .env content.
|
|
7
|
+
*/
|
|
8
|
+
export declare function addEnvhubHeader(secretName: string, content: string): string;
|
|
9
|
+
//# sourceMappingURL=envhub-header.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envhub-header.d.ts","sourceRoot":"","sources":["../../src/utils/envhub-header.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAwBzD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAG3E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const LEGACY_ENVHUB_HEADER_PREFIX = "# envhub: secret=";
|
|
2
|
+
const ENVHUB_MANAGED_LINE = "# 🔐 Managed by envhub-cli";
|
|
3
|
+
const ENVHUB_ENV_LINE_PREFIX = "# Environment: ";
|
|
4
|
+
/**
|
|
5
|
+
* Remove an envhub local header from the beginning of .env content.
|
|
6
|
+
*/
|
|
7
|
+
export function stripEnvhubHeader(content) {
|
|
8
|
+
const lines = content.split("\n");
|
|
9
|
+
const firstLine = lines[0] ?? "";
|
|
10
|
+
const secondLine = lines[1] ?? "";
|
|
11
|
+
if (firstLine === ENVHUB_MANAGED_LINE &&
|
|
12
|
+
secondLine.startsWith(ENVHUB_ENV_LINE_PREFIX)) {
|
|
13
|
+
lines.splice(0, 2);
|
|
14
|
+
if (lines[0] === "") {
|
|
15
|
+
lines.shift();
|
|
16
|
+
}
|
|
17
|
+
return lines.join("\n");
|
|
18
|
+
}
|
|
19
|
+
if (firstLine.startsWith(LEGACY_ENVHUB_HEADER_PREFIX)) {
|
|
20
|
+
lines.shift();
|
|
21
|
+
if (lines[0] === "") {
|
|
22
|
+
lines.shift();
|
|
23
|
+
}
|
|
24
|
+
return lines.join("\n");
|
|
25
|
+
}
|
|
26
|
+
return content;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Add (or replace) the envhub local header at the top of .env content.
|
|
30
|
+
*/
|
|
31
|
+
export function addEnvhubHeader(secretName, content) {
|
|
32
|
+
const withoutHeader = stripEnvhubHeader(content).replace(/^\n+/, "");
|
|
33
|
+
return `${ENVHUB_MANAGED_LINE}\n${ENVHUB_ENV_LINE_PREFIX}${secretName}\n\n${withoutHeader}`;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=envhub-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envhub-header.js","sourceRoot":"","sources":["../../src/utils/envhub-header.ts"],"names":[],"mappings":"AAAA,MAAM,2BAA2B,GAAG,mBAAmB,CAAC;AACxD,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AACzD,MAAM,sBAAsB,GAAG,iBAAiB,CAAC;AAEjD;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAElC,IACE,SAAS,KAAK,mBAAmB;QACjC,UAAU,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAC7C,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YACpB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,UAAkB,EAAE,OAAe;IACjE,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,GAAG,mBAAmB,KAAK,sBAAsB,GAAG,UAAU,OAAO,aAAa,EAAE,CAAC;AAC9F,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "envhub-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Securely share .env files between developers using cloud providers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -23,6 +23,17 @@
|
|
|
23
23
|
"secrets",
|
|
24
24
|
"dotenv",
|
|
25
25
|
"aws",
|
|
26
|
+
"azure",
|
|
27
|
+
"gcp",
|
|
28
|
+
"version-control",
|
|
29
|
+
"interactive-setup",
|
|
30
|
+
"cloud-provider",
|
|
31
|
+
"env-management",
|
|
32
|
+
"env-sharing",
|
|
33
|
+
"env-sync",
|
|
34
|
+
"env-syncing",
|
|
35
|
+
"env-syncing-cli",
|
|
36
|
+
"env-syncing-cli-tool",
|
|
26
37
|
"secrets-manager",
|
|
27
38
|
"cli",
|
|
28
39
|
"developer-tools"
|
|
@@ -31,11 +42,22 @@
|
|
|
31
42
|
"name": "Kemal Can Yaprak",
|
|
32
43
|
"email": "kemalcan.yaprak1@gmail.com"
|
|
33
44
|
},
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/caanyp24/envhub-cli.git"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/caanyp24/envhub-cli#readme",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/caanyp24/envhub-cli/issues"
|
|
52
|
+
},
|
|
34
53
|
"license": "MIT",
|
|
35
54
|
"dependencies": {
|
|
36
55
|
"@aws-sdk/client-iam": "^3.0.0",
|
|
37
56
|
"@aws-sdk/client-secrets-manager": "^3.0.0",
|
|
38
57
|
"@aws-sdk/credential-providers": "^3.0.0",
|
|
58
|
+
"@azure/identity": "^4.11.1",
|
|
59
|
+
"@azure/keyvault-secrets": "^4.10.0",
|
|
60
|
+
"@google-cloud/secret-manager": "^6.1.1",
|
|
39
61
|
"@inquirer/prompts": "^7.0.0",
|
|
40
62
|
"chalk": "^5.4.1",
|
|
41
63
|
"commander": "^13.0.0",
|