@swovohq/fuel 0.2.0-alpha.8 → 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 +71 -19
- package/dist/bin/fuel.js +134 -44
- package/dist/bin/fuel.js.map +1 -1
- package/dist/commands/config-verify.d.ts +4 -0
- package/dist/commands/config-verify.d.ts.map +1 -0
- package/dist/commands/config-verify.js +66 -0
- package/dist/commands/config-verify.js.map +1 -0
- package/dist/commands/create-app.d.ts +6 -1
- package/dist/commands/create-app.d.ts.map +1 -1
- package/dist/commands/create-app.js +66 -45
- package/dist/commands/create-app.js.map +1 -1
- package/dist/commands/infra-deploy.d.ts +5 -0
- package/dist/commands/infra-deploy.d.ts.map +1 -1
- package/dist/commands/infra-deploy.js +59 -15
- package/dist/commands/infra-deploy.js.map +1 -1
- package/dist/commands/infra-destroy.d.ts +2 -0
- package/dist/commands/infra-destroy.d.ts.map +1 -1
- package/dist/commands/infra-destroy.js +4 -6
- package/dist/commands/infra-destroy.js.map +1 -1
- package/dist/commands/infra-init.d.ts +1 -0
- package/dist/commands/infra-init.d.ts.map +1 -1
- package/dist/commands/infra-init.js +99 -14
- package/dist/commands/infra-init.js.map +1 -1
- package/dist/commands/migrate-init.d.ts.map +1 -1
- package/dist/commands/migrate-init.js +28 -12
- package/dist/commands/migrate-init.js.map +1 -1
- package/dist/engines/template-source.d.ts.map +1 -1
- package/dist/engines/template-source.js +14 -1
- package/dist/engines/template-source.js.map +1 -1
- package/dist/infra/config-loader.d.ts.map +1 -1
- package/dist/infra/config-loader.js +10 -2
- package/dist/infra/config-loader.js.map +1 -1
- package/dist/infra/config-writer.d.ts +2 -7
- package/dist/infra/config-writer.d.ts.map +1 -1
- package/dist/infra/config-writer.js +5 -11
- package/dist/infra/config-writer.js.map +1 -1
- package/dist/infra/credentials.d.ts +10 -2
- package/dist/infra/credentials.d.ts.map +1 -1
- package/dist/infra/credentials.js +44 -25
- package/dist/infra/credentials.js.map +1 -1
- package/dist/infra/git-client.d.ts +1 -1
- package/dist/infra/git-client.d.ts.map +1 -1
- package/dist/infra/git-client.js +8 -4
- package/dist/infra/git-client.js.map +1 -1
- package/dist/infra/orchestrator.d.ts +4 -1
- package/dist/infra/orchestrator.d.ts.map +1 -1
- package/dist/infra/orchestrator.js +38 -29
- package/dist/infra/orchestrator.js.map +1 -1
- package/dist/infra/port-utils.d.ts +4 -0
- package/dist/infra/port-utils.d.ts.map +1 -0
- package/dist/infra/port-utils.js +77 -0
- package/dist/infra/port-utils.js.map +1 -0
- package/dist/infra/preflight.d.ts +1 -1
- package/dist/infra/preflight.d.ts.map +1 -1
- package/dist/infra/preflight.js +4 -4
- package/dist/infra/preflight.js.map +1 -1
- package/dist/infra/s3-state-bucket.d.ts +1 -1
- package/dist/infra/s3-state-bucket.d.ts.map +1 -1
- package/dist/infra/s3-state-bucket.js +21 -26
- package/dist/infra/s3-state-bucket.js.map +1 -1
- package/dist/infra/secrets-manager-client.d.ts.map +1 -1
- package/dist/infra/secrets-manager-client.js +35 -1
- package/dist/infra/secrets-manager-client.js.map +1 -1
- package/dist/infra/template-engine.d.ts.map +1 -1
- package/dist/infra/template-engine.js +11 -25
- package/dist/infra/template-engine.js.map +1 -1
- package/dist/infra/tofu-runner.d.ts +1 -2
- package/dist/infra/tofu-runner.d.ts.map +1 -1
- package/dist/infra/tofu-runner.js +5 -5
- package/dist/infra/tofu-runner.js.map +1 -1
- package/package.json +10 -6
- package/schema/fuel.schema.json +158 -0
|
@@ -37,38 +37,57 @@ exports.resolveCredentials = resolveCredentials;
|
|
|
37
37
|
const path = __importStar(require("path"));
|
|
38
38
|
const fs = __importStar(require("fs-extra"));
|
|
39
39
|
const types_1 = require("./types");
|
|
40
|
-
async function
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
async function tryReadCredentialsFile(credPath) {
|
|
41
|
+
if (!(await fs.pathExists(credPath)))
|
|
42
|
+
return {};
|
|
43
|
+
try {
|
|
44
|
+
const file = await fs.readJson(credPath);
|
|
45
|
+
const result = {};
|
|
46
|
+
for (const key of types_1.REQUIRED_CREDENTIAL_KEYS) {
|
|
47
|
+
if (file[key])
|
|
48
|
+
result[key] = file[key];
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
45
51
|
}
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
async function resolveCredentials(searchDir) {
|
|
49
|
-
// Priority 1: ALL keys present in env
|
|
50
|
-
const envValues = types_1.REQUIRED_CREDENTIAL_KEYS.map((k) => process.env[k]);
|
|
51
|
-
if (envValues.every(Boolean)) {
|
|
52
|
-
return Object.fromEntries(types_1.REQUIRED_CREDENTIAL_KEYS.map((k, i) => [k, envValues[i]]));
|
|
52
|
+
catch {
|
|
53
|
+
return {};
|
|
53
54
|
}
|
|
54
|
-
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve credentials by merging sources in priority order:
|
|
58
|
+
* 1. CLI flag overrides (highest)
|
|
59
|
+
* 2. .fuel-credentials file (searchDir, then CWD fallback)
|
|
60
|
+
* 3. Environment variables (lowest)
|
|
61
|
+
*
|
|
62
|
+
* Sources are merged per-key — e.g., AWS keys from env + GITHUB_TOKEN from file = valid.
|
|
63
|
+
*/
|
|
64
|
+
async function resolveCredentials(searchDir, overrides) {
|
|
65
|
+
// Collect file values from searchDir and CWD
|
|
55
66
|
const credPath = searchDir
|
|
56
67
|
? path.join(searchDir, '.fuel-credentials')
|
|
57
68
|
: path.resolve('.fuel-credentials');
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
61
|
-
// Priority 3: fallback to CWD when searchDir was provided and differs from CWD
|
|
69
|
+
const fileValues = await tryReadCredentialsFile(credPath);
|
|
70
|
+
// Fallback to CWD if searchDir was provided and differs
|
|
62
71
|
const cwd = process.cwd();
|
|
72
|
+
let cwdValues = {};
|
|
63
73
|
if (searchDir && path.resolve(searchDir) !== cwd) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
74
|
+
cwdValues = await tryReadCredentialsFile(path.resolve('.fuel-credentials'));
|
|
75
|
+
}
|
|
76
|
+
// Merge per-key: overrides → file (searchDir) → file (CWD) → env
|
|
77
|
+
const resolved = {};
|
|
78
|
+
for (const key of types_1.REQUIRED_CREDENTIAL_KEYS) {
|
|
79
|
+
resolved[key] =
|
|
80
|
+
overrides?.[key] ||
|
|
81
|
+
fileValues[key] ||
|
|
82
|
+
cwdValues[key] ||
|
|
83
|
+
process.env[key] ||
|
|
84
|
+
undefined;
|
|
85
|
+
}
|
|
86
|
+
const missing = types_1.REQUIRED_CREDENTIAL_KEYS.filter((k) => !resolved[k]);
|
|
87
|
+
if (missing.length > 0) {
|
|
88
|
+
throw new Error(`Missing credentials: ${missing.join(', ')}\n` +
|
|
89
|
+
`Provide them via CLI flags, .fuel-credentials file, or environment variables.`);
|
|
68
90
|
}
|
|
69
|
-
|
|
70
|
-
const missingFromEnv = types_1.REQUIRED_CREDENTIAL_KEYS.filter((k) => !process.env[k]);
|
|
71
|
-
throw new Error(`Credentials not found. Missing env vars: ${missingFromEnv.join(', ')}\n` +
|
|
72
|
-
`Or create a .fuel-credentials JSON file with those keys.`);
|
|
91
|
+
return resolved;
|
|
73
92
|
}
|
|
74
93
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,gDAqCC;AA/DD,2CAA4B;AAC5B,6CAA8B;AAC9B,mCAA8E;AAE9E,KAAK,UAAU,sBAAsB,CAAC,QAAgB;IACpD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,EAAE,CAAA;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAA2B,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAChE,MAAM,MAAM,GAA2C,EAAE,CAAA;QACzD,KAAK,MAAM,GAAG,IAAI,gCAAwB,EAAE,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,kBAAkB,CACtC,SAAkB,EAClB,SAAkD;IAElD,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,SAAS;QACxB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACrC,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAEzD,wDAAwD;IACxD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,IAAI,SAAS,GAA2C,EAAE,CAAA;IAC1D,IAAI,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;QACjD,SAAS,GAAG,MAAM,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAC7E,CAAC;IAED,iEAAiE;IACjE,MAAM,QAAQ,GAA2C,EAAE,CAAA;IAC3D,KAAK,MAAM,GAAG,IAAI,gCAAwB,EAAE,CAAC;QAC3C,QAAQ,CAAC,GAAG,CAAC;YACX,SAAS,EAAE,CAAC,GAAG,CAAC;gBAChB,UAAU,CAAC,GAAG,CAAC;gBACf,SAAS,CAAC,GAAG,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAChB,SAAS,CAAA;IACb,CAAC;IAED,MAAM,OAAO,GAAG,gCAAwB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC5C,+EAA+E,CAClF,CAAA;IACH,CAAC;IAED,OAAO,QAAuB,CAAA;AAChC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export declare function wireGitRemote(projectDir: string, repoUrl: string): Promise<void>;
|
|
2
2
|
export declare function commitAll(projectDir: string, message: string): Promise<boolean>;
|
|
3
|
-
export declare function pushToRemote(projectDir: string, githubToken: string, branches: string[]): Promise<void>;
|
|
3
|
+
export declare function pushToRemote(projectDir: string, githubToken: string, branches: string[], forcePush?: boolean): Promise<void>;
|
|
4
4
|
//# sourceMappingURL=git-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-client.d.ts","sourceRoot":"","sources":["../../src/infra/git-client.ts"],"names":[],"mappings":"AAgCA,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"git-client.d.ts","sourceRoot":"","sources":["../../src/infra/git-client.ts"],"names":[],"mappings":"AAgCA,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtF;AAED,wBAAsB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAarF;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,CAAC,EAAE,OAAO,GAClB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
|
package/dist/infra/git-client.js
CHANGED
|
@@ -25,9 +25,10 @@ function spawnQuiet(cmd, args, cwd) {
|
|
|
25
25
|
});
|
|
26
26
|
}
|
|
27
27
|
async function wireGitRemote(projectDir, repoUrl) {
|
|
28
|
-
|
|
28
|
+
// Try set-url quietly — it fails if origin doesn't exist yet
|
|
29
|
+
const setUrlResult = await spawnQuiet('git', ['remote', 'set-url', 'origin', repoUrl], projectDir);
|
|
29
30
|
if (setUrlResult.code !== 0) {
|
|
30
|
-
const addResult = await
|
|
31
|
+
const addResult = await spawnQuiet('git', ['remote', 'add', 'origin', repoUrl], projectDir);
|
|
31
32
|
if (addResult.code !== 0) {
|
|
32
33
|
throw new Error(`Failed to set git remote origin to ${repoUrl}`);
|
|
33
34
|
}
|
|
@@ -45,7 +46,7 @@ async function commitAll(projectDir, message) {
|
|
|
45
46
|
}
|
|
46
47
|
return true;
|
|
47
48
|
}
|
|
48
|
-
async function pushToRemote(projectDir, githubToken, branches) {
|
|
49
|
+
async function pushToRemote(projectDir, githubToken, branches, forcePush) {
|
|
49
50
|
const { stdout: originalUrl } = await spawnQuiet('git', ['remote', 'get-url', 'origin'], projectDir);
|
|
50
51
|
const authUrl = originalUrl.replace('https://github.com/', `https://x-access-token:${githubToken}@github.com/`);
|
|
51
52
|
await spawnSimple('git', ['remote', 'set-url', 'origin', authUrl], projectDir);
|
|
@@ -59,7 +60,10 @@ async function pushToRemote(projectDir, githubToken, branches) {
|
|
|
59
60
|
throw new Error(`Failed to create local branch: ${branch}`);
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
|
-
const
|
|
63
|
+
const pushArgs = forcePush
|
|
64
|
+
? ['push', '--force', '-u', 'origin', branch]
|
|
65
|
+
: ['push', '-u', 'origin', branch];
|
|
66
|
+
const pushResult = await spawnSimple('git', pushArgs, projectDir);
|
|
63
67
|
if (pushResult.code !== 0) {
|
|
64
68
|
throw new Error(`Failed to push branch: ${branch}`);
|
|
65
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-client.js","sourceRoot":"","sources":["../../src/infra/git-client.ts"],"names":[],"mappings":";;AAgCA,
|
|
1
|
+
{"version":3,"file":"git-client.js","sourceRoot":"","sources":["../../src/infra/git-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { InfraConfig, Credentials } from './types';
|
|
2
2
|
export interface OrchestratorOptions {
|
|
3
|
-
|
|
3
|
+
destroyOnFailure?: boolean;
|
|
4
4
|
planOnly?: boolean;
|
|
5
|
+
targetBranch?: string;
|
|
6
|
+
forcePush?: boolean;
|
|
7
|
+
skipBranchProtection?: boolean;
|
|
5
8
|
}
|
|
6
9
|
export declare function runInfraOrchestrator(targetRoot: string, _appName: string, config: InfraConfig, credentials: Credentials, options?: OrchestratorOptions): Promise<void>;
|
|
7
10
|
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/infra/orchestrator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/infra/orchestrator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAqDlD,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,OAAO,CAAC,IAAI,CAAC,CA0Jf"}
|
|
@@ -37,12 +37,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.runInfraOrchestrator = runInfraOrchestrator;
|
|
40
|
-
const crypto = __importStar(require("crypto"));
|
|
41
|
-
const fs = __importStar(require("fs"));
|
|
42
40
|
const path = __importStar(require("path"));
|
|
43
41
|
const chalk_1 = __importDefault(require("chalk"));
|
|
44
42
|
const tofu_runner_1 = require("./tofu-runner");
|
|
45
43
|
const secrets_manager_client_1 = require("./secrets-manager-client");
|
|
44
|
+
const config_writer_1 = require("./config-writer");
|
|
46
45
|
const git_client_1 = require("./git-client");
|
|
47
46
|
const github_client_1 = require("./github-client");
|
|
48
47
|
const github_secrets_client_1 = require("./github-secrets-client");
|
|
@@ -66,7 +65,7 @@ async function runCompensation(infraDir, credentials, tofuVars) {
|
|
|
66
65
|
}
|
|
67
66
|
console.log(chalk_1.default.green('AWS resources cleaned up'));
|
|
68
67
|
}
|
|
69
|
-
function printOutputTable(albDns, ecrUrl, githubRepoUrl
|
|
68
|
+
function printOutputTable(albDns, ecrUrl, githubRepoUrl) {
|
|
70
69
|
const divider = chalk_1.default.gray('─'.repeat(60));
|
|
71
70
|
console.log('\n' + divider);
|
|
72
71
|
console.log(chalk_1.default.bold(' Deployment Complete'));
|
|
@@ -74,8 +73,6 @@ function printOutputTable(albDns, ecrUrl, githubRepoUrl, dbUsername, dbPassword)
|
|
|
74
73
|
console.log(` ${chalk_1.default.dim('ALB DNS')} ${albDns}`);
|
|
75
74
|
console.log(` ${chalk_1.default.dim('ECR URL')} ${ecrUrl}`);
|
|
76
75
|
console.log(` ${chalk_1.default.dim('GitHub Repo')} ${githubRepoUrl}`);
|
|
77
|
-
console.log(` ${chalk_1.default.dim('DB Username')} ${dbUsername}`);
|
|
78
|
-
console.log(` ${chalk_1.default.dim('DB Password')} ${dbPassword} ${chalk_1.default.yellow("Save these — they won't be shown again")}`);
|
|
79
76
|
console.log(divider);
|
|
80
77
|
console.log(chalk_1.default.cyan('\n Next steps:'));
|
|
81
78
|
console.log(' Your code has been pushed. Your first deploy will start shortly.\n');
|
|
@@ -85,36 +82,39 @@ async function runInfraOrchestrator(targetRoot, _appName, config, credentials, o
|
|
|
85
82
|
const repoName = `${config.name}-monorepo`;
|
|
86
83
|
// Generate TofuVars
|
|
87
84
|
const tofuVars = {
|
|
88
|
-
db_password: crypto.randomBytes(32).toString('hex'),
|
|
89
85
|
db_username: slugify(config.name),
|
|
90
86
|
db_name: slugify(config.name),
|
|
91
87
|
github_repo_name: repoName,
|
|
92
88
|
};
|
|
93
89
|
// Ensure S3 state bucket exists (before Tofu init)
|
|
94
90
|
console.log(chalk_1.default.cyan('--- Ensuring state bucket exists ---'));
|
|
95
|
-
const suffix =
|
|
91
|
+
const suffix = (0, s3_state_bucket_1.deriveSuffix)(config.name);
|
|
96
92
|
const bucketName = (0, s3_state_bucket_1.buildStateBucketName)(config.name, suffix);
|
|
97
93
|
await (0, s3_state_bucket_1.ensureStateBucket)(credentials, bucketName);
|
|
98
94
|
// Write secret to AWS Secrets Manager (before Tofu — Tofu reads it via data.tf)
|
|
99
95
|
const secretName = `${config.name}-infrastructure-variables`;
|
|
100
|
-
const
|
|
101
|
-
|
|
96
|
+
const secretPayload = {
|
|
97
|
+
...config,
|
|
98
|
+
seed: (0, config_writer_1.generateSeed)(),
|
|
99
|
+
aws_region: credentials.AWS_REGION,
|
|
100
|
+
github_org: credentials.GITHUB_ORGANIZATION,
|
|
101
|
+
};
|
|
102
102
|
console.log(chalk_1.default.cyan('--- Writing infrastructure secret ---'));
|
|
103
|
-
await (0, secrets_manager_client_1.putSecret)(credentials, secretName,
|
|
103
|
+
await (0, secrets_manager_client_1.putSecret)(credentials, secretName, secretPayload);
|
|
104
104
|
console.log(chalk_1.default.green('Secret written to AWS Secrets Manager'));
|
|
105
105
|
// SIGINT compensation setup
|
|
106
106
|
const state = { tofuStarted: false };
|
|
107
107
|
const sigintHandler = async () => {
|
|
108
|
-
if (options?.
|
|
109
|
-
console.log(chalk_1.default.yellow('\nInterrupted — partial resources preserved.'));
|
|
110
|
-
console.log(chalk_1.default.yellow('Re-run "fuel infra:deploy" to resume.\n'));
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
108
|
+
if (options?.destroyOnFailure) {
|
|
113
109
|
console.log(chalk_1.default.yellow('\nInterrupted — running compensation...'));
|
|
114
110
|
if (state.tofuStarted) {
|
|
115
111
|
await runCompensation(infraDir, credentials, tofuVars);
|
|
116
112
|
}
|
|
117
113
|
}
|
|
114
|
+
else {
|
|
115
|
+
console.log(chalk_1.default.yellow('\nInterrupted — partial resources preserved.'));
|
|
116
|
+
console.log(chalk_1.default.yellow('Re-run "fuel infra:deploy" to resume.\n'));
|
|
117
|
+
}
|
|
118
118
|
process.exit(1);
|
|
119
119
|
};
|
|
120
120
|
process.once('SIGINT', sigintHandler);
|
|
@@ -163,38 +163,47 @@ async function runInfraOrchestrator(targetRoot, _appName, config, credentials, o
|
|
|
163
163
|
if (committed) {
|
|
164
164
|
console.log(chalk_1.default.green('Infrastructure files committed'));
|
|
165
165
|
}
|
|
166
|
-
const
|
|
166
|
+
const allBranches = [...new Set(config.apps.map(app => app.branch))];
|
|
167
|
+
const branches = options?.targetBranch
|
|
168
|
+
? allBranches.filter(b => b === options.targetBranch)
|
|
169
|
+
: allBranches;
|
|
167
170
|
try {
|
|
168
|
-
await (0, git_client_1.pushToRemote)(targetRoot, credentials.GITHUB_TOKEN, branches);
|
|
171
|
+
await (0, git_client_1.pushToRemote)(targetRoot, credentials.GITHUB_TOKEN, branches, options?.forcePush);
|
|
169
172
|
console.log(chalk_1.default.green(`Code pushed to: ${branches.join(', ')}`));
|
|
170
173
|
}
|
|
171
174
|
catch {
|
|
172
175
|
console.log(chalk_1.default.yellow(`Warning: automatic push failed. Push manually: git push -u origin ${branches.join(' ')}`));
|
|
173
176
|
}
|
|
174
177
|
// Step 5: Branch protections
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
178
|
+
if (!options?.skipBranchProtection) {
|
|
179
|
+
console.log(chalk_1.default.cyan('--- Applying branch protections ---'));
|
|
180
|
+
for (const branch of branches) {
|
|
181
|
+
try {
|
|
182
|
+
await (0, github_client_1.setBranchProtection)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName, branch);
|
|
183
|
+
console.log(chalk_1.default.green(`✓ Branch protection set for: ${branch}`));
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
console.log(chalk_1.default.yellow(`Warning: could not set branch protection for ${branch}`));
|
|
187
|
+
}
|
|
183
188
|
}
|
|
184
189
|
}
|
|
190
|
+
else {
|
|
191
|
+
console.log(chalk_1.default.yellow('--- Skipping branch protections (--skip-branch-protection) ---'));
|
|
192
|
+
}
|
|
185
193
|
// Print output table
|
|
186
194
|
const albDns = result.outputs['alb_dns'].value;
|
|
187
195
|
const ecrUrl = result.outputs['ecr_url'].value;
|
|
188
|
-
printOutputTable(albDns, ecrUrl, githubRepoUrl
|
|
196
|
+
printOutputTable(albDns, ecrUrl, githubRepoUrl);
|
|
189
197
|
}
|
|
190
198
|
catch (err) {
|
|
191
199
|
if (err instanceof tofu_runner_1.TofuApplyError) {
|
|
192
|
-
if (options?.
|
|
200
|
+
if (options?.destroyOnFailure) {
|
|
201
|
+
await runCompensation(infraDir, credentials, tofuVars);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
193
204
|
console.log(chalk_1.default.yellow('\n Partial resources preserved. Fix the issue and re-run:'));
|
|
194
205
|
console.log(chalk_1.default.yellow(' fuel infra:deploy\n'));
|
|
195
|
-
process.exit(1);
|
|
196
206
|
}
|
|
197
|
-
await runCompensation(infraDir, credentials, tofuVars);
|
|
198
207
|
process.exit(1);
|
|
199
208
|
}
|
|
200
209
|
throw err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/infra/orchestrator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/infra/orchestrator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,oDAgKC;AA/ND,2CAA4B;AAC5B,kDAAyB;AAEzB,+CAAwF;AACxF,qEAAoD;AACpD,mDAA8C;AAC9C,6CAAqE;AACrE,mDAAuE;AACvE,mEAAwD;AACxD,6CAA6C;AAC7C,uDAAyF;AAEzF,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;AACvD,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,QAAgB,EAChB,WAAwB,EACxB,QAAkB;IAElB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAA;IAC7D,MAAM,IAAI,GAAG,IAAA,8BAAgB,EAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;IACpD,MAAM,MAAM,GAAG;QACb,iBAAiB,EAAE,WAAW,CAAC,iBAAiB;QAChD,qBAAqB,EAAE,WAAW,CAAC,qBAAqB;QACxD,UAAU,EAAE,WAAW,CAAC,UAAU;KACnC,CAAA;IACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAA,2BAAc,EAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAE7D,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC,CAAA;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAc,EACd,MAAc,EACd,aAAqB;IAErB,MAAM,OAAO,GAAG,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,CAAA;IAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACpB,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,MAAM,EAAE,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,MAAM,EAAE,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,eAAK,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,aAAa,EAAE,CAAC,CAAA;IAClE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAA;AACrF,CAAC;AAUM,KAAK,UAAU,oBAAoB,CACxC,UAAkB,EAClB,QAAgB,EAChB,MAAmB,EACnB,WAAwB,EACxB,OAA6B;IAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,WAAW,CAAA;IAE1C,oBAAoB;IACpB,MAAM,QAAQ,GAAa;QACzB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;QAC7B,gBAAgB,EAAE,QAAQ;KAC3B,CAAA;IAED,mDAAmD;IACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,IAAA,8BAAY,EAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACxC,MAAM,UAAU,GAAG,IAAA,sCAAoB,EAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC5D,MAAM,IAAA,mCAAiB,EAAC,WAAW,EAAE,UAAU,CAAC,CAAA;IAEhD,gFAAgF;IAChF,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,IAAI,2BAA2B,CAAA;IAC5D,MAAM,aAAa,GAAG;QACpB,GAAG,MAAM;QACT,IAAI,EAAE,IAAA,4BAAY,GAAE;QACpB,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,UAAU,EAAE,WAAW,CAAC,mBAAmB;KAC5C,CAAA;IACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAA;IAChE,MAAM,IAAA,kCAAS,EAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAA;IACvD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAA;IAEjE,4BAA4B;IAC5B,MAAM,KAAK,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAA;IAEpC,MAAM,aAAa,GAAG,KAAK,IAAI,EAAE;QAC/B,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAA;YACpE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,MAAM,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;YACxD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAA;YACzE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAA;QACtE,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAA;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;IAErC,IAAI,CAAC;QACH,sDAAsD;QACtD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAA;YAC7D,IAAI,CAAC;gBACH,MAAM,IAAA,gCAAgB,EACpB,WAAW,CAAC,YAAY,EACxB,WAAW,CAAC,mBAAmB,EAC/B,QAAQ,CACT,CAAA;gBACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,yBAAyB,WAAW,CAAC,mBAAmB,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAA;YAClG,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,8DAA8D;gBAC9D,IAAI,GAAG,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACxB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,cAAc,WAAW,CAAC,mBAAmB,IAAI,QAAQ,gCAAgC,CAAC,CAAC,CAAA;gBACtH,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAA;QACxB,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAY,EAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE;YACjE,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC5B,CAAC,CAAA;QAEF,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAA;YAC5E,OAAM;QACR,CAAC;QAED,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAA;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAQ,CAAC,eAAe,CAAC,CAAC,KAAK,CAAA;QACtD,MAAM,OAAO,GAA2B;YACtC,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,YAAY,EAAE,OAAO;YACrB,YAAY,EAAE,MAAM,CAAC,IAAI;SAC1B,CAAA;QACD,MAAM,IAAA,sCAAc,EAClB,WAAW,CAAC,YAAY,EACxB,WAAW,CAAC,mBAAmB,EAC/B,QAAQ,EACR,OAAO,CACR,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAA;QAE/D,oBAAoB;QACpB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAQ,CAAC,sBAAsB,CAAC,CAAC,KAAK,CAAA;QACnE,MAAM,IAAA,0BAAa,EAAC,UAAU,EAAE,aAAa,CAAC,CAAA;QAC9C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAEjD,MAAM,SAAS,GAAG,MAAM,IAAA,sBAAS,EAAC,UAAU,EAAE,kCAAkC,CAAC,CAAA;QACjF,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAA;QAC5D,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACpE,MAAM,QAAQ,GAAG,OAAO,EAAE,YAAY;YACpC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC;YACrD,CAAC,CAAC,WAAW,CAAA;QACf,IAAI,CAAC;YACH,MAAM,IAAA,yBAAY,EAAC,UAAU,EAAE,WAAW,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;YACtF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,qEAAqE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;QACtH,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAA;YAC9D,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,IAAA,mCAAmB,EACvB,WAAW,CAAC,YAAY,EACxB,WAAW,CAAC,mBAAmB,EAC/B,QAAQ,EACR,MAAM,CACP,CAAA;oBACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC,CAAA;gBACpE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gDAAgD,MAAM,EAAE,CAAC,CAAC,CAAA;gBACrF,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gEAAgE,CAAC,CAAC,CAAA;QAC7F,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAA;QAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAA;QAC/C,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAA;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,4BAAc,EAAE,CAAC;YAClC,IAAI,OAAO,EAAE,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;YACxD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAC,CAAA;gBACvF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAA;YACtD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QACD,MAAM,GAAG,CAAA;IACX,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function isPortAvailable(port: number): Promise<boolean>;
|
|
2
|
+
export declare function findAvailablePort(preferredPort: number): Promise<number>;
|
|
3
|
+
export declare function patchDotEnvPort(envFilePath: string, key: string, port: number): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=port-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-utils.d.ts","sourceRoot":"","sources":["../../src/infra/port-utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS9D;AAED,wBAAsB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAc9E;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isPortAvailable = isPortAvailable;
|
|
37
|
+
exports.findAvailablePort = findAvailablePort;
|
|
38
|
+
exports.patchDotEnvPort = patchDotEnvPort;
|
|
39
|
+
const net = __importStar(require("net"));
|
|
40
|
+
const fs = __importStar(require("fs-extra"));
|
|
41
|
+
function isPortAvailable(port) {
|
|
42
|
+
return new Promise((resolve) => {
|
|
43
|
+
const server = net.createServer();
|
|
44
|
+
server.once('error', () => resolve(false));
|
|
45
|
+
server.once('listening', () => {
|
|
46
|
+
server.close(() => resolve(true));
|
|
47
|
+
});
|
|
48
|
+
server.listen(port, '127.0.0.1');
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async function findAvailablePort(preferredPort) {
|
|
52
|
+
if (await isPortAvailable(preferredPort)) {
|
|
53
|
+
return preferredPort;
|
|
54
|
+
}
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const server = net.createServer();
|
|
57
|
+
server.once('error', reject);
|
|
58
|
+
server.once('listening', () => {
|
|
59
|
+
const addr = server.address();
|
|
60
|
+
const port = addr.port;
|
|
61
|
+
server.close(() => resolve(port));
|
|
62
|
+
});
|
|
63
|
+
server.listen(0, '127.0.0.1');
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async function patchDotEnvPort(envFilePath, key, port) {
|
|
67
|
+
let content = await fs.readFile(envFilePath, 'utf-8');
|
|
68
|
+
const regex = new RegExp(`^${key}=.*$`, 'm');
|
|
69
|
+
if (regex.test(content)) {
|
|
70
|
+
content = content.replace(regex, `${key}=${port}`);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
content = content.trimEnd() + `\n${key}=${port}\n`;
|
|
74
|
+
}
|
|
75
|
+
await fs.writeFile(envFilePath, content, 'utf-8');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=port-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-utils.js","sourceRoot":"","sources":["../../src/infra/port-utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,0CASC;AAED,8CAcC;AAED,0CAaC;AA3CD,yCAA0B;AAC1B,6CAA8B;AAE9B,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;AACJ,CAAC;AAEM,KAAK,UAAU,iBAAiB,CAAC,aAAqB;IAC3D,IAAI,MAAM,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC;QACzC,OAAO,aAAa,CAAA;IACtB,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAC5B,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAqB,CAAA;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;YACtB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACnC,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAA;IAC/B,CAAC,CAAC,CAAA;AACJ,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,GAAW,EACX,IAAY;IAEZ,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5C,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,IAAI,IAAI,IAAI,CAAA;IACpD,CAAC;IACD,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -5,5 +5,5 @@ export interface PreflightResult {
|
|
|
5
5
|
credentials: Credentials;
|
|
6
6
|
tofuVersion: string;
|
|
7
7
|
}
|
|
8
|
-
export declare function runPreflight(configPath: string): Promise<PreflightResult>;
|
|
8
|
+
export declare function runPreflight(configPath: string, credentialOverrides?: Partial<Record<import('./types').CredentialKey, string>>): Promise<PreflightResult>;
|
|
9
9
|
//# sourceMappingURL=preflight.d.ts.map
|
|
@@ -1 +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,
|
|
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,CAChC,UAAU,EAAE,MAAM,EAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,GAC7E,OAAO,CAAC,eAAe,CAAC,CA8B1B"}
|
package/dist/infra/preflight.js
CHANGED
|
@@ -41,7 +41,7 @@ function checkTofuVersion() {
|
|
|
41
41
|
}
|
|
42
42
|
return `${match[1]}.${match[2]}.${match[3]}`;
|
|
43
43
|
}
|
|
44
|
-
async function runPreflight(configPath) {
|
|
44
|
+
async function runPreflight(configPath, credentialOverrides) {
|
|
45
45
|
// Check 1: tofu binary
|
|
46
46
|
let tofuVersion;
|
|
47
47
|
try {
|
|
@@ -54,7 +54,7 @@ async function runPreflight(configPath) {
|
|
|
54
54
|
// Check 2: credentials
|
|
55
55
|
let credentials;
|
|
56
56
|
try {
|
|
57
|
-
credentials = await (0, credentials_1.resolveCredentials)();
|
|
57
|
+
credentials = await (0, credentials_1.resolveCredentials)(undefined, credentialOverrides);
|
|
58
58
|
pass('AWS credentials valid');
|
|
59
59
|
pass('GitHub token valid');
|
|
60
60
|
}
|
|
@@ -65,10 +65,10 @@ async function runPreflight(configPath) {
|
|
|
65
65
|
let config;
|
|
66
66
|
try {
|
|
67
67
|
config = await (0, config_loader_1.loadInfraConfig)(configPath);
|
|
68
|
-
pass(`
|
|
68
|
+
pass(`fuel.yml valid — ${config.apps.length} app(s) (${config.apps.map((a) => a.name).join(', ')})`);
|
|
69
69
|
}
|
|
70
70
|
catch (err) {
|
|
71
|
-
fail('
|
|
71
|
+
fail('fuel.yml', err.message);
|
|
72
72
|
}
|
|
73
73
|
return { config: config, credentials: credentials, tofuVersion: tofuVersion };
|
|
74
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/infra/preflight.ts"],"names":[],"mappings":";;;;;AAkBA,4CA2BC;AAQD,
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../../src/infra/preflight.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Credentials } from './types';
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function deriveSuffix(projectName: string): string;
|
|
3
3
|
export declare function buildStateBucketName(projectName: string, suffix: string): string;
|
|
4
4
|
export declare function ensureStateBucket(credentials: Credentials, bucketName: string): Promise<void>;
|
|
5
5
|
//# sourceMappingURL=s3-state-bucket.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-state-bucket.d.ts","sourceRoot":"","sources":["../../src/infra/s3-state-bucket.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"s3-state-bucket.d.ts","sourceRoot":"","sources":["../../src/infra/s3-state-bucket.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;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,CAyCf"}
|
|
@@ -36,29 +36,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
36
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.
|
|
39
|
+
exports.deriveSuffix = deriveSuffix;
|
|
40
40
|
exports.buildStateBucketName = buildStateBucketName;
|
|
41
41
|
exports.ensureStateBucket = ensureStateBucket;
|
|
42
42
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
43
|
-
const fs = __importStar(require("fs-extra"));
|
|
44
|
-
const path = __importStar(require("path"));
|
|
45
43
|
const crypto = __importStar(require("crypto"));
|
|
46
44
|
const chalk_1 = __importDefault(require("chalk"));
|
|
47
|
-
|
|
48
|
-
|
|
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;
|
|
45
|
+
function deriveSuffix(projectName) {
|
|
46
|
+
return crypto.createHash('sha256').update(projectName).digest('hex').slice(0, 8);
|
|
62
47
|
}
|
|
63
48
|
function buildStateBucketName(projectName, suffix) {
|
|
64
49
|
return `${projectName}-infrastructure-tf-${suffix}`;
|
|
@@ -77,16 +62,26 @@ async function ensureStateBucket(credentials, bucketName) {
|
|
|
77
62
|
return;
|
|
78
63
|
}
|
|
79
64
|
catch (err) {
|
|
80
|
-
|
|
81
|
-
|
|
65
|
+
const statusCode = err['$metadata']?.httpStatusCode;
|
|
66
|
+
if (statusCode !== 404 && err.name !== 'NotFound') {
|
|
67
|
+
const detail = err.message || err.name || 'Unknown error';
|
|
68
|
+
throw new Error(`Failed to check state bucket "${bucketName}" (HTTP ${statusCode || '?'}): ${detail}\n` +
|
|
69
|
+
'Verify your AWS credentials have s3:HeadBucket permission and the region is correct.');
|
|
82
70
|
}
|
|
83
71
|
}
|
|
84
72
|
console.log(chalk_1.default.cyan(` Creating state bucket: ${bucketName}`));
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
73
|
+
try {
|
|
74
|
+
await client.send(new client_s3_1.CreateBucketCommand({ Bucket: bucketName }));
|
|
75
|
+
await client.send(new client_s3_1.PutBucketVersioningCommand({
|
|
76
|
+
Bucket: bucketName,
|
|
77
|
+
VersioningConfiguration: { Status: 'Enabled' },
|
|
78
|
+
}));
|
|
79
|
+
console.log(chalk_1.default.green(` ✓ State bucket created with versioning enabled`));
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
const detail = err.message || err.name || 'Unknown error';
|
|
83
|
+
throw new Error(`Failed to create state bucket "${bucketName}": ${detail}\n` +
|
|
84
|
+
'Verify your AWS credentials have s3:CreateBucket permission and the region is correct.');
|
|
85
|
+
}
|
|
91
86
|
}
|
|
92
87
|
//# sourceMappingURL=s3-state-bucket.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-state-bucket.js","sourceRoot":"","sources":["../../src/infra/s3-state-bucket.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"s3-state-bucket.js","sourceRoot":"","sources":["../../src/infra/s3-state-bucket.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,oCAEC;AAED,oDAEC;AAED,8CA4CC;AA9DD,kDAK2B;AAC3B,+CAAgC;AAChC,kDAAyB;AAGzB,SAAgB,YAAY,CAAC,WAAmB;IAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAClF,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,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,CAAC,EAAE,cAAc,CAAA;QACnD,IAAI,UAAU,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAClD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,eAAe,CAAA;YACzD,MAAM,IAAI,KAAK,CACb,iCAAiC,UAAU,WAAW,UAAU,IAAI,GAAG,MAAM,MAAM,IAAI;gBACrF,sFAAsF,CACzF,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC,CAAA;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,+BAAmB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA;QAClE,MAAM,MAAM,CAAC,IAAI,CACf,IAAI,sCAA0B,CAAC;YAC7B,MAAM,EAAE,UAAU;YAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC/C,CAAC,CACH,CAAA;QACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC,CAAA;IAC9E,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,eAAe,CAAA;QACzD,MAAM,IAAI,KAAK,CACb,kCAAkC,UAAU,MAAM,MAAM,IAAI;YAC1D,wFAAwF,CAC3F,CAAA;IACH,CAAC;AACH,CAAC"}
|