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.
Files changed (41) hide show
  1. package/README.md +5 -5
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +4 -1
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +72 -2
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/pull.d.ts.map +1 -1
  9. package/dist/commands/pull.js +3 -1
  10. package/dist/commands/pull.js.map +1 -1
  11. package/dist/commands/push.d.ts.map +1 -1
  12. package/dist/commands/push.js +3 -2
  13. package/dist/commands/push.js.map +1 -1
  14. package/dist/commands/tui.d.ts +6 -0
  15. package/dist/commands/tui.d.ts.map +1 -0
  16. package/dist/commands/tui.js +30 -0
  17. package/dist/commands/tui.js.map +1 -0
  18. package/dist/config/config.schema.d.ts +2 -2
  19. package/dist/config/config.schema.d.ts.map +1 -1
  20. package/dist/config/config.schema.js +27 -0
  21. package/dist/config/config.schema.js.map +1 -1
  22. package/dist/providers/azure/azure-key-vault.provider.d.ts +27 -0
  23. package/dist/providers/azure/azure-key-vault.provider.d.ts.map +1 -0
  24. package/dist/providers/azure/azure-key-vault.provider.js +190 -0
  25. package/dist/providers/azure/azure-key-vault.provider.js.map +1 -0
  26. package/dist/providers/gcp/gcp-secret-manager.provider.d.ts +26 -0
  27. package/dist/providers/gcp/gcp-secret-manager.provider.d.ts.map +1 -0
  28. package/dist/providers/gcp/gcp-secret-manager.provider.js +199 -0
  29. package/dist/providers/gcp/gcp-secret-manager.provider.js.map +1 -0
  30. package/dist/providers/provider.factory.d.ts.map +1 -1
  31. package/dist/providers/provider.factory.js +12 -4
  32. package/dist/providers/provider.factory.js.map +1 -1
  33. package/dist/tui/app.d.ts +12 -0
  34. package/dist/tui/app.d.ts.map +1 -0
  35. package/dist/tui/app.js +220 -0
  36. package/dist/tui/app.js.map +1 -0
  37. package/dist/utils/envhub-header.d.ts +9 -0
  38. package/dist/utils/envhub-header.d.ts.map +1 -0
  39. package/dist/utils/envhub-header.js +35 -0
  40. package/dist/utils/envhub-header.js.map +1 -0
  41. package/package.json +23 -1
@@ -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.1.2",
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",