@swovohq/fuel 0.2.2-alpha.9 → 0.2.2-alpha.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +173 -69
  2. package/dist/bin/fuel.js +77 -31
  3. package/dist/bin/fuel.js.map +1 -1
  4. package/dist/cleanup/finalize.d.ts.map +1 -1
  5. package/dist/cleanup/finalize.js +11 -3
  6. package/dist/cleanup/finalize.js.map +1 -1
  7. package/dist/commands/config-verify.d.ts.map +1 -1
  8. package/dist/commands/config-verify.js +14 -6
  9. package/dist/commands/config-verify.js.map +1 -1
  10. package/dist/commands/create-app.d.ts.map +1 -1
  11. package/dist/commands/create-app.js +41 -7
  12. package/dist/commands/create-app.js.map +1 -1
  13. package/dist/commands/infra-deploy.d.ts +15 -1
  14. package/dist/commands/infra-deploy.d.ts.map +1 -1
  15. package/dist/commands/infra-deploy.js +164 -18
  16. package/dist/commands/infra-deploy.js.map +1 -1
  17. package/dist/commands/infra-destroy.d.ts.map +1 -1
  18. package/dist/commands/infra-destroy.js +3 -3
  19. package/dist/commands/infra-destroy.js.map +1 -1
  20. package/dist/commands/infra-init.d.ts +91 -0
  21. package/dist/commands/infra-init.d.ts.map +1 -1
  22. package/dist/commands/infra-init.js +644 -113
  23. package/dist/commands/infra-init.js.map +1 -1
  24. package/dist/commands/infra-pull.d.ts +8 -0
  25. package/dist/commands/infra-pull.d.ts.map +1 -0
  26. package/dist/commands/infra-pull.js +81 -0
  27. package/dist/commands/infra-pull.js.map +1 -0
  28. package/dist/commands/list-modules.d.ts.map +1 -1
  29. package/dist/commands/list-modules.js +10 -3
  30. package/dist/commands/list-modules.js.map +1 -1
  31. package/dist/engines/convention.d.ts +2 -2
  32. package/dist/engines/convention.d.ts.map +1 -1
  33. package/dist/engines/convention.js +8 -6
  34. package/dist/engines/convention.js.map +1 -1
  35. package/dist/engines/dependencies.d.ts +2 -0
  36. package/dist/engines/dependencies.d.ts.map +1 -1
  37. package/dist/engines/dependencies.js.map +1 -1
  38. package/dist/engines/monorepo.d.ts.map +1 -1
  39. package/dist/engines/monorepo.js.map +1 -1
  40. package/dist/engines/template-source.d.ts.map +1 -1
  41. package/dist/engines/template-source.js +3 -1
  42. package/dist/engines/template-source.js.map +1 -1
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/infra/azure-defaults.d.ts +49 -0
  46. package/dist/infra/azure-defaults.d.ts.map +1 -0
  47. package/dist/infra/azure-defaults.js +52 -0
  48. package/dist/infra/azure-defaults.js.map +1 -0
  49. package/dist/infra/azure-keyvault-client.d.ts +4 -0
  50. package/dist/infra/azure-keyvault-client.d.ts.map +1 -0
  51. package/dist/infra/azure-keyvault-client.js +57 -0
  52. package/dist/infra/azure-keyvault-client.js.map +1 -0
  53. package/dist/infra/azure-rbac.d.ts +11 -0
  54. package/dist/infra/azure-rbac.d.ts.map +1 -0
  55. package/dist/infra/azure-rbac.js +49 -0
  56. package/dist/infra/azure-rbac.js.map +1 -0
  57. package/dist/infra/azure-state-storage.d.ts +20 -0
  58. package/dist/infra/azure-state-storage.d.ts.map +1 -0
  59. package/dist/infra/azure-state-storage.js +229 -0
  60. package/dist/infra/azure-state-storage.js.map +1 -0
  61. package/dist/infra/config-loader.d.ts.map +1 -1
  62. package/dist/infra/config-loader.js.map +1 -1
  63. package/dist/infra/config-writer.js +1 -1
  64. package/dist/infra/credentials.d.ts +2 -2
  65. package/dist/infra/credentials.d.ts.map +1 -1
  66. package/dist/infra/credentials.js +8 -4
  67. package/dist/infra/credentials.js.map +1 -1
  68. package/dist/infra/dependency-checker.d.ts.map +1 -1
  69. package/dist/infra/dependency-checker.js.map +1 -1
  70. package/dist/infra/deployment-detect.d.ts +9 -0
  71. package/dist/infra/deployment-detect.d.ts.map +1 -0
  72. package/dist/infra/deployment-detect.js +53 -0
  73. package/dist/infra/deployment-detect.js.map +1 -0
  74. package/dist/infra/git-client.d.ts.map +1 -1
  75. package/dist/infra/git-client.js +6 -10
  76. package/dist/infra/git-client.js.map +1 -1
  77. package/dist/infra/github-client.d.ts +7 -0
  78. package/dist/infra/github-client.d.ts.map +1 -1
  79. package/dist/infra/github-client.js +47 -7
  80. package/dist/infra/github-client.js.map +1 -1
  81. package/dist/infra/github-secrets-client.d.ts.map +1 -1
  82. package/dist/infra/github-secrets-client.js +2 -2
  83. package/dist/infra/github-secrets-client.js.map +1 -1
  84. package/dist/infra/github-token-link.d.ts +4 -0
  85. package/dist/infra/github-token-link.d.ts.map +1 -0
  86. package/dist/infra/github-token-link.js +32 -0
  87. package/dist/infra/github-token-link.js.map +1 -0
  88. package/dist/infra/orchestrator.d.ts +4 -1
  89. package/dist/infra/orchestrator.d.ts.map +1 -1
  90. package/dist/infra/orchestrator.js +218 -63
  91. package/dist/infra/orchestrator.js.map +1 -1
  92. package/dist/infra/port-utils.d.ts.map +1 -1
  93. package/dist/infra/port-utils.js.map +1 -1
  94. package/dist/infra/preflight.d.ts.map +1 -1
  95. package/dist/infra/preflight.js +25 -11
  96. package/dist/infra/preflight.js.map +1 -1
  97. package/dist/infra/remote-secret.d.ts +14 -0
  98. package/dist/infra/remote-secret.d.ts.map +1 -0
  99. package/dist/infra/remote-secret.js +42 -0
  100. package/dist/infra/remote-secret.js.map +1 -0
  101. package/dist/infra/s3-state-bucket.d.ts.map +1 -1
  102. package/dist/infra/s3-state-bucket.js +8 -4
  103. package/dist/infra/s3-state-bucket.js.map +1 -1
  104. package/dist/infra/secrets-manager-client.d.ts.map +1 -1
  105. package/dist/infra/secrets-manager-client.js +8 -5
  106. package/dist/infra/secrets-manager-client.js.map +1 -1
  107. package/dist/infra/subprocess.js +1 -1
  108. package/dist/infra/template-engine.d.ts +14 -5
  109. package/dist/infra/template-engine.d.ts.map +1 -1
  110. package/dist/infra/template-engine.js +157 -39
  111. package/dist/infra/template-engine.js.map +1 -1
  112. package/dist/infra/tofu-runner.d.ts +4 -3
  113. package/dist/infra/tofu-runner.d.ts.map +1 -1
  114. package/dist/infra/tofu-runner.js +40 -34
  115. package/dist/infra/tofu-runner.js.map +1 -1
  116. package/dist/infra/types.d.ts +241 -17
  117. package/dist/infra/types.d.ts.map +1 -1
  118. package/dist/infra/types.js +419 -22
  119. package/dist/infra/types.js.map +1 -1
  120. package/dist/infra-templates/TODO-azure-prod.md +127 -0
  121. package/dist/infra-templates/modules/azure-container-app/main.tf +124 -0
  122. package/dist/infra-templates/modules/azure-container-app/outputs.tf +24 -0
  123. package/dist/infra-templates/modules/azure-container-app/variables.tf +80 -0
  124. package/dist/infra-templates/modules/azure-container-apps-environment/main.tf +18 -0
  125. package/dist/infra-templates/modules/azure-container-apps-environment/outputs.tf +14 -0
  126. package/dist/infra-templates/modules/azure-container-apps-environment/variables.tf +24 -0
  127. package/dist/infra-templates/modules/azure-container-registry/main.tf +10 -0
  128. package/dist/infra-templates/modules/azure-container-registry/outputs.tf +14 -0
  129. package/dist/infra-templates/modules/azure-container-registry/variables.tf +20 -0
  130. package/dist/infra-templates/modules/azure-front-door/main.tf +80 -0
  131. package/dist/infra-templates/modules/azure-front-door/outputs.tf +20 -0
  132. package/dist/infra-templates/modules/azure-front-door/variables.tf +26 -0
  133. package/dist/infra-templates/modules/azure-github-oidc/main.tf +48 -0
  134. package/dist/infra-templates/modules/azure-github-oidc/outputs.tf +9 -0
  135. package/dist/infra-templates/modules/azure-github-oidc/variables.tf +69 -0
  136. package/dist/infra-templates/modules/azure-key-vault/main.tf +21 -0
  137. package/dist/infra-templates/modules/azure-key-vault/outputs.tf +11 -0
  138. package/dist/infra-templates/modules/azure-key-vault/variables.tf +43 -0
  139. package/dist/infra-templates/modules/azure-monitor/main.tf +29 -0
  140. package/dist/infra-templates/modules/azure-monitor/outputs.tf +17 -0
  141. package/dist/infra-templates/modules/azure-monitor/variables.tf +32 -0
  142. package/dist/infra-templates/modules/azure-network/main.tf +134 -0
  143. package/dist/infra-templates/modules/azure-network/outputs.tf +44 -0
  144. package/dist/infra-templates/modules/azure-network/variables.tf +56 -0
  145. package/dist/infra-templates/modules/azure-postgresql-flexible/main.tf +34 -0
  146. package/dist/infra-templates/modules/azure-postgresql-flexible/outputs.tf +20 -0
  147. package/dist/infra-templates/modules/azure-postgresql-flexible/variables.tf +54 -0
  148. package/dist/infra-templates/modules/azure-redis-cache/main.tf +32 -0
  149. package/dist/infra-templates/modules/azure-redis-cache/outputs.tf +15 -0
  150. package/dist/infra-templates/modules/azure-redis-cache/variables.tf +30 -0
  151. package/dist/infra-templates/modules/azure-resource-group/main.tf +5 -0
  152. package/dist/infra-templates/modules/azure-resource-group/outputs.tf +11 -0
  153. package/dist/infra-templates/modules/azure-resource-group/variables.tf +16 -0
  154. package/dist/infra-templates/modules/azure-sql-database/main.tf +63 -0
  155. package/dist/infra-templates/modules/azure-sql-database/outputs.tf +20 -0
  156. package/dist/infra-templates/modules/azure-sql-database/variables.tf +78 -0
  157. package/dist/infra-templates/modules/azure-storage-account/main.tf +13 -0
  158. package/dist/infra-templates/modules/azure-storage-account/outputs.tf +16 -0
  159. package/dist/infra-templates/modules/azure-storage-account/variables.tf +38 -0
  160. package/dist/infra-templates/modules/cloud-watch/event-bridge.tf +15 -0
  161. package/dist/infra-templates/modules/cloud-watch/lambda.tf +84 -0
  162. package/dist/infra-templates/modules/cloud-watch/lambda_function.zip +0 -0
  163. package/dist/infra-templates/modules/cloud-watch/lambda_function_deploy.zip +0 -0
  164. package/dist/infra-templates/modules/cloud-watch/main.tf +156 -0
  165. package/dist/infra-templates/modules/cloud-watch/sns.tf +3 -0
  166. package/dist/infra-templates/modules/cloud-watch/variables.tf +38 -0
  167. package/dist/infra-templates/modules/ecs-core/alb.tf +126 -0
  168. package/dist/infra-templates/modules/ecs-core/cloudwatch.tf +48 -0
  169. package/dist/infra-templates/modules/ecs-core/iam.tf +95 -0
  170. package/dist/infra-templates/modules/ecs-core/main.tf +12 -0
  171. package/dist/infra-templates/modules/ecs-core/outputs.tf +44 -0
  172. package/dist/infra-templates/modules/ecs-core/secrets.tf +9 -0
  173. package/dist/infra-templates/modules/ecs-core/security_groups.tf +73 -0
  174. package/dist/infra-templates/modules/ecs-core/variables.tf +96 -0
  175. package/dist/infra-templates/modules/ecs-service/ecs_autoscaling.tf +51 -0
  176. package/dist/infra-templates/modules/ecs-service/ecs_service.tf +39 -0
  177. package/dist/infra-templates/modules/ecs-service/ecs_task_definition.tf +56 -0
  178. package/dist/infra-templates/modules/ecs-service/variables.tf +170 -0
  179. package/dist/infra-templates/modules/elastic-container-registry/main.tf +32 -0
  180. package/dist/infra-templates/modules/elastic-container-registry/outputs.tf +9 -0
  181. package/dist/infra-templates/modules/elastic-container-registry/variables.tf +25 -0
  182. package/dist/infra-templates/modules/github-oidc-role/main.tf +46 -0
  183. package/dist/infra-templates/modules/github-oidc-role/outputs.tf +4 -0
  184. package/dist/infra-templates/modules/github-oidc-role/variables.tf +11 -0
  185. package/dist/infra-templates/modules/guardduty/main.tf +8 -0
  186. package/dist/infra-templates/modules/iam/main.tf +205 -0
  187. package/dist/infra-templates/modules/iam/outputs.tf +3 -0
  188. package/dist/infra-templates/modules/iam/variables.tf +4 -0
  189. package/dist/infra-templates/modules/random-key/main.tf +11 -0
  190. package/dist/infra-templates/modules/random-key/outputs.tf +4 -0
  191. package/dist/infra-templates/modules/random-key/variables.tf +10 -0
  192. package/dist/infra-templates/modules/redis/main.tf +47 -0
  193. package/dist/infra-templates/modules/redis/outputs.tf +8 -0
  194. package/dist/infra-templates/modules/redis/variables.tf +20 -0
  195. package/dist/infra-templates/modules/relational-database-service/main.tf +44 -0
  196. package/dist/infra-templates/modules/relational-database-service/outputs.tf +13 -0
  197. package/dist/infra-templates/modules/relational-database-service/security-group.tf +15 -0
  198. package/dist/infra-templates/modules/relational-database-service/variables.tf +50 -0
  199. package/dist/infra-templates/modules/secret/main.tf +14 -0
  200. package/dist/infra-templates/modules/secret/outputs.tf +3 -0
  201. package/dist/infra-templates/modules/secret/variables.tf +8 -0
  202. package/dist/infra-templates/modules/simple-storage-service/main.tf +28 -0
  203. package/dist/infra-templates/modules/simple-storage-service/variables.tf +4 -0
  204. package/dist/infra-templates/modules/vpc/data.tf +2 -0
  205. package/dist/infra-templates/modules/vpc/main.tf +76 -0
  206. package/dist/infra-templates/modules/vpc/outputs.tf +23 -0
  207. package/dist/infra-templates/modules/vpc/variables.tf +5 -0
  208. package/dist/infra-templates/package.json +6 -0
  209. package/dist/infra-templates/templates/azure/MANUAL_DEPLOY.md +168 -0
  210. package/dist/infra-templates/templates/azure/backend.tf +8 -0
  211. package/dist/infra-templates/templates/azure/data.tf +21 -0
  212. package/dist/infra-templates/templates/azure/default.tfvars +0 -0
  213. package/dist/infra-templates/templates/azure/locals.tf +116 -0
  214. package/dist/infra-templates/templates/azure/main.tf +421 -0
  215. package/dist/infra-templates/templates/azure/outputs.tf +40 -0
  216. package/dist/infra-templates/templates/azure/providers.tf +65 -0
  217. package/dist/infra-templates/templates/azure/variables.tf +69 -0
  218. package/dist/infra-templates/templates/azure/workflows/build_and_deploy.yml +155 -0
  219. package/dist/infra-templates/templates/azure/workflows/tests.yml +63 -0
  220. package/dist/infra-templates/templates/ecs/README.md +235 -0
  221. package/dist/infra-templates/templates/ecs/backend.tf +7 -0
  222. package/dist/infra-templates/templates/ecs/data.tf +6 -0
  223. package/dist/infra-templates/templates/ecs/default.tfvars +1 -0
  224. package/dist/infra-templates/templates/ecs/locals.tf +97 -0
  225. package/dist/infra-templates/templates/ecs/main.tf +185 -0
  226. package/dist/infra-templates/templates/ecs/outputs.tf +42 -0
  227. package/dist/infra-templates/templates/ecs/providers.tf +21 -0
  228. package/dist/infra-templates/templates/ecs/variables.tf +105 -0
  229. package/dist/infra-templates/templates/ecs/workflows/build_and_deploy.yml +188 -0
  230. package/dist/infra-templates/templates/ecs/workflows/tests.yml +65 -0
  231. package/package.json +10 -2
  232. package/schema/fuel.schema.json +570 -91
@@ -1 +1 @@
1
- {"version":3,"file":"git-client.js","sourceRoot":"","sources":["../../src/infra/git-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-client.js","sourceRoot":"","sources":["../../src/infra/git-client.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
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>;
7
+ export declare function repoExists(token: string, org: string, name: string): Promise<boolean>;
1
8
  export declare function createGitHubRepo(token: string, org: string, name: string): Promise<{
2
9
  name: string;
3
10
  htmlUrl: string;
@@ -1 +1 @@
1
- {"version":3,"file":"github-client.d.ts","sourceRoot":"","sources":["../../src/infra/github-client.ts"],"names":[],"mappings":"AAEA,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,CAmBf"}
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,CA2BtE;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,8 +1,51 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateGitHubToken = validateGitHubToken;
4
+ exports.repoExists = repoExists;
3
5
  exports.createGitHubRepo = createGitHubRepo;
4
6
  exports.setBranchProtection = setBranchProtection;
5
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
+ }
37
+ async function repoExists(token, org, name) {
38
+ const octokit = new rest_1.Octokit({ auth: token });
39
+ try {
40
+ await octokit.rest.repos.get({ owner: org, repo: name });
41
+ return true;
42
+ }
43
+ catch (err) {
44
+ if (err?.status === 404)
45
+ return false;
46
+ throw err;
47
+ }
48
+ }
6
49
  async function createGitHubRepo(token, org, name) {
7
50
  const octokit = new rest_1.Octokit({ auth: token });
8
51
  const { data } = await octokit.rest.repos.createInOrg({
@@ -10,7 +53,7 @@ async function createGitHubRepo(token, org, name) {
10
53
  name,
11
54
  auto_init: false,
12
55
  visibility: 'private',
13
- description: 'FUEL Monorepo — generated by Fuel CLI',
56
+ description: 'FUEL Monorepo — generated by Fuel CLI'
14
57
  });
15
58
  return { name: data.name, htmlUrl: data.html_url };
16
59
  }
@@ -23,14 +66,11 @@ async function setBranchProtection(token, owner, repo, branch) {
23
66
  enforce_admins: false,
24
67
  required_pull_request_reviews: {
25
68
  required_approving_review_count: 1,
26
- dismiss_stale_reviews: true,
27
- },
28
- required_status_checks: {
29
- strict: true,
30
- contexts: ['Title matches Jira Issue'],
69
+ dismiss_stale_reviews: true
31
70
  },
71
+ required_status_checks: null,
32
72
  restrictions: null,
33
- allow_deletions: false,
73
+ allow_deletions: false
34
74
  });
35
75
  }
36
76
  //# sourceMappingURL=github-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/infra/github-client.ts"],"names":[],"mappings":";;AAEA,4CAgBC;AAED,kDAwBC;AA5CD,wCAAuC;AAEhC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,GAAW,EACX,IAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAE5C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QACpD,GAAG;QACH,IAAI;QACJ,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,SAAS;QACrB,WAAW,EAAE,uCAAuC;KACrD,CAAC,CAAA;IAEF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAA;AACpD,CAAC;AAEM,KAAK,UAAU,mBAAmB,CACvC,KAAa,EACb,KAAa,EACb,IAAY,EACZ,MAAc;IAEd,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAE5C,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC;QAC9C,KAAK;QACL,IAAI;QACJ,MAAM;QACN,cAAc,EAAE,KAAK;QACrB,6BAA6B,EAAE;YAC7B,+BAA+B,EAAE,CAAC;YAClC,qBAAqB,EAAE,IAAI;SAC5B;QACD,sBAAsB,EAAE;YACtB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,CAAC,0BAA0B,CAAC;SACvC;QACD,YAAY,EAAE,IAAI;QAClB,eAAe,EAAE,KAAK;KACvB,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"github-client.js","sourceRoot":"","sources":["../../src/infra/github-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"github-secrets-client.d.ts","sourceRoot":"","sources":["../../src/infra/github-secrets-client.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAIf"}
1
+ {"version":3,"file":"github-secrets-client.d.ts","sourceRoot":"","sources":["../../src/infra/github-secrets-client.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -13,7 +13,7 @@ async function setRepoSecret(token, owner, repo, secretName, secretValue) {
13
13
  // Fetch the repo's public key for secret encryption
14
14
  const { data: keyData } = await octokit.rest.actions.getRepoPublicKey({
15
15
  owner,
16
- repo,
16
+ repo
17
17
  });
18
18
  // Encrypt the secret value using libsodium crypto_box_seal
19
19
  const binkey = libsodium_wrappers_1.default.from_base64(keyData.key, libsodium_wrappers_1.default.base64_variants.ORIGINAL);
@@ -26,7 +26,7 @@ async function setRepoSecret(token, owner, repo, secretName, secretValue) {
26
26
  repo,
27
27
  secret_name: secretName,
28
28
  encrypted_value: encryptedValue,
29
- key_id: keyData.key_id,
29
+ key_id: keyData.key_id
30
30
  });
31
31
  }
32
32
  async function setRepoSecrets(token, owner, repo, secrets) {
@@ -1 +1 @@
1
- {"version":3,"file":"github-secrets-client.js","sourceRoot":"","sources":["../../src/infra/github-secrets-client.ts"],"names":[],"mappings":";;;;;AAGA,sCA+BC;AAED,wCASC;AA7CD,wCAAuC;AACvC,4EAAuC;AAEhC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,KAAa,EACb,IAAY,EACZ,UAAkB,EAClB,WAAmB;IAEnB,MAAM,4BAAM,CAAC,KAAK,CAAA;IAElB,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAE5C,oDAAoD;IACpD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACpE,KAAK;QACL,IAAI;KACL,CAAC,CAAA;IAEF,2DAA2D;IAC3D,MAAM,MAAM,GAAG,4BAAM,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,4BAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IAC/E,MAAM,MAAM,GAAG,4BAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,4BAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvD,MAAM,cAAc,GAAG,4BAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,4BAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;IAElF,8BAA8B;IAC9B,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;QAClD,KAAK;QACL,IAAI;QACJ,WAAW,EAAE,UAAU;QACvB,eAAe,EAAE,cAAc;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;AACJ,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,KAAa,EACb,IAAY,EACZ,OAA+B;IAE/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IACtD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"github-secrets-client.js","sourceRoot":"","sources":["../../src/infra/github-secrets-client.ts"],"names":[],"mappings":";;;;;AAGA,sCAqCC;AAED,wCASC;AAnDD,wCAAuC;AACvC,4EAAuC;AAEhC,KAAK,UAAU,aAAa,CACjC,KAAa,EACb,KAAa,EACb,IAAY,EACZ,UAAkB,EAClB,WAAmB;IAEnB,MAAM,4BAAM,CAAC,KAAK,CAAA;IAElB,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAE5C,oDAAoD;IACpD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;QACpE,KAAK;QACL,IAAI;KACL,CAAC,CAAA;IAEF,2DAA2D;IAC3D,MAAM,MAAM,GAAG,4BAAM,CAAC,WAAW,CAC/B,OAAO,CAAC,GAAG,EACX,4BAAM,CAAC,eAAe,CAAC,QAAQ,CAChC,CAAA;IACD,MAAM,MAAM,GAAG,4BAAM,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;IAC9C,MAAM,QAAQ,GAAG,4BAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvD,MAAM,cAAc,GAAG,4BAAM,CAAC,SAAS,CACrC,QAAQ,EACR,4BAAM,CAAC,eAAe,CAAC,QAAQ,CAChC,CAAA;IAED,8BAA8B;IAC9B,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC;QAClD,KAAK;QACL,IAAI;QACJ,WAAW,EAAE,UAAU;QACvB,eAAe,EAAE,cAAc;QAC/B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAA;AACJ,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,KAAa,EACb,IAAY,EACZ,OAA+B;IAE/B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;IACtD,CAAC;AACH,CAAC"}
@@ -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,CAY/C"}
@@ -0,0 +1,32 @@
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'
21
+ ? 'open'
22
+ : process.platform === 'win32'
23
+ ? 'start'
24
+ : 'xdg-open';
25
+ try {
26
+ (0, child_process_1.exec)(`${cmd} "${url}"`);
27
+ }
28
+ catch {
29
+ // Best-effort — the link is already printed for the user to open manually.
30
+ }
31
+ }
32
+ //# 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,sCAYC;AA7BD,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;QAC3B,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,UAAU,CAAA;IAClB,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 declare function runInfraOrchestrator(targetRoot: string, _appName: string, config: InfraConfig, credentials: Credentials, options?: OrchestratorOptions): Promise<void>;
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;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"}
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;AAgHlD,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;AA4aD,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"}
@@ -41,22 +41,25 @@ const path = __importStar(require("path"));
41
41
  const chalk_1 = __importDefault(require("chalk"));
42
42
  const tofu_runner_1 = require("./tofu-runner");
43
43
  const secrets_manager_client_1 = require("./secrets-manager-client");
44
+ const azure_keyvault_client_1 = require("./azure-keyvault-client");
44
45
  const config_writer_1 = require("./config-writer");
45
46
  const git_client_1 = require("./git-client");
46
47
  const github_client_1 = require("./github-client");
47
48
  const github_secrets_client_1 = require("./github-secrets-client");
48
49
  const subprocess_1 = require("./subprocess");
49
50
  const s3_state_bucket_1 = require("./s3-state-bucket");
51
+ const azure_state_storage_1 = require("./azure-state-storage");
52
+ const azure_rbac_1 = require("./azure-rbac");
50
53
  function slugify(name) {
51
54
  return name.replace(/[^a-z0-9]/gi, '_').toLowerCase();
52
55
  }
53
- async function runCompensation(infraDir, credentials, tofuVars) {
56
+ async function runAwsCompensation(infraDir, credentials, tofuVars) {
54
57
  console.log(chalk_1.default.red('\n--- Cleaning up AWS resources ---'));
55
- const args = (0, tofu_runner_1.buildDestroyArgs)(credentials, tofuVars);
58
+ const args = (0, tofu_runner_1.buildDestroyArgs)(credentials, tofuVars, 'ecs');
56
59
  const awsEnv = {
57
60
  AWS_ACCESS_KEY_ID: credentials.AWS_ACCESS_KEY_ID,
58
61
  AWS_SECRET_ACCESS_KEY: credentials.AWS_SECRET_ACCESS_KEY,
59
- AWS_REGION: credentials.AWS_REGION,
62
+ AWS_REGION: credentials.AWS_REGION
60
63
  };
61
64
  const { code } = await (0, subprocess_1.spawnStreaming)(args, infraDir, awsEnv);
62
65
  if (code !== 0) {
@@ -65,50 +68,112 @@ async function runCompensation(infraDir, credentials, tofuVars) {
65
68
  }
66
69
  console.log(chalk_1.default.green('AWS resources cleaned up'));
67
70
  }
68
- function printOutputTable(albDns, ecrUrl, githubRepoUrl) {
71
+ async function runAzureCompensation(infraDir, credentials, tofuVars) {
72
+ console.log(chalk_1.default.red('\n--- Cleaning up Azure resources ---'));
73
+ const args = (0, tofu_runner_1.buildDestroyArgs)(credentials, tofuVars, 'azure');
74
+ const azureEnv = {
75
+ ARM_SUBSCRIPTION_ID: credentials.AZURE_SUBSCRIPTION_ID,
76
+ ARM_TENANT_ID: credentials.AZURE_TENANT_ID,
77
+ ARM_CLIENT_ID: credentials.AZURE_CLIENT_ID,
78
+ ARM_CLIENT_SECRET: credentials.AZURE_CLIENT_SECRET
79
+ };
80
+ const { code } = await (0, subprocess_1.spawnStreaming)(args, infraDir, azureEnv);
81
+ if (code !== 0) {
82
+ console.error(chalk_1.default.red('Compensation destroy failed. Manually delete Azure resources.'));
83
+ process.exit(1);
84
+ }
85
+ console.log(chalk_1.default.green('Azure resources cleaned up'));
86
+ }
87
+ function printOutputTable(rows, codePushed) {
69
88
  const divider = chalk_1.default.gray('─'.repeat(60));
70
89
  console.log('\n' + divider);
71
90
  console.log(chalk_1.default.bold(' Deployment Complete'));
72
91
  console.log(divider);
73
- console.log(` ${chalk_1.default.dim('ALB DNS')} ${albDns}`);
74
- console.log(` ${chalk_1.default.dim('ECR URL')} ${ecrUrl}`);
75
- console.log(` ${chalk_1.default.dim('GitHub Repo')} ${githubRepoUrl}`);
92
+ for (const [label, value] of rows) {
93
+ console.log(` ${chalk_1.default.dim(label.padEnd(18))}${value}`);
94
+ }
76
95
  console.log(divider);
77
96
  console.log(chalk_1.default.cyan('\n Next steps:'));
78
- console.log(' Your code has been pushed. Your first deploy will start shortly.\n');
97
+ if (codePushed) {
98
+ console.log(' Your code has been pushed. Your first deploy will start shortly.\n');
99
+ }
100
+ else {
101
+ console.log(chalk_1.default.yellow(' Code was NOT pushed automatically — see the push warning above and push manually.\n'));
102
+ }
79
103
  }
80
- async function runInfraOrchestrator(targetRoot, _appName, config, credentials, options) {
104
+ async function pushCodeAndProtect(targetRoot, config, credentials, repoName, githubRepoUrl, options) {
105
+ await (0, git_client_1.wireGitRemote)(targetRoot, githubRepoUrl);
106
+ console.log(chalk_1.default.green('Git remote origin set'));
107
+ const allBranches = [...new Set(config.apps.map((app) => app.branch))];
108
+ const branches = options?.targetBranch
109
+ ? allBranches.filter((b) => b === options.targetBranch)
110
+ : allBranches;
111
+ // Phase 1: push the base commit so the branch exists on the remote.
112
+ try {
113
+ await (0, git_client_1.pushToRemote)(targetRoot, credentials.GITHUB_TOKEN, branches, options?.forcePush);
114
+ }
115
+ catch {
116
+ console.log(chalk_1.default.yellow(`Warning: base push failed. Push manually: git push -u origin ${branches.join(' ')}`));
117
+ }
118
+ // Phase 2: commit infrastructure and push on top as a fast-forward.
119
+ const committed = await (0, git_client_1.commitAll)(targetRoot, 'Add infrastructure configuration');
120
+ if (committed) {
121
+ console.log(chalk_1.default.green('Infrastructure files committed'));
122
+ }
123
+ let codePushed = false;
124
+ try {
125
+ await (0, git_client_1.pushToRemote)(targetRoot, credentials.GITHUB_TOKEN, branches, false);
126
+ console.log(chalk_1.default.green(`Code pushed to: ${branches.join(', ')}`));
127
+ codePushed = true;
128
+ }
129
+ catch {
130
+ console.log(chalk_1.default.yellow(`Warning: automatic push failed. Push manually: git push origin ${branches.join(' ')}`));
131
+ }
132
+ if (!options?.skipBranchProtection) {
133
+ console.log(chalk_1.default.cyan('--- Applying branch protections ---'));
134
+ for (const branch of branches) {
135
+ try {
136
+ await (0, github_client_1.setBranchProtection)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName, branch);
137
+ console.log(chalk_1.default.green(`✓ Branch protection set for: ${branch}`));
138
+ }
139
+ catch {
140
+ console.log(chalk_1.default.yellow(`Warning: could not set branch protection for ${branch}`));
141
+ }
142
+ }
143
+ }
144
+ else {
145
+ console.log(chalk_1.default.yellow('--- Skipping branch protections (--skip-branch-protection) ---'));
146
+ }
147
+ return { branches, codePushed };
148
+ }
149
+ async function runAwsOrchestrator(targetRoot, config, credentials, options) {
81
150
  const infraDir = path.join(targetRoot, 'infra');
82
- const repoName = `${config.name}-monorepo`;
83
- // Generate TofuVars
151
+ const repoName = config.github_repo_name ?? `${config.name}-monorepo`;
84
152
  const tofuVars = {
85
153
  db_username: slugify(config.name),
86
154
  db_name: slugify(config.name),
87
- github_repo_name: repoName,
155
+ github_repo_name: repoName
88
156
  };
89
- // Ensure S3 state bucket exists (before Tofu init)
90
157
  console.log(chalk_1.default.cyan('--- Ensuring state bucket exists ---'));
91
158
  const suffix = (0, s3_state_bucket_1.deriveSuffix)(config.name);
92
159
  const bucketName = (0, s3_state_bucket_1.buildStateBucketName)(config.name, suffix);
93
160
  await (0, s3_state_bucket_1.ensureStateBucket)(credentials, bucketName);
94
- // Write secret to AWS Secrets Manager (before Tofu — Tofu reads it via data.tf)
95
161
  const secretName = `${config.name}-infrastructure-variables`;
96
162
  const secretPayload = {
97
163
  ...config,
98
164
  seed: (0, config_writer_1.generateSeed)(),
99
165
  aws_region: credentials.AWS_REGION,
100
- github_org: credentials.GITHUB_ORGANIZATION,
166
+ github_org: credentials.GITHUB_ORGANIZATION
101
167
  };
102
168
  console.log(chalk_1.default.cyan('--- Writing infrastructure secret ---'));
103
169
  await (0, secrets_manager_client_1.putSecret)(credentials, secretName, secretPayload);
104
170
  console.log(chalk_1.default.green('Secret written to AWS Secrets Manager'));
105
- // SIGINT compensation setup
106
171
  const state = { tofuStarted: false };
107
172
  const sigintHandler = async () => {
108
173
  if (options?.destroyOnFailure) {
109
174
  console.log(chalk_1.default.yellow('\nInterrupted — running compensation...'));
110
175
  if (state.tofuStarted) {
111
- await runCompensation(infraDir, credentials, tofuVars);
176
+ await runAwsCompensation(infraDir, credentials, tofuVars);
112
177
  }
113
178
  }
114
179
  else {
@@ -119,86 +184,170 @@ async function runInfraOrchestrator(targetRoot, _appName, config, credentials, o
119
184
  };
120
185
  process.once('SIGINT', sigintHandler);
121
186
  try {
122
- // Step 1: Create GitHub repo (skip in plan-only mode)
123
187
  if (!options?.planOnly) {
124
188
  console.log(chalk_1.default.cyan('--- Creating GitHub repository ---'));
125
- try {
189
+ const exists = await (0, github_client_1.repoExists)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName);
190
+ if (exists) {
191
+ console.log(chalk_1.default.yellow(`Repository ${credentials.GITHUB_ORGANIZATION}/${repoName} already exists, skipping creation`));
192
+ }
193
+ else {
126
194
  await (0, github_client_1.createGitHubRepo)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName);
127
195
  console.log(chalk_1.default.green(`✓ Repository created: ${credentials.GITHUB_ORGANIZATION}/${repoName}`));
128
196
  }
129
- catch (err) {
130
- // If repo already exists (422), continue — it may be a re-run
131
- if (err?.status === 422) {
132
- console.log(chalk_1.default.yellow(`Repository ${credentials.GITHUB_ORGANIZATION}/${repoName} already exists, continuing...`));
133
- }
134
- else {
135
- throw err;
136
- }
137
- }
138
197
  }
139
- // Step 2: Single Tofu apply (all AWS resources)
140
198
  state.tofuStarted = true;
141
199
  const result = await (0, tofu_runner_1.runTofuApply)(infraDir, credentials, tofuVars, {
142
200
  planOnly: options?.planOnly,
201
+ deployment: 'ecs'
143
202
  });
144
203
  if (options?.planOnly) {
145
204
  console.log(chalk_1.default.green('\n Plan complete — no resources were created.\n'));
146
205
  return;
147
206
  }
148
- // Step 3: Set GitHub Actions secrets
149
207
  console.log(chalk_1.default.cyan('--- Setting GitHub Actions secrets ---'));
150
208
  const roleArn = result.outputs['oidc_role_arn'].value;
151
209
  const secrets = {
152
210
  AWS_REGION: credentials.AWS_REGION,
153
211
  AWS_ROLE_ARN: roleArn,
154
- PROJECT_NAME: config.name,
212
+ PROJECT_NAME: config.name
155
213
  };
156
214
  await (0, github_secrets_client_1.setRepoSecrets)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName, secrets);
157
215
  console.log(chalk_1.default.green('✓ GitHub Actions secrets configured'));
158
- // Step 4: Push code
159
216
  const githubRepoUrl = result.outputs['github_http_repo_url'].value;
160
- await (0, git_client_1.wireGitRemote)(targetRoot, githubRepoUrl);
161
- console.log(chalk_1.default.green('Git remote origin set'));
162
- const committed = await (0, git_client_1.commitAll)(targetRoot, 'Add infrastructure configuration');
163
- if (committed) {
164
- console.log(chalk_1.default.green('Infrastructure files committed'));
217
+ const { codePushed } = await pushCodeAndProtect(targetRoot, config, credentials, repoName, githubRepoUrl, options);
218
+ printOutputTable([
219
+ ['ALB DNS', result.outputs['alb_dns'].value],
220
+ ['ECR URL', result.outputs['ecr_url'].value],
221
+ ['GitHub Repo', githubRepoUrl]
222
+ ], codePushed);
223
+ return { codePushed };
224
+ }
225
+ catch (err) {
226
+ if (err instanceof tofu_runner_1.TofuApplyError) {
227
+ if (options?.destroyOnFailure) {
228
+ await runAwsCompensation(infraDir, credentials, tofuVars);
229
+ }
230
+ else {
231
+ console.log(chalk_1.default.yellow('\n Partial resources preserved. Fix the issue and re-run:'));
232
+ console.log(chalk_1.default.yellow(' fuel infra:deploy\n'));
233
+ }
234
+ process.exit(1);
165
235
  }
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;
170
- try {
171
- await (0, git_client_1.pushToRemote)(targetRoot, credentials.GITHUB_TOKEN, branches, options?.forcePush);
172
- console.log(chalk_1.default.green(`Code pushed to: ${branches.join(', ')}`));
236
+ throw err;
237
+ }
238
+ finally {
239
+ process.removeListener('SIGINT', sigintHandler);
240
+ }
241
+ }
242
+ async function runAzureOrchestrator(targetRoot, config, credentials, options) {
243
+ const infraDir = path.join(targetRoot, 'infra');
244
+ const repoName = config.github_repo_name ?? `${config.name}-monorepo`;
245
+ const tofuVars = {
246
+ db_username: slugify(config.name),
247
+ db_name: slugify(config.name),
248
+ github_repo_name: repoName
249
+ };
250
+ console.log(chalk_1.default.cyan('--- Ensuring resource group, state storage and Key Vault exist ---'));
251
+ const suffix = (0, s3_state_bucket_1.deriveSuffix)(config.name);
252
+ const resourceGroupName = (0, azure_state_storage_1.buildResourceGroupName)(config.name);
253
+ const storageAccountName = (0, azure_state_storage_1.buildStateStorageAccountName)(config.name, suffix);
254
+ const keyVaultName = (0, azure_state_storage_1.buildKeyVaultName)(config.name, suffix);
255
+ await (0, azure_state_storage_1.ensureResourceGroup)(credentials, resourceGroupName, config.location);
256
+ await (0, azure_state_storage_1.ensureStateStorage)(credentials, resourceGroupName, storageAccountName, config.location);
257
+ await (0, azure_state_storage_1.ensureBootstrapKeyVault)(credentials, resourceGroupName, keyVaultName, config.location);
258
+ await (0, azure_rbac_1.ensureRoleAssignmentPermission)(credentials, resourceGroupName);
259
+ const secretName = 'infrastructure-variables';
260
+ const secretPayload = {
261
+ ...config,
262
+ seed: (0, config_writer_1.generateSeed)(),
263
+ github_org: credentials.GITHUB_ORGANIZATION
264
+ };
265
+ console.log(chalk_1.default.cyan('--- Writing infrastructure secret ---'));
266
+ await (0, azure_keyvault_client_1.putSecret)(credentials, keyVaultName, secretName, secretPayload);
267
+ console.log(chalk_1.default.green('Secret written to Azure Key Vault'));
268
+ const state = { tofuStarted: false };
269
+ const sigintHandler = async () => {
270
+ if (options?.destroyOnFailure) {
271
+ console.log(chalk_1.default.yellow('\nInterrupted — running compensation...'));
272
+ if (state.tofuStarted) {
273
+ await runAzureCompensation(infraDir, credentials, tofuVars);
274
+ }
173
275
  }
174
- catch {
175
- console.log(chalk_1.default.yellow(`Warning: automatic push failed. Push manually: git push -u origin ${branches.join(' ')}`));
276
+ else {
277
+ console.log(chalk_1.default.yellow('\nInterrupted — partial resources preserved.'));
278
+ console.log(chalk_1.default.yellow('Re-run "fuel infra:deploy" to resume.\n'));
176
279
  }
177
- // Step 5: Branch protections
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
- }
280
+ process.exit(1);
281
+ };
282
+ process.once('SIGINT', sigintHandler);
283
+ try {
284
+ if (!options?.planOnly) {
285
+ console.log(chalk_1.default.cyan('--- Creating GitHub repository ---'));
286
+ const exists = await (0, github_client_1.repoExists)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName);
287
+ if (exists) {
288
+ console.log(chalk_1.default.yellow(`Repository ${credentials.GITHUB_ORGANIZATION}/${repoName} already exists, skipping creation`));
188
289
  }
290
+ else {
291
+ await (0, github_client_1.createGitHubRepo)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName);
292
+ console.log(chalk_1.default.green(`✓ Repository created: ${credentials.GITHUB_ORGANIZATION}/${repoName}`));
293
+ }
294
+ }
295
+ state.tofuStarted = true;
296
+ const result = await (0, tofu_runner_1.runTofuApply)(infraDir, credentials, tofuVars, {
297
+ planOnly: options?.planOnly,
298
+ deployment: 'azure'
299
+ });
300
+ if (options?.planOnly) {
301
+ console.log(chalk_1.default.green('\n Plan complete — no resources were created.\n'));
302
+ return;
303
+ }
304
+ console.log(chalk_1.default.cyan('--- Setting GitHub Actions secrets ---'));
305
+ const oidcClientId = result.outputs['github_oidc_client_id']?.value;
306
+ const secrets = {
307
+ AZURE_TENANT_ID: credentials.AZURE_TENANT_ID,
308
+ AZURE_SUBSCRIPTION_ID: credentials.AZURE_SUBSCRIPTION_ID,
309
+ PROJECT_NAME: config.name,
310
+ ACR_LOGIN_SERVER: result.outputs['acr_login_server'].value,
311
+ RESOURCE_GROUP: resourceGroupName
312
+ };
313
+ if (oidcClientId) {
314
+ secrets.AZURE_CLIENT_ID = oidcClientId;
189
315
  }
190
316
  else {
191
- console.log(chalk_1.default.yellow('--- Skipping branch protections (--skip-branch-protection) ---'));
317
+ console.log(chalk_1.default.yellow(' github_oidc disabled — skipping AZURE_CLIENT_ID secret (CI push/deploy will not work until it is set up)'));
192
318
  }
193
- // Print output table
194
- const albDns = result.outputs['alb_dns'].value;
195
- const ecrUrl = result.outputs['ecr_url'].value;
196
- printOutputTable(albDns, ecrUrl, githubRepoUrl);
319
+ await (0, github_secrets_client_1.setRepoSecrets)(credentials.GITHUB_TOKEN, credentials.GITHUB_ORGANIZATION, repoName, secrets);
320
+ console.log(chalk_1.default.green('✓ GitHub Actions secrets configured'));
321
+ const githubRepoUrl = result.outputs['github_http_repo_url'].value;
322
+ const { codePushed } = await pushCodeAndProtect(targetRoot, config, credentials, repoName, githubRepoUrl, options);
323
+ printOutputTable([
324
+ [
325
+ 'Front Door',
326
+ result.outputs['front_door_endpoint_hostname']?.value ??
327
+ '(not created)'
328
+ ],
329
+ ['ACR', result.outputs['acr_login_server'].value],
330
+ ['Resource Group', resourceGroupName],
331
+ ['GitHub Repo', githubRepoUrl]
332
+ ], codePushed);
333
+ const domainValidation = (result.outputs['custom_domain_validation']
334
+ ?.value ?? {});
335
+ const domains = Object.entries(domainValidation);
336
+ if (domains.length > 0) {
337
+ console.log(chalk_1.default.cyan('\n--- Custom domain DNS records needed ---'));
338
+ console.log(chalk_1.default.yellow(" Add these at the domain's own DNS provider so Azure can validate ownership and issue the managed TLS certificate:\n"));
339
+ for (const [hostName, record] of domains) {
340
+ console.log(chalk_1.default.white(` ${hostName}`));
341
+ console.log(` TXT ${record.txt_record_name} → ${record.txt_record_value}`);
342
+ console.log(` CNAME ${hostName} → ${record.cname_target}\n`);
343
+ }
344
+ }
345
+ return { codePushed };
197
346
  }
198
347
  catch (err) {
199
348
  if (err instanceof tofu_runner_1.TofuApplyError) {
200
349
  if (options?.destroyOnFailure) {
201
- await runCompensation(infraDir, credentials, tofuVars);
350
+ await runAzureCompensation(infraDir, credentials, tofuVars);
202
351
  }
203
352
  else {
204
353
  console.log(chalk_1.default.yellow('\n Partial resources preserved. Fix the issue and re-run:'));
@@ -212,4 +361,10 @@ async function runInfraOrchestrator(targetRoot, _appName, config, credentials, o
212
361
  process.removeListener('SIGINT', sigintHandler);
213
362
  }
214
363
  }
364
+ async function runInfraOrchestrator(targetRoot, _appName, config, credentials, options) {
365
+ if (config.deployment === 'azure') {
366
+ return runAzureOrchestrator(targetRoot, config, credentials, options);
367
+ }
368
+ return runAwsOrchestrator(targetRoot, config, credentials, options);
369
+ }
215
370
  //# sourceMappingURL=orchestrator.js.map