@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,187 @@
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.runInfraOrchestrator = runInfraOrchestrator;
40
+ const crypto = __importStar(require("crypto"));
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const chalk_1 = __importDefault(require("chalk"));
44
+ const tofu_runner_1 = require("./tofu-runner");
45
+ const secrets_manager_client_1 = require("./secrets-manager-client");
46
+ const git_client_1 = require("./git-client");
47
+ const subprocess_1 = require("./subprocess");
48
+ const s3_state_bucket_1 = require("./s3-state-bucket");
49
+ function slugify(name) {
50
+ return name.replace(/[^a-z0-9]/gi, '_').toLowerCase();
51
+ }
52
+ function buildDestroyArgs(completedPasses, credentials, tofuVars) {
53
+ const targets = [];
54
+ if (completedPasses.includes(1)) {
55
+ targets.push('-target=module.ecr', '-target=module.github_repo');
56
+ }
57
+ if (completedPasses.includes(2)) {
58
+ targets.push('-target=module.github_actions');
59
+ }
60
+ return [
61
+ 'destroy',
62
+ '-var-file=default.tfvars',
63
+ '-auto-approve',
64
+ `-var=github_token=${credentials.GITHUB_TOKEN}`,
65
+ `-var=github_username=${credentials.GITHUB_USERNAME}`,
66
+ `-var=aws_access_key_id=${credentials.AWS_ACCESS_KEY_ID}`,
67
+ `-var=aws_secret_access_key=${credentials.AWS_SECRET_ACCESS_KEY}`,
68
+ `-var=aws_region=${credentials.AWS_REGION}`,
69
+ `-var=github_organization=${credentials.GITHUB_ORGANIZATION}`,
70
+ `-var=db_password=${tofuVars.db_password}`,
71
+ `-var=db_username=${tofuVars.db_username}`,
72
+ `-var=db_name=${tofuVars.db_name}`,
73
+ `-var=skip_ecs=true`,
74
+ ...targets,
75
+ ];
76
+ }
77
+ async function runCompensation(infraDir, credentials, tofuVars, completedPasses) {
78
+ if (completedPasses.length === 0)
79
+ return;
80
+ console.log(chalk_1.default.red('\n--- Cleaning up partial resources ---'));
81
+ const args = buildDestroyArgs(completedPasses, credentials, tofuVars);
82
+ const awsEnv = {
83
+ AWS_ACCESS_KEY_ID: credentials.AWS_ACCESS_KEY_ID,
84
+ AWS_SECRET_ACCESS_KEY: credentials.AWS_SECRET_ACCESS_KEY,
85
+ AWS_REGION: credentials.AWS_REGION,
86
+ };
87
+ const { code } = await (0, subprocess_1.spawnStreaming)(args, infraDir, awsEnv);
88
+ if (code !== 0) {
89
+ console.error(chalk_1.default.red('Compensation destroy failed. Manually delete these resources:'));
90
+ if (completedPasses.includes(1)) {
91
+ console.error(chalk_1.default.red(' - ECR repository (module.ecr)'));
92
+ console.error(chalk_1.default.red(' - GitHub repository (module.github_repo)'));
93
+ }
94
+ if (completedPasses.includes(2)) {
95
+ console.error(chalk_1.default.red(' - GitHub Actions config (module.github_actions)'));
96
+ }
97
+ process.exit(1);
98
+ }
99
+ console.log(chalk_1.default.green('Partial resources cleaned up'));
100
+ }
101
+ function printOutputTable(albDns, ecrUrl, githubRepoUrl, dbUsername, dbPassword) {
102
+ const divider = chalk_1.default.gray('─'.repeat(60));
103
+ console.log('\n' + divider);
104
+ console.log(chalk_1.default.bold(' Deployment Complete'));
105
+ console.log(divider);
106
+ console.log(` ${chalk_1.default.dim('ALB DNS')} ${albDns}`);
107
+ console.log(` ${chalk_1.default.dim('ECR URL')} ${ecrUrl}`);
108
+ console.log(` ${chalk_1.default.dim('GitHub Repo')} ${githubRepoUrl}`);
109
+ console.log(` ${chalk_1.default.dim('DB Username')} ${dbUsername}`);
110
+ console.log(` ${chalk_1.default.dim('DB Password')} ${dbPassword} ${chalk_1.default.yellow("Save these — they won't be shown again")}`);
111
+ console.log(divider);
112
+ console.log(chalk_1.default.cyan('\n Next steps:'));
113
+ console.log(' Push to main to trigger your first deploy.\n');
114
+ }
115
+ async function runInfraOrchestrator(targetRoot, appName, config, credentials, options) {
116
+ const infraDir = path.join(targetRoot, 'infra');
117
+ // Generate TofuVars
118
+ const tofuVars = {
119
+ db_password: crypto.randomBytes(32).toString('hex'),
120
+ db_username: slugify(config.name),
121
+ db_name: slugify(config.name),
122
+ };
123
+ // Ensure S3 state bucket exists (before Tofu init)
124
+ console.log(chalk_1.default.cyan('--- Ensuring state bucket exists ---'));
125
+ const suffix = await (0, s3_state_bucket_1.loadOrCreateSuffix)(targetRoot);
126
+ const bucketName = (0, s3_state_bucket_1.buildStateBucketName)(config.name, suffix);
127
+ await (0, s3_state_bucket_1.ensureStateBucket)(credentials, bucketName);
128
+ // Write secret to AWS Secrets Manager (before Tofu — Tofu reads it via data.tf)
129
+ const secretName = `${config.name}-infrastructure-variables`;
130
+ const fuelConfigPath = path.join(targetRoot, 'fuel.config.json');
131
+ const fuelConfigContents = JSON.parse(fs.readFileSync(fuelConfigPath, 'utf-8'));
132
+ console.log(chalk_1.default.cyan('--- Writing infrastructure secret ---'));
133
+ await (0, secrets_manager_client_1.putSecret)(credentials, secretName, fuelConfigContents);
134
+ console.log(chalk_1.default.green('Secret written to AWS Secrets Manager'));
135
+ // SIGINT compensation setup
136
+ const state = { tofuStarted: false, completedPasses: [] };
137
+ const sigintHandler = async () => {
138
+ if (options?.skipCompensation) {
139
+ console.log(chalk_1.default.yellow('\nInterrupted — partial resources preserved.'));
140
+ console.log(chalk_1.default.yellow('Re-run "fuel infra:deploy" to resume.\n'));
141
+ }
142
+ else {
143
+ console.log(chalk_1.default.yellow('\nInterrupted — running compensation...'));
144
+ if (state.tofuStarted && state.completedPasses.length > 0) {
145
+ await runCompensation(infraDir, credentials, tofuVars, state.completedPasses);
146
+ }
147
+ }
148
+ process.exit(1);
149
+ };
150
+ process.once('SIGINT', sigintHandler);
151
+ try {
152
+ // Run Tofu three-pass sequence
153
+ state.tofuStarted = true;
154
+ const result = await (0, tofu_runner_1.runTofuSequence)(infraDir, credentials, tofuVars, {
155
+ planOnly: options?.planOnly,
156
+ });
157
+ state.completedPasses = result.completedPasses;
158
+ if (options?.planOnly) {
159
+ console.log(chalk_1.default.green('\n Plan complete — no resources were created.\n'));
160
+ return;
161
+ }
162
+ // Wire git remote
163
+ const githubRepoUrl = result.outputs['github_http_repo_url'].value;
164
+ await (0, git_client_1.wireGitRemote)(targetRoot, githubRepoUrl);
165
+ console.log(chalk_1.default.green('Git remote origin set'));
166
+ // Print output table
167
+ const albDns = result.outputs['alb_dns'].value;
168
+ const ecrUrl = result.outputs['ecr_url'].value;
169
+ printOutputTable(albDns, ecrUrl, githubRepoUrl, tofuVars.db_username, tofuVars.db_password);
170
+ }
171
+ catch (err) {
172
+ if (err instanceof tofu_runner_1.TofuPassError) {
173
+ if (options?.skipCompensation) {
174
+ console.log(chalk_1.default.yellow('\n Partial resources preserved. Fix the issue and re-run:'));
175
+ console.log(chalk_1.default.yellow(' fuel infra:deploy\n'));
176
+ process.exit(1);
177
+ }
178
+ await runCompensation(infraDir, credentials, tofuVars, err.completedPasses);
179
+ process.exit(1);
180
+ }
181
+ throw err;
182
+ }
183
+ finally {
184
+ process.removeListener('SIGINT', sigintHandler);
185
+ }
186
+ }
187
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/infra/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { InfraConfig, Credentials } from './types';
2
+ export declare function checkTofuVersion(): string;
3
+ export interface PreflightResult {
4
+ config: InfraConfig;
5
+ credentials: Credentials;
6
+ tofuVersion: string;
7
+ }
8
+ export declare function runPreflight(configPath: string): Promise<PreflightResult>;
9
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/infra/preflight.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAclD,wBAAgB,gBAAgB,IAAI,MAAM,CA2BzC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,CAAA;IACnB,WAAW,EAAE,WAAW,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA8B/E"}
@@ -0,0 +1,75 @@
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.checkTofuVersion = checkTofuVersion;
7
+ exports.runPreflight = runPreflight;
8
+ const child_process_1 = require("child_process");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ const config_loader_1 = require("./config-loader");
11
+ const credentials_1 = require("./credentials");
12
+ const MIN_TOFU_MAJOR = 1;
13
+ const MIN_TOFU_MINOR = 7;
14
+ function pass(label) {
15
+ console.log(chalk_1.default.green('✓') + ' ' + label);
16
+ }
17
+ function fail(label, detail) {
18
+ console.error(chalk_1.default.red('✗') + ' ' + label + ': ' + detail);
19
+ process.exit(1);
20
+ }
21
+ function checkTofuVersion() {
22
+ let output;
23
+ try {
24
+ output = (0, child_process_1.execSync)('tofu version', {
25
+ encoding: 'utf-8',
26
+ stdio: ['ignore', 'pipe', 'pipe'],
27
+ });
28
+ }
29
+ catch (e) {
30
+ throw new Error('tofu not found. Install OpenTofu >= 1.7.0: https://opentofu.org/docs/intro/install/');
31
+ }
32
+ const match = output.match(/OpenTofu v(\d+)\.(\d+)\.(\d+)/);
33
+ if (!match) {
34
+ throw new Error('Could not parse tofu version output');
35
+ }
36
+ const [major, minor] = [Number(match[1]), Number(match[2])];
37
+ if (major < MIN_TOFU_MAJOR ||
38
+ (major === MIN_TOFU_MAJOR && minor < MIN_TOFU_MINOR)) {
39
+ throw new Error(`tofu v${match[1]}.${match[2]}.${match[3]} found but >= ${MIN_TOFU_MAJOR}.${MIN_TOFU_MINOR}.0 required. ` +
40
+ `Upgrade at https://opentofu.org/docs/intro/install/`);
41
+ }
42
+ return `${match[1]}.${match[2]}.${match[3]}`;
43
+ }
44
+ async function runPreflight(configPath) {
45
+ // Check 1: tofu binary
46
+ let tofuVersion;
47
+ try {
48
+ tofuVersion = checkTofuVersion();
49
+ pass(`tofu ${tofuVersion}`);
50
+ }
51
+ catch (err) {
52
+ fail('tofu', err.message);
53
+ }
54
+ // Check 2: credentials
55
+ let credentials;
56
+ try {
57
+ credentials = await (0, credentials_1.resolveCredentials)();
58
+ pass('AWS credentials valid');
59
+ pass('GitHub token valid');
60
+ }
61
+ catch (err) {
62
+ fail('credentials', err.message);
63
+ }
64
+ // Check 3: config
65
+ let config;
66
+ try {
67
+ config = await (0, config_loader_1.loadInfraConfig)(configPath);
68
+ pass(`config.json valid — ${config.apps.length} app(s) (${config.apps.map((a) => a.name).join(', ')})`);
69
+ }
70
+ catch (err) {
71
+ fail('config.json', err.message);
72
+ }
73
+ return { config: config, credentials: credentials, tofuVersion: tofuVersion };
74
+ }
75
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/infra/preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Credentials } from './types';
2
+ export declare function loadOrCreateSuffix(projectRoot: string): Promise<string>;
3
+ export declare function buildStateBucketName(projectName: string, suffix: string): string;
4
+ export declare function ensureStateBucket(credentials: Credentials, bucketName: string): Promise<void>;
5
+ //# sourceMappingURL=s3-state-bucket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-state-bucket.d.ts","sourceRoot":"","sources":["../../src/infra/s3-state-bucket.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAYrC,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW7E;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CA4Bf"}
@@ -0,0 +1,92 @@
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.loadOrCreateSuffix = loadOrCreateSuffix;
40
+ exports.buildStateBucketName = buildStateBucketName;
41
+ exports.ensureStateBucket = ensureStateBucket;
42
+ const client_s3_1 = require("@aws-sdk/client-s3");
43
+ const fs = __importStar(require("fs-extra"));
44
+ const path = __importStar(require("path"));
45
+ const crypto = __importStar(require("crypto"));
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const STATE_FILE = '.fuel-infra-state.json';
48
+ function generateSuffix() {
49
+ return crypto.randomBytes(4).toString('hex');
50
+ }
51
+ async function loadOrCreateSuffix(projectRoot) {
52
+ const stateFilePath = path.join(projectRoot, STATE_FILE);
53
+ if (await fs.pathExists(stateFilePath)) {
54
+ const state = await fs.readJson(stateFilePath);
55
+ if (state.stateBucketSuffix) {
56
+ return state.stateBucketSuffix;
57
+ }
58
+ }
59
+ const suffix = generateSuffix();
60
+ await fs.writeJson(stateFilePath, { stateBucketSuffix: suffix }, { spaces: 2 });
61
+ return suffix;
62
+ }
63
+ function buildStateBucketName(projectName, suffix) {
64
+ return `${projectName}-infrastructure-tf-${suffix}`;
65
+ }
66
+ async function ensureStateBucket(credentials, bucketName) {
67
+ const client = new client_s3_1.S3Client({
68
+ region: credentials.AWS_REGION,
69
+ credentials: {
70
+ accessKeyId: credentials.AWS_ACCESS_KEY_ID,
71
+ secretAccessKey: credentials.AWS_SECRET_ACCESS_KEY,
72
+ },
73
+ });
74
+ try {
75
+ await client.send(new client_s3_1.HeadBucketCommand({ Bucket: bucketName }));
76
+ console.log(chalk_1.default.green(` ✓ State bucket already exists: ${bucketName}`));
77
+ return;
78
+ }
79
+ catch (err) {
80
+ if (err.name !== 'NotFound' && err['$metadata']?.httpStatusCode !== 404) {
81
+ throw err;
82
+ }
83
+ }
84
+ console.log(chalk_1.default.cyan(` Creating state bucket: ${bucketName}`));
85
+ await client.send(new client_s3_1.CreateBucketCommand({ Bucket: bucketName }));
86
+ await client.send(new client_s3_1.PutBucketVersioningCommand({
87
+ Bucket: bucketName,
88
+ VersioningConfiguration: { Status: 'Enabled' },
89
+ }));
90
+ console.log(chalk_1.default.green(` ✓ State bucket created with versioning enabled`));
91
+ }
92
+ //# sourceMappingURL=s3-state-bucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-state-bucket.js","sourceRoot":"","sources":["../../src/infra/s3-state-bucket.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBA,gDAWC;AAED,oDAEC;AAED,8CA+BC;AAtED,kDAK2B;AAC3B,6CAA8B;AAC9B,2CAA4B;AAC5B,+CAAgC;AAChC,kDAAyB;AAGzB,MAAM,UAAU,GAAG,wBAAwB,CAAA;AAM3C,SAAS,cAAc;IACrB,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC9C,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IACxD,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACvC,MAAM,KAAK,GAAe,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QAC1D,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC,iBAAiB,CAAA;QAChC,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;IAC7F,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAgB,oBAAoB,CAAC,WAAmB,EAAE,MAAc;IACtE,OAAO,GAAG,WAAW,sBAAsB,MAAM,EAAE,CAAA;AACrD,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,WAAwB,EACxB,UAAkB;IAElB,MAAM,MAAM,GAAG,IAAI,oBAAQ,CAAC;QAC1B,MAAM,EAAE,WAAW,CAAC,UAAU;QAC9B,WAAW,EAAE;YACX,WAAW,EAAE,WAAW,CAAC,iBAAiB;YAC1C,eAAe,EAAE,WAAW,CAAC,qBAAqB;SACnD;KACF,CAAC,CAAA;IAEF,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,6BAAiB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QAChE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC,CAAA;QAC1E,OAAM;IACR,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,IAAI,GAAG,CAAC,WAAW,CAAC,EAAE,cAAc,KAAK,GAAG,EAAE,CAAC;YACxE,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC,CAAA;IACjE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,+BAAmB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;IAClE,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,sCAA0B,CAAC;QAC7B,MAAM,EAAE,UAAU;QAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;KAC/C,CAAC,CACH,CAAA;IACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAA;AAC9E,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Credentials } from './types';
2
+ export declare function putSecret(credentials: Credentials, name: string, value: Record<string, unknown>): Promise<void>;
3
+ //# sourceMappingURL=secrets-manager-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-manager-client.d.ts","sourceRoot":"","sources":["../../src/infra/secrets-manager-client.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,wBAAsB,SAAS,CAC7B,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.putSecret = putSecret;
4
+ const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
5
+ async function putSecret(credentials, name, value) {
6
+ const client = new client_secrets_manager_1.SecretsManagerClient({
7
+ region: credentials.AWS_REGION,
8
+ credentials: {
9
+ accessKeyId: credentials.AWS_ACCESS_KEY_ID,
10
+ secretAccessKey: credentials.AWS_SECRET_ACCESS_KEY,
11
+ },
12
+ });
13
+ const secretString = JSON.stringify(value);
14
+ try {
15
+ await client.send(new client_secrets_manager_1.CreateSecretCommand({ Name: name, SecretString: secretString }));
16
+ }
17
+ catch (e) {
18
+ if (e.name === 'ResourceExistsException') {
19
+ await client.send(new client_secrets_manager_1.PutSecretValueCommand({ SecretId: name, SecretString: secretString }));
20
+ }
21
+ else {
22
+ throw e;
23
+ }
24
+ }
25
+ }
26
+ //# sourceMappingURL=secrets-manager-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-manager-client.js","sourceRoot":"","sources":["../../src/infra/secrets-manager-client.ts"],"names":[],"mappings":";;AAOA,8BAwBC;AA/BD,4EAIwC;AAGjC,KAAK,UAAU,SAAS,CAC7B,WAAwB,EACxB,IAAY,EACZ,KAA8B;IAE9B,MAAM,MAAM,GAAG,IAAI,6CAAoB,CAAC;QACtC,MAAM,EAAE,WAAW,CAAC,UAAU;QAC9B,WAAW,EAAE;YACX,WAAW,EAAE,WAAW,CAAC,iBAAiB;YAC1C,eAAe,EAAE,WAAW,CAAC,qBAAqB;SACnD;KACF,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IAE1C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,4CAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IACxF,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QAChB,IAAI,CAAC,CAAC,IAAI,KAAK,yBAAyB,EAAE,CAAC;YACzC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,8CAAqB,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;QAC9F,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function spawnStreaming(args: string[], cwd: string, env?: Record<string, string>): Promise<{
2
+ code: number;
3
+ combined: string;
4
+ }>;
5
+ //# sourceMappingURL=subprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/infra/subprocess.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAwB7C"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.spawnStreaming = spawnStreaming;
4
+ const child_process_1 = require("child_process");
5
+ function spawnStreaming(args, cwd, env) {
6
+ return new Promise((resolve) => {
7
+ const proc = (0, child_process_1.spawn)('tofu', args, {
8
+ stdio: ['ignore', 'pipe', 'pipe'],
9
+ cwd,
10
+ env: env ? { ...process.env, ...env } : undefined,
11
+ });
12
+ let combined = '';
13
+ proc.stdout.on('data', (chunk) => {
14
+ process.stdout.write(chunk);
15
+ combined += chunk.toString();
16
+ });
17
+ proc.stderr.on('data', (chunk) => {
18
+ process.stderr.write(chunk);
19
+ combined += chunk.toString();
20
+ });
21
+ proc.on('close', (code) => {
22
+ resolve({ code: code ?? 1, combined });
23
+ });
24
+ });
25
+ }
26
+ //# sourceMappingURL=subprocess.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess.js","sourceRoot":"","sources":["../../src/infra/subprocess.ts"],"names":[],"mappings":";;AAEA,wCA4BC;AA9BD,iDAAqC;AAErC,SAAgB,cAAc,CAC5B,IAAc,EACd,GAAW,EACX,GAA4B;IAE5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,IAAI,EAAE;YAC/B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG;YACH,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;SAClD,CAAC,CAAA;QAEF,IAAI,QAAQ,GAAG,EAAE,CAAA;QAEjB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC3B,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC3B,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;QAC9B,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAmB,EAAE,EAAE;YACvC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { InfraConfig, Credentials } from './types';
2
+ /**
3
+ * Parse a .tfvars file content into a Record<string, string>.
4
+ * Handles lines in the format: key = "value"
5
+ */
6
+ export declare function parseTfvars(content: string): Record<string, string>;
7
+ /**
8
+ * Serialize a Record<string, string> into .tfvars format.
9
+ * Produces: key = "value"\n lines joined with newline, ending with newline.
10
+ */
11
+ export declare function serializeTfvars(vars: Record<string, string>): string;
12
+ /**
13
+ * Patch main.tf: replace all ../../modules references with ./modules.
14
+ */
15
+ export declare function patchMainTf(infraRoot: string): Promise<void>;
16
+ /**
17
+ * Patch backend.tf: replace {project_name}, {aws_region}, and {unique_suffix} placeholders.
18
+ */
19
+ export declare function patchBackendTf(infraRoot: string, projectName: string, awsRegion: string, uniqueSuffix: string): Promise<void>;
20
+ /**
21
+ * Patch default.tfvars: set project_name, aws_region, db_password from config and credentials.
22
+ */
23
+ export declare function patchDefaultTfvars(infraRoot: string, config: InfraConfig, credentials: Credentials): Promise<void>;
24
+ /**
25
+ * Prune modules not referenced in main.tf (after patching).
26
+ * Always keeps modules listed in MODULES_DONT_REMOVE (e.g., secret-main).
27
+ */
28
+ export declare function pruneUnusedModules(infraRoot: string): Promise<void>;
29
+ /**
30
+ * Copy GitHub Actions workflow files into <projectDir>/.github/workflows/.
31
+ * Replaces what Terraform's github_repository_file resources used to do.
32
+ */
33
+ export declare function copyWorkflowFiles(projectDir: string, config: InfraConfig, infraSrcRoot: string): Promise<void>;
34
+ /**
35
+ * Generate a self-contained /infra folder in targetRoot.
36
+ * Copies ECS templates and all Terraform modules, then patches and prunes.
37
+ *
38
+ * The fuel-infrastructure sibling path is resolved via:
39
+ * - FUEL_INFRA_PATH env var (override for testing / CI)
40
+ * - process.cwd()/../fuel-infrastructure (default monorepo layout)
41
+ */
42
+ export declare function generateInfra(targetRoot: string, config: InfraConfig, credentials: Credentials): Promise<void>;
43
+ //# sourceMappingURL=template-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../../src/infra/template-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAyBlD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAenE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EACnB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA2Ef;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAyCf"}