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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter CLI - Init Command
|
|
3
|
+
*
|
|
4
|
+
* Initialize a new .vaulter configuration in the current directory
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'node:fs';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import { createDefaultConfig, configExists, findConfigDir } from '../../lib/config-loader.js';
|
|
9
|
+
/**
|
|
10
|
+
* Run the init command
|
|
11
|
+
*/
|
|
12
|
+
export async function runInit(context) {
|
|
13
|
+
const { args, verbose, dryRun, jsonOutput } = context;
|
|
14
|
+
// Check if already initialized
|
|
15
|
+
if (configExists()) {
|
|
16
|
+
const existingDir = findConfigDir();
|
|
17
|
+
if (!args.force) {
|
|
18
|
+
if (jsonOutput) {
|
|
19
|
+
console.log(JSON.stringify({ error: 'already_initialized', path: existingDir }));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.error(`Vaulter already initialized at ${existingDir}`);
|
|
23
|
+
console.error('Use --force to reinitialize');
|
|
24
|
+
}
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// Determine project name
|
|
29
|
+
const projectName = args.project || args.p || path.basename(process.cwd());
|
|
30
|
+
// Config directory path
|
|
31
|
+
const configDir = path.join(process.cwd(), '.vaulter');
|
|
32
|
+
if (verbose) {
|
|
33
|
+
console.log(`Initializing vaulter for project: ${projectName}`);
|
|
34
|
+
console.log(`Config directory: ${configDir}`);
|
|
35
|
+
}
|
|
36
|
+
if (dryRun) {
|
|
37
|
+
if (jsonOutput) {
|
|
38
|
+
console.log(JSON.stringify({
|
|
39
|
+
action: 'init',
|
|
40
|
+
project: projectName,
|
|
41
|
+
configDir,
|
|
42
|
+
dryRun: true
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log('Dry run - would create:');
|
|
47
|
+
console.log(` ${configDir}/config.yaml`);
|
|
48
|
+
console.log(` ${configDir}/environments/`);
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Create configuration
|
|
53
|
+
createDefaultConfig(configDir, projectName);
|
|
54
|
+
// Create .gitignore for sensitive files
|
|
55
|
+
const gitignorePath = path.join(configDir, '.gitignore');
|
|
56
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
57
|
+
fs.writeFileSync(gitignorePath, `# Vaulter sensitive files
|
|
58
|
+
.key
|
|
59
|
+
*.key
|
|
60
|
+
*.pem
|
|
61
|
+
`);
|
|
62
|
+
}
|
|
63
|
+
// Create placeholder environment files
|
|
64
|
+
const envDir = path.join(configDir, 'environments');
|
|
65
|
+
const environments = ['dev', 'stg', 'prd', 'sbx', 'dr'];
|
|
66
|
+
for (const env of environments) {
|
|
67
|
+
const envFile = path.join(envDir, `${env}.env`);
|
|
68
|
+
if (!fs.existsSync(envFile)) {
|
|
69
|
+
fs.writeFileSync(envFile, `# ${env.toUpperCase()} Environment Variables
|
|
70
|
+
# Add your ${env} environment variables here
|
|
71
|
+
# Example: DATABASE_URL=postgres://localhost/${env}_db
|
|
72
|
+
`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (jsonOutput) {
|
|
76
|
+
console.log(JSON.stringify({
|
|
77
|
+
success: true,
|
|
78
|
+
project: projectName,
|
|
79
|
+
configDir,
|
|
80
|
+
files: [
|
|
81
|
+
'config.yaml',
|
|
82
|
+
'.gitignore',
|
|
83
|
+
...environments.map(e => `environments/${e}.env`)
|
|
84
|
+
]
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(`✓ Initialized vaulter for project: ${projectName}`);
|
|
89
|
+
console.log(` Config: ${configDir}/config.yaml`);
|
|
90
|
+
console.log(` Environments: ${envDir}/`);
|
|
91
|
+
console.log('');
|
|
92
|
+
console.log('Next steps:');
|
|
93
|
+
console.log(' 1. Edit .vaulter/config.yaml to configure your backend');
|
|
94
|
+
console.log(' 2. Add environment variables to .vaulter/environments/*.env');
|
|
95
|
+
console.log(' 3. Run "vaulter sync -e dev" to sync with backend');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAW7F;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAChD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAErD,+BAA+B;IAC/B,IAAI,YAAY,EAAE,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,aAAa,EAAE,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAA;YAClF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAA;gBAC9D,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAC9C,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAE1E,wBAAwB;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAA;IAEtD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,qCAAqC,WAAW,EAAE,CAAC,CAAA;QAC/D,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,WAAW;gBACpB,SAAS;gBACT,MAAM,EAAE,IAAI;aACb,CAAC,CAAC,CAAA;QACL,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,cAAc,CAAC,CAAA;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,gBAAgB,CAAC,CAAA;QAC7C,CAAC;QACD,OAAM;IACR,CAAC;IAED,uBAAuB;IACvB,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAE3C,wCAAwC;IACxC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE;;;;CAInC,CAAC,CAAA;IACA,CAAC;IAED,uCAAuC;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;IACnD,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IAEvD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,CAAA;QAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,WAAW,EAAE;aACzC,GAAG;+CAC+B,GAAG;CACjD,CAAC,CAAA;QACE,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,WAAW;YACpB,SAAS;YACT,KAAK,EAAE;gBACL,aAAa;gBACb,YAAY;gBACZ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;aAClD;SACF,CAAC,CAAC,CAAA;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,WAAW,EAAE,CAAC,CAAA;QAChE,OAAO,CAAC,GAAG,CAAC,aAAa,SAAS,cAAc,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,GAAG,CAAC,CAAA;QACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACf,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;QAC1B,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAA;QAC5E,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;IACpE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter CLI - Helm Integration Commands
|
|
3
|
+
*
|
|
4
|
+
* Generate Helm values.yaml
|
|
5
|
+
*/
|
|
6
|
+
import type { CLIArgs, VaulterConfig, Environment } from '../../../types.js';
|
|
7
|
+
interface HelmContext {
|
|
8
|
+
args: CLIArgs;
|
|
9
|
+
config: VaulterConfig | null;
|
|
10
|
+
project: string;
|
|
11
|
+
service?: string;
|
|
12
|
+
environment: Environment;
|
|
13
|
+
verbose: boolean;
|
|
14
|
+
jsonOutput: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate Helm values.yaml
|
|
18
|
+
*/
|
|
19
|
+
export declare function runHelmValues(context: HelmContext): Promise<void>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=helm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/integrations/helm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI5E,UAAU,WAAW;IACnB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8CvE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter CLI - Helm Integration Commands
|
|
3
|
+
*
|
|
4
|
+
* Generate Helm values.yaml
|
|
5
|
+
*/
|
|
6
|
+
import { createClientFromConfig } from '../../lib/create-client.js';
|
|
7
|
+
import { getSecretPatterns, splitVarsBySecret } from '../../../lib/secret-patterns.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate Helm values.yaml
|
|
10
|
+
*/
|
|
11
|
+
export async function runHelmValues(context) {
|
|
12
|
+
const { args, config, project, service, environment, verbose, jsonOutput } = context;
|
|
13
|
+
if (!project) {
|
|
14
|
+
console.error('Error: Project not specified');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
if (verbose) {
|
|
18
|
+
console.error(`Generating Helm values for ${project}/${environment}`);
|
|
19
|
+
}
|
|
20
|
+
const client = await createClientFromConfig({ args, config, verbose });
|
|
21
|
+
try {
|
|
22
|
+
await client.connect();
|
|
23
|
+
const vars = await client.export(project, environment, service);
|
|
24
|
+
if (Object.keys(vars).length === 0) {
|
|
25
|
+
console.error('Warning: No variables found');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (jsonOutput) {
|
|
29
|
+
console.log(JSON.stringify({
|
|
30
|
+
format: 'helm-values',
|
|
31
|
+
project,
|
|
32
|
+
environment,
|
|
33
|
+
variableCount: Object.keys(vars).length
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const patterns = getSecretPatterns(config);
|
|
38
|
+
const { plain, secrets } = splitVarsBySecret(vars, patterns);
|
|
39
|
+
// Generate Helm values YAML
|
|
40
|
+
const yaml = generateHelmValuesYaml(plain, secrets, {
|
|
41
|
+
project,
|
|
42
|
+
service,
|
|
43
|
+
environment
|
|
44
|
+
});
|
|
45
|
+
console.log(yaml);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await client.disconnect();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generate Helm values YAML string
|
|
54
|
+
*
|
|
55
|
+
* Creates a structure like:
|
|
56
|
+
* env:
|
|
57
|
+
* PUBLIC_URL: "..."
|
|
58
|
+
*
|
|
59
|
+
* secrets:
|
|
60
|
+
* DATABASE_URL: "..."
|
|
61
|
+
* API_KEY: "..."
|
|
62
|
+
*/
|
|
63
|
+
function generateHelmValuesYaml(plainVars, secretVars, metadata) {
|
|
64
|
+
const lines = [
|
|
65
|
+
'# Generated by vaulter',
|
|
66
|
+
`# Project: ${metadata.project}`,
|
|
67
|
+
`# Environment: ${metadata.environment}`,
|
|
68
|
+
metadata.service ? `# Service: ${metadata.service}` : null,
|
|
69
|
+
'# DO NOT EDIT - changes will be overwritten',
|
|
70
|
+
'',
|
|
71
|
+
'# Environment variables (plain)',
|
|
72
|
+
'env:'
|
|
73
|
+
].filter(Boolean);
|
|
74
|
+
// Add env vars
|
|
75
|
+
for (const [key, value] of Object.entries(plainVars)) {
|
|
76
|
+
lines.push(` ${key}: ${formatYamlValue(value)}`);
|
|
77
|
+
}
|
|
78
|
+
lines.push('');
|
|
79
|
+
lines.push('# Secrets (matching patterns, for use with secretKeyRef)');
|
|
80
|
+
lines.push('secrets:');
|
|
81
|
+
for (const [key, value] of Object.entries(secretVars)) {
|
|
82
|
+
lines.push(` ${key}: ${formatYamlValue(value)}`);
|
|
83
|
+
}
|
|
84
|
+
return lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Format value for YAML
|
|
88
|
+
*/
|
|
89
|
+
function formatYamlValue(value) {
|
|
90
|
+
// Check if value needs quoting
|
|
91
|
+
const needsQuote = value === '' ||
|
|
92
|
+
value === 'true' ||
|
|
93
|
+
value === 'false' ||
|
|
94
|
+
value === 'null' ||
|
|
95
|
+
value === 'yes' ||
|
|
96
|
+
value === 'no' ||
|
|
97
|
+
!isNaN(Number(value)) ||
|
|
98
|
+
value.includes(':') ||
|
|
99
|
+
value.includes('#') ||
|
|
100
|
+
value.includes('\n') ||
|
|
101
|
+
value.includes('"') ||
|
|
102
|
+
value.includes("'") ||
|
|
103
|
+
value.startsWith(' ') ||
|
|
104
|
+
value.endsWith(' ') ||
|
|
105
|
+
value.startsWith('{') ||
|
|
106
|
+
value.startsWith('[');
|
|
107
|
+
if (needsQuote) {
|
|
108
|
+
// Use double quotes and escape special chars
|
|
109
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`;
|
|
110
|
+
}
|
|
111
|
+
return value;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=helm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helm.js","sourceRoot":"","sources":["../../../../src/cli/commands/integrations/helm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter CLI - Kubernetes Integration Commands
|
|
3
|
+
*
|
|
4
|
+
* Generate Kubernetes Secret and ConfigMap YAML
|
|
5
|
+
*/
|
|
6
|
+
import type { CLIArgs, VaulterConfig, Environment } from '../../../types.js';
|
|
7
|
+
interface K8sContext {
|
|
8
|
+
args: CLIArgs;
|
|
9
|
+
config: VaulterConfig | null;
|
|
10
|
+
project: string;
|
|
11
|
+
service?: string;
|
|
12
|
+
environment: Environment;
|
|
13
|
+
verbose: boolean;
|
|
14
|
+
jsonOutput: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate Kubernetes Secret YAML
|
|
18
|
+
*/
|
|
19
|
+
export declare function runK8sSecret(context: K8sContext): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Generate Kubernetes ConfigMap YAML
|
|
22
|
+
*/
|
|
23
|
+
export declare function runK8sConfigMap(context: K8sContext): Promise<void>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=kubernetes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/integrations/kubernetes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI5E,UAAU,UAAU;IAClB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB;AAoBD;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkErE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiExE"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter CLI - Kubernetes Integration Commands
|
|
3
|
+
*
|
|
4
|
+
* Generate Kubernetes Secret and ConfigMap YAML
|
|
5
|
+
*/
|
|
6
|
+
import { createClientFromConfig } from '../../lib/create-client.js';
|
|
7
|
+
import { getSecretPatterns, splitVarsBySecret } from '../../../lib/secret-patterns.js';
|
|
8
|
+
/**
|
|
9
|
+
* Encode value to base64
|
|
10
|
+
*/
|
|
11
|
+
function base64Encode(value) {
|
|
12
|
+
return Buffer.from(value).toString('base64');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Sanitize name for Kubernetes (lowercase, alphanumeric, hyphens)
|
|
16
|
+
*/
|
|
17
|
+
function sanitizeK8sName(name) {
|
|
18
|
+
return name
|
|
19
|
+
.toLowerCase()
|
|
20
|
+
.replace(/[^a-z0-9-]/g, '-')
|
|
21
|
+
.replace(/--+/g, '-')
|
|
22
|
+
.replace(/^-|-$/g, '');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generate Kubernetes Secret YAML
|
|
26
|
+
*/
|
|
27
|
+
export async function runK8sSecret(context) {
|
|
28
|
+
const { args, config, project, service, environment, verbose, jsonOutput } = context;
|
|
29
|
+
if (!project) {
|
|
30
|
+
console.error('Error: Project not specified');
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
// Determine secret name and namespace
|
|
34
|
+
const namespace = args.namespace || args.n ||
|
|
35
|
+
config?.integrations?.kubernetes?.namespace ||
|
|
36
|
+
`${project}-${environment}`;
|
|
37
|
+
const secretName = config?.integrations?.kubernetes?.secret_name ||
|
|
38
|
+
(service ? `${service}-secrets` : `${project}-secrets`);
|
|
39
|
+
if (verbose) {
|
|
40
|
+
console.error(`Generating K8s Secret: ${namespace}/${secretName}`);
|
|
41
|
+
}
|
|
42
|
+
const client = await createClientFromConfig({ args, config, verbose });
|
|
43
|
+
try {
|
|
44
|
+
await client.connect();
|
|
45
|
+
const vars = await client.export(project, environment, service);
|
|
46
|
+
if (Object.keys(vars).length === 0) {
|
|
47
|
+
console.error('Warning: No variables found');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const patterns = getSecretPatterns(config);
|
|
51
|
+
const { secrets } = splitVarsBySecret(vars, patterns);
|
|
52
|
+
const secretVars = Object.keys(secrets).length > 0 ? secrets : vars;
|
|
53
|
+
if (Object.keys(secrets).length === 0 && patterns.length > 0) {
|
|
54
|
+
console.error('Warning: No variables matched secret patterns, exporting all variables');
|
|
55
|
+
}
|
|
56
|
+
// Generate YAML
|
|
57
|
+
const yaml = generateSecretYaml(sanitizeK8sName(secretName), sanitizeK8sName(namespace), secretVars, {
|
|
58
|
+
project,
|
|
59
|
+
service,
|
|
60
|
+
environment,
|
|
61
|
+
managedBy: 'vaulter'
|
|
62
|
+
});
|
|
63
|
+
if (jsonOutput) {
|
|
64
|
+
console.log(JSON.stringify({
|
|
65
|
+
kind: 'Secret',
|
|
66
|
+
name: secretName,
|
|
67
|
+
namespace,
|
|
68
|
+
variableCount: Object.keys(secretVars).length
|
|
69
|
+
}));
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
console.log(yaml);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await client.disconnect();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Generate Kubernetes ConfigMap YAML
|
|
81
|
+
*/
|
|
82
|
+
export async function runK8sConfigMap(context) {
|
|
83
|
+
const { args, config, project, service, environment, verbose, jsonOutput } = context;
|
|
84
|
+
if (!project) {
|
|
85
|
+
console.error('Error: Project not specified');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
// Determine configmap name and namespace
|
|
89
|
+
const namespace = args.namespace || args.n ||
|
|
90
|
+
config?.integrations?.kubernetes?.namespace ||
|
|
91
|
+
`${project}-${environment}`;
|
|
92
|
+
const configMapName = config?.integrations?.kubernetes?.configmap_name ||
|
|
93
|
+
(service ? `${service}-config` : `${project}-config`);
|
|
94
|
+
if (verbose) {
|
|
95
|
+
console.error(`Generating K8s ConfigMap: ${namespace}/${configMapName}`);
|
|
96
|
+
}
|
|
97
|
+
const client = await createClientFromConfig({ args, config, verbose });
|
|
98
|
+
try {
|
|
99
|
+
await client.connect();
|
|
100
|
+
const vars = await client.export(project, environment, service);
|
|
101
|
+
if (Object.keys(vars).length === 0) {
|
|
102
|
+
console.error('Warning: No variables found');
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const patterns = getSecretPatterns(config);
|
|
106
|
+
const { plain } = splitVarsBySecret(vars, patterns);
|
|
107
|
+
if (Object.keys(plain).length === 0) {
|
|
108
|
+
console.error('Warning: No non-secret variables found for ConfigMap');
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Generate YAML
|
|
112
|
+
const yaml = generateConfigMapYaml(sanitizeK8sName(configMapName), sanitizeK8sName(namespace), plain, {
|
|
113
|
+
project,
|
|
114
|
+
service,
|
|
115
|
+
environment,
|
|
116
|
+
managedBy: 'vaulter'
|
|
117
|
+
});
|
|
118
|
+
if (jsonOutput) {
|
|
119
|
+
console.log(JSON.stringify({
|
|
120
|
+
kind: 'ConfigMap',
|
|
121
|
+
name: configMapName,
|
|
122
|
+
namespace,
|
|
123
|
+
variableCount: Object.keys(plain).length
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log(yaml);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await client.disconnect();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Generate Secret YAML string
|
|
136
|
+
*/
|
|
137
|
+
function generateSecretYaml(name, namespace, data, labels) {
|
|
138
|
+
const lines = [
|
|
139
|
+
'# Generated by vaulter',
|
|
140
|
+
'# DO NOT EDIT - changes will be overwritten',
|
|
141
|
+
'apiVersion: v1',
|
|
142
|
+
'kind: Secret',
|
|
143
|
+
'metadata:',
|
|
144
|
+
` name: ${name}`,
|
|
145
|
+
` namespace: ${namespace}`,
|
|
146
|
+
' labels:'
|
|
147
|
+
];
|
|
148
|
+
// Add labels
|
|
149
|
+
for (const [key, value] of Object.entries(labels)) {
|
|
150
|
+
if (value) {
|
|
151
|
+
lines.push(` app.kubernetes.io/${key}: "${value}"`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
lines.push('type: Opaque');
|
|
155
|
+
lines.push('data:');
|
|
156
|
+
// Add base64-encoded data
|
|
157
|
+
for (const [key, value] of Object.entries(data)) {
|
|
158
|
+
lines.push(` ${key}: ${base64Encode(value)}`);
|
|
159
|
+
}
|
|
160
|
+
return lines.join('\n');
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Generate ConfigMap YAML string
|
|
164
|
+
*/
|
|
165
|
+
function generateConfigMapYaml(name, namespace, data, labels) {
|
|
166
|
+
const lines = [
|
|
167
|
+
'# Generated by vaulter',
|
|
168
|
+
'# DO NOT EDIT - changes will be overwritten',
|
|
169
|
+
'apiVersion: v1',
|
|
170
|
+
'kind: ConfigMap',
|
|
171
|
+
'metadata:',
|
|
172
|
+
` name: ${name}`,
|
|
173
|
+
` namespace: ${namespace}`,
|
|
174
|
+
' labels:'
|
|
175
|
+
];
|
|
176
|
+
// Add labels
|
|
177
|
+
for (const [key, value] of Object.entries(labels)) {
|
|
178
|
+
if (value) {
|
|
179
|
+
lines.push(` app.kubernetes.io/${key}: "${value}"`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
lines.push('data:');
|
|
183
|
+
// Add string data (quote values that need it)
|
|
184
|
+
for (const [key, value] of Object.entries(data)) {
|
|
185
|
+
const needsQuote = value.includes(':') ||
|
|
186
|
+
value.includes('#') ||
|
|
187
|
+
value.includes('\n') ||
|
|
188
|
+
value.startsWith(' ') ||
|
|
189
|
+
value.endsWith(' ');
|
|
190
|
+
if (needsQuote) {
|
|
191
|
+
lines.push(` ${key}: "${value.replace(/"/g, '\\"').replace(/\n/g, '\\n')}"`);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
lines.push(` ${key}: ${value}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return lines.join('\n');
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=kubernetes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kubernetes.js","sourceRoot":"","sources":["../../../../src/cli/commands/integrations/kubernetes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter CLI - Terraform Integration Commands
|
|
3
|
+
*
|
|
4
|
+
* Generate Terraform .tfvars and JSON files
|
|
5
|
+
*/
|
|
6
|
+
import type { CLIArgs, VaulterConfig, Environment } from '../../../types.js';
|
|
7
|
+
interface TerraformContext {
|
|
8
|
+
args: CLIArgs;
|
|
9
|
+
config: VaulterConfig | null;
|
|
10
|
+
project: string;
|
|
11
|
+
service?: string;
|
|
12
|
+
environment: Environment;
|
|
13
|
+
verbose: boolean;
|
|
14
|
+
jsonOutput: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate Terraform .tfvars file
|
|
18
|
+
*/
|
|
19
|
+
export declare function runTfVars(context: TerraformContext): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Generate Terraform JSON variables file
|
|
22
|
+
*/
|
|
23
|
+
export declare function runTfJson(context: TerraformContext): Promise<void>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=terraform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/integrations/terraform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG5E,UAAU,gBAAgB;IACxB,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CxE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6CxE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vaulter CLI - Terraform Integration Commands
|
|
3
|
+
*
|
|
4
|
+
* Generate Terraform .tfvars and JSON files
|
|
5
|
+
*/
|
|
6
|
+
import { createClientFromConfig } from '../../lib/create-client.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate Terraform .tfvars file
|
|
9
|
+
*/
|
|
10
|
+
export async function runTfVars(context) {
|
|
11
|
+
const { args, config, project, service, environment, verbose, jsonOutput } = context;
|
|
12
|
+
if (!project) {
|
|
13
|
+
console.error('Error: Project not specified');
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
if (verbose) {
|
|
17
|
+
console.error(`Generating Terraform tfvars for ${project}/${environment}`);
|
|
18
|
+
}
|
|
19
|
+
const client = await createClientFromConfig({ args, config, verbose });
|
|
20
|
+
try {
|
|
21
|
+
await client.connect();
|
|
22
|
+
const vars = await client.export(project, environment, service);
|
|
23
|
+
if (Object.keys(vars).length === 0) {
|
|
24
|
+
console.error('Warning: No variables found');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (jsonOutput) {
|
|
28
|
+
console.log(JSON.stringify({
|
|
29
|
+
format: 'tfvars',
|
|
30
|
+
project,
|
|
31
|
+
environment,
|
|
32
|
+
variableCount: Object.keys(vars).length
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Generate .tfvars content
|
|
37
|
+
const tfvars = generateTfVars(vars, {
|
|
38
|
+
project,
|
|
39
|
+
service,
|
|
40
|
+
environment
|
|
41
|
+
});
|
|
42
|
+
console.log(tfvars);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
await client.disconnect();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate Terraform JSON variables file
|
|
51
|
+
*/
|
|
52
|
+
export async function runTfJson(context) {
|
|
53
|
+
const { args, config, project, service, environment, verbose, jsonOutput } = context;
|
|
54
|
+
if (!project) {
|
|
55
|
+
console.error('Error: Project not specified');
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
if (verbose) {
|
|
59
|
+
console.error(`Generating Terraform JSON for ${project}/${environment}`);
|
|
60
|
+
}
|
|
61
|
+
const client = await createClientFromConfig({ args, config, verbose });
|
|
62
|
+
try {
|
|
63
|
+
await client.connect();
|
|
64
|
+
const vars = await client.export(project, environment, service);
|
|
65
|
+
if (Object.keys(vars).length === 0) {
|
|
66
|
+
console.error('Warning: No variables found');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
// Generate JSON output
|
|
70
|
+
// Terraform expects variable names in lowercase with underscores
|
|
71
|
+
const tfVars = {};
|
|
72
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
73
|
+
// Convert to terraform-friendly name
|
|
74
|
+
const tfKey = key.toLowerCase();
|
|
75
|
+
tfVars[tfKey] = value;
|
|
76
|
+
}
|
|
77
|
+
// Also include an env_vars map for convenience
|
|
78
|
+
const output = {
|
|
79
|
+
// Individual variables
|
|
80
|
+
...tfVars,
|
|
81
|
+
// Full map for use with for_each
|
|
82
|
+
env_vars: vars
|
|
83
|
+
};
|
|
84
|
+
console.log(JSON.stringify(output, null, 2));
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
await client.disconnect();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate .tfvars content
|
|
92
|
+
*/
|
|
93
|
+
function generateTfVars(vars, metadata) {
|
|
94
|
+
const lines = [
|
|
95
|
+
'# Generated by vaulter',
|
|
96
|
+
`# Project: ${metadata.project}`,
|
|
97
|
+
`# Environment: ${metadata.environment}`,
|
|
98
|
+
metadata.service ? `# Service: ${metadata.service}` : null,
|
|
99
|
+
'# DO NOT EDIT - changes will be overwritten',
|
|
100
|
+
''
|
|
101
|
+
].filter(Boolean);
|
|
102
|
+
// Add individual variables (lowercase names for Terraform convention)
|
|
103
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
104
|
+
const tfKey = key.toLowerCase();
|
|
105
|
+
lines.push(`${tfKey} = ${formatTfValue(value)}`);
|
|
106
|
+
}
|
|
107
|
+
// Add a map variable containing all env vars
|
|
108
|
+
lines.push('');
|
|
109
|
+
lines.push('# All environment variables as a map');
|
|
110
|
+
lines.push('env_vars = {');
|
|
111
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
112
|
+
lines.push(` "${key}" = ${formatTfValue(value)}`);
|
|
113
|
+
}
|
|
114
|
+
lines.push('}');
|
|
115
|
+
return lines.join('\n');
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Format value for Terraform HCL
|
|
119
|
+
*/
|
|
120
|
+
function formatTfValue(value) {
|
|
121
|
+
// Always use double quotes for strings in Terraform
|
|
122
|
+
// Escape special characters
|
|
123
|
+
const escaped = value
|
|
124
|
+
.replace(/\\/g, '\\\\')
|
|
125
|
+
.replace(/"/g, '\\"')
|
|
126
|
+
.replace(/\n/g, '\\n')
|
|
127
|
+
.replace(/\r/g, '\\r')
|
|
128
|
+
.replace(/\t/g, '\\t');
|
|
129
|
+
return `"${escaped}"`;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=terraform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../../../src/cli/commands/integrations/terraform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAYnE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAEpF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,IAAI,WAAW,EAAE,CAAC,CAAA;IAC5E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;IAEtE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;QAEtB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;QAE/D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAC5C,OAAM;QACR,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,MAAM,EAAE,QAAQ;gBAChB,OAAO;gBACP,WAAW;gBACX,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;aACxC,CAAC,CAAC,CAAA;QACL,CAAC;aAAM,CAAC;YACN,2BAA2B;YAC3B,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE;gBAClC,OAAO;gBACP,OAAO;gBACP,WAAW;aACZ,CAAC,CAAA;YACF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAEpF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,iCAAiC,OAAO,IAAI,WAAW,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;IAEtE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;QAEtB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;QAE/D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;YAC5C,OAAM;QACR,CAAC;QAED,uBAAuB;QACvB,iEAAiE;QACjE,MAAM,MAAM,GAA2B,EAAE,CAAA;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChD,qCAAqC;YACrC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;YAC/B,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QACvB,CAAC;QAED,+CAA+C;QAC/C,MAAM,MAAM,GAAG;YACb,uBAAuB;YACvB,GAAG,MAAM;YACT,iCAAiC;YACjC,QAAQ,EAAE,IAAI;SACf,CAAA;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAC9C,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,UAAU,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,IAA4B,EAC5B,QAAoE;IAEpE,MAAM,KAAK,GAAa;QACtB,wBAAwB;QACxB,cAAc,QAAQ,CAAC,OAAO,EAAE;QAChC,kBAAkB,QAAQ,CAAC,WAAW,EAAE;QACxC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;QAC1D,6CAA6C;QAC7C,EAAE;KACH,CAAC,MAAM,CAAC,OAAO,CAAa,CAAA;IAE7B,sEAAsE;IACtE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;QAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAClD,CAAC;IAED,6CAA6C;IAC7C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;IAClD,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,oDAAoD;IACpD,4BAA4B;IAC5B,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;IAExB,OAAO,IAAI,OAAO,GAAG,CAAA;AACvB,CAAC"}
|