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.
- package/LICENSE +21 -0
- package/README.md +490 -0
- package/dist/bin/minienv-mcp.cjs +17 -0
- package/dist/bin/minienv.cjs +146 -0
- package/dist/cli/commands/delete.d.ts +22 -0
- package/dist/cli/commands/delete.d.ts.map +1 -0
- package/dist/cli/commands/delete.js +85 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/export.d.ts +21 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +126 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/get.d.ts +21 -0
- package/dist/cli/commands/get.d.ts.map +1 -0
- package/dist/cli/commands/get.js +62 -0
- package/dist/cli/commands/get.js.map +1 -0
- package/dist/cli/commands/init.d.ts +20 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +98 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/integrations/helm.d.ts +21 -0
- package/dist/cli/commands/integrations/helm.d.ts.map +1 -0
- package/dist/cli/commands/integrations/helm.js +113 -0
- package/dist/cli/commands/integrations/helm.js.map +1 -0
- package/dist/cli/commands/integrations/kubernetes.d.ts +25 -0
- package/dist/cli/commands/integrations/kubernetes.d.ts.map +1 -0
- package/dist/cli/commands/integrations/kubernetes.js +199 -0
- package/dist/cli/commands/integrations/kubernetes.js.map +1 -0
- package/dist/cli/commands/integrations/terraform.d.ts +25 -0
- package/dist/cli/commands/integrations/terraform.d.ts.map +1 -0
- package/dist/cli/commands/integrations/terraform.js +131 -0
- package/dist/cli/commands/integrations/terraform.js.map +1 -0
- package/dist/cli/commands/key.d.ts +19 -0
- package/dist/cli/commands/key.d.ts.map +1 -0
- package/dist/cli/commands/key.js +247 -0
- package/dist/cli/commands/key.js.map +1 -0
- package/dist/cli/commands/list.d.ts +21 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +94 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/pull.d.ts +22 -0
- package/dist/cli/commands/pull.d.ts.map +1 -0
- package/dist/cli/commands/pull.js +142 -0
- package/dist/cli/commands/pull.js.map +1 -0
- package/dist/cli/commands/push.d.ts +22 -0
- package/dist/cli/commands/push.d.ts.map +1 -0
- package/dist/cli/commands/push.js +181 -0
- package/dist/cli/commands/push.js.map +1 -0
- package/dist/cli/commands/services.d.ts +18 -0
- package/dist/cli/commands/services.d.ts.map +1 -0
- package/dist/cli/commands/services.js +92 -0
- package/dist/cli/commands/services.js.map +1 -0
- package/dist/cli/commands/set.d.ts +22 -0
- package/dist/cli/commands/set.d.ts.map +1 -0
- package/dist/cli/commands/set.js +93 -0
- package/dist/cli/commands/set.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +23 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +362 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +266 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/lib/create-client.d.ts +21 -0
- package/dist/cli/lib/create-client.d.ts.map +1 -0
- package/dist/cli/lib/create-client.js +68 -0
- package/dist/cli/lib/create-client.js.map +1 -0
- package/dist/cli/lib/hooks.d.ts +5 -0
- package/dist/cli/lib/hooks.d.ts.map +1 -0
- package/dist/cli/lib/hooks.js +17 -0
- package/dist/cli/lib/hooks.js.map +1 -0
- package/dist/cli/preload.d.ts +6 -0
- package/dist/cli/preload.d.ts.map +1 -0
- package/dist/cli/preload.js +7 -0
- package/dist/cli/preload.js.map +1 -0
- package/dist/client.d.ts +89 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +350 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/batch-runner.d.ts +39 -0
- package/dist/lib/batch-runner.d.ts.map +1 -0
- package/dist/lib/batch-runner.js +117 -0
- package/dist/lib/batch-runner.js.map +1 -0
- package/dist/lib/config-loader.d.ts +45 -0
- package/dist/lib/config-loader.d.ts.map +1 -0
- package/dist/lib/config-loader.js +357 -0
- package/dist/lib/config-loader.js.map +1 -0
- package/dist/lib/env-parser.d.ts +38 -0
- package/dist/lib/env-parser.d.ts.map +1 -0
- package/dist/lib/env-parser.js +281 -0
- package/dist/lib/env-parser.js.map +1 -0
- package/dist/lib/monorepo.d.ts +39 -0
- package/dist/lib/monorepo.d.ts.map +1 -0
- package/dist/lib/monorepo.js +181 -0
- package/dist/lib/monorepo.js.map +1 -0
- package/dist/lib/pattern-matcher.d.ts +5 -0
- package/dist/lib/pattern-matcher.d.ts.map +1 -0
- package/dist/lib/pattern-matcher.js +18 -0
- package/dist/lib/pattern-matcher.js.map +1 -0
- package/dist/lib/s3-key-loader.d.ts +33 -0
- package/dist/lib/s3-key-loader.d.ts.map +1 -0
- package/dist/lib/s3-key-loader.js +83 -0
- package/dist/lib/s3-key-loader.js.map +1 -0
- package/dist/lib/secret-patterns.d.ts +10 -0
- package/dist/lib/secret-patterns.d.ts.map +1 -0
- package/dist/lib/secret-patterns.js +27 -0
- package/dist/lib/secret-patterns.js.map +1 -0
- package/dist/load.d.ts +14 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +15 -0
- package/dist/load.js.map +1 -0
- package/dist/loader.d.ts +63 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +50 -0
- package/dist/loader.js.map +1 -0
- package/dist/mcp/index.d.ts +8 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +14 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/preload.d.ts +6 -0
- package/dist/mcp/preload.d.ts.map +1 -0
- package/dist/mcp/preload.js +7 -0
- package/dist/mcp/preload.js.map +1 -0
- package/dist/mcp/resources.d.ts +23 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +112 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/server.d.ts +16 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +81 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +20 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +405 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/types.d.ts +182 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- 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"}
|