vaulter 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.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +490 -0
  3. package/dist/bin/minienv-mcp.cjs +17 -0
  4. package/dist/bin/minienv.cjs +146 -0
  5. package/dist/cli/commands/delete.d.ts +22 -0
  6. package/dist/cli/commands/delete.d.ts.map +1 -0
  7. package/dist/cli/commands/delete.js +85 -0
  8. package/dist/cli/commands/delete.js.map +1 -0
  9. package/dist/cli/commands/export.d.ts +21 -0
  10. package/dist/cli/commands/export.d.ts.map +1 -0
  11. package/dist/cli/commands/export.js +126 -0
  12. package/dist/cli/commands/export.js.map +1 -0
  13. package/dist/cli/commands/get.d.ts +21 -0
  14. package/dist/cli/commands/get.d.ts.map +1 -0
  15. package/dist/cli/commands/get.js +62 -0
  16. package/dist/cli/commands/get.js.map +1 -0
  17. package/dist/cli/commands/init.d.ts +20 -0
  18. package/dist/cli/commands/init.d.ts.map +1 -0
  19. package/dist/cli/commands/init.js +98 -0
  20. package/dist/cli/commands/init.js.map +1 -0
  21. package/dist/cli/commands/integrations/helm.d.ts +21 -0
  22. package/dist/cli/commands/integrations/helm.d.ts.map +1 -0
  23. package/dist/cli/commands/integrations/helm.js +113 -0
  24. package/dist/cli/commands/integrations/helm.js.map +1 -0
  25. package/dist/cli/commands/integrations/kubernetes.d.ts +25 -0
  26. package/dist/cli/commands/integrations/kubernetes.d.ts.map +1 -0
  27. package/dist/cli/commands/integrations/kubernetes.js +199 -0
  28. package/dist/cli/commands/integrations/kubernetes.js.map +1 -0
  29. package/dist/cli/commands/integrations/terraform.d.ts +25 -0
  30. package/dist/cli/commands/integrations/terraform.d.ts.map +1 -0
  31. package/dist/cli/commands/integrations/terraform.js +131 -0
  32. package/dist/cli/commands/integrations/terraform.js.map +1 -0
  33. package/dist/cli/commands/key.d.ts +19 -0
  34. package/dist/cli/commands/key.d.ts.map +1 -0
  35. package/dist/cli/commands/key.js +247 -0
  36. package/dist/cli/commands/key.js.map +1 -0
  37. package/dist/cli/commands/list.d.ts +21 -0
  38. package/dist/cli/commands/list.d.ts.map +1 -0
  39. package/dist/cli/commands/list.js +94 -0
  40. package/dist/cli/commands/list.js.map +1 -0
  41. package/dist/cli/commands/pull.d.ts +22 -0
  42. package/dist/cli/commands/pull.d.ts.map +1 -0
  43. package/dist/cli/commands/pull.js +142 -0
  44. package/dist/cli/commands/pull.js.map +1 -0
  45. package/dist/cli/commands/push.d.ts +22 -0
  46. package/dist/cli/commands/push.d.ts.map +1 -0
  47. package/dist/cli/commands/push.js +181 -0
  48. package/dist/cli/commands/push.js.map +1 -0
  49. package/dist/cli/commands/services.d.ts +18 -0
  50. package/dist/cli/commands/services.d.ts.map +1 -0
  51. package/dist/cli/commands/services.js +92 -0
  52. package/dist/cli/commands/services.js.map +1 -0
  53. package/dist/cli/commands/set.d.ts +22 -0
  54. package/dist/cli/commands/set.d.ts.map +1 -0
  55. package/dist/cli/commands/set.js +93 -0
  56. package/dist/cli/commands/set.js.map +1 -0
  57. package/dist/cli/commands/sync.d.ts +23 -0
  58. package/dist/cli/commands/sync.d.ts.map +1 -0
  59. package/dist/cli/commands/sync.js +362 -0
  60. package/dist/cli/commands/sync.js.map +1 -0
  61. package/dist/cli/index.d.ts +7 -0
  62. package/dist/cli/index.d.ts.map +1 -0
  63. package/dist/cli/index.js +266 -0
  64. package/dist/cli/index.js.map +1 -0
  65. package/dist/cli/lib/create-client.d.ts +21 -0
  66. package/dist/cli/lib/create-client.d.ts.map +1 -0
  67. package/dist/cli/lib/create-client.js +68 -0
  68. package/dist/cli/lib/create-client.js.map +1 -0
  69. package/dist/cli/lib/hooks.d.ts +5 -0
  70. package/dist/cli/lib/hooks.d.ts.map +1 -0
  71. package/dist/cli/lib/hooks.js +17 -0
  72. package/dist/cli/lib/hooks.js.map +1 -0
  73. package/dist/cli/preload.d.ts +6 -0
  74. package/dist/cli/preload.d.ts.map +1 -0
  75. package/dist/cli/preload.js +7 -0
  76. package/dist/cli/preload.js.map +1 -0
  77. package/dist/client.d.ts +89 -0
  78. package/dist/client.d.ts.map +1 -0
  79. package/dist/client.js +350 -0
  80. package/dist/client.js.map +1 -0
  81. package/dist/index.d.ts +20 -0
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +33 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/lib/batch-runner.d.ts +39 -0
  86. package/dist/lib/batch-runner.d.ts.map +1 -0
  87. package/dist/lib/batch-runner.js +117 -0
  88. package/dist/lib/batch-runner.js.map +1 -0
  89. package/dist/lib/config-loader.d.ts +45 -0
  90. package/dist/lib/config-loader.d.ts.map +1 -0
  91. package/dist/lib/config-loader.js +357 -0
  92. package/dist/lib/config-loader.js.map +1 -0
  93. package/dist/lib/env-parser.d.ts +38 -0
  94. package/dist/lib/env-parser.d.ts.map +1 -0
  95. package/dist/lib/env-parser.js +281 -0
  96. package/dist/lib/env-parser.js.map +1 -0
  97. package/dist/lib/monorepo.d.ts +39 -0
  98. package/dist/lib/monorepo.d.ts.map +1 -0
  99. package/dist/lib/monorepo.js +181 -0
  100. package/dist/lib/monorepo.js.map +1 -0
  101. package/dist/lib/pattern-matcher.d.ts +5 -0
  102. package/dist/lib/pattern-matcher.d.ts.map +1 -0
  103. package/dist/lib/pattern-matcher.js +18 -0
  104. package/dist/lib/pattern-matcher.js.map +1 -0
  105. package/dist/lib/s3-key-loader.d.ts +33 -0
  106. package/dist/lib/s3-key-loader.d.ts.map +1 -0
  107. package/dist/lib/s3-key-loader.js +83 -0
  108. package/dist/lib/s3-key-loader.js.map +1 -0
  109. package/dist/lib/secret-patterns.d.ts +10 -0
  110. package/dist/lib/secret-patterns.d.ts.map +1 -0
  111. package/dist/lib/secret-patterns.js +27 -0
  112. package/dist/lib/secret-patterns.js.map +1 -0
  113. package/dist/load.d.ts +14 -0
  114. package/dist/load.d.ts.map +1 -0
  115. package/dist/load.js +15 -0
  116. package/dist/load.js.map +1 -0
  117. package/dist/loader.d.ts +63 -0
  118. package/dist/loader.d.ts.map +1 -0
  119. package/dist/loader.js +50 -0
  120. package/dist/loader.js.map +1 -0
  121. package/dist/mcp/index.d.ts +8 -0
  122. package/dist/mcp/index.d.ts.map +1 -0
  123. package/dist/mcp/index.js +14 -0
  124. package/dist/mcp/index.js.map +1 -0
  125. package/dist/mcp/preload.d.ts +6 -0
  126. package/dist/mcp/preload.d.ts.map +1 -0
  127. package/dist/mcp/preload.js +7 -0
  128. package/dist/mcp/preload.js.map +1 -0
  129. package/dist/mcp/resources.d.ts +23 -0
  130. package/dist/mcp/resources.d.ts.map +1 -0
  131. package/dist/mcp/resources.js +112 -0
  132. package/dist/mcp/resources.js.map +1 -0
  133. package/dist/mcp/server.d.ts +16 -0
  134. package/dist/mcp/server.d.ts.map +1 -0
  135. package/dist/mcp/server.js +81 -0
  136. package/dist/mcp/server.js.map +1 -0
  137. package/dist/mcp/tools.d.ts +20 -0
  138. package/dist/mcp/tools.d.ts.map +1 -0
  139. package/dist/mcp/tools.js +405 -0
  140. package/dist/mcp/tools.js.map +1 -0
  141. package/dist/types.d.ts +182 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +37 -0
  144. package/dist/types.js.map +1 -0
  145. package/package.json +114 -0
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Vaulter - Multi-backend environment variable and secrets manager
3
+ *
4
+ * Main library exports for programmatic usage
5
+ */
6
+ // Client
7
+ export { VaulterClient, createClient } from './client.js';
8
+ export { ENVIRONMENTS, ENVIRONMENT_NAMES, EXPORT_FORMATS, DEFAULT_SECRET_PATTERNS } from './types.js';
9
+ // Config utilities
10
+ export { loadConfig, findConfigDir, getProjectName, configExists, loadEncryptionKey, createDefaultConfig } from './lib/config-loader.js';
11
+ /**
12
+ * Resolve backend URLs from config
13
+ * Supports both single `url` and multiple `urls` with fallback
14
+ */
15
+ export function resolveBackendUrls(config) {
16
+ if (!config.backend) {
17
+ return [];
18
+ }
19
+ // If urls array is provided, use it
20
+ if (config.backend.urls && config.backend.urls.length > 0) {
21
+ return config.backend.urls.filter(url => url && url.trim() !== '');
22
+ }
23
+ // Otherwise use single url
24
+ if (config.backend.url && config.backend.url.trim() !== '') {
25
+ return [config.backend.url];
26
+ }
27
+ return [];
28
+ }
29
+ // Env parser
30
+ export { parseEnvFile, parseEnvString, serializeEnv, hasStdinData, parseEnvFromStdin } from './lib/env-parser.js';
31
+ // Loader (dotenv integration)
32
+ export { loader, parse } from './loader.js';
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,SAAS;AACT,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAazD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAErG,mBAAmB;AACnB,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,wBAAwB,CAAA;AAK/B;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,oCAAoC;IACpC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACpE,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3D,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO,EAAE,CAAA;AACX,CAAC;AAED,aAAa;AACb,OAAO,EACL,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,iBAAiB,EAClB,MAAM,qBAAqB,CAAA;AAE5B,8BAA8B;AAC9B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Batch Runner
3
+ *
4
+ * Execute operations across multiple services in a monorepo
5
+ */
6
+ import type { ServiceInfo } from './monorepo.js';
7
+ import type { Environment } from '../types.js';
8
+ export interface BatchOperation<T> {
9
+ service: ServiceInfo;
10
+ environment: Environment;
11
+ result?: T;
12
+ error?: Error;
13
+ duration: number;
14
+ }
15
+ export interface BatchResult<T> {
16
+ total: number;
17
+ successful: number;
18
+ failed: number;
19
+ operations: BatchOperation<T>[];
20
+ }
21
+ export type OperationFn<T> = (service: ServiceInfo, environment: Environment) => Promise<T>;
22
+ /**
23
+ * Run an operation across multiple services
24
+ */
25
+ export declare function runBatch<T>(services: ServiceInfo[], environment: Environment, operation: OperationFn<T>, options?: {
26
+ concurrency?: number;
27
+ stopOnError?: boolean;
28
+ verbose?: boolean;
29
+ onProgress?: (completed: number, total: number, current: ServiceInfo) => void;
30
+ }): Promise<BatchResult<T>>;
31
+ /**
32
+ * Format batch result for display
33
+ */
34
+ export declare function formatBatchResult<T>(result: BatchResult<T>, formatItem?: (op: BatchOperation<T>) => string): string;
35
+ /**
36
+ * Format batch result as JSON
37
+ */
38
+ export declare function formatBatchResultJson<T>(result: BatchResult<T>): object;
39
+ //# sourceMappingURL=batch-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-runner.d.ts","sourceRoot":"","sources":["../../src/lib/batch-runner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,OAAO,EAAE,WAAW,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,CAAC,CAAA;IACV,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;CAChC;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAC3B,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,WAAW,KACrB,OAAO,CAAC,CAAC,CAAC,CAAA;AAEf;;GAEG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,WAAW,EAAE,EACvB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,EACzB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,CAAA;CACzE,GACL,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA6EzB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EACtB,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,MAAM,GAC7C,MAAM,CA4BR;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAevE"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Batch Runner
3
+ *
4
+ * Execute operations across multiple services in a monorepo
5
+ */
6
+ import pLimit from 'p-limit';
7
+ /**
8
+ * Run an operation across multiple services
9
+ */
10
+ export async function runBatch(services, environment, operation, options = {}) {
11
+ const { concurrency = 1, stopOnError = false, verbose = false, onProgress } = options;
12
+ const operations = [];
13
+ let successful = 0;
14
+ let failed = 0;
15
+ const runOperation = async (service, index) => {
16
+ if (onProgress) {
17
+ onProgress(index, services.length, service);
18
+ }
19
+ const startTime = Date.now();
20
+ try {
21
+ const result = await operation(service, environment);
22
+ const duration = Date.now() - startTime;
23
+ operations.push({
24
+ service,
25
+ environment,
26
+ result,
27
+ duration
28
+ });
29
+ successful++;
30
+ }
31
+ catch (err) {
32
+ const duration = Date.now() - startTime;
33
+ operations.push({
34
+ service,
35
+ environment,
36
+ error: err instanceof Error ? err : new Error(String(err)),
37
+ duration
38
+ });
39
+ failed++;
40
+ }
41
+ };
42
+ if (concurrency <= 1) {
43
+ for (let i = 0; i < services.length; i++) {
44
+ await runOperation(services[i], i);
45
+ if (stopOnError && failed > 0) {
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ else {
51
+ const limit = pLimit(concurrency);
52
+ let hasError = false;
53
+ await Promise.all(services.map((service, index) => limit(async () => {
54
+ if (stopOnError && hasError) {
55
+ return;
56
+ }
57
+ await runOperation(service, index);
58
+ if (stopOnError && failed > 0) {
59
+ hasError = true;
60
+ }
61
+ })));
62
+ }
63
+ return {
64
+ total: services.length,
65
+ successful,
66
+ failed,
67
+ operations
68
+ };
69
+ }
70
+ /**
71
+ * Format batch result for display
72
+ */
73
+ export function formatBatchResult(result, formatItem) {
74
+ const lines = [];
75
+ lines.push('');
76
+ lines.push(`Batch Operation Summary:`);
77
+ lines.push(` Total: ${result.total}`);
78
+ lines.push(` Successful: ${result.successful}`);
79
+ lines.push(` Failed: ${result.failed}`);
80
+ lines.push('');
81
+ if (result.failed > 0) {
82
+ lines.push('Failures:');
83
+ for (const op of result.operations) {
84
+ if (op.error) {
85
+ lines.push(` ✗ ${op.service.name}: ${op.error.message}`);
86
+ }
87
+ }
88
+ lines.push('');
89
+ }
90
+ if (formatItem) {
91
+ lines.push('Details:');
92
+ for (const op of result.operations) {
93
+ lines.push(` ${formatItem(op)}`);
94
+ }
95
+ }
96
+ return lines.join('\n');
97
+ }
98
+ /**
99
+ * Format batch result as JSON
100
+ */
101
+ export function formatBatchResultJson(result) {
102
+ return {
103
+ total: result.total,
104
+ successful: result.successful,
105
+ failed: result.failed,
106
+ operations: result.operations.map(op => ({
107
+ service: op.service.name,
108
+ path: op.service.path,
109
+ environment: op.environment,
110
+ success: !op.error,
111
+ error: op.error?.message,
112
+ duration: op.duration,
113
+ result: op.result
114
+ }))
115
+ };
116
+ }
117
+ //# sourceMappingURL=batch-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-runner.js","sourceRoot":"","sources":["../../src/lib/batch-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Vaulter Config Loader
3
+ *
4
+ * Loads and merges configuration from .vaulter/config.yaml files
5
+ * with support for inheritance via "extends" field.
6
+ */
7
+ import type { VaulterConfig, Environment } from '../types.js';
8
+ /**
9
+ * Default configuration
10
+ */
11
+ export declare const DEFAULT_CONFIG: VaulterConfig;
12
+ /**
13
+ * Find the .vaulter directory by searching up from the current directory
14
+ */
15
+ export declare function findConfigDir(startDir?: string): string | null;
16
+ /**
17
+ * Load configuration from the nearest .vaulter/config.yaml
18
+ * Also merges config.local.yaml if it exists (for secrets/overrides)
19
+ */
20
+ export declare function loadConfig(startDir?: string): VaulterConfig;
21
+ /**
22
+ * Get the project name from config or directory name
23
+ */
24
+ export declare function getProjectName(config: VaulterConfig, startDir?: string): string;
25
+ /**
26
+ * Get the environments directory path
27
+ */
28
+ export declare function getEnvironmentsDir(configDir: string): string;
29
+ /**
30
+ * Get the path to an environment file
31
+ */
32
+ export declare function getEnvFilePath(configDir: string, environment: Environment): string;
33
+ /**
34
+ * Check if a config directory exists
35
+ */
36
+ export declare function configExists(startDir?: string): boolean;
37
+ /**
38
+ * Get the encryption key from configured sources
39
+ */
40
+ export declare function loadEncryptionKey(config: VaulterConfig): Promise<string | null>;
41
+ /**
42
+ * Create a default config file
43
+ */
44
+ export declare function createDefaultConfig(configDir: string, project: string, options?: Partial<VaulterConfig>): void;
45
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../src/lib/config-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AA2D7D;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,aAuB5B,CAAA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAuB7E;AAyFD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAoB3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,MAAM,CAElF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkCrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,CAAC,aAAa,CAAM,GACnC,IAAI,CA+FN"}
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Vaulter Config Loader
3
+ *
4
+ * Loads and merges configuration from .vaulter/config.yaml files
5
+ * with support for inheritance via "extends" field.
6
+ */
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { parse as parseYaml } from 'yaml';
10
+ import { loadKeyFromS3 } from './s3-key-loader.js';
11
+ const CONFIG_DIR = '.vaulter';
12
+ const CONFIG_FILE = 'config.yaml';
13
+ const CONFIG_LOCAL_FILE = 'config.local.yaml';
14
+ const MAX_SEARCH_DEPTH = 5;
15
+ const MAX_EXTENDS_DEPTH = 10;
16
+ /**
17
+ * Expand environment variables in a string
18
+ * Supports: ${VAR}, ${VAR:-default}, $VAR
19
+ */
20
+ function expandEnvVars(str) {
21
+ if (typeof str !== 'string')
22
+ return str;
23
+ // Handle ${VAR:-default} syntax
24
+ str = str.replace(/\$\{([^}:]+):-([^}]*)\}/g, (_, varName, defaultValue) => {
25
+ return process.env[varName] || defaultValue;
26
+ });
27
+ // Handle ${VAR} syntax
28
+ str = str.replace(/\$\{([^}]+)\}/g, (_, varName) => {
29
+ return process.env[varName] || '';
30
+ });
31
+ // Handle $VAR syntax (word boundary)
32
+ str = str.replace(/\$([A-Z_][A-Z0-9_]*)/gi, (_, varName) => {
33
+ return process.env[varName] || '';
34
+ });
35
+ return str;
36
+ }
37
+ /**
38
+ * Recursively expand env vars in an object
39
+ */
40
+ function expandEnvVarsInObject(obj) {
41
+ if (obj === null || obj === undefined)
42
+ return obj;
43
+ if (typeof obj === 'string') {
44
+ return expandEnvVars(obj);
45
+ }
46
+ if (Array.isArray(obj)) {
47
+ return obj.map(item => expandEnvVarsInObject(item));
48
+ }
49
+ if (typeof obj === 'object') {
50
+ const result = {};
51
+ for (const [key, value] of Object.entries(obj)) {
52
+ result[key] = expandEnvVarsInObject(value);
53
+ }
54
+ return result;
55
+ }
56
+ return obj;
57
+ }
58
+ /**
59
+ * Default configuration
60
+ */
61
+ export const DEFAULT_CONFIG = {
62
+ version: '1',
63
+ project: '',
64
+ environments: ['dev', 'stg', 'prd', 'sbx', 'dr'],
65
+ default_environment: 'dev',
66
+ sync: {
67
+ conflict: 'local'
68
+ },
69
+ security: {
70
+ paranoid: false,
71
+ confirm_production: true,
72
+ auto_encrypt: {
73
+ patterns: [
74
+ '*_KEY',
75
+ '*_SECRET',
76
+ '*_TOKEN',
77
+ '*_PASSWORD',
78
+ '*_CREDENTIAL',
79
+ 'DATABASE_URL',
80
+ 'REDIS_URL'
81
+ ]
82
+ }
83
+ }
84
+ };
85
+ /**
86
+ * Find the .vaulter directory by searching up from the current directory
87
+ */
88
+ export function findConfigDir(startDir = process.cwd()) {
89
+ let currentDir = path.resolve(startDir);
90
+ let depth = 0;
91
+ while (depth < MAX_SEARCH_DEPTH) {
92
+ const configDir = path.join(currentDir, CONFIG_DIR);
93
+ const configFile = path.join(configDir, CONFIG_FILE);
94
+ if (fs.existsSync(configFile)) {
95
+ return configDir;
96
+ }
97
+ const parentDir = path.dirname(currentDir);
98
+ if (parentDir === currentDir) {
99
+ // Reached root
100
+ break;
101
+ }
102
+ currentDir = parentDir;
103
+ depth++;
104
+ }
105
+ return null;
106
+ }
107
+ /**
108
+ * Load a single config file
109
+ */
110
+ function loadConfigFile(configPath, required = true) {
111
+ if (!fs.existsSync(configPath)) {
112
+ if (required) {
113
+ throw new Error(`Config file not found: ${configPath}`);
114
+ }
115
+ return {};
116
+ }
117
+ const content = fs.readFileSync(configPath, 'utf-8');
118
+ const parsed = parseYaml(content);
119
+ // Expand environment variables in all string values
120
+ return expandEnvVarsInObject(parsed || {});
121
+ }
122
+ /**
123
+ * Deep merge two config objects
124
+ */
125
+ function deepMerge(target, source) {
126
+ const result = { ...target };
127
+ for (const key of Object.keys(source)) {
128
+ const sourceValue = source[key];
129
+ const targetValue = result[key];
130
+ if (sourceValue !== null &&
131
+ sourceValue !== undefined &&
132
+ typeof sourceValue === 'object' &&
133
+ !Array.isArray(sourceValue) &&
134
+ targetValue !== null &&
135
+ targetValue !== undefined &&
136
+ typeof targetValue === 'object' &&
137
+ !Array.isArray(targetValue)) {
138
+ // Deep merge objects
139
+ result[key] = deepMerge(targetValue, sourceValue);
140
+ }
141
+ else if (sourceValue !== undefined) {
142
+ // Override with source value
143
+ result[key] = sourceValue;
144
+ }
145
+ }
146
+ return result;
147
+ }
148
+ /**
149
+ * Load config with inheritance support
150
+ */
151
+ function loadConfigWithExtends(configPath, visited = new Set(), depth = 0) {
152
+ if (depth > MAX_EXTENDS_DEPTH) {
153
+ throw new Error(`Config inheritance depth exceeded (max ${MAX_EXTENDS_DEPTH})`);
154
+ }
155
+ const absolutePath = path.resolve(configPath);
156
+ if (visited.has(absolutePath)) {
157
+ throw new Error(`Circular config inheritance detected: ${absolutePath}`);
158
+ }
159
+ visited.add(absolutePath);
160
+ const config = loadConfigFile(absolutePath);
161
+ // Handle extends
162
+ if (config.extends) {
163
+ const extendsPath = path.resolve(path.dirname(absolutePath), config.extends);
164
+ const parentConfig = loadConfigWithExtends(extendsPath, visited, depth + 1);
165
+ // Remove extends from config before merging
166
+ const { extends: _, ...configWithoutExtends } = config;
167
+ // Merge: parent <- current
168
+ return deepMerge(parentConfig, configWithoutExtends);
169
+ }
170
+ // No extends, merge with defaults
171
+ return deepMerge(DEFAULT_CONFIG, config);
172
+ }
173
+ /**
174
+ * Load configuration from the nearest .vaulter/config.yaml
175
+ * Also merges config.local.yaml if it exists (for secrets/overrides)
176
+ */
177
+ export function loadConfig(startDir) {
178
+ const configDir = findConfigDir(startDir);
179
+ if (!configDir) {
180
+ // No config found, return defaults with empty project
181
+ return { ...DEFAULT_CONFIG };
182
+ }
183
+ const configPath = path.join(configDir, CONFIG_FILE);
184
+ let config = loadConfigWithExtends(configPath);
185
+ // Load and merge local config (for secrets that shouldn't be committed)
186
+ const localConfigPath = path.join(configDir, CONFIG_LOCAL_FILE);
187
+ const localConfig = loadConfigFile(localConfigPath, false);
188
+ if (Object.keys(localConfig).length > 0) {
189
+ config = deepMerge(config, localConfig);
190
+ }
191
+ return config;
192
+ }
193
+ /**
194
+ * Get the project name from config or directory name
195
+ */
196
+ export function getProjectName(config, startDir) {
197
+ if (config.project) {
198
+ return config.project;
199
+ }
200
+ // Fallback to directory name
201
+ const dir = startDir || process.cwd();
202
+ return path.basename(dir);
203
+ }
204
+ /**
205
+ * Get the environments directory path
206
+ */
207
+ export function getEnvironmentsDir(configDir) {
208
+ return path.join(configDir, 'environments');
209
+ }
210
+ /**
211
+ * Get the path to an environment file
212
+ */
213
+ export function getEnvFilePath(configDir, environment) {
214
+ return path.join(getEnvironmentsDir(configDir), `${environment}.env`);
215
+ }
216
+ /**
217
+ * Check if a config directory exists
218
+ */
219
+ export function configExists(startDir) {
220
+ return findConfigDir(startDir) !== null;
221
+ }
222
+ /**
223
+ * Get the encryption key from configured sources
224
+ */
225
+ export async function loadEncryptionKey(config) {
226
+ const keySources = config.encryption?.key_source || [];
227
+ for (const source of keySources) {
228
+ if ('env' in source) {
229
+ // Environment variable
230
+ const value = process.env[source.env];
231
+ if (value)
232
+ return value;
233
+ }
234
+ else if ('file' in source) {
235
+ // Local file
236
+ const filePath = path.resolve(source.file);
237
+ if (fs.existsSync(filePath)) {
238
+ return fs.readFileSync(filePath, 'utf-8').trim();
239
+ }
240
+ }
241
+ else if ('s3' in source) {
242
+ // S3 remote key
243
+ try {
244
+ const key = await loadKeyFromS3(source.s3);
245
+ if (key)
246
+ return key;
247
+ }
248
+ catch (err) {
249
+ // Log error but continue to next source
250
+ if (process.env.VAULTER_VERBOSE) {
251
+ console.warn(`Failed to load key from S3: ${err.message}`);
252
+ }
253
+ }
254
+ }
255
+ }
256
+ // Fallback to VAULTER_KEY environment variable
257
+ if (process.env.VAULTER_KEY) {
258
+ return process.env.VAULTER_KEY;
259
+ }
260
+ return null;
261
+ }
262
+ /**
263
+ * Create a default config file
264
+ */
265
+ export function createDefaultConfig(configDir, project, options = {}) {
266
+ const config = {
267
+ version: '1',
268
+ project,
269
+ ...options
270
+ };
271
+ // Ensure directory exists
272
+ if (!fs.existsSync(configDir)) {
273
+ fs.mkdirSync(configDir, { recursive: true });
274
+ }
275
+ // Create environments directory
276
+ const envDir = getEnvironmentsDir(configDir);
277
+ if (!fs.existsSync(envDir)) {
278
+ fs.mkdirSync(envDir, { recursive: true });
279
+ }
280
+ // Write config file
281
+ const configPath = path.join(configDir, CONFIG_FILE);
282
+ const yamlContent = `# Vaulter Configuration
283
+ # https://github.com/forattini-dev/vaulter
284
+
285
+ version: "1"
286
+
287
+ # Project identification
288
+ project: ${project}
289
+ # service: optional-service-name
290
+
291
+ # Backend configuration
292
+ # SECURITY: Use environment variables for credentials!
293
+ # Supports: \${VAR}, \${VAR:-default}, $VAR
294
+ backend:
295
+ # AWS S3 (uses AWS credential chain - no creds in URL)
296
+ # url: s3://bucket/envs?region=us-east-1
297
+
298
+ # AWS S3 with specific profile (from ~/.aws/credentials)
299
+ # url: s3://bucket/envs?region=us-east-1&profile=\${AWS_PROFILE:-default}
300
+
301
+ # S3 with explicit credentials from env vars
302
+ # url: s3://\${AWS_ACCESS_KEY_ID}:\${AWS_SECRET_ACCESS_KEY}@bucket/envs?region=us-east-1
303
+
304
+ # Or use a single env var for the whole URL
305
+ # url: \${VAULTER_BACKEND_URL}
306
+
307
+ # MinIO / S3-compatible
308
+ # url: http://\${MINIO_ACCESS_KEY}:\${MINIO_SECRET_KEY}@localhost:9000/envs
309
+
310
+ # Local filesystem (development)
311
+ url: file://${process.env.HOME}/.vaulter/store
312
+
313
+ # In-memory (testing)
314
+ # url: memory://test
315
+
316
+ # Encryption settings
317
+ encryption:
318
+ key_source:
319
+ - env: VAULTER_KEY # 1. Try environment variable first
320
+ - file: .vaulter/.key # 2. Then local file (gitignored)
321
+ # - s3: s3://secure-bucket/keys/vaulter.key # 3. Remote key
322
+
323
+ # Available environments
324
+ environments:
325
+ - dev
326
+ - stg
327
+ - prd
328
+ - sbx
329
+ - dr
330
+
331
+ # Default environment
332
+ default_environment: dev
333
+
334
+ # Sync behavior
335
+ sync:
336
+ conflict: local # local | remote | prompt | error
337
+
338
+ # Security settings
339
+ security:
340
+ confirm_production: true
341
+ auto_encrypt:
342
+ patterns:
343
+ - "*_KEY"
344
+ - "*_SECRET"
345
+ - "*_TOKEN"
346
+ - "*_PASSWORD"
347
+ - "DATABASE_URL"
348
+
349
+ # TIP: For credentials, create .vaulter/config.local.yaml (gitignored)
350
+ # and put sensitive overrides there:
351
+ #
352
+ # backend:
353
+ # url: s3://real-key:real-secret@bucket/envs
354
+ `;
355
+ fs.writeFileSync(configPath, yamlContent);
356
+ }
357
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../src/lib/config-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Vaulter - .env File Parser
3
+ *
4
+ * Robust parser for .env files with support for:
5
+ * - Single, double, and backtick quotes
6
+ * - Escape sequences in double quotes
7
+ * - Variable expansion (${VAR} and $VAR)
8
+ * - Multiline values
9
+ * - Comments
10
+ */
11
+ export interface ParsedEnv {
12
+ [key: string]: string;
13
+ }
14
+ export interface ParseOptions {
15
+ expand?: boolean;
16
+ env?: Record<string, string>;
17
+ }
18
+ /**
19
+ * Parse a .env file from path
20
+ */
21
+ export declare function parseEnvFile(filePath: string, options?: ParseOptions): ParsedEnv;
22
+ /**
23
+ * Parse a .env string
24
+ */
25
+ export declare function parseEnvString(content: string, options?: ParseOptions): ParsedEnv;
26
+ /**
27
+ * Serialize a ParsedEnv object to .env format
28
+ */
29
+ export declare function serializeEnv(env: ParsedEnv): string;
30
+ /**
31
+ * Read stdin as .env content
32
+ */
33
+ export declare function parseEnvFromStdin(options?: ParseOptions): Promise<ParsedEnv>;
34
+ /**
35
+ * Check if stdin has data (is piped)
36
+ */
37
+ export declare function hasStdinData(): boolean;
38
+ //# sourceMappingURL=env-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-parser.d.ts","sourceRoot":"","sources":["../../src/lib/env-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,SAAS,CAGpF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,SAAS,CA0DrF;AAsLD;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CA6BnD;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAkBtF;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC"}