envhub-cli 0.1.1

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 (78) hide show
  1. package/README.md +60 -0
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +92 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/cat.d.ts +6 -0
  7. package/dist/commands/cat.d.ts.map +1 -0
  8. package/dist/commands/cat.js +55 -0
  9. package/dist/commands/cat.js.map +1 -0
  10. package/dist/commands/delete.d.ts +10 -0
  11. package/dist/commands/delete.d.ts.map +1 -0
  12. package/dist/commands/delete.js +46 -0
  13. package/dist/commands/delete.js.map +1 -0
  14. package/dist/commands/grant.d.ts +6 -0
  15. package/dist/commands/grant.d.ts.map +1 -0
  16. package/dist/commands/grant.js +25 -0
  17. package/dist/commands/grant.js.map +1 -0
  18. package/dist/commands/init.d.ts +6 -0
  19. package/dist/commands/init.d.ts.map +1 -0
  20. package/dist/commands/init.js +275 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/list.d.ts +6 -0
  23. package/dist/commands/list.d.ts.map +1 -0
  24. package/dist/commands/list.js +46 -0
  25. package/dist/commands/list.js.map +1 -0
  26. package/dist/commands/pull.d.ts +6 -0
  27. package/dist/commands/pull.d.ts.map +1 -0
  28. package/dist/commands/pull.js +35 -0
  29. package/dist/commands/pull.js.map +1 -0
  30. package/dist/commands/push.d.ts +11 -0
  31. package/dist/commands/push.d.ts.map +1 -0
  32. package/dist/commands/push.js +126 -0
  33. package/dist/commands/push.js.map +1 -0
  34. package/dist/commands/revoke.d.ts +6 -0
  35. package/dist/commands/revoke.d.ts.map +1 -0
  36. package/dist/commands/revoke.js +25 -0
  37. package/dist/commands/revoke.js.map +1 -0
  38. package/dist/config/config.d.ts +52 -0
  39. package/dist/config/config.d.ts.map +1 -0
  40. package/dist/config/config.js +136 -0
  41. package/dist/config/config.js.map +1 -0
  42. package/dist/config/config.schema.d.ts +66 -0
  43. package/dist/config/config.schema.d.ts.map +1 -0
  44. package/dist/config/config.schema.js +33 -0
  45. package/dist/config/config.schema.js.map +1 -0
  46. package/dist/index.d.ts +3 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +14 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/providers/aws/aws-secrets.provider.d.ts +44 -0
  51. package/dist/providers/aws/aws-secrets.provider.d.ts.map +1 -0
  52. package/dist/providers/aws/aws-secrets.provider.js +306 -0
  53. package/dist/providers/aws/aws-secrets.provider.js.map +1 -0
  54. package/dist/providers/provider.factory.d.ts +24 -0
  55. package/dist/providers/provider.factory.d.ts.map +1 -0
  56. package/dist/providers/provider.factory.js +40 -0
  57. package/dist/providers/provider.factory.js.map +1 -0
  58. package/dist/providers/provider.interface.d.ts +96 -0
  59. package/dist/providers/provider.interface.d.ts.map +1 -0
  60. package/dist/providers/provider.interface.js +2 -0
  61. package/dist/providers/provider.interface.js.map +1 -0
  62. package/dist/utils/diff.d.ts +27 -0
  63. package/dist/utils/diff.d.ts.map +1 -0
  64. package/dist/utils/diff.js +105 -0
  65. package/dist/utils/diff.js.map +1 -0
  66. package/dist/utils/env-parser.d.ts +48 -0
  67. package/dist/utils/env-parser.d.ts.map +1 -0
  68. package/dist/utils/env-parser.js +84 -0
  69. package/dist/utils/env-parser.js.map +1 -0
  70. package/dist/utils/logger.d.ts +57 -0
  71. package/dist/utils/logger.d.ts.map +1 -0
  72. package/dist/utils/logger.js +82 -0
  73. package/dist/utils/logger.js.map +1 -0
  74. package/dist/versioning/version-control.d.ts +44 -0
  75. package/dist/versioning/version-control.d.ts.map +1 -0
  76. package/dist/versioning/version-control.js +81 -0
  77. package/dist/versioning/version-control.js.map +1 -0
  78. package/package.json +58 -0
@@ -0,0 +1,105 @@
1
+ import chalk from "chalk";
2
+ import { parseEnvContent } from "./env-parser.js";
3
+ /**
4
+ * Compare two .env contents and return the differences.
5
+ *
6
+ * @param localContent - The current local .env content
7
+ * @param remoteContent - The remote/new .env content
8
+ * @returns Array of changes detected
9
+ */
10
+ export function diffEnvContents(localContent, remoteContent) {
11
+ const local = parseEnvContent(localContent);
12
+ const remote = parseEnvContent(remoteContent);
13
+ const changes = [];
14
+ // Check for added and changed keys
15
+ for (const [key, remoteValue] of remote) {
16
+ const localValue = local.get(key);
17
+ if (localValue === undefined) {
18
+ changes.push({
19
+ key,
20
+ type: "added",
21
+ newValue: remoteValue,
22
+ });
23
+ }
24
+ else if (localValue !== remoteValue) {
25
+ changes.push({
26
+ key,
27
+ type: "changed",
28
+ oldValue: localValue,
29
+ newValue: remoteValue,
30
+ });
31
+ }
32
+ }
33
+ // Check for removed keys
34
+ for (const [key, localValue] of local) {
35
+ if (!remote.has(key)) {
36
+ changes.push({
37
+ key,
38
+ type: "removed",
39
+ oldValue: localValue,
40
+ });
41
+ }
42
+ }
43
+ return changes;
44
+ }
45
+ /**
46
+ * Format changes into a human-readable string for terminal display.
47
+ */
48
+ export function formatChanges(changes) {
49
+ if (changes.length === 0) {
50
+ return "No changes detected.";
51
+ }
52
+ const lines = [];
53
+ const added = changes.filter((c) => c.type === "added");
54
+ const removed = changes.filter((c) => c.type === "removed");
55
+ const changed = changes.filter((c) => c.type === "changed");
56
+ if (added.length > 0) {
57
+ lines.push(` 🟢 Added (${added.length}):`);
58
+ for (const c of added) {
59
+ lines.push(chalk.green(` + ${c.key}=${maskValue(c.newValue ?? "")}`));
60
+ }
61
+ }
62
+ if (removed.length > 0) {
63
+ lines.push(` 🔴 Removed (${removed.length}):`);
64
+ for (const c of removed) {
65
+ lines.push(chalk.red(` - ${c.key}`));
66
+ }
67
+ }
68
+ if (changed.length > 0) {
69
+ lines.push(` 🟡 Changed (${changed.length}):`);
70
+ for (const c of changed) {
71
+ lines.push(chalk.yellow(` ~ ${c.key}`));
72
+ }
73
+ }
74
+ return lines.join("\n");
75
+ }
76
+ /**
77
+ * Format changes into a compact one-line summary.
78
+ * Example: "3 added, 1 removed, 12 changed"
79
+ */
80
+ export function summarizeChanges(changes) {
81
+ if (changes.length === 0) {
82
+ return "no changes";
83
+ }
84
+ const added = changes.filter((c) => c.type === "added").length;
85
+ const removed = changes.filter((c) => c.type === "removed").length;
86
+ const changed = changes.filter((c) => c.type === "changed").length;
87
+ const parts = [];
88
+ if (added > 0)
89
+ parts.push(`${added} added`);
90
+ if (removed > 0)
91
+ parts.push(`${removed} removed`);
92
+ if (changed > 0)
93
+ parts.push(`${changed} changed`);
94
+ return parts.join(", ");
95
+ }
96
+ /**
97
+ * Mask a value for safe display (show first 3 chars, mask the rest).
98
+ */
99
+ function maskValue(value) {
100
+ if (value.length <= 3) {
101
+ return "***";
102
+ }
103
+ return value.substring(0, 3) + "***";
104
+ }
105
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/utils/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * A single key-value pair from an .env file.
3
+ */
4
+ export interface EnvEntry {
5
+ key: string;
6
+ value: string;
7
+ /** Original line (preserving comments, quotes, etc.) */
8
+ raw: string;
9
+ }
10
+ /**
11
+ * Parsed representation of an .env file.
12
+ */
13
+ export interface ParsedEnv {
14
+ /** Key-value entries */
15
+ entries: EnvEntry[];
16
+ /** Lines that are comments or blank (preserved for round-tripping) */
17
+ lines: string[];
18
+ }
19
+ /**
20
+ * Parse .env file content into structured entries.
21
+ * Handles comments, blank lines, quoted values, and multi-line values.
22
+ */
23
+ export declare function parseEnvContent(content: string): Map<string, string>;
24
+ /**
25
+ * Serialize a Map of key-value pairs back to .env format.
26
+ */
27
+ export declare function serializeEnv(entries: Map<string, string>): string;
28
+ /**
29
+ * Read and parse an .env file from disk.
30
+ */
31
+ export declare function readEnvFile(filePath: string): Promise<Map<string, string>>;
32
+ /**
33
+ * Read the raw content of an .env file.
34
+ */
35
+ export declare function readEnvFileRaw(filePath: string): Promise<string>;
36
+ /**
37
+ * Write an .env file to disk.
38
+ */
39
+ export declare function writeEnvFile(filePath: string, entries: Map<string, string>): Promise<void>;
40
+ /**
41
+ * Write raw content to an .env file.
42
+ */
43
+ export declare function writeEnvFileRaw(filePath: string, content: string): Promise<void>;
44
+ /**
45
+ * Check if a file exists.
46
+ */
47
+ export declare function fileExists(filePath: string): Promise<boolean>;
48
+ //# sourceMappingURL=env-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-parser.d.ts","sourceRoot":"","sources":["../../src/utils/env-parser.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,wBAAwB;IACxB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,sEAAsE;IACtE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoCpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAWjE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAGhF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEtE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE"}
@@ -0,0 +1,84 @@
1
+ import * as fs from "node:fs/promises";
2
+ /**
3
+ * Parse .env file content into structured entries.
4
+ * Handles comments, blank lines, quoted values, and multi-line values.
5
+ */
6
+ export function parseEnvContent(content) {
7
+ const result = new Map();
8
+ const lines = content.split("\n");
9
+ for (const line of lines) {
10
+ const trimmed = line.trim();
11
+ // Skip empty lines and comments
12
+ if (!trimmed || trimmed.startsWith("#")) {
13
+ continue;
14
+ }
15
+ // Find the first = sign
16
+ const eqIndex = trimmed.indexOf("=");
17
+ if (eqIndex === -1) {
18
+ continue;
19
+ }
20
+ const key = trimmed.substring(0, eqIndex).trim();
21
+ let value = trimmed.substring(eqIndex + 1).trim();
22
+ // Remove surrounding quotes if present
23
+ if ((value.startsWith('"') && value.endsWith('"')) ||
24
+ (value.startsWith("'") && value.endsWith("'"))) {
25
+ value = value.slice(1, -1);
26
+ }
27
+ if (key) {
28
+ result.set(key, value);
29
+ }
30
+ }
31
+ return result;
32
+ }
33
+ /**
34
+ * Serialize a Map of key-value pairs back to .env format.
35
+ */
36
+ export function serializeEnv(entries) {
37
+ const lines = [];
38
+ for (const [key, value] of entries) {
39
+ // Quote values that contain spaces, #, or special characters
40
+ const needsQuoting = /[\s#"'\\]/.test(value) || value === "";
41
+ const formattedValue = needsQuoting ? `"${value}"` : value;
42
+ lines.push(`${key}=${formattedValue}`);
43
+ }
44
+ return lines.join("\n") + "\n";
45
+ }
46
+ /**
47
+ * Read and parse an .env file from disk.
48
+ */
49
+ export async function readEnvFile(filePath) {
50
+ const content = await fs.readFile(filePath, "utf-8");
51
+ return parseEnvContent(content);
52
+ }
53
+ /**
54
+ * Read the raw content of an .env file.
55
+ */
56
+ export async function readEnvFileRaw(filePath) {
57
+ return fs.readFile(filePath, "utf-8");
58
+ }
59
+ /**
60
+ * Write an .env file to disk.
61
+ */
62
+ export async function writeEnvFile(filePath, entries) {
63
+ const content = serializeEnv(entries);
64
+ await fs.writeFile(filePath, content, "utf-8");
65
+ }
66
+ /**
67
+ * Write raw content to an .env file.
68
+ */
69
+ export async function writeEnvFileRaw(filePath, content) {
70
+ await fs.writeFile(filePath, content, "utf-8");
71
+ }
72
+ /**
73
+ * Check if a file exists.
74
+ */
75
+ export async function fileExists(filePath) {
76
+ try {
77
+ await fs.access(filePath);
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ //# sourceMappingURL=env-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-parser.js","sourceRoot":"","sources":["../../src/utils/env-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAsBvC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,gCAAgC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,wBAAwB;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAElD,uCAAuC;QACvC,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAA4B;IACvD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,6DAA6D;QAC7D,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC7D,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrD,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,OAA4B;IAE5B,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,OAAe;IAEf,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { type Ora } from "ora";
2
+ /**
3
+ * Centralized logger for consistent CLI output formatting.
4
+ */
5
+ export declare const logger: {
6
+ /**
7
+ * Print a success message with a green checkmark.
8
+ */
9
+ success(message: string): void;
10
+ /**
11
+ * Print an error message with a red cross.
12
+ */
13
+ error(message: string): void;
14
+ /**
15
+ * Print a warning message with a yellow exclamation mark.
16
+ */
17
+ warn(message: string): void;
18
+ /**
19
+ * Print an informational message.
20
+ */
21
+ info(message: string): void;
22
+ /**
23
+ * Print a plain message without any prefix.
24
+ */
25
+ log(message: string): void;
26
+ /**
27
+ * Print a dimmed/subtle message.
28
+ */
29
+ dim(message: string): void;
30
+ /**
31
+ * Print a key-value pair with formatting.
32
+ */
33
+ keyValue(key: string, value: string): void;
34
+ /**
35
+ * Print a blank line.
36
+ */
37
+ newline(): void;
38
+ /**
39
+ * Create and start a spinner for async operations.
40
+ */
41
+ spinner(text: string): Ora;
42
+ /**
43
+ * Print a table header.
44
+ */
45
+ tableHeader(...columns: {
46
+ label: string;
47
+ width: number;
48
+ }[]): void;
49
+ /**
50
+ * Print a table row.
51
+ */
52
+ tableRow(...cells: {
53
+ value: string;
54
+ width: number;
55
+ }[]): void;
56
+ };
57
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB;;OAEG;qBACc,MAAM,GAAG,IAAI;IAI9B;;OAEG;mBACY,MAAM,GAAG,IAAI;IAI5B;;OAEG;kBACW,MAAM,GAAG,IAAI;IAI3B;;OAEG;kBACW,MAAM,GAAG,IAAI;IAI3B;;OAEG;iBACU,MAAM,GAAG,IAAI;IAI1B;;OAEG;iBACU,MAAM,GAAG,IAAI;IAI1B;;OAEG;kBACW,MAAM,SAAS,MAAM,GAAG,IAAI;IAI1C;;OAEG;eACQ,IAAI;IAIf;;OAEG;kBACW,MAAM,GAAG,GAAG;IAO1B;;OAEG;4BACqB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI;IAQjE;;OAEG;uBACgB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI;CAI7D,CAAC"}
@@ -0,0 +1,82 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ /**
4
+ * Centralized logger for consistent CLI output formatting.
5
+ */
6
+ export const logger = {
7
+ /**
8
+ * Print a success message with a green checkmark.
9
+ */
10
+ success(message) {
11
+ console.log(chalk.green("✔") + " " + message);
12
+ },
13
+ /**
14
+ * Print an error message with a red cross.
15
+ */
16
+ error(message) {
17
+ console.error(chalk.red("✖") + " " + chalk.red(message));
18
+ },
19
+ /**
20
+ * Print a warning message with a yellow exclamation mark.
21
+ */
22
+ warn(message) {
23
+ console.warn(chalk.yellow("⚠") + " " + chalk.yellow(message));
24
+ },
25
+ /**
26
+ * Print an informational message.
27
+ */
28
+ info(message) {
29
+ console.log(chalk.blue("ℹ") + " " + message);
30
+ },
31
+ /**
32
+ * Print a plain message without any prefix.
33
+ */
34
+ log(message) {
35
+ console.log(message);
36
+ },
37
+ /**
38
+ * Print a dimmed/subtle message.
39
+ */
40
+ dim(message) {
41
+ console.log(chalk.dim(message));
42
+ },
43
+ /**
44
+ * Print a key-value pair with formatting.
45
+ */
46
+ keyValue(key, value) {
47
+ console.log(` ${chalk.bold(key)}: ${value}`);
48
+ },
49
+ /**
50
+ * Print a blank line.
51
+ */
52
+ newline() {
53
+ console.log();
54
+ },
55
+ /**
56
+ * Create and start a spinner for async operations.
57
+ */
58
+ spinner(text) {
59
+ return ora({
60
+ text,
61
+ color: "cyan",
62
+ }).start();
63
+ },
64
+ /**
65
+ * Print a table header.
66
+ */
67
+ tableHeader(...columns) {
68
+ const header = columns
69
+ .map((col) => chalk.bold(col.label.padEnd(col.width)))
70
+ .join(" ");
71
+ console.log(header);
72
+ console.log(chalk.dim("─".repeat(header.length)));
73
+ },
74
+ /**
75
+ * Print a table row.
76
+ */
77
+ tableRow(...cells) {
78
+ const row = cells.map((cell) => cell.value.padEnd(cell.width)).join(" ");
79
+ console.log(row);
80
+ },
81
+ };
82
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;OAEG;IACH,OAAO,CAAC,OAAe;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,OAAe;QAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe;QACjB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,OAAe;QACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAW,EAAE,KAAa;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAY;QAClB,OAAO,GAAG,CAAC;YACT,IAAI;YACJ,KAAK,EAAE,MAAM;SACd,CAAC,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,GAAG,OAA2C;QACxD,MAAM,MAAM,GAAG,OAAO;aACnB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;aACrD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAG,KAAyC;QACnD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;CACF,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { ConfigManager } from "../config/config.js";
2
+ import type { SecretProvider } from "../providers/provider.interface.js";
3
+ /**
4
+ * Result of a version check before a push operation.
5
+ */
6
+ export interface VersionCheckResult {
7
+ /** Whether it's safe to push */
8
+ canPush: boolean;
9
+ /** The current local version */
10
+ localVersion: number;
11
+ /** The current remote version */
12
+ remoteVersion: number;
13
+ /** Human-readable reason if push is not safe */
14
+ reason?: string;
15
+ }
16
+ /**
17
+ * Manages version tracking and conflict detection for secrets.
18
+ *
19
+ * Workflow:
20
+ * - Before push: check if local version matches remote (conflict detection)
21
+ * - After push: update local version in .envhubrc.json
22
+ * - After pull: update local version in .envhubrc.json
23
+ */
24
+ export declare class VersionControl {
25
+ private configManager;
26
+ private provider;
27
+ constructor(configManager: ConfigManager, provider: SecretProvider);
28
+ /**
29
+ * Check if a push is safe by comparing local and remote versions.
30
+ *
31
+ * Returns a conflict if the remote version is ahead of the local version,
32
+ * meaning someone else has pushed a newer version.
33
+ */
34
+ checkBeforePush(secretName: string): Promise<VersionCheckResult>;
35
+ /**
36
+ * Update the local version tracking after a successful push.
37
+ */
38
+ recordPush(secretName: string, newVersion: number, file: string): Promise<void>;
39
+ /**
40
+ * Update the local version tracking after a successful pull.
41
+ */
42
+ recordPull(secretName: string, version: number, file: string): Promise<void>;
43
+ }
44
+ //# sourceMappingURL=version-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-control.d.ts","sourceRoot":"","sources":["../../src/versioning/version-control.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,QAAQ;gBADR,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,cAAc;IAGlC;;;;;OAKG;IACG,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA4CtE;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrF;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOnF"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Manages version tracking and conflict detection for secrets.
3
+ *
4
+ * Workflow:
5
+ * - Before push: check if local version matches remote (conflict detection)
6
+ * - After push: update local version in .envhubrc.json
7
+ * - After pull: update local version in .envhubrc.json
8
+ */
9
+ export class VersionControl {
10
+ configManager;
11
+ provider;
12
+ constructor(configManager, provider) {
13
+ this.configManager = configManager;
14
+ this.provider = provider;
15
+ }
16
+ /**
17
+ * Check if a push is safe by comparing local and remote versions.
18
+ *
19
+ * Returns a conflict if the remote version is ahead of the local version,
20
+ * meaning someone else has pushed a newer version.
21
+ */
22
+ async checkBeforePush(secretName) {
23
+ const localVersion = this.configManager.getTrackedVersion(secretName);
24
+ let remoteVersion;
25
+ try {
26
+ remoteVersion = await this.provider.getVersion(secretName);
27
+ }
28
+ catch {
29
+ // Secret doesn't exist yet, safe to push
30
+ return {
31
+ canPush: true,
32
+ localVersion,
33
+ remoteVersion: 0,
34
+ };
35
+ }
36
+ // If remote version is 0, the secret doesn't exist yet
37
+ if (remoteVersion === 0) {
38
+ return {
39
+ canPush: true,
40
+ localVersion,
41
+ remoteVersion: 0,
42
+ };
43
+ }
44
+ // If local version matches remote, safe to push
45
+ if (localVersion >= remoteVersion) {
46
+ return {
47
+ canPush: true,
48
+ localVersion,
49
+ remoteVersion,
50
+ };
51
+ }
52
+ // Remote is ahead – conflict detected
53
+ return {
54
+ canPush: false,
55
+ localVersion,
56
+ remoteVersion,
57
+ reason: `Remote version (${remoteVersion}) is newer than your local version (${localVersion}). ` +
58
+ `Run 'envhub pull' first to get the latest changes, or use --force to overwrite.`,
59
+ };
60
+ }
61
+ /**
62
+ * Update the local version tracking after a successful push.
63
+ */
64
+ async recordPush(secretName, newVersion, file) {
65
+ await this.configManager.updateSecret(secretName, {
66
+ version: newVersion,
67
+ file,
68
+ });
69
+ }
70
+ /**
71
+ * Update the local version tracking after a successful pull.
72
+ */
73
+ async recordPull(secretName, version, file) {
74
+ await this.configManager.updateSecret(secretName, {
75
+ version,
76
+ file,
77
+ lastPulled: new Date().toISOString(),
78
+ });
79
+ }
80
+ }
81
+ //# sourceMappingURL=version-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-control.js","sourceRoot":"","sources":["../../src/versioning/version-control.ts"],"names":[],"mappings":"AAiBA;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IAEf;IACA;IAFV,YACU,aAA4B,EAC5B,QAAwB;QADxB,kBAAa,GAAb,aAAa,CAAe;QAC5B,aAAQ,GAAR,QAAQ,CAAgB;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,UAAkB;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACtE,IAAI,aAAqB,CAAC;QAE1B,IAAI,CAAC;YACH,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;YACzC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY;gBACZ,aAAa,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;QAED,uDAAuD;QACvD,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY;gBACZ,aAAa,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;QAED,gDAAgD;QAChD,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,YAAY;gBACZ,aAAa;aACd,CAAC;QACJ,CAAC;QAED,sCAAsC;QACtC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,YAAY;YACZ,aAAa;YACb,MAAM,EACJ,mBAAmB,aAAa,uCAAuC,YAAY,KAAK;gBACxF,iFAAiF;SACpF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,UAAkB,EAAE,IAAY;QACnE,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,EAAE;YAChD,OAAO,EAAE,UAAU;YACnB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,UAAkB,EAAE,OAAe,EAAE,IAAY;QAChE,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,EAAE;YAChD,OAAO;YACP,IAAI;YACJ,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "envhub-cli",
3
+ "version": "0.1.1",
4
+ "description": "Securely share .env files between developers using cloud providers",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "envhub": "dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/index.js",
15
+ "lint": "eslint .",
16
+ "test": "vitest run",
17
+ "test:watch": "vitest",
18
+ "test:coverage": "vitest run --coverage",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "env",
23
+ "secrets",
24
+ "dotenv",
25
+ "aws",
26
+ "secrets-manager",
27
+ "cli",
28
+ "developer-tools"
29
+ ],
30
+ "author": {
31
+ "name": "Kemal Can Yaprak",
32
+ "email": "kemalcan.yaprak1@gmail.com"
33
+ },
34
+ "license": "MIT",
35
+ "dependencies": {
36
+ "@aws-sdk/client-iam": "^3.0.0",
37
+ "@aws-sdk/client-secrets-manager": "^3.0.0",
38
+ "@aws-sdk/credential-providers": "^3.0.0",
39
+ "@inquirer/prompts": "^7.0.0",
40
+ "chalk": "^5.4.1",
41
+ "commander": "^13.0.0",
42
+ "cosmiconfig": "^9.0.0",
43
+ "ora": "^8.2.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.0.0",
47
+ "eslint": "^9.21.0",
48
+ "typescript": "^5.7.0",
49
+ "typescript-eslint": "^8.25.0",
50
+ "vitest": "^4.0.18"
51
+ },
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ },
55
+ "files": [
56
+ "dist"
57
+ ]
58
+ }