@swovohq/fuel 0.2.2-alpha.87 → 0.2.2-alpha.89
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/README.md +65 -2
- package/dist/bin/fuel.js +10 -31
- package/dist/bin/fuel.js.map +1 -1
- package/dist/commands/config-verify.d.ts.map +1 -1
- package/dist/commands/config-verify.js +14 -6
- package/dist/commands/config-verify.js.map +1 -1
- package/dist/commands/create-app.d.ts.map +1 -1
- package/dist/commands/create-app.js +10 -3
- package/dist/commands/create-app.js.map +1 -1
- package/dist/commands/infra-deploy.d.ts +4 -0
- package/dist/commands/infra-deploy.d.ts.map +1 -1
- package/dist/commands/infra-deploy.js +75 -43
- package/dist/commands/infra-deploy.js.map +1 -1
- package/dist/commands/infra-destroy.js +3 -3
- package/dist/commands/infra-destroy.js.map +1 -1
- package/dist/commands/infra-init.d.ts +91 -0
- package/dist/commands/infra-init.d.ts.map +1 -1
- package/dist/commands/infra-init.js +510 -80
- package/dist/commands/infra-init.js.map +1 -1
- package/dist/commands/infra-pull.d.ts.map +1 -1
- package/dist/commands/infra-pull.js +6 -5
- package/dist/commands/infra-pull.js.map +1 -1
- package/dist/infra/azure-defaults.d.ts +49 -0
- package/dist/infra/azure-defaults.d.ts.map +1 -0
- package/dist/infra/azure-defaults.js +52 -0
- package/dist/infra/azure-defaults.js.map +1 -0
- package/dist/infra/azure-keyvault-client.d.ts +4 -0
- package/dist/infra/azure-keyvault-client.d.ts.map +1 -0
- package/dist/infra/azure-keyvault-client.js +57 -0
- package/dist/infra/azure-keyvault-client.js.map +1 -0
- package/dist/infra/azure-rbac.d.ts +11 -0
- package/dist/infra/azure-rbac.d.ts.map +1 -0
- package/dist/infra/azure-rbac.js +47 -0
- package/dist/infra/azure-rbac.js.map +1 -0
- package/dist/infra/azure-state-storage.d.ts +20 -0
- package/dist/infra/azure-state-storage.d.ts.map +1 -0
- package/dist/infra/azure-state-storage.js +229 -0
- package/dist/infra/azure-state-storage.js.map +1 -0
- package/dist/infra/credentials.d.ts +2 -2
- package/dist/infra/credentials.d.ts.map +1 -1
- package/dist/infra/credentials.js +8 -4
- package/dist/infra/credentials.js.map +1 -1
- package/dist/infra/deployment-detect.d.ts +9 -0
- package/dist/infra/deployment-detect.d.ts.map +1 -0
- package/dist/infra/deployment-detect.js +53 -0
- package/dist/infra/deployment-detect.js.map +1 -0
- package/dist/infra/github-client.d.ts +6 -0
- package/dist/infra/github-client.d.ts.map +1 -1
- package/dist/infra/github-client.js +31 -4
- package/dist/infra/github-client.js.map +1 -1
- package/dist/infra/github-token-link.d.ts +4 -0
- package/dist/infra/github-token-link.d.ts.map +1 -0
- package/dist/infra/github-token-link.js +28 -0
- package/dist/infra/github-token-link.js.map +1 -0
- package/dist/infra/orchestrator.d.ts +4 -1
- package/dist/infra/orchestrator.d.ts.map +1 -1
- package/dist/infra/orchestrator.js +203 -66
- package/dist/infra/orchestrator.js.map +1 -1
- package/dist/infra/preflight.d.ts.map +1 -1
- package/dist/infra/preflight.js +17 -9
- package/dist/infra/preflight.js.map +1 -1
- package/dist/infra/remote-secret.d.ts +14 -0
- package/dist/infra/remote-secret.d.ts.map +1 -0
- package/dist/infra/remote-secret.js +42 -0
- package/dist/infra/remote-secret.js.map +1 -0
- package/dist/infra/template-engine.d.ts +13 -4
- package/dist/infra/template-engine.d.ts.map +1 -1
- package/dist/infra/template-engine.js +141 -49
- package/dist/infra/template-engine.js.map +1 -1
- package/dist/infra/tofu-runner.d.ts +4 -3
- package/dist/infra/tofu-runner.d.ts.map +1 -1
- package/dist/infra/tofu-runner.js +36 -27
- package/dist/infra/tofu-runner.js.map +1 -1
- package/dist/infra/types.d.ts +239 -16
- package/dist/infra/types.d.ts.map +1 -1
- package/dist/infra/types.js +206 -18
- package/dist/infra/types.js.map +1 -1
- package/dist/infra-templates/TODO-azure-prod.md +119 -0
- package/dist/infra-templates/modules/azure-container-app/main.tf +124 -0
- package/dist/infra-templates/modules/azure-container-app/outputs.tf +24 -0
- package/dist/infra-templates/modules/azure-container-app/variables.tf +80 -0
- package/dist/infra-templates/modules/azure-container-apps-environment/main.tf +18 -0
- package/dist/infra-templates/modules/azure-container-apps-environment/outputs.tf +14 -0
- package/dist/infra-templates/modules/azure-container-apps-environment/variables.tf +24 -0
- package/dist/infra-templates/modules/azure-container-registry/main.tf +10 -0
- package/dist/infra-templates/modules/azure-container-registry/outputs.tf +14 -0
- package/dist/infra-templates/modules/azure-container-registry/variables.tf +20 -0
- package/dist/infra-templates/modules/azure-front-door/main.tf +80 -0
- package/dist/infra-templates/modules/azure-front-door/outputs.tf +20 -0
- package/dist/infra-templates/modules/azure-front-door/variables.tf +26 -0
- package/dist/infra-templates/modules/azure-github-oidc/main.tf +48 -0
- package/dist/infra-templates/modules/azure-github-oidc/outputs.tf +9 -0
- package/dist/infra-templates/modules/azure-github-oidc/variables.tf +69 -0
- package/dist/infra-templates/modules/azure-key-vault/main.tf +21 -0
- package/dist/infra-templates/modules/azure-key-vault/outputs.tf +11 -0
- package/dist/infra-templates/modules/azure-key-vault/variables.tf +43 -0
- package/dist/infra-templates/modules/azure-monitor/main.tf +29 -0
- package/dist/infra-templates/modules/azure-monitor/outputs.tf +17 -0
- package/dist/infra-templates/modules/azure-monitor/variables.tf +32 -0
- package/dist/infra-templates/modules/azure-network/main.tf +134 -0
- package/dist/infra-templates/modules/azure-network/outputs.tf +44 -0
- package/dist/infra-templates/modules/azure-network/variables.tf +56 -0
- package/dist/infra-templates/modules/azure-postgresql-flexible/main.tf +34 -0
- package/dist/infra-templates/modules/azure-postgresql-flexible/outputs.tf +20 -0
- package/dist/infra-templates/modules/azure-postgresql-flexible/variables.tf +54 -0
- package/dist/infra-templates/modules/azure-redis-cache/main.tf +32 -0
- package/dist/infra-templates/modules/azure-redis-cache/outputs.tf +15 -0
- package/dist/infra-templates/modules/azure-redis-cache/variables.tf +30 -0
- package/dist/infra-templates/modules/azure-resource-group/main.tf +5 -0
- package/dist/infra-templates/modules/azure-resource-group/outputs.tf +11 -0
- package/dist/infra-templates/modules/azure-resource-group/variables.tf +16 -0
- package/dist/infra-templates/modules/azure-sql-database/main.tf +63 -0
- package/dist/infra-templates/modules/azure-sql-database/outputs.tf +20 -0
- package/dist/infra-templates/modules/azure-sql-database/variables.tf +78 -0
- package/dist/infra-templates/modules/azure-storage-account/main.tf +13 -0
- package/dist/infra-templates/modules/azure-storage-account/outputs.tf +16 -0
- package/dist/infra-templates/modules/azure-storage-account/variables.tf +38 -0
- package/dist/infra-templates/modules/cloud-watch/event-bridge.tf +15 -0
- package/dist/infra-templates/modules/cloud-watch/lambda.tf +84 -0
- package/dist/infra-templates/modules/cloud-watch/lambda_function.zip +0 -0
- package/dist/infra-templates/modules/cloud-watch/lambda_function_deploy.zip +0 -0
- package/dist/infra-templates/modules/cloud-watch/main.tf +156 -0
- package/dist/infra-templates/modules/cloud-watch/sns.tf +3 -0
- package/dist/infra-templates/modules/cloud-watch/variables.tf +38 -0
- package/dist/infra-templates/modules/ecs-core/alb.tf +126 -0
- package/dist/infra-templates/modules/ecs-core/cloudwatch.tf +48 -0
- package/dist/infra-templates/modules/ecs-core/iam.tf +95 -0
- package/dist/infra-templates/modules/ecs-core/main.tf +12 -0
- package/dist/infra-templates/modules/ecs-core/outputs.tf +44 -0
- package/dist/infra-templates/modules/ecs-core/secrets.tf +9 -0
- package/dist/infra-templates/modules/ecs-core/security_groups.tf +73 -0
- package/dist/infra-templates/modules/ecs-core/variables.tf +96 -0
- package/dist/infra-templates/modules/ecs-service/ecs_autoscaling.tf +51 -0
- package/dist/infra-templates/modules/ecs-service/ecs_service.tf +39 -0
- package/dist/infra-templates/modules/ecs-service/ecs_task_definition.tf +56 -0
- package/dist/infra-templates/modules/ecs-service/variables.tf +170 -0
- package/dist/infra-templates/modules/elastic-container-registry/main.tf +32 -0
- package/dist/infra-templates/modules/elastic-container-registry/outputs.tf +9 -0
- package/dist/infra-templates/modules/elastic-container-registry/variables.tf +25 -0
- package/dist/infra-templates/modules/github-oidc-role/main.tf +46 -0
- package/dist/infra-templates/modules/github-oidc-role/outputs.tf +4 -0
- package/dist/infra-templates/modules/github-oidc-role/variables.tf +11 -0
- package/dist/infra-templates/modules/guardduty/main.tf +8 -0
- package/dist/infra-templates/modules/iam/main.tf +205 -0
- package/dist/infra-templates/modules/iam/outputs.tf +3 -0
- package/dist/infra-templates/modules/iam/variables.tf +4 -0
- package/dist/infra-templates/modules/random-key/main.tf +11 -0
- package/dist/infra-templates/modules/random-key/outputs.tf +4 -0
- package/dist/infra-templates/modules/random-key/variables.tf +10 -0
- package/dist/infra-templates/modules/redis/main.tf +47 -0
- package/dist/infra-templates/modules/redis/outputs.tf +8 -0
- package/dist/infra-templates/modules/redis/variables.tf +20 -0
- package/dist/infra-templates/modules/relational-database-service/main.tf +44 -0
- package/dist/infra-templates/modules/relational-database-service/outputs.tf +13 -0
- package/dist/infra-templates/modules/relational-database-service/security-group.tf +15 -0
- package/dist/infra-templates/modules/relational-database-service/variables.tf +50 -0
- package/dist/infra-templates/modules/secret/main.tf +14 -0
- package/dist/infra-templates/modules/secret/outputs.tf +3 -0
- package/dist/infra-templates/modules/secret/variables.tf +8 -0
- package/dist/infra-templates/modules/simple-storage-service/main.tf +28 -0
- package/dist/infra-templates/modules/simple-storage-service/variables.tf +4 -0
- package/dist/infra-templates/modules/vpc/data.tf +2 -0
- package/dist/infra-templates/modules/vpc/main.tf +76 -0
- package/dist/infra-templates/modules/vpc/outputs.tf +23 -0
- package/dist/infra-templates/modules/vpc/variables.tf +5 -0
- package/dist/infra-templates/package.json +6 -0
- package/dist/infra-templates/templates/azure/MANUAL_DEPLOY.md +168 -0
- package/dist/infra-templates/templates/azure/backend.tf +8 -0
- package/dist/infra-templates/templates/azure/data.tf +21 -0
- package/dist/infra-templates/templates/azure/default.tfvars +0 -0
- package/dist/infra-templates/templates/azure/locals.tf +116 -0
- package/dist/infra-templates/templates/azure/main.tf +421 -0
- package/dist/infra-templates/templates/azure/outputs.tf +40 -0
- package/dist/infra-templates/templates/azure/providers.tf +65 -0
- package/dist/infra-templates/templates/azure/variables.tf +69 -0
- package/dist/infra-templates/templates/azure/workflows/build_and_deploy.yml +155 -0
- package/dist/infra-templates/templates/azure/workflows/tests.yml +63 -0
- package/dist/infra-templates/templates/ecs/README.md +225 -0
- package/dist/infra-templates/templates/ecs/backend.tf +7 -0
- package/dist/infra-templates/templates/ecs/data.tf +6 -0
- package/dist/infra-templates/templates/ecs/default.tfvars +1 -0
- package/dist/infra-templates/templates/ecs/locals.tf +97 -0
- package/dist/infra-templates/templates/ecs/main.tf +185 -0
- package/dist/infra-templates/templates/ecs/outputs.tf +42 -0
- package/dist/infra-templates/templates/ecs/providers.tf +21 -0
- package/dist/infra-templates/templates/ecs/variables.tf +105 -0
- package/dist/infra-templates/templates/ecs/workflows/build_and_deploy.yml +188 -0
- package/dist/infra-templates/templates/ecs/workflows/tests.yml +65 -0
- package/package.json +10 -2
- package/schema/fuel.schema.json +570 -91
|
@@ -0,0 +1,229 @@
|
|
|
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.STATE_CONTAINER_NAME = exports.deriveSuffix = void 0;
|
|
40
|
+
exports.buildResourceGroupName = buildResourceGroupName;
|
|
41
|
+
exports.buildStateStorageAccountName = buildStateStorageAccountName;
|
|
42
|
+
exports.buildKeyVaultName = buildKeyVaultName;
|
|
43
|
+
exports.waitForDns = waitForDns;
|
|
44
|
+
exports.ensureResourceGroup = ensureResourceGroup;
|
|
45
|
+
exports.ensureStateStorage = ensureStateStorage;
|
|
46
|
+
exports.ensureBootstrapKeyVault = ensureBootstrapKeyVault;
|
|
47
|
+
const https = __importStar(require("https"));
|
|
48
|
+
const dns = __importStar(require("dns"));
|
|
49
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
50
|
+
const identity_1 = require("@azure/identity");
|
|
51
|
+
const arm_resources_1 = require("@azure/arm-resources");
|
|
52
|
+
const arm_storage_1 = require("@azure/arm-storage");
|
|
53
|
+
const arm_keyvault_1 = require("@azure/arm-keyvault");
|
|
54
|
+
const storage_blob_1 = require("@azure/storage-blob");
|
|
55
|
+
const s3_state_bucket_1 = require("./s3-state-bucket");
|
|
56
|
+
Object.defineProperty(exports, "deriveSuffix", { enumerable: true, get: function () { return s3_state_bucket_1.deriveSuffix; } });
|
|
57
|
+
function slugify(name) {
|
|
58
|
+
return name.replace(/[^a-z0-9]/gi, '').toLowerCase();
|
|
59
|
+
}
|
|
60
|
+
function buildResourceGroupName(projectName) {
|
|
61
|
+
return `${projectName}-rg`.replace(/[^a-zA-Z0-9-_.()]/g, '-');
|
|
62
|
+
}
|
|
63
|
+
function buildStateStorageAccountName(projectName, suffix) {
|
|
64
|
+
const safeSuffix = slugify(suffix).slice(-8);
|
|
65
|
+
const base = slugify(projectName).slice(0, 24 - 2 - safeSuffix.length) || 'app';
|
|
66
|
+
return `st${base}${safeSuffix}`;
|
|
67
|
+
}
|
|
68
|
+
function buildKeyVaultName(projectName, suffix) {
|
|
69
|
+
const safeSuffix = slugify(suffix).slice(-8);
|
|
70
|
+
const base = slugify(projectName).slice(0, 24 - 3 - 1 - safeSuffix.length) || 'app';
|
|
71
|
+
return `kv-${base}-${safeSuffix}`;
|
|
72
|
+
}
|
|
73
|
+
exports.STATE_CONTAINER_NAME = 'tfstate';
|
|
74
|
+
function credential(credentials) {
|
|
75
|
+
return new identity_1.ClientSecretCredential(credentials.AZURE_TENANT_ID, credentials.AZURE_CLIENT_ID, credentials.AZURE_CLIENT_SECRET);
|
|
76
|
+
}
|
|
77
|
+
function isNotFound(err) {
|
|
78
|
+
return err?.statusCode === 404 || err?.code === 'ResourceNotFound';
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Polls DNS until `hostname` resolves. A freshly-created Azure PaaS resource (Key Vault,
|
|
82
|
+
* Storage Account, ...) is reported "Succeeded" by the ARM control plane before its public
|
|
83
|
+
* DNS record has actually propagated — an immediate follow-up call can fail with ENOTFOUND
|
|
84
|
+
* even though the resource exists. Only needed right after creating a new resource.
|
|
85
|
+
*/
|
|
86
|
+
async function waitForDns(hostname, timeoutMs = 60_000, intervalMs = 3_000) {
|
|
87
|
+
const deadline = Date.now() + timeoutMs;
|
|
88
|
+
for (;;) {
|
|
89
|
+
try {
|
|
90
|
+
await dns.promises.lookup(hostname);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
if (Date.now() >= deadline)
|
|
95
|
+
return; // give up silently — the caller's own request will surface the real error
|
|
96
|
+
await new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Looks up the AAD object ID for the service principal identified by AZURE_CLIENT_ID, via Microsoft Graph. */
|
|
101
|
+
async function getServicePrincipalObjectId(cred, clientId) {
|
|
102
|
+
const token = await cred.getToken('https://graph.microsoft.com/.default');
|
|
103
|
+
const url = `https://graph.microsoft.com/v1.0/servicePrincipals?$filter=appId eq '${clientId}'`;
|
|
104
|
+
const body = await new Promise((resolve, reject) => {
|
|
105
|
+
const req = https.get(url, { headers: { Authorization: `Bearer ${token.token}` } }, (res) => {
|
|
106
|
+
let data = '';
|
|
107
|
+
res.on('data', (chunk) => (data += chunk));
|
|
108
|
+
res.on('end', () => resolve(data));
|
|
109
|
+
});
|
|
110
|
+
req.on('error', reject);
|
|
111
|
+
});
|
|
112
|
+
const parsed = JSON.parse(body);
|
|
113
|
+
if (!parsed.value || parsed.value.length === 0) {
|
|
114
|
+
throw new Error(`Could not resolve service principal object ID for AZURE_CLIENT_ID=${clientId}: ${parsed.error?.message ?? 'not found'}`);
|
|
115
|
+
}
|
|
116
|
+
return parsed.value[0].id;
|
|
117
|
+
}
|
|
118
|
+
async function ensureResourceGroup(credentials, resourceGroupName, location) {
|
|
119
|
+
const client = new arm_resources_1.ResourceManagementClient(credential(credentials), credentials.AZURE_SUBSCRIPTION_ID);
|
|
120
|
+
// checkExistence resolves to { body: boolean }, not a plain boolean — the object itself is always truthy.
|
|
121
|
+
const { body: exists } = await client.resourceGroups.checkExistence(resourceGroupName);
|
|
122
|
+
if (exists) {
|
|
123
|
+
console.log(chalk_1.default.green(` ✓ Resource group already exists: ${resourceGroupName}`));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
console.log(chalk_1.default.cyan(` Creating resource group: ${resourceGroupName}`));
|
|
127
|
+
await client.resourceGroups.createOrUpdate(resourceGroupName, { location });
|
|
128
|
+
console.log(chalk_1.default.green(' ✓ Resource group created'));
|
|
129
|
+
}
|
|
130
|
+
/** Ensures the storage account + blob container backing the `azurerm` Tofu state backend exist. */
|
|
131
|
+
async function ensureStateStorage(credentials, resourceGroupName, storageAccountName, location, containerName = exports.STATE_CONTAINER_NAME) {
|
|
132
|
+
const cred = credential(credentials);
|
|
133
|
+
const storageClient = new arm_storage_1.StorageManagementClient(cred, credentials.AZURE_SUBSCRIPTION_ID);
|
|
134
|
+
let exists = true;
|
|
135
|
+
try {
|
|
136
|
+
await storageClient.storageAccounts.getProperties(resourceGroupName, storageAccountName);
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
if (!isNotFound(err)) {
|
|
140
|
+
throw new Error(`Failed to check state storage account "${storageAccountName}": ${err.message || err}`);
|
|
141
|
+
}
|
|
142
|
+
exists = false;
|
|
143
|
+
}
|
|
144
|
+
if (!exists) {
|
|
145
|
+
console.log(chalk_1.default.cyan(` Creating state storage account: ${storageAccountName}`));
|
|
146
|
+
const poller = await storageClient.storageAccounts.beginCreate(resourceGroupName, storageAccountName, {
|
|
147
|
+
location,
|
|
148
|
+
sku: { name: 'Standard_LRS' },
|
|
149
|
+
kind: 'StorageV2',
|
|
150
|
+
allowBlobPublicAccess: false,
|
|
151
|
+
minimumTlsVersion: 'TLS1_2',
|
|
152
|
+
});
|
|
153
|
+
await poller.pollUntilDone();
|
|
154
|
+
await waitForDns(`${storageAccountName}.blob.core.windows.net`);
|
|
155
|
+
console.log(chalk_1.default.green(' ✓ State storage account created'));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log(chalk_1.default.green(` ✓ State storage account already exists: ${storageAccountName}`));
|
|
159
|
+
}
|
|
160
|
+
const keys = await storageClient.storageAccounts.listKeys(resourceGroupName, storageAccountName);
|
|
161
|
+
const key = keys.keys?.[0]?.value;
|
|
162
|
+
if (!key) {
|
|
163
|
+
throw new Error(`Could not retrieve an access key for storage account "${storageAccountName}"`);
|
|
164
|
+
}
|
|
165
|
+
const blobServiceClient = new storage_blob_1.BlobServiceClient(`https://${storageAccountName}.blob.core.windows.net`, new storage_blob_1.StorageSharedKeyCredential(storageAccountName, key));
|
|
166
|
+
const containerClient = blobServiceClient.getContainerClient(containerName);
|
|
167
|
+
if (await containerClient.exists()) {
|
|
168
|
+
console.log(chalk_1.default.green(` ✓ State container already exists: ${containerName}`));
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
console.log(chalk_1.default.cyan(` Creating state container: ${containerName}`));
|
|
172
|
+
await containerClient.create();
|
|
173
|
+
console.log(chalk_1.default.green(' ✓ State container created'));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/** Ensures the Key Vault that stores the fuel.yml infrastructure secret exists and grants the CLI's SP access to it. */
|
|
177
|
+
async function ensureBootstrapKeyVault(credentials, resourceGroupName, keyVaultName, location) {
|
|
178
|
+
const cred = credential(credentials);
|
|
179
|
+
const client = new arm_keyvault_1.KeyVaultManagementClient(cred, credentials.AZURE_SUBSCRIPTION_ID);
|
|
180
|
+
let exists = true;
|
|
181
|
+
try {
|
|
182
|
+
await client.vaults.get(resourceGroupName, keyVaultName);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
if (!isNotFound(err)) {
|
|
186
|
+
throw new Error(`Failed to check Key Vault "${keyVaultName}": ${err.message || err}`);
|
|
187
|
+
}
|
|
188
|
+
exists = false;
|
|
189
|
+
}
|
|
190
|
+
const objectId = await getServicePrincipalObjectId(cred, credentials.AZURE_CLIENT_ID);
|
|
191
|
+
if (exists) {
|
|
192
|
+
// A vault created outside this flow (or before this SP existed) may not grant it
|
|
193
|
+
// secret access yet. "add" merges/replaces just this principal's policy, leaving
|
|
194
|
+
// every other access policy on the vault untouched.
|
|
195
|
+
await client.vaults.updateAccessPolicy(resourceGroupName, keyVaultName, 'add', {
|
|
196
|
+
properties: {
|
|
197
|
+
accessPolicies: [
|
|
198
|
+
{
|
|
199
|
+
tenantId: credentials.AZURE_TENANT_ID,
|
|
200
|
+
objectId,
|
|
201
|
+
permissions: { secrets: ['Get', 'List', 'Set', 'Delete'] },
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
console.log(chalk_1.default.green(` ✓ Key Vault already exists: ${keyVaultName}`));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
console.log(chalk_1.default.cyan(` Creating Key Vault: ${keyVaultName}`));
|
|
210
|
+
const poller = await client.vaults.beginCreateOrUpdate(resourceGroupName, keyVaultName, {
|
|
211
|
+
location,
|
|
212
|
+
properties: {
|
|
213
|
+
tenantId: credentials.AZURE_TENANT_ID,
|
|
214
|
+
sku: { family: 'A', name: 'standard' },
|
|
215
|
+
enableRbacAuthorization: false,
|
|
216
|
+
accessPolicies: [
|
|
217
|
+
{
|
|
218
|
+
tenantId: credentials.AZURE_TENANT_ID,
|
|
219
|
+
objectId,
|
|
220
|
+
permissions: { secrets: ['Get', 'List', 'Set', 'Delete'] },
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
await poller.pollUntilDone();
|
|
226
|
+
await waitForDns(`${keyVaultName}.vault.azure.net`);
|
|
227
|
+
console.log(chalk_1.default.green(' ✓ Key Vault created'));
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=azure-state-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"azure-state-storage.js","sourceRoot":"","sources":["../../src/infra/azure-state-storage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,wDAEC;AAED,oEAIC;AAED,8CAIC;AAsBD,gCAWC;AAuBD,kDAeC;AAGD,gDAsDC;AAGD,0DA2DC;AA7ND,6CAA8B;AAC9B,yCAA0B;AAC1B,kDAAyB;AACzB,8CAAyE;AACzE,wDAA+D;AAC/D,oDAA4D;AAC5D,sDAA8D;AAC9D,sDAAmF;AAEnF,uDAAgD;AAEvC,6FAFA,8BAAY,OAEA;AAErB,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;AACtD,CAAC;AAED,SAAgB,sBAAsB,CAAC,WAAmB;IACxD,OAAO,GAAG,WAAW,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAA;AAC/D,CAAC;AAED,SAAgB,4BAA4B,CAAC,WAAmB,EAAE,MAAc;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;IAC/E,OAAO,KAAK,IAAI,GAAG,UAAU,EAAE,CAAA;AACjC,CAAC;AAED,SAAgB,iBAAiB,CAAC,WAAmB,EAAE,MAAc;IACnE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAA;IACnF,OAAO,MAAM,IAAI,IAAI,UAAU,EAAE,CAAA;AACnC,CAAC;AAEY,QAAA,oBAAoB,GAAG,SAAS,CAAA;AAE7C,SAAS,UAAU,CAAC,WAAwB;IAC1C,OAAO,IAAI,iCAAsB,CAC/B,WAAW,CAAC,eAAe,EAC3B,WAAW,CAAC,eAAe,EAC3B,WAAW,CAAC,mBAAmB,CAChC,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,GAAQ;IAC1B,OAAO,GAAG,EAAE,UAAU,KAAK,GAAG,IAAI,GAAG,EAAE,IAAI,KAAK,kBAAkB,CAAA;AACpE,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAAC,QAAgB,EAAE,SAAS,GAAG,MAAM,EAAE,UAAU,GAAG,KAAK;IACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;IACvC,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;YACnC,OAAM;QACR,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,OAAM,CAAC,0EAA0E;YAC7G,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,+GAA+G;AAC/G,KAAK,UAAU,2BAA2B,CAAC,IAAqB,EAAE,QAAgB;IAChF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,sCAAsC,CAAC,CAAA;IACzE,MAAM,GAAG,GAAG,wEAAwE,QAAQ,GAAG,CAAA;IAC/F,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAM,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;YAC3F,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAA;YAC1C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QACF,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAmE,CAAA;IACjG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,qEAAqE,QAAQ,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,IAAI,WAAW,EAAE,CACzH,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC3B,CAAC;AAEM,KAAK,UAAU,mBAAmB,CACvC,WAAwB,EACxB,iBAAyB,EACzB,QAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,wCAAwB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAA;IACvG,0GAA0G;IAC1G,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAA;IACtF,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,sCAAsC,iBAAiB,EAAE,CAAC,CAAC,CAAA;QACnF,OAAM;IACR,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,8BAA8B,iBAAiB,EAAE,CAAC,CAAC,CAAA;IAC1E,MAAM,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC3E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,mGAAmG;AAC5F,KAAK,UAAU,kBAAkB,CACtC,WAAwB,EACxB,iBAAyB,EACzB,kBAA0B,EAC1B,QAAgB,EAChB,gBAAwB,4BAAoB;IAE5C,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACpC,MAAM,aAAa,GAAG,IAAI,qCAAuB,CAAC,IAAI,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAA;IAE1F,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,eAAe,CAAC,aAAa,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAA;IAC1F,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0CAA0C,kBAAkB,MAAM,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAA;QACzG,CAAC;QACD,MAAM,GAAG,KAAK,CAAA;IAChB,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,kBAAkB,EAAE,CAAC,CAAC,CAAA;QAClF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,WAAW,CAAC,iBAAiB,EAAE,kBAAkB,EAAE;YACpG,QAAQ;YACR,GAAG,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;YAC7B,IAAI,EAAE,WAAW;YACjB,qBAAqB,EAAE,KAAK;YAC5B,iBAAiB,EAAE,QAAQ;SAC5B,CAAC,CAAA;QACF,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;QAC5B,MAAM,UAAU,CAAC,GAAG,kBAAkB,wBAAwB,CAAC,CAAA;QAC/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAA;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,6CAA6C,kBAAkB,EAAE,CAAC,CAAC,CAAA;IAC7F,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAA;IAChG,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAA;IACjC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,yDAAyD,kBAAkB,GAAG,CAAC,CAAA;IACjG,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,gCAAiB,CAC7C,WAAW,kBAAkB,wBAAwB,EACrD,IAAI,yCAA0B,CAAC,kBAAkB,EAAE,GAAG,CAAC,CACxD,CAAA;IACD,MAAM,eAAe,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAA;IAC3E,IAAI,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uCAAuC,aAAa,EAAE,CAAC,CAAC,CAAA;IAClF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,+BAA+B,aAAa,EAAE,CAAC,CAAC,CAAA;QACvE,MAAM,eAAe,CAAC,MAAM,EAAE,CAAA;QAC9B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAA;IACzD,CAAC;AACH,CAAC;AAED,wHAAwH;AACjH,KAAK,UAAU,uBAAuB,CAC3C,WAAwB,EACxB,iBAAyB,EACzB,YAAoB,EACpB,QAAgB;IAEhB,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,CAAC,CAAA;IACpC,MAAM,MAAM,GAAG,IAAI,uCAAwB,CAAC,IAAI,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAA;IAEpF,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAA;IAC1D,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,8BAA8B,YAAY,MAAM,GAAG,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,GAAG,KAAK,CAAA;IAChB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,CAAA;IAErF,IAAI,MAAM,EAAE,CAAC;QACX,iFAAiF;QACjF,iFAAiF;QACjF,oDAAoD;QACpD,MAAM,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,YAAY,EAAE,KAAK,EAAE;YAC7E,UAAU,EAAE;gBACV,cAAc,EAAE;oBACd;wBACE,QAAQ,EAAE,WAAW,CAAC,eAAe;wBACrC,QAAQ;wBACR,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE;qBAC3D;iBACF;aACF;SACF,CAAC,CAAA;QACF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,YAAY,EAAE,CAAC,CAAC,CAAA;QACzE,OAAM;IACR,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC,CAAA;IAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,YAAY,EAAE;QACtF,QAAQ;QACR,UAAU,EAAE;YACV,QAAQ,EAAE,WAAW,CAAC,eAAe;YACrC,GAAG,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE;YACtC,uBAAuB,EAAE,KAAK;YAC9B,cAAc,EAAE;gBACd;oBACE,QAAQ,EAAE,WAAW,CAAC,eAAe;oBACrC,QAAQ;oBACR,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE;iBAC3D;aACF;SACF;KACF,CAAC,CAAA;IACF,MAAM,MAAM,CAAC,aAAa,EAAE,CAAA;IAC5B,MAAM,UAAU,CAAC,GAAG,YAAY,kBAAkB,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAA;AACnD,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Credentials, CredentialKey } from './types';
|
|
1
|
+
import { Credentials, CredentialKey, Deployment } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* Resolve credentials by merging sources in priority order:
|
|
4
4
|
* 1. CLI flag overrides (highest)
|
|
@@ -7,5 +7,5 @@ import { Credentials, CredentialKey } from './types';
|
|
|
7
7
|
*
|
|
8
8
|
* Sources are merged per-key — e.g., AWS keys from env + GITHUB_TOKEN from file = valid.
|
|
9
9
|
*/
|
|
10
|
-
export declare function resolveCredentials(searchDir?: string, overrides?: Partial<Record<CredentialKey, string
|
|
10
|
+
export declare function resolveCredentials(searchDir?: string, overrides?: Partial<Record<CredentialKey, string>>, deployment?: Deployment): Promise<Credentials>;
|
|
11
11
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAA4B,aAAa,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAA4B,aAAa,EAAE,UAAU,EAA6B,MAAM,SAAS,CAAA;AAgBrH;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,EAClD,UAAU,GAAE,UAAkB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAqCtB"}
|
|
@@ -61,7 +61,8 @@ async function tryReadCredentialsFile(credPath) {
|
|
|
61
61
|
*
|
|
62
62
|
* Sources are merged per-key — e.g., AWS keys from env + GITHUB_TOKEN from file = valid.
|
|
63
63
|
*/
|
|
64
|
-
async function resolveCredentials(searchDir, overrides) {
|
|
64
|
+
async function resolveCredentials(searchDir, overrides, deployment = 'ecs') {
|
|
65
|
+
const requiredKeys = (0, types_1.requiredCredentialKeysFor)(deployment);
|
|
65
66
|
// Collect file values from searchDir and CWD
|
|
66
67
|
const credPath = searchDir
|
|
67
68
|
? path.join(searchDir, '.fuel-credentials')
|
|
@@ -83,10 +84,13 @@ async function resolveCredentials(searchDir, overrides) {
|
|
|
83
84
|
process.env[key] ||
|
|
84
85
|
undefined;
|
|
85
86
|
}
|
|
86
|
-
const missing =
|
|
87
|
+
const missing = requiredKeys.filter((k) => !resolved[k]);
|
|
87
88
|
if (missing.length > 0) {
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
const missingGitHubOnly = missing.every((k) => k.startsWith('GITHUB_'));
|
|
90
|
+
const hint = missingGitHubOnly
|
|
91
|
+
? 'Run "fuel auth:init" to set up GitHub credentials interactively (guides you to a token with the right permissions), or provide them via CLI flags, .fuel-credentials, or environment variables.'
|
|
92
|
+
: 'Provide them via CLI flags, .fuel-credentials file, or environment variables.';
|
|
93
|
+
throw new Error(`Missing credentials: ${missing.join(', ')}\n${hint}`);
|
|
90
94
|
}
|
|
91
95
|
return resolved;
|
|
92
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/infra/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,gDAyCC;AAnED,2CAA4B;AAC5B,6CAA8B;AAC9B,mCAAqH;AAErH,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,EAClD,aAAyB,KAAK;IAE9B,MAAM,YAAY,GAAG,IAAA,iCAAyB,EAAC,UAAU,CAAC,CAAA;IAE1D,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,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAA;QACvE,MAAM,IAAI,GAAG,iBAAiB;YAC5B,CAAC,CAAC,iMAAiM;YACnM,CAAC,CAAC,+EAA+E,CAAA;QACnF,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IACxE,CAAC;IAED,OAAO,QAAuB,CAAA;AAChC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Deployment } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Infers the deployment provider from an already-generated /infra folder,
|
|
4
|
+
* for flows that need it before fuel.yml/the remote secret has been read
|
|
5
|
+
* (e.g. `--tofu-only`, `infra:pull`). Based on which provider block
|
|
6
|
+
* providers.tf declares.
|
|
7
|
+
*/
|
|
8
|
+
export declare function detectDeploymentFromInfraDir(infraDir: string): Promise<Deployment>;
|
|
9
|
+
//# sourceMappingURL=deployment-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-detect.d.ts","sourceRoot":"","sources":["../../src/infra/deployment-detect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAOxF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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.detectDeploymentFromInfraDir = detectDeploymentFromInfraDir;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs-extra"));
|
|
39
|
+
/**
|
|
40
|
+
* Infers the deployment provider from an already-generated /infra folder,
|
|
41
|
+
* for flows that need it before fuel.yml/the remote secret has been read
|
|
42
|
+
* (e.g. `--tofu-only`, `infra:pull`). Based on which provider block
|
|
43
|
+
* providers.tf declares.
|
|
44
|
+
*/
|
|
45
|
+
async function detectDeploymentFromInfraDir(infraDir) {
|
|
46
|
+
const providersPath = path.join(infraDir, 'providers.tf');
|
|
47
|
+
if (!(await fs.pathExists(providersPath))) {
|
|
48
|
+
return 'ecs';
|
|
49
|
+
}
|
|
50
|
+
const content = await fs.readFile(providersPath, 'utf-8');
|
|
51
|
+
return content.includes('azurerm') ? 'azure' : 'ecs';
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=deployment-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployment-detect.js","sourceRoot":"","sources":["../../src/infra/deployment-detect.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,oEAOC;AAjBD,2CAA4B;AAC5B,6CAA8B;AAG9B;;;;;GAKG;AACI,KAAK,UAAU,4BAA4B,CAAC,QAAgB;IACjE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;IACzD,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IACzD,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AACtD,CAAC"}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verifies the GitHub token authenticates and — for classic PATs, which report their
|
|
3
|
+
* scopes via the `x-oauth-scopes` response header — that it has repo push/admin access.
|
|
4
|
+
* Fine-grained PATs don't expose scopes this way, so we can only confirm those authenticate.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateGitHubToken(token: string): Promise<void>;
|
|
1
7
|
export declare function repoExists(token: string, org: string, name: string): Promise<boolean>;
|
|
2
8
|
export declare function createGitHubRepo(token: string, org: string, name: string): Promise<{
|
|
3
9
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/infra/github-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/infra/github-client.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BtE;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CASlB;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAY5C;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -1,9 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateGitHubToken = validateGitHubToken;
|
|
3
4
|
exports.repoExists = repoExists;
|
|
4
5
|
exports.createGitHubRepo = createGitHubRepo;
|
|
5
6
|
exports.setBranchProtection = setBranchProtection;
|
|
6
7
|
const rest_1 = require("@octokit/rest");
|
|
8
|
+
const REQUIRED_SCOPES = ['repo', 'public_repo'];
|
|
9
|
+
/**
|
|
10
|
+
* Verifies the GitHub token authenticates and — for classic PATs, which report their
|
|
11
|
+
* scopes via the `x-oauth-scopes` response header — that it has repo push/admin access.
|
|
12
|
+
* Fine-grained PATs don't expose scopes this way, so we can only confirm those authenticate.
|
|
13
|
+
*/
|
|
14
|
+
async function validateGitHubToken(token) {
|
|
15
|
+
const octokit = new rest_1.Octokit({ auth: token });
|
|
16
|
+
let scopesHeader;
|
|
17
|
+
try {
|
|
18
|
+
const response = await octokit.request('GET /user');
|
|
19
|
+
scopesHeader = response.headers['x-oauth-scopes'];
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
throw new Error(`GitHub token is invalid or expired: ${err.message || err}`);
|
|
23
|
+
}
|
|
24
|
+
if (scopesHeader === undefined) {
|
|
25
|
+
// Fine-grained PAT — no scopes header to check. Token authenticates; proceed.
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const scopes = scopesHeader
|
|
29
|
+
.split(',')
|
|
30
|
+
.map((s) => s.trim())
|
|
31
|
+
.filter(Boolean);
|
|
32
|
+
if (!scopes.some((s) => REQUIRED_SCOPES.includes(s))) {
|
|
33
|
+
throw new Error(`GitHub token is missing the "repo" scope (found: ${scopes.join(', ') || 'none'}). ` +
|
|
34
|
+
'Regenerate a classic Personal Access Token with the "repo" scope so the CLI can create the repo, push code, and set branch protections.');
|
|
35
|
+
}
|
|
36
|
+
}
|
|
7
37
|
async function repoExists(token, org, name) {
|
|
8
38
|
const octokit = new rest_1.Octokit({ auth: token });
|
|
9
39
|
try {
|
|
@@ -38,10 +68,7 @@ async function setBranchProtection(token, owner, repo, branch) {
|
|
|
38
68
|
required_approving_review_count: 1,
|
|
39
69
|
dismiss_stale_reviews: true,
|
|
40
70
|
},
|
|
41
|
-
required_status_checks:
|
|
42
|
-
strict: true,
|
|
43
|
-
contexts: ['Title matches Jira Issue'],
|
|
44
|
-
},
|
|
71
|
+
required_status_checks: null,
|
|
45
72
|
restrictions: null,
|
|
46
73
|
allow_deletions: false,
|
|
47
74
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/infra/github-client.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/infra/github-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Builds a GitHub token-creation URL with the CLI's required scope(s) pre-selected. */
|
|
2
|
+
export declare function buildGitHubTokenUrl(description?: string): string;
|
|
3
|
+
export declare function openInBrowser(url: string): void;
|
|
4
|
+
//# sourceMappingURL=github-token-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-token-link.d.ts","sourceRoot":"","sources":["../../src/infra/github-token-link.ts"],"names":[],"mappings":"AAQA,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,WAAW,SAAa,GAAG,MAAM,CAMpE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQ/C"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildGitHubTokenUrl = buildGitHubTokenUrl;
|
|
4
|
+
exports.openInBrowser = openInBrowser;
|
|
5
|
+
const child_process_1 = require("child_process");
|
|
6
|
+
// The single scope every CLI-driven GitHub operation needs (create repo, push,
|
|
7
|
+
// set branch protection, configure Actions secrets). Pre-selecting it on the
|
|
8
|
+
// token creation page means the user never has to know or look up which
|
|
9
|
+
// checkbox to tick.
|
|
10
|
+
const REQUIRED_SCOPES = ['repo'];
|
|
11
|
+
/** Builds a GitHub token-creation URL with the CLI's required scope(s) pre-selected. */
|
|
12
|
+
function buildGitHubTokenUrl(description = 'Fuel CLI') {
|
|
13
|
+
const params = new URLSearchParams({
|
|
14
|
+
scopes: REQUIRED_SCOPES.join(','),
|
|
15
|
+
description,
|
|
16
|
+
});
|
|
17
|
+
return `https://github.com/settings/tokens/new?${params.toString()}`;
|
|
18
|
+
}
|
|
19
|
+
function openInBrowser(url) {
|
|
20
|
+
const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
|
|
21
|
+
try {
|
|
22
|
+
(0, child_process_1.exec)(`${cmd} "${url}"`);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Best-effort — the link is already printed for the user to open manually.
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=github-token-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-token-link.js","sourceRoot":"","sources":["../../src/infra/github-token-link.ts"],"names":[],"mappings":";;AASA,kDAMC;AAED,sCAQC;AAzBD,iDAAoC;AAEpC,+EAA+E;AAC/E,6EAA6E;AAC7E,wEAAwE;AACxE,oBAAoB;AACpB,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC,CAAA;AAEhC,wFAAwF;AACxF,SAAgB,mBAAmB,CAAC,WAAW,GAAG,UAAU;IAC1D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC;QACjC,WAAW;KACZ,CAAC,CAAA;IACF,OAAO,0CAA0C,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;AACtE,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAA;IAC9F,IAAI,CAAC;QACH,IAAA,oBAAI,EAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -6,5 +6,8 @@ export interface OrchestratorOptions {
|
|
|
6
6
|
forcePush?: boolean;
|
|
7
7
|
skipBranchProtection?: boolean;
|
|
8
8
|
}
|
|
9
|
-
export
|
|
9
|
+
export interface OrchestratorResult {
|
|
10
|
+
codePushed: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function runInfraOrchestrator(targetRoot: string, _appName: string, config: InfraConfig, credentials: Credentials, options?: OrchestratorOptions): Promise<OrchestratorResult | undefined>;
|
|
10
13
|
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AA0FlD,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,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,OAAO,CAAA;CACpB;AAySD,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,kBAAkB,GAAG,SAAS,CAAC,CAKzC"}
|