@swovohq/fuel 0.1.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 (109) hide show
  1. package/dist/bin/fuel.d.ts +3 -0
  2. package/dist/bin/fuel.d.ts.map +1 -0
  3. package/dist/bin/fuel.js +353 -0
  4. package/dist/bin/fuel.js.map +1 -0
  5. package/dist/cleanup/finalize.d.ts +11 -0
  6. package/dist/cleanup/finalize.d.ts.map +1 -0
  7. package/dist/cleanup/finalize.js +116 -0
  8. package/dist/cleanup/finalize.js.map +1 -0
  9. package/dist/commands/create-app.d.ts +14 -0
  10. package/dist/commands/create-app.d.ts.map +1 -0
  11. package/dist/commands/create-app.js +354 -0
  12. package/dist/commands/create-app.js.map +1 -0
  13. package/dist/commands/infra-deploy.d.ts +8 -0
  14. package/dist/commands/infra-deploy.d.ts.map +1 -0
  15. package/dist/commands/infra-deploy.js +102 -0
  16. package/dist/commands/infra-deploy.js.map +1 -0
  17. package/dist/commands/infra-destroy.d.ts +5 -0
  18. package/dist/commands/infra-destroy.d.ts.map +1 -0
  19. package/dist/commands/infra-destroy.js +85 -0
  20. package/dist/commands/infra-destroy.js.map +1 -0
  21. package/dist/commands/infra-init.d.ts +75 -0
  22. package/dist/commands/infra-init.d.ts.map +1 -0
  23. package/dist/commands/infra-init.js +577 -0
  24. package/dist/commands/infra-init.js.map +1 -0
  25. package/dist/commands/list-modules.d.ts +2 -0
  26. package/dist/commands/list-modules.d.ts.map +1 -0
  27. package/dist/commands/list-modules.js +71 -0
  28. package/dist/commands/list-modules.js.map +1 -0
  29. package/dist/commands/migrate-init.d.ts +6 -0
  30. package/dist/commands/migrate-init.d.ts.map +1 -0
  31. package/dist/commands/migrate-init.js +174 -0
  32. package/dist/commands/migrate-init.js.map +1 -0
  33. package/dist/engines/convention.d.ts +3 -0
  34. package/dist/engines/convention.d.ts.map +1 -0
  35. package/dist/engines/convention.js +76 -0
  36. package/dist/engines/convention.js.map +1 -0
  37. package/dist/engines/dependencies.d.ts +20 -0
  38. package/dist/engines/dependencies.d.ts.map +1 -0
  39. package/dist/engines/dependencies.js +26 -0
  40. package/dist/engines/dependencies.js.map +1 -0
  41. package/dist/engines/monorepo.d.ts +6 -0
  42. package/dist/engines/monorepo.d.ts.map +1 -0
  43. package/dist/engines/monorepo.js +56 -0
  44. package/dist/engines/monorepo.js.map +1 -0
  45. package/dist/engines/template-source.d.ts +9 -0
  46. package/dist/engines/template-source.d.ts.map +1 -0
  47. package/dist/engines/template-source.js +123 -0
  48. package/dist/engines/template-source.js.map +1 -0
  49. package/dist/index.d.ts +8 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +16 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/infra/config-loader.d.ts +4 -0
  54. package/dist/infra/config-loader.d.ts.map +1 -0
  55. package/dist/infra/config-loader.js +57 -0
  56. package/dist/infra/config-loader.js.map +1 -0
  57. package/dist/infra/config-writer.d.ts +9 -0
  58. package/dist/infra/config-writer.d.ts.map +1 -0
  59. package/dist/infra/config-writer.js +58 -0
  60. package/dist/infra/config-writer.js.map +1 -0
  61. package/dist/infra/credentials.d.ts +3 -0
  62. package/dist/infra/credentials.d.ts.map +1 -0
  63. package/dist/infra/credentials.js +74 -0
  64. package/dist/infra/credentials.js.map +1 -0
  65. package/dist/infra/dependency-checker.d.ts +9 -0
  66. package/dist/infra/dependency-checker.d.ts.map +1 -0
  67. package/dist/infra/dependency-checker.js +41 -0
  68. package/dist/infra/dependency-checker.js.map +1 -0
  69. package/dist/infra/git-client.d.ts +2 -0
  70. package/dist/infra/git-client.d.ts.map +1 -0
  71. package/dist/infra/git-client.js +22 -0
  72. package/dist/infra/git-client.js.map +1 -0
  73. package/dist/infra/github-secrets-client.d.ts +3 -0
  74. package/dist/infra/github-secrets-client.d.ts.map +1 -0
  75. package/dist/infra/github-secrets-client.js +37 -0
  76. package/dist/infra/github-secrets-client.js.map +1 -0
  77. package/dist/infra/orchestrator.d.ts +7 -0
  78. package/dist/infra/orchestrator.d.ts.map +1 -0
  79. package/dist/infra/orchestrator.js +187 -0
  80. package/dist/infra/orchestrator.js.map +1 -0
  81. package/dist/infra/preflight.d.ts +9 -0
  82. package/dist/infra/preflight.d.ts.map +1 -0
  83. package/dist/infra/preflight.js +75 -0
  84. package/dist/infra/preflight.js.map +1 -0
  85. package/dist/infra/s3-state-bucket.d.ts +5 -0
  86. package/dist/infra/s3-state-bucket.d.ts.map +1 -0
  87. package/dist/infra/s3-state-bucket.js +92 -0
  88. package/dist/infra/s3-state-bucket.js.map +1 -0
  89. package/dist/infra/secrets-manager-client.d.ts +3 -0
  90. package/dist/infra/secrets-manager-client.d.ts.map +1 -0
  91. package/dist/infra/secrets-manager-client.js +26 -0
  92. package/dist/infra/secrets-manager-client.js.map +1 -0
  93. package/dist/infra/subprocess.d.ts +5 -0
  94. package/dist/infra/subprocess.d.ts.map +1 -0
  95. package/dist/infra/subprocess.js +26 -0
  96. package/dist/infra/subprocess.js.map +1 -0
  97. package/dist/infra/template-engine.d.ts +43 -0
  98. package/dist/infra/template-engine.d.ts.map +1 -0
  99. package/dist/infra/template-engine.js +233 -0
  100. package/dist/infra/template-engine.js.map +1 -0
  101. package/dist/infra/tofu-runner.d.ts +26 -0
  102. package/dist/infra/tofu-runner.d.ts.map +1 -0
  103. package/dist/infra/tofu-runner.js +210 -0
  104. package/dist/infra/tofu-runner.js.map +1 -0
  105. package/dist/infra/types.d.ts +69 -0
  106. package/dist/infra/types.d.ts.map +1 -0
  107. package/dist/infra/types.js +44 -0
  108. package/dist/infra/types.js.map +1 -0
  109. package/package.json +45 -0
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.parseTfvars = parseTfvars;
40
+ exports.serializeTfvars = serializeTfvars;
41
+ exports.patchMainTf = patchMainTf;
42
+ exports.patchBackendTf = patchBackendTf;
43
+ exports.patchDefaultTfvars = patchDefaultTfvars;
44
+ exports.pruneUnusedModules = pruneUnusedModules;
45
+ exports.copyWorkflowFiles = copyWorkflowFiles;
46
+ exports.generateInfra = generateInfra;
47
+ const fs = __importStar(require("fs-extra"));
48
+ const path = __importStar(require("path"));
49
+ const crypto = __importStar(require("crypto"));
50
+ const chalk_1 = __importDefault(require("chalk"));
51
+ const s3_state_bucket_1 = require("./s3-state-bucket");
52
+ // Modules that must never be removed during pruning, regardless of main.tf references
53
+ const MODULES_DONT_REMOVE = ['secret-main'];
54
+ /**
55
+ * Generate a random 32-char hex database password.
56
+ */
57
+ function generateDbPassword() {
58
+ return crypto.randomBytes(16).toString('hex');
59
+ }
60
+ /**
61
+ * Fetch the caller's public IPv4 address and return it as a /32 CIDR block.
62
+ */
63
+ async function fetchPublicIpCidr() {
64
+ const res = await fetch('https://checkip.amazonaws.com');
65
+ if (!res.ok) {
66
+ throw new Error(`Failed to fetch public IP: ${res.status} ${res.statusText}`);
67
+ }
68
+ const ip = (await res.text()).trim();
69
+ return `${ip}/32`;
70
+ }
71
+ /**
72
+ * Parse a .tfvars file content into a Record<string, string>.
73
+ * Handles lines in the format: key = "value"
74
+ */
75
+ function parseTfvars(content) {
76
+ const result = {};
77
+ for (const line of content.split('\n')) {
78
+ const eqIdx = line.indexOf('=');
79
+ if (eqIdx === -1)
80
+ continue;
81
+ const key = line.slice(0, eqIdx).trim();
82
+ if (!key || key.startsWith('#'))
83
+ continue;
84
+ let value = line.slice(eqIdx + 1).trim();
85
+ // Strip surrounding double-quotes
86
+ if (value.startsWith('"') && value.endsWith('"')) {
87
+ value = value.slice(1, -1);
88
+ }
89
+ result[key] = value;
90
+ }
91
+ return result;
92
+ }
93
+ /**
94
+ * Serialize a Record<string, string> into .tfvars format.
95
+ * Produces: key = "value"\n lines joined with newline, ending with newline.
96
+ */
97
+ function serializeTfvars(vars) {
98
+ return (Object.entries(vars)
99
+ .map(([k, v]) => `${k} = "${v}"`)
100
+ .join('\n') + '\n');
101
+ }
102
+ /**
103
+ * Patch main.tf: replace all ../../modules references with ./modules.
104
+ */
105
+ async function patchMainTf(infraRoot) {
106
+ const filePath = path.join(infraRoot, 'main.tf');
107
+ const content = await fs.readFile(filePath, 'utf8');
108
+ const patched = content.replaceAll('../../modules', './modules');
109
+ await fs.writeFile(filePath, patched, 'utf8');
110
+ }
111
+ /**
112
+ * Patch backend.tf: replace {project_name}, {aws_region}, and {unique_suffix} placeholders.
113
+ */
114
+ async function patchBackendTf(infraRoot, projectName, awsRegion, uniqueSuffix) {
115
+ const filePath = path.join(infraRoot, 'backend.tf');
116
+ const content = await fs.readFile(filePath, 'utf8');
117
+ const patched = content
118
+ .replaceAll('{project_name}', projectName)
119
+ .replaceAll('{aws_region}', awsRegion)
120
+ .replaceAll('{unique_suffix}', uniqueSuffix);
121
+ await fs.writeFile(filePath, patched, 'utf8');
122
+ }
123
+ /**
124
+ * Patch default.tfvars: set project_name, aws_region, db_password from config and credentials.
125
+ */
126
+ async function patchDefaultTfvars(infraRoot, config, credentials) {
127
+ const filePath = path.join(infraRoot, 'default.tfvars');
128
+ const content = await fs.readFile(filePath, 'utf8');
129
+ const vars = parseTfvars(content);
130
+ vars['project_name'] = config.name;
131
+ vars['aws_region'] = credentials.AWS_REGION;
132
+ vars['db_password'] = generateDbPassword();
133
+ vars['access_ip_range'] = await fetchPublicIpCidr();
134
+ await fs.writeFile(filePath, serializeTfvars(vars), 'utf8');
135
+ }
136
+ /**
137
+ * Prune modules not referenced in main.tf (after patching).
138
+ * Always keeps modules listed in MODULES_DONT_REMOVE (e.g., secret-main).
139
+ */
140
+ async function pruneUnusedModules(infraRoot) {
141
+ const mainTfPath = path.join(infraRoot, 'main.tf');
142
+ const content = await fs.readFile(mainTfPath, 'utf8');
143
+ // Extract all referenced module source paths: source = "./modules/<name>"
144
+ const usedModules = new Set(MODULES_DONT_REMOVE);
145
+ const regex = /source\s*=\s*"\.\/modules\/([^"]+)"/g;
146
+ let match;
147
+ while ((match = regex.exec(content)) !== null) {
148
+ usedModules.add(match[1]);
149
+ }
150
+ const modulesDir = path.join(infraRoot, 'modules');
151
+ const entries = await fs.readdir(modulesDir, { withFileTypes: true });
152
+ for (const entry of entries) {
153
+ if (entry.isDirectory() && !usedModules.has(entry.name)) {
154
+ await fs.remove(path.join(modulesDir, entry.name));
155
+ }
156
+ }
157
+ }
158
+ /**
159
+ * Copy GitHub Actions workflow files into <projectDir>/.github/workflows/.
160
+ * Replaces what Terraform's github_repository_file resources used to do.
161
+ */
162
+ async function copyWorkflowFiles(projectDir, config, infraSrcRoot) {
163
+ const workflowsDir = path.join(projectDir, '.github', 'workflows');
164
+ await fs.ensureDir(workflowsDir);
165
+ // Read template files
166
+ const deployTemplatePath = path.join(infraSrcRoot, 'modules', 'github-actions', 'github-workflows-ecs', 'build_and_deploy.yml');
167
+ const testsTemplatePath = path.join(infraSrcRoot, 'modules', 'github-actions', 'github-workflows-app', 'tests.yml');
168
+ const deployTemplate = await fs.readFile(deployTemplatePath, 'utf8');
169
+ const testsContent = await fs.readFile(testsTemplatePath, 'utf8');
170
+ // Copy tests.yml as-is
171
+ await fs.writeFile(path.join(workflowsDir, 'tests.yml'), testsContent, 'utf8');
172
+ // Helper: apply substitutions for a given service entry
173
+ function applySubstitutions(template, name, dockerfile, buildEnv, branch, secretName) {
174
+ const buildArgs = buildEnv && Object.keys(buildEnv).length > 0
175
+ ? Object.entries(buildEnv)
176
+ .map(([k, v]) => `--build-arg ${k.toUpperCase()}=${v}`)
177
+ .join(' ')
178
+ : '';
179
+ return template
180
+ .replaceAll('REPLACEME', name)
181
+ .replaceAll('DOCKERFILE', dockerfile)
182
+ .replaceAll('BUILDARGS', buildArgs)
183
+ .replaceAll('BRANCHREPLACE', branch)
184
+ .replaceAll('SECRETNAME', secretName);
185
+ }
186
+ // Write a workflow file per app
187
+ for (const app of config.apps) {
188
+ const content = applySubstitutions(deployTemplate, app.name, app.dockerfile ?? 'Dockerfile', app.build_env, app.branch ?? 'main', `${app.name}-secrets`);
189
+ await fs.writeFile(path.join(workflowsDir, `${app.name}.yaml`), content, 'utf8');
190
+ // Write a workflow file per worker within this app
191
+ for (const worker of app.workers ?? []) {
192
+ const workerContent = applySubstitutions(deployTemplate, worker.name, worker.dockerfile ?? 'Dockerfile', app.build_env, app.branch ?? 'main', `${app.name}-secrets`);
193
+ await fs.writeFile(path.join(workflowsDir, `${worker.name}.yaml`), workerContent, 'utf8');
194
+ }
195
+ }
196
+ }
197
+ /**
198
+ * Generate a self-contained /infra folder in targetRoot.
199
+ * Copies ECS templates and all Terraform modules, then patches and prunes.
200
+ *
201
+ * The fuel-infrastructure sibling path is resolved via:
202
+ * - FUEL_INFRA_PATH env var (override for testing / CI)
203
+ * - process.cwd()/../fuel-infrastructure (default monorepo layout)
204
+ */
205
+ async function generateInfra(targetRoot, config, credentials) {
206
+ const infraSourceRoot = process.env.FUEL_INFRA_PATH ??
207
+ path.resolve(__dirname, '..', '..', '..', 'infra');
208
+ const infraRoot = path.join(targetRoot, 'infra');
209
+ const templateSrc = path.join(infraSourceRoot, 'templates', 'ecs');
210
+ const modulesSrc = path.join(infraSourceRoot, 'modules');
211
+ if (!(await fs.pathExists(templateSrc))) {
212
+ throw new Error(`Template source not found: ${templateSrc}. ` +
213
+ `Set FUEL_INFRA_PATH env var or ensure packages/infra exists in the monorepo.`);
214
+ }
215
+ console.log(chalk_1.default.cyan(' Generating infra folder...'));
216
+ // Step 1: Copy all 9 ECS template files into <project>/infra/
217
+ await fs.copy(templateSrc, infraRoot);
218
+ // Step 2: Copy all Terraform modules into <project>/infra/modules/
219
+ await fs.copy(modulesSrc, path.join(infraRoot, 'modules'));
220
+ // Step 3: Patch main.tf — replace ../../modules with ./modules
221
+ await patchMainTf(infraRoot);
222
+ // Step 4: Patch backend.tf — replace {project_name}, {aws_region}, and {unique_suffix}
223
+ const suffix = await (0, s3_state_bucket_1.loadOrCreateSuffix)(targetRoot);
224
+ await patchBackendTf(infraRoot, config.name, credentials.AWS_REGION, suffix);
225
+ // Step 5: Patch default.tfvars — fill ssl, project_name, aws_region, db_password
226
+ await patchDefaultTfvars(infraRoot, config, credentials);
227
+ // Step 6: Prune modules not referenced in patched main.tf
228
+ await pruneUnusedModules(infraRoot);
229
+ // Step 7: Copy GitHub Actions workflow files into <project>/.github/workflows/
230
+ await copyWorkflowFiles(targetRoot, config, infraSourceRoot);
231
+ console.log(chalk_1.default.green(' ✓ Infra folder generated'));
232
+ }
233
+ //# sourceMappingURL=template-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../../src/infra/template-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Credentials } from './types';
2
+ export interface TofuRunResult {
3
+ completedPasses: number[];
4
+ failedPass: number | null;
5
+ outputs: Record<string, {
6
+ value: any;
7
+ type: string;
8
+ }> | null;
9
+ }
10
+ export interface TofuVars {
11
+ db_password: string;
12
+ db_username: string;
13
+ db_name: string;
14
+ }
15
+ export declare class TofuPassError extends Error {
16
+ readonly failedPass: number;
17
+ readonly completedPasses: number[];
18
+ constructor(failedPass: number, completedPasses: number[]);
19
+ }
20
+ export interface TofuSequenceOptions {
21
+ planOnly?: boolean;
22
+ }
23
+ export declare function buildDestroyArgs(credentials: Credentials, tofuVars: TofuVars): string[];
24
+ export declare function runTofuDestroy(infraDir: string, credentials: Credentials, tofuVars: TofuVars): Promise<void>;
25
+ export declare function runTofuSequence(infraDir: string, credentials: Credentials, tofuVars: TofuVars, options?: TofuSequenceOptions): Promise<TofuRunResult>;
26
+ //# sourceMappingURL=tofu-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tofu-runner.d.ts","sourceRoot":"","sources":["../../src/infra/tofu-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGrC,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,GAAG,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAA;CAC7D;AAED,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,qBAAa,aAAc,SAAQ,KAAK;aAEpB,UAAU,EAAE,MAAM;aAClB,eAAe,EAAE,MAAM,EAAE;gBADzB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,MAAM,EAAE;CAK5C;AAyBD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AA+GD,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,GACjB,MAAM,EAAE,CAMV;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,aAAa,CAAC,CA+ExB"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TofuPassError = void 0;
7
+ exports.buildDestroyArgs = buildDestroyArgs;
8
+ exports.runTofuDestroy = runTofuDestroy;
9
+ exports.runTofuSequence = runTofuSequence;
10
+ const child_process_1 = require("child_process");
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const subprocess_1 = require("./subprocess");
13
+ class TofuPassError extends Error {
14
+ constructor(failedPass, completedPasses) {
15
+ super(`Tofu pass ${failedPass} failed after ${MAX_ATTEMPTS} attempts`);
16
+ this.failedPass = failedPass;
17
+ this.completedPasses = completedPasses;
18
+ this.name = 'TofuPassError';
19
+ }
20
+ }
21
+ exports.TofuPassError = TofuPassError;
22
+ const MAX_ATTEMPTS = 3;
23
+ const TRANSIENT_PATTERNS = [
24
+ /RequestError/i,
25
+ /ThrottlingException/i,
26
+ /5\d\d/,
27
+ /timeout/i,
28
+ /connection reset/i,
29
+ /TooManyRequests/i,
30
+ ];
31
+ function isTransient(output) {
32
+ return TRANSIENT_PATTERNS.some((pattern) => pattern.test(output));
33
+ }
34
+ function buildAwsEnv(credentials) {
35
+ return {
36
+ AWS_ACCESS_KEY_ID: credentials.AWS_ACCESS_KEY_ID,
37
+ AWS_SECRET_ACCESS_KEY: credentials.AWS_SECRET_ACCESS_KEY,
38
+ AWS_REGION: credentials.AWS_REGION,
39
+ };
40
+ }
41
+ function buildVarArgs(credentials, tofuVars, skipEcs) {
42
+ return [
43
+ '-var-file=default.tfvars',
44
+ `-var=github_token=${credentials.GITHUB_TOKEN}`,
45
+ `-var=github_username=${credentials.GITHUB_USERNAME}`,
46
+ `-var=aws_access_key_id=${credentials.AWS_ACCESS_KEY_ID}`,
47
+ `-var=aws_secret_access_key=${credentials.AWS_SECRET_ACCESS_KEY}`,
48
+ `-var=aws_region=${credentials.AWS_REGION}`,
49
+ `-var=github_organization=${credentials.GITHUB_ORGANIZATION}`,
50
+ `-var=db_password=${tofuVars.db_password}`,
51
+ `-var=db_username=${tofuVars.db_username}`,
52
+ `-var=db_name=${tofuVars.db_name}`,
53
+ `-var=skip_ecs=${skipEcs}`,
54
+ ];
55
+ }
56
+ function buildApplyArgs(passTargets, credentials, tofuVars, skipEcs) {
57
+ return [
58
+ 'apply',
59
+ '-auto-approve',
60
+ ...buildVarArgs(credentials, tofuVars, skipEcs),
61
+ ...passTargets,
62
+ ];
63
+ }
64
+ function buildPlanArgs(passTargets, credentials, tofuVars, skipEcs) {
65
+ return [
66
+ 'plan',
67
+ ...buildVarArgs(credentials, tofuVars, skipEcs),
68
+ ...passTargets,
69
+ ];
70
+ }
71
+ async function runPassWithRetry(passNum, passLabel, args, cwd, env) {
72
+ for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
73
+ const { code, combined } = await (0, subprocess_1.spawnStreaming)(args, cwd, env);
74
+ if (code === 0) {
75
+ return;
76
+ }
77
+ if (!isTransient(combined) || attempt === MAX_ATTEMPTS) {
78
+ throw new Error(`Pass ${passNum} (${passLabel}) failed after attempt ${attempt}`);
79
+ }
80
+ console.warn(chalk_1.default.yellow(`Warning: Pass ${passNum} attempt ${attempt} failed with transient error. Retrying...`));
81
+ }
82
+ }
83
+ async function collectOutputs(infraDir, env) {
84
+ return new Promise((resolve, reject) => {
85
+ const proc = (0, child_process_1.spawn)('tofu', ['output', '-json'], {
86
+ stdio: ['ignore', 'pipe', 'pipe'],
87
+ cwd: infraDir,
88
+ env: env ? { ...process.env, ...env } : undefined,
89
+ });
90
+ let stdout = '';
91
+ let stderr = '';
92
+ proc.stdout.on('data', (chunk) => {
93
+ stdout += chunk.toString();
94
+ });
95
+ proc.stderr.on('data', (chunk) => {
96
+ stderr += chunk.toString();
97
+ });
98
+ proc.on('close', (code) => {
99
+ if ((code ?? 1) !== 0) {
100
+ reject(new Error(`tofu output -json failed: ${stderr}`));
101
+ return;
102
+ }
103
+ try {
104
+ resolve(JSON.parse(stdout));
105
+ }
106
+ catch (e) {
107
+ reject(new Error(`Failed to parse tofu output JSON: ${e.message}`));
108
+ }
109
+ });
110
+ });
111
+ }
112
+ function buildDestroyArgs(credentials, tofuVars) {
113
+ return [
114
+ 'destroy',
115
+ '-auto-approve',
116
+ ...buildVarArgs(credentials, tofuVars, false),
117
+ ];
118
+ }
119
+ async function runTofuDestroy(infraDir, credentials, tofuVars) {
120
+ const awsEnv = buildAwsEnv(credentials);
121
+ // Initialize OpenTofu
122
+ console.log(chalk_1.default.cyan('--- Initializing OpenTofu ---'));
123
+ const { code: initCode } = await (0, subprocess_1.spawnStreaming)(['init'], infraDir, awsEnv);
124
+ if (initCode !== 0) {
125
+ console.error(chalk_1.default.red('✗ OpenTofu init failed'));
126
+ process.exit(1);
127
+ }
128
+ console.log(chalk_1.default.green('✓ OpenTofu initialized'));
129
+ // Run destroy
130
+ console.log(chalk_1.default.cyan('--- Destroying infrastructure ---'));
131
+ const args = buildDestroyArgs(credentials, tofuVars);
132
+ const { code } = await (0, subprocess_1.spawnStreaming)(args, infraDir, awsEnv);
133
+ if (code !== 0) {
134
+ throw new Error('OpenTofu destroy failed. Check the output above for details.');
135
+ }
136
+ console.log(chalk_1.default.green('✓ Infrastructure destroyed'));
137
+ }
138
+ async function runTofuSequence(infraDir, credentials, tofuVars, options) {
139
+ const awsEnv = buildAwsEnv(credentials);
140
+ // Initialize OpenTofu
141
+ console.log(chalk_1.default.cyan('--- Initializing OpenTofu ---'));
142
+ const { code: initCode } = await (0, subprocess_1.spawnStreaming)(['init'], infraDir, awsEnv);
143
+ if (initCode !== 0) {
144
+ console.error(chalk_1.default.red('✗ OpenTofu init failed'));
145
+ process.exit(1);
146
+ }
147
+ console.log(chalk_1.default.green('✓ OpenTofu initialized'));
148
+ // Define pass configurations
149
+ const passes = [
150
+ {
151
+ num: 1,
152
+ label: 'ECR + GitHub repo',
153
+ targets: ['-target=module.ecr', '-target=module.github_repo'],
154
+ skipEcs: true,
155
+ },
156
+ {
157
+ num: 2,
158
+ label: 'GitHub Actions',
159
+ targets: ['-target=module.github_actions', '-target=module.github_repo', '-target=module.github_oidc'],
160
+ skipEcs: true,
161
+ },
162
+ {
163
+ num: 3,
164
+ label: 'Full apply',
165
+ targets: [],
166
+ skipEcs: false,
167
+ },
168
+ ];
169
+ const result = {
170
+ completedPasses: [],
171
+ failedPass: null,
172
+ outputs: null,
173
+ };
174
+ const planOnly = options?.planOnly ?? false;
175
+ for (const pass of passes) {
176
+ const mode = planOnly ? 'Plan' : 'Pass';
177
+ console.log(chalk_1.default.cyan(`--- ${mode} ${pass.num}/3: ${pass.label} ---`));
178
+ try {
179
+ const args = planOnly
180
+ ? buildPlanArgs(pass.targets, credentials, tofuVars, pass.skipEcs)
181
+ : buildApplyArgs(pass.targets, credentials, tofuVars, pass.skipEcs);
182
+ if (planOnly) {
183
+ const { code } = await (0, subprocess_1.spawnStreaming)(args, infraDir, awsEnv);
184
+ if (code !== 0) {
185
+ throw new Error(`Plan ${pass.num} (${pass.label}) failed`);
186
+ }
187
+ }
188
+ else {
189
+ await runPassWithRetry(pass.num, pass.label, args, infraDir, awsEnv);
190
+ }
191
+ result.completedPasses.push(pass.num);
192
+ console.log(chalk_1.default.green(`✓ ${mode} ${pass.num} complete`));
193
+ }
194
+ catch (err) {
195
+ result.failedPass = pass.num;
196
+ if (planOnly) {
197
+ console.log(chalk_1.default.red(`✗ Plan ${pass.num} failed.`));
198
+ throw err;
199
+ }
200
+ console.log(chalk_1.default.red(`✗ Pass ${pass.num} failed after ${MAX_ATTEMPTS} attempts.`));
201
+ throw new TofuPassError(pass.num, [...result.completedPasses]);
202
+ }
203
+ }
204
+ if (!planOnly) {
205
+ // Collect outputs after all passes
206
+ result.outputs = await collectOutputs(infraDir, awsEnv);
207
+ }
208
+ return result;
209
+ }
210
+ //# sourceMappingURL=tofu-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tofu-runner.js","sourceRoot":"","sources":["../../src/infra/tofu-runner.ts"],"names":[],"mappings":";;;;;;AAmKA,4CASC;AAED,wCAwBC;AAED,0CAoFC;AA5RD,iDAAqC;AACrC,kDAAyB;AAEzB,6CAA6C;AAc7C,MAAa,aAAc,SAAQ,KAAK;IACtC,YACkB,UAAkB,EAClB,eAAyB;QAEzC,KAAK,CAAC,aAAa,UAAU,iBAAiB,YAAY,WAAW,CAAC,CAAA;QAHtD,eAAU,GAAV,UAAU,CAAQ;QAClB,oBAAe,GAAf,eAAe,CAAU;QAGzC,IAAI,CAAC,IAAI,GAAG,eAAe,CAAA;IAC7B,CAAC;CACF;AARD,sCAQC;AAED,MAAM,YAAY,GAAG,CAAC,CAAA;AAEtB,MAAM,kBAAkB,GAAa;IACnC,eAAe;IACf,sBAAsB;IACtB,OAAO;IACP,UAAU;IACV,mBAAmB;IACnB,kBAAkB;CACnB,CAAA;AAED,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,WAAW,CAAC,WAAwB;IAC3C,OAAO;QACL,iBAAiB,EAAE,WAAW,CAAC,iBAAiB;QAChD,qBAAqB,EAAE,WAAW,CAAC,qBAAqB;QACxD,UAAU,EAAE,WAAW,CAAC,UAAU;KACnC,CAAA;AACH,CAAC;AAMD,SAAS,YAAY,CACnB,WAAwB,EACxB,QAAkB,EAClB,OAAgB;IAEhB,OAAO;QACL,0BAA0B;QAC1B,qBAAqB,WAAW,CAAC,YAAY,EAAE;QAC/C,wBAAwB,WAAW,CAAC,eAAe,EAAE;QACrD,0BAA0B,WAAW,CAAC,iBAAiB,EAAE;QACzD,8BAA8B,WAAW,CAAC,qBAAqB,EAAE;QACjE,mBAAmB,WAAW,CAAC,UAAU,EAAE;QAC3C,4BAA4B,WAAW,CAAC,mBAAmB,EAAE;QAC7D,oBAAoB,QAAQ,CAAC,WAAW,EAAE;QAC1C,oBAAoB,QAAQ,CAAC,WAAW,EAAE;QAC1C,gBAAgB,QAAQ,CAAC,OAAO,EAAE;QAClC,iBAAiB,OAAO,EAAE;KAC3B,CAAA;AACH,CAAC;AAED,SAAS,cAAc,CACrB,WAAqB,EACrB,WAAwB,EACxB,QAAkB,EAClB,OAAgB;IAEhB,OAAO;QACL,OAAO;QACP,eAAe;QACf,GAAG,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;QAC/C,GAAG,WAAW;KACf,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CACpB,WAAqB,EACrB,WAAwB,EACxB,QAAkB,EAClB,OAAgB;IAEhB,OAAO;QACL,MAAM;QACN,GAAG,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;QAC/C,GAAG,WAAW;KACf,CAAA;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAe,EACf,SAAiB,EACjB,IAAc,EACd,GAAW,EACX,GAA4B;IAE5B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;QACzD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,2BAAc,EAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QAE/D,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,KAAK,SAAS,0BAA0B,OAAO,EAAE,CAAC,CAAA;QACnF,CAAC;QAED,OAAO,CAAC,IAAI,CACV,eAAK,CAAC,MAAM,CACV,iBAAiB,OAAO,YAAY,OAAO,2CAA2C,CACvF,CACF,CAAA;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAAgB,EAChB,GAA4B;IAE5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE;YAC9C,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,QAAQ;YACb,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;SAClD,CAAC,CAAA;QAEF,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,MAAM,GAAG,EAAE,CAAA;QAEf,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;YACvC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC,CAAA;gBACxD,OAAM;YACR,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;YAC7B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAsC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;YAChF,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAC9B,WAAwB,EACxB,QAAkB;IAElB,OAAO;QACL,SAAS;QACT,eAAe;QACf,GAAG,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,CAAC;KAC9C,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,WAAwB,EACxB,QAAkB;IAElB,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAEvC,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAA;IACxD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,2BAAc,EAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC3E,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAA;IAElD,cAAc;IACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAA;IAC5D,MAAM,IAAI,GAAG,gBAAgB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACpD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,2BAAc,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC7D,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAA;IACjF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;AACxD,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,WAAwB,EACxB,QAAkB,EAClB,OAA6B;IAE7B,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAEvC,sBAAsB;IACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAA;IACxD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,2BAAc,EAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAC3E,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAA;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAA;IAElD,6BAA6B;IAC7B,MAAM,MAAM,GAAG;QACb;YACE,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAE,CAAC,oBAAoB,EAAE,4BAA4B,CAAC;YAC7D,OAAO,EAAE,IAAI;SACd;QACD;YACE,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,gBAAgB;YACvB,OAAO,EAAE,CAAC,+BAA+B,EAAE,4BAA4B,EAAE,4BAA4B,CAAC;YACtG,OAAO,EAAE,IAAI;SACd;QACD;YACE,GAAG,EAAE,CAAC;YACN,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,KAAK;SACf;KACF,CAAA;IAED,MAAM,MAAM,GAAkB;QAC5B,eAAe,EAAE,EAAE;QACnB,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,IAAI;KACd,CAAA;IAED,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAA;IAE3C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QACvC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAA;QAEvE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ;gBACnB,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC;gBAClE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YAErE,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,2BAAc,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAC7D,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,UAAU,CAAC,CAAA;gBAC5D,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;YACtE,CAAC;YAED,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAA;YAC5B,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAA;gBACpD,MAAM,GAAG,CAAA;YACX,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,GAAG,iBAAiB,YAAY,YAAY,CAAC,CAAC,CAAA;YACnF,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,mCAAmC;QACnC,MAAM,CAAC,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACzD,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { z } from 'zod';
2
+ declare const WorkerSchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ dockerfile: z.ZodString;
5
+ }, z.core.$strip>;
6
+ export declare const AppSchema: z.ZodObject<{
7
+ name: z.ZodString;
8
+ technology: z.ZodEnum<{
9
+ nest: "nest";
10
+ react: "react";
11
+ }>;
12
+ dockerfile: z.ZodString;
13
+ health_check_path: z.ZodString;
14
+ domain: z.ZodString;
15
+ port: z.ZodNumber;
16
+ branch: z.ZodDefault<z.ZodString>;
17
+ template_repo_branch: z.ZodDefault<z.ZodString>;
18
+ postgres: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
19
+ redis: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
20
+ variables: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
21
+ build_env: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
22
+ workers: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
23
+ name: z.ZodString;
24
+ dockerfile: z.ZodString;
25
+ }, z.core.$strip>>>>;
26
+ cpu_units: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
27
+ memory_units: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
28
+ db_instance_type: z.ZodOptional<z.ZodString>;
29
+ db_allocated_storage: z.ZodOptional<z.ZodNumber>;
30
+ redis_instance_type: z.ZodOptional<z.ZodString>;
31
+ }, z.core.$strip>;
32
+ export declare const InfraConfigSchema: z.ZodObject<{
33
+ name: z.ZodString;
34
+ deployment: z.ZodLiteral<"ecs">;
35
+ ssl: z.ZodString;
36
+ apps: z.ZodArray<z.ZodObject<{
37
+ name: z.ZodString;
38
+ technology: z.ZodEnum<{
39
+ nest: "nest";
40
+ react: "react";
41
+ }>;
42
+ dockerfile: z.ZodString;
43
+ health_check_path: z.ZodString;
44
+ domain: z.ZodString;
45
+ port: z.ZodNumber;
46
+ branch: z.ZodDefault<z.ZodString>;
47
+ template_repo_branch: z.ZodDefault<z.ZodString>;
48
+ postgres: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
49
+ redis: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
50
+ variables: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
51
+ build_env: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>>;
52
+ workers: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodObject<{
53
+ name: z.ZodString;
54
+ dockerfile: z.ZodString;
55
+ }, z.core.$strip>>>>;
56
+ cpu_units: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
57
+ memory_units: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
58
+ db_instance_type: z.ZodOptional<z.ZodString>;
59
+ db_allocated_storage: z.ZodOptional<z.ZodNumber>;
60
+ redis_instance_type: z.ZodOptional<z.ZodString>;
61
+ }, z.core.$strip>>;
62
+ }, z.core.$strip>;
63
+ export type AppConfig = z.infer<typeof AppSchema>;
64
+ export type InfraConfig = z.infer<typeof InfraConfigSchema>;
65
+ export { WorkerSchema };
66
+ export declare const REQUIRED_CREDENTIAL_KEYS: readonly ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_REGION", "GITHUB_TOKEN", "GITHUB_USERNAME", "GITHUB_ORGANIZATION"];
67
+ export type CredentialKey = typeof REQUIRED_CREDENTIAL_KEYS[number];
68
+ export type Credentials = Record<CredentialKey, string>;
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/infra/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,QAAA,MAAM,YAAY;;;iBAGhB,CAAA;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBpB,CAAA;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK5B,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAA;AACjD,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,CAAA;AAEvB,eAAO,MAAM,wBAAwB,iIAO3B,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAA;AACnE,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REQUIRED_CREDENTIAL_KEYS = exports.WorkerSchema = exports.InfraConfigSchema = exports.AppSchema = void 0;
4
+ const zod_1 = require("zod");
5
+ const WorkerSchema = zod_1.z.object({
6
+ name: zod_1.z.string().min(1),
7
+ dockerfile: zod_1.z.string().min(1),
8
+ });
9
+ exports.WorkerSchema = WorkerSchema;
10
+ exports.AppSchema = zod_1.z.object({
11
+ name: zod_1.z.string().min(1),
12
+ technology: zod_1.z.enum(['nest', 'react']),
13
+ dockerfile: zod_1.z.string().min(1),
14
+ health_check_path: zod_1.z.string().min(1),
15
+ domain: zod_1.z.string().min(1),
16
+ port: zod_1.z.number().int().positive(),
17
+ branch: zod_1.z.string().default('main'),
18
+ template_repo_branch: zod_1.z.string().default('main'),
19
+ postgres: zod_1.z.boolean().optional().default(false),
20
+ redis: zod_1.z.boolean().optional().default(false),
21
+ variables: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional().default({}),
22
+ build_env: zod_1.z.record(zod_1.z.string(), zod_1.z.string()).optional().default({}),
23
+ workers: zod_1.z.array(WorkerSchema).optional().default([]),
24
+ cpu_units: zod_1.z.number().int().positive().optional().default(1024),
25
+ memory_units: zod_1.z.number().int().positive().optional().default(2048),
26
+ db_instance_type: zod_1.z.string().optional(),
27
+ db_allocated_storage: zod_1.z.number().int().positive().optional(),
28
+ redis_instance_type: zod_1.z.string().optional(),
29
+ });
30
+ exports.InfraConfigSchema = zod_1.z.object({
31
+ name: zod_1.z.string().min(1),
32
+ deployment: zod_1.z.literal('ecs'),
33
+ ssl: zod_1.z.string().min(1),
34
+ apps: zod_1.z.array(exports.AppSchema).min(1),
35
+ });
36
+ exports.REQUIRED_CREDENTIAL_KEYS = [
37
+ 'AWS_ACCESS_KEY_ID',
38
+ 'AWS_SECRET_ACCESS_KEY',
39
+ 'AWS_REGION',
40
+ 'GITHUB_TOKEN',
41
+ 'GITHUB_USERNAME',
42
+ 'GITHUB_ORGANIZATION',
43
+ ];
44
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/infra/types.ts"],"names":[],"mappings":"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"}