@qpqjs/cli 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/lib/commonjs/cli/commandMenu.js +5 -4
  2. package/lib/commonjs/cli/commandMenu.js.map +1 -1
  3. package/lib/commonjs/cli/runCli.js +15 -7
  4. package/lib/commonjs/cli/runCli.js.map +1 -1
  5. package/lib/commonjs/commands/checkCircular.js +15 -7
  6. package/lib/commonjs/commands/checkCircular.js.map +1 -1
  7. package/lib/commonjs/commands/clearResources.js +8 -14
  8. package/lib/commonjs/commands/clearResources.js.map +1 -1
  9. package/lib/commonjs/commands/go.js +3 -7
  10. package/lib/commonjs/commands/go.js.map +1 -1
  11. package/lib/commonjs/commands/goDev.js +4 -2
  12. package/lib/commonjs/commands/goDev.js.map +1 -1
  13. package/lib/commonjs/commands/goDevApi.js +23 -20
  14. package/lib/commonjs/commands/goDevApi.js.map +1 -1
  15. package/lib/commonjs/commands/goDevWeb.js +13 -8
  16. package/lib/commonjs/commands/goDevWeb.js.map +1 -1
  17. package/lib/commonjs/commands/goDocker.js +10 -13
  18. package/lib/commonjs/commands/goDocker.js.map +1 -1
  19. package/lib/commonjs/commands/hooks.js +4 -2
  20. package/lib/commonjs/commands/hooks.js.map +1 -1
  21. package/lib/commonjs/commands/migrate.js +11 -9
  22. package/lib/commonjs/commands/migrate.js.map +1 -1
  23. package/lib/commonjs/commands/prep.js +4 -2
  24. package/lib/commonjs/commands/prep.js.map +1 -1
  25. package/lib/commonjs/commands/publish.js +4 -7
  26. package/lib/commonjs/commands/publish.js.map +1 -1
  27. package/lib/commonjs/commands/scriptBuild.js +7 -5
  28. package/lib/commonjs/commands/scriptBuild.js.map +1 -1
  29. package/lib/commonjs/commands/scriptBuilderLayer.js +6 -4
  30. package/lib/commonjs/commands/scriptBuilderLayer.js.map +1 -1
  31. package/lib/commonjs/commands/scriptNew.js +7 -5
  32. package/lib/commonjs/commands/scriptNew.js.map +1 -1
  33. package/lib/commonjs/commands/setup.js +14 -22
  34. package/lib/commonjs/commands/setup.js.map +1 -1
  35. package/lib/commonjs/commands/synth.js +16 -20
  36. package/lib/commonjs/commands/synth.js.map +1 -1
  37. package/lib/commonjs/commands/teardown.js +8 -14
  38. package/lib/commonjs/commands/teardown.js.map +1 -1
  39. package/lib/commonjs/lib/CliError.d.ts +4 -0
  40. package/lib/commonjs/lib/CliError.js +14 -0
  41. package/lib/commonjs/lib/CliError.js.map +1 -0
  42. package/lib/commonjs/lib/circularImports.d.ts +0 -1
  43. package/lib/commonjs/lib/circularImports.js +5 -6
  44. package/lib/commonjs/lib/circularImports.js.map +1 -1
  45. package/lib/commonjs/lib/clearResourcesPlan.d.ts +0 -1
  46. package/lib/commonjs/lib/clearResourcesPlan.js +12 -13
  47. package/lib/commonjs/lib/clearResourcesPlan.js.map +1 -1
  48. package/lib/commonjs/lib/deployPrompts.d.ts +2 -1
  49. package/lib/commonjs/lib/deployPrompts.js +16 -16
  50. package/lib/commonjs/lib/deployPrompts.js.map +1 -1
  51. package/lib/commonjs/lib/devServerEntry.js +5 -4
  52. package/lib/commonjs/lib/devServerEntry.js.map +1 -1
  53. package/lib/commonjs/lib/devServerPorts.js +2 -4
  54. package/lib/commonjs/lib/devServerPorts.js.map +1 -1
  55. package/lib/commonjs/lib/discovery.d.ts +0 -2
  56. package/lib/commonjs/lib/discovery.js +11 -44
  57. package/lib/commonjs/lib/discovery.js.map +1 -1
  58. package/lib/commonjs/lib/hooks.js +5 -3
  59. package/lib/commonjs/lib/hooks.js.map +1 -1
  60. package/lib/commonjs/lib/killChildWithEscalation.js +3 -1
  61. package/lib/commonjs/lib/killChildWithEscalation.js.map +1 -1
  62. package/lib/commonjs/lib/killStaleListeners.js +24 -37
  63. package/lib/commonjs/lib/killStaleListeners.js.map +1 -1
  64. package/lib/commonjs/lib/out.d.ts +11 -0
  65. package/lib/commonjs/lib/out.js +30 -0
  66. package/lib/commonjs/lib/out.js.map +1 -0
  67. package/lib/commonjs/lib/prompts.d.ts +1 -0
  68. package/lib/commonjs/lib/prompts.js +15 -2
  69. package/lib/commonjs/lib/prompts.js.map +1 -1
  70. package/lib/commonjs/lib/qpqConfigs.js +4 -4
  71. package/lib/commonjs/lib/qpqConfigs.js.map +1 -1
  72. package/lib/commonjs/lib/requireDriverCapability.d.ts +7 -0
  73. package/lib/commonjs/lib/requireDriverCapability.js +17 -0
  74. package/lib/commonjs/lib/requireDriverCapability.js.map +1 -0
  75. package/lib/commonjs/lib/resolveAppSelection.d.ts +1 -0
  76. package/lib/commonjs/lib/resolveAppSelection.js +19 -12
  77. package/lib/commonjs/lib/resolveAppSelection.js.map +1 -1
  78. package/lib/commonjs/lib/resolveCommandContext.d.ts +12 -0
  79. package/lib/commonjs/lib/resolveCommandContext.js +26 -0
  80. package/lib/commonjs/lib/resolveCommandContext.js.map +1 -0
  81. package/lib/commonjs/lib/resolveDeployment.d.ts +0 -1
  82. package/lib/commonjs/lib/resolveDeployment.js +15 -10
  83. package/lib/commonjs/lib/resolveDeployment.js.map +1 -1
  84. package/lib/commonjs/lib/runCommand.d.ts +20 -0
  85. package/lib/commonjs/lib/runCommand.js +64 -34
  86. package/lib/commonjs/lib/runCommand.js.map +1 -1
  87. package/lib/commonjs/lib/runTasks.js +8 -4
  88. package/lib/commonjs/lib/runTasks.js.map +1 -1
  89. package/lib/commonjs/lib/timing.js +5 -3
  90. package/lib/commonjs/lib/timing.js.map +1 -1
  91. package/lib/commonjs/lib/typeWatcher.d.ts +2 -1
  92. package/lib/commonjs/lib/typeWatcher.js +6 -13
  93. package/lib/commonjs/lib/typeWatcher.js.map +1 -1
  94. package/lib/commonjs/lib/userScriptBuilderLayer.d.ts +0 -2
  95. package/lib/commonjs/lib/userScriptBuilderLayer.js +7 -8
  96. package/lib/commonjs/lib/userScriptBuilderLayer.js.map +1 -1
  97. package/lib/commonjs/lib/views.js +3 -2
  98. package/lib/commonjs/lib/views.js.map +1 -1
  99. package/lib/commonjs/lib/webAddressingEnv.d.ts +0 -2
  100. package/lib/commonjs/lib/webAddressingEnv.js +4 -4
  101. package/lib/commonjs/lib/webAddressingEnv.js.map +1 -1
  102. package/lib/commonjs/platforms/aws/awsCredentials.js +3 -1
  103. package/lib/commonjs/platforms/aws/awsCredentials.js.map +1 -1
  104. package/lib/commonjs/platforms/aws/cdkApp.js +1 -1
  105. package/lib/commonjs/platforms/aws/cdkApp.js.map +1 -1
  106. package/lib/commonjs/platforms/aws/clearResources.js +16 -26
  107. package/lib/commonjs/platforms/aws/clearResources.js.map +1 -1
  108. package/lib/commonjs/platforms/aws/getDeployEnv.d.ts +1 -0
  109. package/lib/commonjs/platforms/aws/getDeployEnv.js +12 -0
  110. package/lib/commonjs/platforms/aws/getDeployEnv.js.map +1 -0
  111. package/lib/commonjs/platforms/aws/go.js +17 -15
  112. package/lib/commonjs/platforms/aws/go.js.map +1 -1
  113. package/lib/commonjs/platforms/aws/goDocker.js +29 -26
  114. package/lib/commonjs/platforms/aws/goDocker.js.map +1 -1
  115. package/lib/commonjs/platforms/aws/goDockerManifest.js +6 -1
  116. package/lib/commonjs/platforms/aws/goDockerManifest.js.map +1 -1
  117. package/lib/commonjs/platforms/aws/publish.js +13 -11
  118. package/lib/commonjs/platforms/aws/publish.js.map +1 -1
  119. package/lib/commonjs/platforms/aws/remote.js +8 -7
  120. package/lib/commonjs/platforms/aws/remote.js.map +1 -1
  121. package/lib/commonjs/platforms/aws/setup/buildBucketNamesStep.js +4 -4
  122. package/lib/commonjs/platforms/aws/setup/buildBucketNamesStep.js.map +1 -1
  123. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js +4 -3
  124. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
  125. package/lib/commonjs/platforms/aws/stacks.d.ts +0 -1
  126. package/lib/commonjs/platforms/aws/stacks.js +21 -33
  127. package/lib/commonjs/platforms/aws/stacks.js.map +1 -1
  128. package/lib/commonjs/platforms/aws/teardown.js +9 -7
  129. package/lib/commonjs/platforms/aws/teardown.js.map +1 -1
  130. package/lib/commonjs/platforms/aws/viewsSync.js +23 -11
  131. package/lib/commonjs/platforms/aws/viewsSync.js.map +1 -1
  132. package/lib/commonjs/platforms/docker/go.js +20 -18
  133. package/lib/commonjs/platforms/docker/go.js.map +1 -1
  134. package/lib/commonjs/platforms/docker/index.js +5 -4
  135. package/lib/commonjs/platforms/docker/index.js.map +1 -1
  136. package/lib/commonjs/platforms/docker/parseMounts.js +3 -2
  137. package/lib/commonjs/platforms/docker/parseMounts.js.map +1 -1
  138. package/lib/commonjs/platforms/index.js +4 -2
  139. package/lib/commonjs/platforms/index.js.map +1 -1
  140. package/lib/commonjs/platforms/types.d.ts +2 -2
  141. package/lib/commonjs/platforms/types.js.map +1 -1
  142. package/lib/esm/cli/commandMenu.js +5 -4
  143. package/lib/esm/cli/commandMenu.js.map +1 -1
  144. package/lib/esm/cli/runCli.js +15 -7
  145. package/lib/esm/cli/runCli.js.map +1 -1
  146. package/lib/esm/commands/checkCircular.js +15 -7
  147. package/lib/esm/commands/checkCircular.js.map +1 -1
  148. package/lib/esm/commands/clearResources.js +8 -14
  149. package/lib/esm/commands/clearResources.js.map +1 -1
  150. package/lib/esm/commands/go.js +3 -7
  151. package/lib/esm/commands/go.js.map +1 -1
  152. package/lib/esm/commands/goDev.js +4 -2
  153. package/lib/esm/commands/goDev.js.map +1 -1
  154. package/lib/esm/commands/goDevApi.js +21 -18
  155. package/lib/esm/commands/goDevApi.js.map +1 -1
  156. package/lib/esm/commands/goDevWeb.js +12 -8
  157. package/lib/esm/commands/goDevWeb.js.map +1 -1
  158. package/lib/esm/commands/goDocker.js +10 -13
  159. package/lib/esm/commands/goDocker.js.map +1 -1
  160. package/lib/esm/commands/hooks.js +4 -2
  161. package/lib/esm/commands/hooks.js.map +1 -1
  162. package/lib/esm/commands/migrate.js +9 -7
  163. package/lib/esm/commands/migrate.js.map +1 -1
  164. package/lib/esm/commands/prep.js +4 -2
  165. package/lib/esm/commands/prep.js.map +1 -1
  166. package/lib/esm/commands/publish.js +4 -7
  167. package/lib/esm/commands/publish.js.map +1 -1
  168. package/lib/esm/commands/scriptBuild.js +7 -5
  169. package/lib/esm/commands/scriptBuild.js.map +1 -1
  170. package/lib/esm/commands/scriptBuilderLayer.js +6 -4
  171. package/lib/esm/commands/scriptBuilderLayer.js.map +1 -1
  172. package/lib/esm/commands/scriptNew.js +7 -5
  173. package/lib/esm/commands/scriptNew.js.map +1 -1
  174. package/lib/esm/commands/setup.js +14 -22
  175. package/lib/esm/commands/setup.js.map +1 -1
  176. package/lib/esm/commands/synth.js +18 -22
  177. package/lib/esm/commands/synth.js.map +1 -1
  178. package/lib/esm/commands/teardown.js +8 -14
  179. package/lib/esm/commands/teardown.js.map +1 -1
  180. package/lib/esm/lib/CliError.d.ts +4 -0
  181. package/lib/esm/lib/CliError.js +11 -0
  182. package/lib/esm/lib/CliError.js.map +1 -0
  183. package/lib/esm/lib/circularImports.d.ts +0 -1
  184. package/lib/esm/lib/circularImports.js +4 -4
  185. package/lib/esm/lib/circularImports.js.map +1 -1
  186. package/lib/esm/lib/clearResourcesPlan.d.ts +0 -1
  187. package/lib/esm/lib/clearResourcesPlan.js +12 -12
  188. package/lib/esm/lib/clearResourcesPlan.js.map +1 -1
  189. package/lib/esm/lib/deployPrompts.d.ts +2 -1
  190. package/lib/esm/lib/deployPrompts.js +17 -17
  191. package/lib/esm/lib/deployPrompts.js.map +1 -1
  192. package/lib/esm/lib/devServerEntry.js +5 -4
  193. package/lib/esm/lib/devServerEntry.js.map +1 -1
  194. package/lib/esm/lib/devServerPorts.js +2 -3
  195. package/lib/esm/lib/devServerPorts.js.map +1 -1
  196. package/lib/esm/lib/discovery.d.ts +0 -2
  197. package/lib/esm/lib/discovery.js +10 -38
  198. package/lib/esm/lib/discovery.js.map +1 -1
  199. package/lib/esm/lib/hooks.js +5 -3
  200. package/lib/esm/lib/hooks.js.map +1 -1
  201. package/lib/esm/lib/killChildWithEscalation.js +3 -1
  202. package/lib/esm/lib/killChildWithEscalation.js.map +1 -1
  203. package/lib/esm/lib/killStaleListeners.js +24 -37
  204. package/lib/esm/lib/killStaleListeners.js.map +1 -1
  205. package/lib/esm/lib/out.d.ts +11 -0
  206. package/lib/esm/lib/out.js +26 -0
  207. package/lib/esm/lib/out.js.map +1 -0
  208. package/lib/esm/lib/prompts.d.ts +1 -0
  209. package/lib/esm/lib/prompts.js +13 -1
  210. package/lib/esm/lib/prompts.js.map +1 -1
  211. package/lib/esm/lib/qpqConfigs.js +4 -4
  212. package/lib/esm/lib/qpqConfigs.js.map +1 -1
  213. package/lib/esm/lib/requireDriverCapability.d.ts +7 -0
  214. package/lib/esm/lib/requireDriverCapability.js +13 -0
  215. package/lib/esm/lib/requireDriverCapability.js.map +1 -0
  216. package/lib/esm/lib/resolveAppSelection.d.ts +1 -0
  217. package/lib/esm/lib/resolveAppSelection.js +17 -11
  218. package/lib/esm/lib/resolveAppSelection.js.map +1 -1
  219. package/lib/esm/lib/resolveCommandContext.d.ts +12 -0
  220. package/lib/esm/lib/resolveCommandContext.js +12 -0
  221. package/lib/esm/lib/resolveCommandContext.js.map +1 -0
  222. package/lib/esm/lib/resolveDeployment.d.ts +0 -1
  223. package/lib/esm/lib/resolveDeployment.js +13 -8
  224. package/lib/esm/lib/resolveDeployment.js.map +1 -1
  225. package/lib/esm/lib/runCommand.d.ts +20 -0
  226. package/lib/esm/lib/runCommand.js +52 -31
  227. package/lib/esm/lib/runCommand.js.map +1 -1
  228. package/lib/esm/lib/runTasks.js +8 -4
  229. package/lib/esm/lib/runTasks.js.map +1 -1
  230. package/lib/esm/lib/timing.js +5 -3
  231. package/lib/esm/lib/timing.js.map +1 -1
  232. package/lib/esm/lib/typeWatcher.d.ts +2 -1
  233. package/lib/esm/lib/typeWatcher.js +6 -13
  234. package/lib/esm/lib/typeWatcher.js.map +1 -1
  235. package/lib/esm/lib/userScriptBuilderLayer.d.ts +0 -2
  236. package/lib/esm/lib/userScriptBuilderLayer.js +5 -5
  237. package/lib/esm/lib/userScriptBuilderLayer.js.map +1 -1
  238. package/lib/esm/lib/views.js +3 -2
  239. package/lib/esm/lib/views.js.map +1 -1
  240. package/lib/esm/lib/webAddressingEnv.d.ts +0 -2
  241. package/lib/esm/lib/webAddressingEnv.js +1 -1
  242. package/lib/esm/lib/webAddressingEnv.js.map +1 -1
  243. package/lib/esm/platforms/aws/awsCredentials.js +3 -1
  244. package/lib/esm/platforms/aws/awsCredentials.js.map +1 -1
  245. package/lib/esm/platforms/aws/cdkApp.js +1 -1
  246. package/lib/esm/platforms/aws/cdkApp.js.map +1 -1
  247. package/lib/esm/platforms/aws/clearResources.js +16 -25
  248. package/lib/esm/platforms/aws/clearResources.js.map +1 -1
  249. package/lib/esm/platforms/aws/getDeployEnv.d.ts +1 -0
  250. package/lib/esm/platforms/aws/getDeployEnv.js +8 -0
  251. package/lib/esm/platforms/aws/getDeployEnv.js.map +1 -0
  252. package/lib/esm/platforms/aws/go.js +17 -15
  253. package/lib/esm/platforms/aws/go.js.map +1 -1
  254. package/lib/esm/platforms/aws/goDocker.js +29 -26
  255. package/lib/esm/platforms/aws/goDocker.js.map +1 -1
  256. package/lib/esm/platforms/aws/goDockerManifest.js +6 -1
  257. package/lib/esm/platforms/aws/goDockerManifest.js.map +1 -1
  258. package/lib/esm/platforms/aws/publish.js +13 -11
  259. package/lib/esm/platforms/aws/publish.js.map +1 -1
  260. package/lib/esm/platforms/aws/remote.js +9 -7
  261. package/lib/esm/platforms/aws/remote.js.map +1 -1
  262. package/lib/esm/platforms/aws/setup/buildBucketNamesStep.js +2 -2
  263. package/lib/esm/platforms/aws/setup/buildBucketNamesStep.js.map +1 -1
  264. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js +4 -3
  265. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
  266. package/lib/esm/platforms/aws/stacks.d.ts +0 -1
  267. package/lib/esm/platforms/aws/stacks.js +22 -30
  268. package/lib/esm/platforms/aws/stacks.js.map +1 -1
  269. package/lib/esm/platforms/aws/teardown.js +9 -7
  270. package/lib/esm/platforms/aws/teardown.js.map +1 -1
  271. package/lib/esm/platforms/aws/viewsSync.js +22 -10
  272. package/lib/esm/platforms/aws/viewsSync.js.map +1 -1
  273. package/lib/esm/platforms/docker/go.js +21 -19
  274. package/lib/esm/platforms/docker/go.js.map +1 -1
  275. package/lib/esm/platforms/docker/index.js +5 -4
  276. package/lib/esm/platforms/docker/index.js.map +1 -1
  277. package/lib/esm/platforms/docker/parseMounts.js +3 -2
  278. package/lib/esm/platforms/docker/parseMounts.js.map +1 -1
  279. package/lib/esm/platforms/index.js +4 -2
  280. package/lib/esm/platforms/index.js.map +1 -1
  281. package/lib/esm/platforms/types.d.ts +2 -2
  282. package/lib/esm/platforms/types.js.map +1 -1
  283. package/package.json +28 -15
  284. package/templates/user-script/README.md +1 -1
@@ -13,7 +13,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.awsGoDocker = void 0;
16
- // `qpq go:docker` — asks the same questions as `qpq go`, then builds locally
16
+ // `qpq go:docker`, asks the same questions as `qpq go`, then builds locally
17
17
  // and deploys in parallel via docker. The two halves can run on different
18
18
  // machines, which is what lets a CI deploy run one job per service and phase:
19
19
  //
@@ -37,7 +37,7 @@ exports.awsGoDocker = void 0;
37
37
  // The deploy half, from the manifests:
38
38
  // wave 1 (inf): one docker container per service deploys its inf stack, all
39
39
  // concurrently. Containers run only the CDK CLI against the mounted
40
- // assembly — the workspace (and its npm-linked quidproquo packages) never
40
+ // assembly, the workspace (and its npm-linked quidproquo packages) never
41
41
  // needs to exist inside the image.
42
42
  // wave 2 (api + web): once every inf stack is done, api and web stacks for
43
43
  // all services deploy concurrently (they depend only on inf, not on each
@@ -49,14 +49,14 @@ exports.awsGoDocker = void 0;
49
49
  // flipped, one aws-cli container per service, all concurrently. Follows
50
50
  // every api deploy, so a lambda never runs a previous release's stories.
51
51
  //
52
- // domain/bootstrap menu options deploy host-side exactly like `qpq go` —
52
+ // domain/bootstrap menu options deploy host-side exactly like `qpq go`:
53
53
  // a single stack gains nothing from docker.
54
54
  //
55
55
  // Requires the same env as `go` (the build half included: `cdk synth` still
56
56
  // looks up hosted zones and VPCs) plus a running docker daemon for the deploy
57
- // half. Knobs: GO_DOCKER_BUILD_CONCURRENCY (default: the machine's core count —
57
+ // half. Knobs: GO_DOCKER_BUILD_CONCURRENCY (default: the machine's core count,
58
58
  // local builds are CPU-bound) and GO_DOCKER_DEPLOY_CONCURRENCY (default
59
- // unlimited — deploys just wait on CloudFormation).
59
+ // unlimited, deploys just wait on CloudFormation).
60
60
  const core_1 = require("@qpqjs/core");
61
61
  const deploy_aws_1 = require("@qpqjs/deploy-aws");
62
62
  const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
@@ -67,6 +67,7 @@ const synth_1 = require("../../commands/synth");
67
67
  const discovery_1 = require("../../lib/discovery");
68
68
  const getDefaultHookJobs_1 = require("../../lib/getDefaultHookJobs");
69
69
  const hooks_1 = require("../../lib/hooks");
70
+ const out_1 = require("../../lib/out");
70
71
  const qpqConfigs_1 = require("../../lib/qpqConfigs");
71
72
  const runCommand_1 = require("../../lib/runCommand");
72
73
  const runTasks_1 = require("../../lib/runTasks");
@@ -74,10 +75,12 @@ const timing_1 = require("../../lib/timing");
74
75
  const views_1 = require("../../lib/views");
75
76
  const awsCredentials_1 = require("./awsCredentials");
76
77
  const cdkApp_1 = require("./cdkApp");
78
+ const getDeployEnv_1 = require("./getDeployEnv");
77
79
  const goDockerManifest_1 = require("./goDockerManifest");
78
80
  const remote_1 = require("./remote");
79
81
  const stacks_1 = require("./stacks");
80
82
  const viewsSync_1 = require("./viewsSync");
83
+ const out = (0, out_1.createOutput)('aws:go-docker');
81
84
  const IMAGE_TAG = 'qpq-cdk-deployer';
82
85
  const AWS_CLI_IMAGE = 'amazon/aws-cli';
83
86
  const BUILD_CONCURRENCY = Number(process.env.GO_DOCKER_BUILD_CONCURRENCY) || os_1.default.availableParallelism();
@@ -114,12 +117,12 @@ const assertDockerRunning = () => __awaiter(void 0, void 0, void 0, function* ()
114
117
  // Pin the image's CDK CLI to the CLI's own aws-cdk version so it can always
115
118
  // read the assembly schema the host synthesized.
116
119
  const buildDeployerImage = (cdkVersion) => __awaiter(void 0, void 0, void 0, function* () {
117
- console.log(`Building deployer image [${IMAGE_TAG}] (aws-cdk ${cdkVersion})`);
120
+ out.log(`Building deployer image [${IMAGE_TAG}] (aws-cdk ${cdkVersion})`);
118
121
  yield (0, runCommand_1.runCommand)('docker', ['build', '-t', IMAGE_TAG, '--build-arg', `CDK_VERSION=${cdkVersion}`, (0, cdkApp_1.getDockerDir)()]);
119
122
  });
120
123
  // Deploy one stack from a pre-synthesized assembly in a throwaway container
121
124
  // named <service>-<stackType> (e.g. mini-web) so `docker ps` reads cleanly.
122
- // The assembly mounts read-only and is copied container-local first — the CDK
125
+ // The assembly mounts read-only and is copied container-local first, the CDK
123
126
  // CLI writes lock files next to the assembly it reads, and the copy keeps
124
127
  // parallel api/web deploys of the same service fully isolated.
125
128
  const dockerDeployStack = (color, serviceName, stackType, stackName, assemblyDir) => __awaiter(void 0, void 0, void 0, function* () {
@@ -182,7 +185,7 @@ const dockerSyncViews = (color, serviceName, views) => __awaiter(void 0, void 0,
182
185
  });
183
186
  // Publish one service's already-built federated remote to S3 in a throwaway
184
187
  // aws-cli container named <service>-publish. The version dir (everything the
185
- // manifest references) syncs first, then the manifest.json is copied last —
188
+ // manifest references) syncs first, then the manifest.json is copied last:
186
189
  // same ordering guarantee as the host-side publish, so a reading lambda never
187
190
  // sees a manifest whose files aren't all present yet.
188
191
  const dockerPublishRemote = (color, serviceName, remote) => __awaiter(void 0, void 0, void 0, function* () {
@@ -245,7 +248,7 @@ const buildGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0,
245
248
  const need = getStackNeeds(stacks);
246
249
  const needCdkSynth = stacks !== 'views';
247
250
  const viewServices = need.views ? services.filter((service) => (0, discovery_1.getServiceNamesWithViews)(appName).includes(service)) : [];
248
- console.log('\n=== Build ===\n');
251
+ out.log('\n=== Build ===\n');
249
252
  // A stale assembly or manifest from an earlier build must not outlive a
250
253
  // change of stack selection, so every selected service starts empty.
251
254
  for (const service of services) {
@@ -256,7 +259,7 @@ const buildGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0,
256
259
  // so bundles would ship stale code unless every lib is tsc'd first. Other
257
260
  // apps' packages are skipped: nothing this app deploys can import them
258
261
  // unless it declares them, and declared ones are built.
259
- console.log('Building workspace packages');
262
+ out.log('Building workspace packages');
260
263
  (0, runTasks_1.assertNoFailures)('Workspace build', yield (0, hooks_1.runHookForAppPackages)('build', appName, (0, getDefaultHookJobs_1.getDefaultHookJobs)()));
261
264
  // Synth the selected services' QPQ configs (and shell's, which the views
262
265
  // destinations resolve from) so a config that fails to load fails here,
@@ -274,7 +277,7 @@ const buildGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0,
274
277
  (0, runTasks_1.assertNoFailures)('API bundling', yield (0, runTasks_1.runTasks)(services.map((service) => ({
275
278
  label: `bundle-api:${service}`,
276
279
  run: () => __awaiter(void 0, void 0, void 0, function* () {
277
- console.log(`Bundling api: [${service}]`);
280
+ out.log(`Bundling api: [${service}]`);
278
281
  const qpqConfig = (0, qpqConfigs_1.loadServiceQpqConfig)(appName, service);
279
282
  yield (0, deploy_rspack_1.runRspack)((0, deploy_rspack_1.getServiceRspackConfig)(qpqConfig, path_1.default.join((0, discovery_1.getServiceDirectory)(appName, service), 'service')));
280
283
  }),
@@ -283,29 +286,29 @@ const buildGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0,
283
286
  (0, runTasks_1.assertNoFailures)('Views bundling', yield (0, runTasks_1.runTasks)(viewServices.map((service) => ({
284
287
  label: `bundle-views:${service}`,
285
288
  run: () => __awaiter(void 0, void 0, void 0, function* () {
286
- console.log(`Bundling views: [${service}]`);
289
+ out.log(`Bundling views: [${service}]`);
287
290
  yield (0, views_1.bundleViews)(appName, service);
288
291
  }),
289
292
  })), BUILD_CONCURRENCY));
290
293
  // Build the federated remotes now (rspack needs the workspace), so the
291
- // publish wave only has to sync the already-built output — mirroring how
294
+ // publish wave only has to sync the already-built output, mirroring how
292
295
  // views are bundled here and synced later.
293
296
  (0, runTasks_1.assertNoFailures)('Remote bundling', yield (0, runTasks_1.runTasks)(federatedServices.map((service) => ({
294
297
  label: `bundle-remote:${service}`,
295
298
  run: () => __awaiter(void 0, void 0, void 0, function* () {
296
- console.log(`Bundling federated remote: [${service}]`);
299
+ out.log(`Bundling federated remote: [${service}]`);
297
300
  yield (0, remote_1.buildRemote)(appName, service);
298
301
  }),
299
302
  })), BUILD_CONCURRENCY));
300
303
  if (needCdkSynth) {
301
304
  // One self-contained cloud assembly per service (all its stacks + staged
302
- // assets) — separate --output dirs so synths can run in parallel and
305
+ // assets), separate --output dirs so synths can run in parallel and
303
306
  // containers never share mutable state.
304
307
  (0, runTasks_1.assertNoFailures)('CDK synth', yield (0, runTasks_1.runTasks)(services.map((service) => ({
305
308
  label: `cdk-synth:${service}`,
306
309
  run: () => (0, runCommand_1.runCommandPrefixed)(`cdk-synth:${service}`, 'npx', ['cdk', 'synth', '--quiet', '--app', (0, cdkApp_1.getCdkAppCommand)(), '--output', (0, goDockerManifest_1.getGoDockerAssemblyDir)(appName, service)], {
307
310
  cwd: (0, discovery_1.getRoot)(),
308
- env: { DEPLOY_SERVICE_NAME: service, DEPLOY_APP_NAME: appName },
311
+ env: (0, getDeployEnv_1.getDeployEnv)(appName, service),
309
312
  color: (0, runCommand_1.nextPrefixColor)(),
310
313
  }),
311
314
  })), BUILD_CONCURRENCY));
@@ -315,9 +318,9 @@ const buildGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0,
315
318
  for (const service of services) {
316
319
  const manifest = resolveBuildManifest(appName, deploymentName, service, stacks, viewServices.includes(service), federatedServices.includes(service), cdkVersion);
317
320
  (0, goDockerManifest_1.writeGoDockerBuildManifest)(appName, service, manifest);
318
- console.log(`Saved build for [${service}]:`);
321
+ out.log(`Saved build for [${service}]:`);
319
322
  for (const dir of getSavedBuildDirs(appName, service, manifest)) {
320
- console.log(` ${dir}`);
323
+ out.log(` ${dir}`);
321
324
  }
322
325
  }
323
326
  });
@@ -373,7 +376,7 @@ const deployGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0
373
376
  }
374
377
  // ---- Wave 1: inf stacks, one container per service, all concurrent ----
375
378
  if (need.inf) {
376
- console.log('\n=== Deploy inf stacks (docker) ===\n');
379
+ out.log('\n=== Deploy inf stacks (docker) ===\n');
377
380
  (0, timing_1.logTimeStart)('infWave');
378
381
  (0, runTasks_1.assertNoFailures)('Inf deploy', yield (0, runTasks_1.runTasks)(services.map((service) => ({
379
382
  label: `inf:${service}`,
@@ -383,7 +386,7 @@ const deployGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0
383
386
  }
384
387
  // ---- Wave 2: api + web stacks, all concurrent ----
385
388
  if (need.api || need.web) {
386
- console.log('\n=== Deploy api + web stacks (docker) ===\n');
389
+ out.log('\n=== Deploy api + web stacks (docker) ===\n');
387
390
  (0, timing_1.logTimeStart)('apiWebWave');
388
391
  (0, runTasks_1.assertNoFailures)('Api/Web deploy', yield (0, runTasks_1.runTasks)(['api', 'web']
389
392
  .filter((stackType) => (stackType === 'api' ? need.api : need.web))
@@ -395,7 +398,7 @@ const deployGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0
395
398
  }
396
399
  // ---- Views: sync the pre-built bundles to S3, all concurrent ----
397
400
  if (viewServices.length > 0) {
398
- console.log('\n=== Sync views to S3 (docker) ===\n');
401
+ out.log('\n=== Sync views to S3 (docker) ===\n');
399
402
  (0, timing_1.logTimeStart)('viewsWave');
400
403
  (0, runTasks_1.assertNoFailures)('Views sync', yield (0, runTasks_1.runTasks)(viewServices.map((service) => ({
401
404
  label: `views:${service}`,
@@ -405,7 +408,7 @@ const deployGoDockerOutput = (appName, deploymentName, plan) => __awaiter(void 0
405
408
  }
406
409
  // ---- Publish: the pre-built federated remotes to S3, all concurrent ----
407
410
  if (federatedServices.length > 0) {
408
- console.log('\n=== Publish federated remotes to S3 (docker) ===\n');
411
+ out.log('\n=== Publish federated remotes to S3 (docker) ===\n');
409
412
  (0, timing_1.logTimeStart)('publishWave');
410
413
  (0, runTasks_1.assertNoFailures)('Federated publish', yield (0, runTasks_1.runTasks)(federatedServices.map((service) => ({
411
414
  label: `publish:${service}`,
@@ -419,7 +422,7 @@ const awsGoDocker = (appName, plan, mode) => __awaiter(void 0, void 0, void 0, f
419
422
  return;
420
423
  }
421
424
  if ((yield (0, awsCredentials_1.isAwsCredentialsValid)()) === false) {
422
- console.log('Credentials are expired or invalid.');
425
+ out.log('Credentials are expired or invalid.');
423
426
  return;
424
427
  }
425
428
  (0, timing_1.logTimeStart)('totalTime');
@@ -442,9 +445,9 @@ const awsGoDocker = (appName, plan, mode) => __awaiter(void 0, void 0, void 0, f
442
445
  if (!deploymentName) {
443
446
  throw new Error(`no deployment selected (${core_1.QpqDeployEnvVar.deployName} is unset)`);
444
447
  }
445
- console.log(`\n\nRunning dockerized deploy (${mode})\n\n`);
446
- console.log('Executing for services');
447
- console.log(plan.services.join(', '));
448
+ out.log(`\n\nRunning dockerized deploy (${mode})\n\n`);
449
+ out.log('Executing for services');
450
+ out.log(plan.services.join(', '));
448
451
  if (mode !== 'from-build') {
449
452
  yield buildGoDockerOutput(appName, deploymentName, plan);
450
453
  }
@@ -1 +1 @@
1
- {"version":3,"file":"goDocker.js","sourceRoot":"","sources":["../../../../src/platforms/aws/goDocker.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:docker` — asks the same questions as `qpq go`, then builds locally\n// and deploys in parallel via docker. The two halves can run on different\n// machines, which is what lets a CI deploy run one job per service and phase:\n//\n// qpq go:docker <svc> <stack> build, then deploy\n// qpq go:docker <svc> <stack> --build-only build and save; no docker needed\n// qpq go:docker <svc> <stack> --from-build deploy the saved build; the\n// workspace need not be built\n//\n// The build half: QPQ config synth, rspack api bundles, rspack view bundles,\n// rspack federated-remote bundles, and one self-contained CDK cloud assembly\n// per service (`cdk synth --output`, which stages the api bundle as assets).\n// It ends by writing a manifest per service with everything the deploy half\n// needs that only the live config can answer (stack names, views destinations,\n// the federated store), so the deploy half never loads a service config. The\n// saved build for a service is:\n// dist/qpq/go-docker/<app>/<svc>/assembly the cloud assembly\n// dist/qpq/go-docker/<app>/<svc>/deploy.json the manifest\n// dist/apps/<app>/services/<svc>/views the views bundle\n// dist/apps/<app>/services/<svc>/service-remote-published the federated remote\n//\n// The deploy half, from the manifests:\n// wave 1 (inf): one docker container per service deploys its inf stack, all\n// concurrently. Containers run only the CDK CLI against the mounted\n// assembly — the workspace (and its npm-linked quidproquo packages) never\n// needs to exist inside the image.\n// wave 2 (api + web): once every inf stack is done, api and web stacks for\n// all services deploy concurrently (they depend only on inf, not on each\n// other).\n// views: the built bundles are synced to S3, one aws-cli container per\n// service, all concurrently.\n// publish: the built federated remotes (backends that opt in with\n// defineFederatedModuleStore(...)) are synced to S3 and their manifests\n// flipped, one aws-cli container per service, all concurrently. Follows\n// every api deploy, so a lambda never runs a previous release's stories.\n//\n// domain/bootstrap menu options deploy host-side exactly like `qpq go` —\n// a single stack gains nothing from docker.\n//\n// Requires the same env as `go` (the build half included: `cdk synth` still\n// looks up hosted zones and VPCs) plus a running docker daemon for the deploy\n// half. Knobs: GO_DOCKER_BUILD_CONCURRENCY (default: the machine's core count —\n// local builds are CPU-bound) and GO_DOCKER_DEPLOY_CONCURRENCY (default\n// unlimited — deploys just wait on CloudFormation).\nimport { QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\nimport { getServiceRspackConfig, runRspack } from '@qpqjs/deploy-rspack';\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { synthCommand } from '../../commands/synth';\nimport { DeployPlan, StackType } from '../../lib/deployPrompts';\nimport { getRoot, getServiceDirectory, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { GoDockerMode } from '../../lib/goDockerMode';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { getServiceNamesWithFederation, loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { nextPrefixColor, runCommand, runCommandBestEffort, runCommandPrefixed } from '../../lib/runCommand';\nimport { assertNoFailures, runTasks } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews, getViewsDistDir } from '../../lib/views';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { getCdkAppCommand, getCdkCliVersion, getDockerDir } from './cdkApp';\nimport {\n fromManifestPath,\n getGoDockerAssemblyDir,\n getGoDockerBuildDir,\n GoDockerBuildManifest,\n GoDockerRemoteEntry,\n GoDockerViewsEntry,\n readGoDockerBuildManifest,\n toManifestPath,\n writeGoDockerBuildManifest,\n} from './goDockerManifest';\nimport { buildRemote, resolvePublishTarget } from './remote';\nimport { deployAccountStack, deployBootstrapStack, deployDomainStack } from './stacks';\nimport { getViewsS3Destinations, NO_CACHE_FILES } from './viewsSync';\n\nconst IMAGE_TAG = 'qpq-cdk-deployer';\nconst AWS_CLI_IMAGE = 'amazon/aws-cli';\n\nconst BUILD_CONCURRENCY = Number(process.env.GO_DOCKER_BUILD_CONCURRENCY) || os.availableParallelism();\nconst DEPLOY_CONCURRENCY = Number(process.env.GO_DOCKER_DEPLOY_CONCURRENCY) || Infinity;\n\n// Credentials/region reach the containers via `docker run -e NAME` (value\n// inherited from this process's env, never on the docker command line).\nconst AWS_ENV_PASSTHROUGH = [\n 'AWS_ACCESS_KEY_ID',\n 'AWS_SECRET_ACCESS_KEY',\n 'AWS_SESSION_TOKEN',\n 'AWS_REGION',\n 'AWS_DEFAULT_REGION',\n 'AWS_DEFAULT_ACCOUNT',\n];\n\ntype ServicesPlan = Extract<DeployPlan, { kind: 'services' }>;\n\ntype StackNeeds = { inf: boolean; api: boolean; web: boolean; views: boolean };\n\nconst getStackNeeds = (stacks: StackType): StackNeeds => ({\n inf: stacks === 'all' || stacks === 'inf',\n api: stacks === 'all' || stacks === 'api',\n web: stacks === 'all' || stacks === 'web',\n views: stacks === 'all' || stacks === 'views',\n});\n\n// A container left behind by an interrupted run would block reusing its name.\n// Clear it first, best-effort: a missing container (exit 1) must not fail the\n// deploy. Was a `docker rm -f … >/dev/null 2>&1 ;` prefix on the run command,\n// but that only worked under `shell: true`; as a separate call it's shell-free.\nconst removeContainer = (containerName: string): Promise<void> => runCommandBestEffort('docker', ['rm', '-f', containerName]);\n\nconst assertDockerRunning = async (): Promise<void> => {\n try {\n await runCommand('docker', ['info', '--format', 'docker daemon ok — server {{.ServerVersion}}']);\n } catch {\n throw new Error('Docker daemon is not running (start Docker Desktop and retry).');\n }\n};\n\n// Pin the image's CDK CLI to the CLI's own aws-cdk version so it can always\n// read the assembly schema the host synthesized.\nconst buildDeployerImage = async (cdkVersion: string): Promise<void> => {\n console.log(`Building deployer image [${IMAGE_TAG}] (aws-cdk ${cdkVersion})`);\n await runCommand('docker', ['build', '-t', IMAGE_TAG, '--build-arg', `CDK_VERSION=${cdkVersion}`, getDockerDir()]);\n};\n\n// Deploy one stack from a pre-synthesized assembly in a throwaway container\n// named <service>-<stackType> (e.g. mini-web) so `docker ps` reads cleanly.\n// The assembly mounts read-only and is copied container-local first — the CDK\n// CLI writes lock files next to the assembly it reads, and the copy keeps\n// parallel api/web deploys of the same service fully isolated.\nconst dockerDeployStack = async (\n color: number,\n serviceName: string,\n stackType: 'inf' | 'api' | 'web',\n stackName: string,\n assemblyDir: string,\n): Promise<void> => {\n const containerName = `${serviceName}-${stackType}`;\n await removeContainer(containerName);\n await runCommandPrefixed(\n `${stackType}:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${assemblyDir}:/assembly:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n IMAGE_TAG,\n 'bash',\n '-c',\n `cp -r /assembly /work/assembly && cdk deploy ${stackName} --app /work/assembly --require-approval never --progress events`,\n ],\n { color },\n );\n};\n\n// Sync one service's pre-built views to S3 in a throwaway aws-cli container\n// named <service>-views. The official image's entrypoint is `aws`. Multiple\n// destinations (shell → website root + views prefix) run sequentially within\n// the service, reusing the container name. Mirrors the host-side syncViewsToS3\n// cache policy: hashed assets immutable, the fixed-name entry points re-uploaded\n// with no-cache every deploy (see NO_CACHE_FILES).\nconst dockerSyncViews = async (color: number, serviceName: string, views: GoDockerViewsEntry): Promise<void> => {\n const containerName = `${serviceName}-views`;\n const distDir = fromManifestPath(views.dir);\n\n const runAwsCli = async (awsArgs: string[]): Promise<void> => {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `views:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${distDir}:/views:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...awsArgs,\n ],\n { color },\n );\n };\n\n for (const destination of views.destinations) {\n await runAwsCli([\n 's3',\n 'sync',\n '/views',\n destination,\n '--cache-control',\n 'public,max-age=31536000,immutable',\n ...NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),\n ]);\n\n for (const file of NO_CACHE_FILES) {\n if (!fs.existsSync(path.join(distDir, file))) {\n continue;\n }\n\n await runAwsCli(['s3', 'cp', `/views/${file}`, `${destination}/${file}`, '--cache-control', 'no-cache']);\n }\n }\n};\n\n// Publish one service's already-built federated remote to S3 in a throwaway\n// aws-cli container named <service>-publish. The version dir (everything the\n// manifest references) syncs first, then the manifest.json is copied last —\n// same ordering guarantee as the host-side publish, so a reading lambda never\n// sees a manifest whose files aren't all present yet.\nconst dockerPublishRemote = async (color: number, serviceName: string, remote: GoDockerRemoteEntry): Promise<void> => {\n const { manifestHash, bucketName, servicePrefix } = remote;\n const publishPath = fromManifestPath(remote.dir);\n const containerName = `${serviceName}-publish`;\n\n // /publish is the service-remote-published dir; the hashed version subdir and\n // manifest.json both live directly under it.\n const s3Operations: string[][] = [\n ['s3', 'sync', `/publish/${manifestHash}`, `s3://${bucketName}/${servicePrefix}/${manifestHash}`],\n ['s3', 'cp', '/publish/manifest.json', `s3://${bucketName}/${servicePrefix}/manifest.json`],\n ];\n\n for (const s3Operation of s3Operations) {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `publish:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${publishPath}:/publish:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...s3Operation,\n ],\n { color },\n );\n }\n};\n\nconst resolveRemoteEntry = (appName: string, service: string): GoDockerRemoteEntry => {\n const { publishPath, manifestHash, bucketName, servicePrefix } = resolvePublishTarget(appName, service);\n return { dir: toManifestPath(publishPath), manifestHash, bucketName, servicePrefix };\n};\n\n// Everything the deploy half needs that only the live config can answer,\n// resolved here while the workspace is built and the config loads.\nconst resolveBuildManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n hasViews: boolean,\n hasRemote: boolean,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const qpqConfig = loadServiceQpqConfig(appName, service);\n\n return {\n cdkVersion,\n deploymentName,\n builtFor: stacks,\n stacks:\n stacks === 'views'\n ? null\n : {\n inf: qpqDeployAwsUtils.getInfStackName(qpqConfig),\n api: qpqDeployAwsUtils.getApiStackName(qpqConfig),\n web: qpqDeployAwsUtils.getWebStackName(qpqConfig),\n },\n views: hasViews ? { dir: toManifestPath(getViewsDistDir(appName, service)), destinations: getViewsS3Destinations(appName, service) } : null,\n remote: hasRemote ? resolveRemoteEntry(appName, service) : null,\n };\n};\n\n// The directories a CI job uploads to carry one service's saved build to the\n// deploy job, root-relative.\nconst getSavedBuildDirs = (appName: string, service: string, manifest: GoDockerBuildManifest): string[] => [\n toManifestPath(getGoDockerBuildDir(appName, service)),\n ...(manifest.views ? [manifest.views.dir] : []),\n ...(manifest.remote ? [manifest.remote.dir] : []),\n];\n\nconst buildGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkSynth = stacks !== 'views';\n\n const viewServices = need.views ? services.filter((service) => getServiceNamesWithViews(appName).includes(service)) : [];\n\n console.log('\\n=== Build ===\\n');\n\n // A stale assembly or manifest from an earlier build must not outlive a\n // change of stack selection, so every selected service starts empty.\n for (const service of services) {\n fs.rmSync(getGoDockerBuildDir(appName, service), { recursive: true, force: true });\n }\n\n await runAppHook(appName, 'predeploy');\n\n // Workspace packages resolve through their built dist/ (package.json main),\n // so bundles would ship stale code unless every lib is tsc'd first. Other\n // apps' packages are skipped: nothing this app deploys can import them\n // unless it declares them, and declared ones are built.\n console.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // Synth the selected services' QPQ configs (and shell's, which the views\n // destinations resolve from) so a config that fails to load fails here,\n // before any bundling. In-process: it's just config loads + JSON writes.\n const qpqSynthServices = [...new Set([...services, ...(need.views ? ['shell'] : [])])];\n for (const service of qpqSynthServices) {\n await synthCommand([service, '--app', appName]);\n }\n\n // Federated remotes are the backend story code, so they are rebuilt (and\n // later republished) whenever the api stack is. Skips services without\n // defineFederatedModuleStore(...). Detected here (after the workspace build)\n // because it loads each service's config.\n const federatedServices = need.api ? getServiceNamesWithFederation(appName, services) : [];\n\n if (needCdkSynth) {\n assertNoFailures(\n 'API bundling',\n await runTasks(\n services.map((service) => ({\n label: `bundle-api:${service}`,\n run: async () => {\n console.log(`Bundling api: [${service}]`);\n const qpqConfig = loadServiceQpqConfig(appName, service);\n await runRspack(getServiceRspackConfig(qpqConfig, path.join(getServiceDirectory(appName, service), 'service')));\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n assertNoFailures(\n 'Views bundling',\n await runTasks(\n viewServices.map((service) => ({\n label: `bundle-views:${service}`,\n run: async () => {\n console.log(`Bundling views: [${service}]`);\n await bundleViews(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n // Build the federated remotes now (rspack needs the workspace), so the\n // publish wave only has to sync the already-built output — mirroring how\n // views are bundled here and synced later.\n assertNoFailures(\n 'Remote bundling',\n await runTasks(\n federatedServices.map((service) => ({\n label: `bundle-remote:${service}`,\n run: async () => {\n console.log(`Bundling federated remote: [${service}]`);\n await buildRemote(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n if (needCdkSynth) {\n // One self-contained cloud assembly per service (all its stacks + staged\n // assets) — separate --output dirs so synths can run in parallel and\n // containers never share mutable state.\n assertNoFailures(\n 'CDK synth',\n await runTasks(\n services.map((service) => ({\n label: `cdk-synth:${service}`,\n run: () =>\n runCommandPrefixed(\n `cdk-synth:${service}`,\n 'npx',\n ['cdk', 'synth', '--quiet', '--app', getCdkAppCommand(), '--output', getGoDockerAssemblyDir(appName, service)],\n {\n cwd: getRoot(),\n env: { DEPLOY_SERVICE_NAME: service, DEPLOY_APP_NAME: appName },\n color: nextPrefixColor(),\n },\n ),\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n // Manifests are written last, so one only ever exists beside a complete build.\n const cdkVersion = getCdkCliVersion();\n for (const service of services) {\n const manifest = resolveBuildManifest(\n appName,\n deploymentName,\n service,\n stacks,\n viewServices.includes(service),\n federatedServices.includes(service),\n cdkVersion,\n );\n writeGoDockerBuildManifest(appName, service, manifest);\n\n console.log(`Saved build for [${service}]:`);\n for (const dir of getSavedBuildDirs(appName, service, manifest)) {\n console.log(` ${dir}`);\n }\n }\n};\n\n// A deploy phase runs from a saved build only when that build was made for it:\n// `all` covers every phase, any other selection only its own. A build made for\n// `inf` has an assembly the api stack could deploy from, but no remote to\n// publish after it, which is exactly the stale-stories deploy the publish\n// ordering exists to prevent.\nconst readCheckedManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const manifest = readGoDockerBuildManifest(appName, service);\n const rebuild = `rebuild it with \\`qpq go:docker ${service} ${stacks} --build-only --app ${appName} --deployment ${deploymentName}\\``;\n\n if (manifest.cdkVersion !== cdkVersion) {\n throw new Error(`saved build for [${service}] was synthesized with aws-cdk ${manifest.cdkVersion}, this qpq has ${cdkVersion}; ${rebuild}`);\n }\n if (manifest.deploymentName !== deploymentName) {\n throw new Error(`saved build for [${service}] is for deployment '${manifest.deploymentName}', not '${deploymentName}'; ${rebuild}`);\n }\n if (manifest.builtFor !== 'all' && manifest.builtFor !== stacks) {\n throw new Error(`saved build for [${service}] was built for '${manifest.builtFor}' stacks and cannot deploy '${stacks}'; ${rebuild}`);\n }\n\n return manifest;\n};\n\nconst getStackName = (manifest: GoDockerBuildManifest, service: string, stackType: 'inf' | 'api' | 'web'): string => {\n if (!manifest.stacks) {\n throw new Error(`saved build for [${service}] has no cloud assembly (it was built for views only)`);\n }\n return manifest.stacks[stackType];\n};\n\nconst deployGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkDeploys = stacks !== 'views';\n\n // Every manifest is read and checked up front, so one missing or mismatched\n // build fails the run before any container starts.\n const cdkVersion = getCdkCliVersion();\n const manifests = new Map(services.map((service) => [service, readCheckedManifest(appName, deploymentName, service, stacks, cdkVersion)]));\n const manifestFor = (service: string): GoDockerBuildManifest => manifests.get(service)!;\n\n const viewServices = need.views ? services.filter((service) => manifestFor(service).views !== null) : [];\n const federatedServices = need.api ? services.filter((service) => manifestFor(service).remote !== null) : [];\n\n // Federated publish needs the api stack (need.api ⇒ needCdkDeploys), so any\n // docker preflight it requires is already covered by these two checks.\n if (needCdkDeploys || viewServices.length > 0) {\n await assertDockerRunning();\n }\n if (needCdkDeploys) {\n await buildDeployerImage(cdkVersion);\n }\n\n // The aws-cli image backs both the views sync and the federated publish\n // waves. Pull once now so those waves don't race N containers into pulling\n // the same image.\n if (viewServices.length > 0 || federatedServices.length > 0) {\n await runCommand('docker', ['pull', AWS_CLI_IMAGE]);\n }\n\n // ---- Wave 1: inf stacks, one container per service, all concurrent ----\n if (need.inf) {\n console.log('\\n=== Deploy inf stacks (docker) ===\\n');\n logTimeStart('infWave');\n assertNoFailures(\n 'Inf deploy',\n await runTasks(\n services.map((service) => ({\n label: `inf:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n 'inf',\n getStackName(manifestFor(service), service, 'inf'),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('infWave');\n }\n\n // ---- Wave 2: api + web stacks, all concurrent ----\n if (need.api || need.web) {\n console.log('\\n=== Deploy api + web stacks (docker) ===\\n');\n logTimeStart('apiWebWave');\n assertNoFailures(\n 'Api/Web deploy',\n await runTasks(\n (['api', 'web'] as const)\n .filter((stackType) => (stackType === 'api' ? need.api : need.web))\n .flatMap((stackType) =>\n services.map((service) => ({\n label: `${stackType}:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n stackType,\n getStackName(manifestFor(service), service, stackType),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n ),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('apiWebWave');\n }\n\n // ---- Views: sync the pre-built bundles to S3, all concurrent ----\n if (viewServices.length > 0) {\n console.log('\\n=== Sync views to S3 (docker) ===\\n');\n logTimeStart('viewsWave');\n assertNoFailures(\n 'Views sync',\n await runTasks(\n viewServices.map((service) => ({\n label: `views:${service}`,\n run: () => dockerSyncViews(nextPrefixColor(), service, manifestFor(service).views!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('viewsWave');\n }\n\n // ---- Publish: the pre-built federated remotes to S3, all concurrent ----\n if (federatedServices.length > 0) {\n console.log('\\n=== Publish federated remotes to S3 (docker) ===\\n');\n logTimeStart('publishWave');\n assertNoFailures(\n 'Federated publish',\n await runTasks(\n federatedServices.map((service) => ({\n label: `publish:${service}`,\n run: () => dockerPublishRemote(nextPrefixColor(), service, manifestFor(service).remote!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('publishWave');\n }\n};\n\nexport const awsGoDocker = async (appName: string, plan: DeployPlan, mode: GoDockerMode): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n if ((await isAwsCredentialsValid()) === false) {\n console.log('Credentials are expired or invalid.');\n return;\n }\n\n logTimeStart('totalTime');\n\n if (plan.kind === 'account') {\n await deployAccountStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n if (plan.kind === 'bootstrap') {\n if (plan.includeDomain) {\n await deployDomainStack(plan.appName);\n }\n await deployBootstrapStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n // resolveDeployment primed the selection before this driver ran. The manifest\n // records it so a build for one deployment can never deploy to another.\n const deploymentName = process.env[QpqDeployEnvVar.deployName];\n if (!deploymentName) {\n throw new Error(`no deployment selected (${QpqDeployEnvVar.deployName} is unset)`);\n }\n\n console.log(`\\n\\nRunning dockerized deploy (${mode})\\n\\n`);\n console.log('Executing for services');\n console.log(plan.services.join(', '));\n\n if (mode !== 'from-build') {\n await buildGoDockerOutput(appName, deploymentName, plan);\n }\n if (mode !== 'build-only') {\n await deployGoDockerOutput(appName, deploymentName, plan);\n }\n\n logTimeEnd('totalTime');\n};\n"]}
1
+ {"version":3,"file":"goDocker.js","sourceRoot":"","sources":["../../../../src/platforms/aws/goDocker.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:docker`, asks the same questions as `qpq go`, then builds locally\n// and deploys in parallel via docker. The two halves can run on different\n// machines, which is what lets a CI deploy run one job per service and phase:\n//\n// qpq go:docker <svc> <stack> build, then deploy\n// qpq go:docker <svc> <stack> --build-only build and save; no docker needed\n// qpq go:docker <svc> <stack> --from-build deploy the saved build; the\n// workspace need not be built\n//\n// The build half: QPQ config synth, rspack api bundles, rspack view bundles,\n// rspack federated-remote bundles, and one self-contained CDK cloud assembly\n// per service (`cdk synth --output`, which stages the api bundle as assets).\n// It ends by writing a manifest per service with everything the deploy half\n// needs that only the live config can answer (stack names, views destinations,\n// the federated store), so the deploy half never loads a service config. The\n// saved build for a service is:\n// dist/qpq/go-docker/<app>/<svc>/assembly the cloud assembly\n// dist/qpq/go-docker/<app>/<svc>/deploy.json the manifest\n// dist/apps/<app>/services/<svc>/views the views bundle\n// dist/apps/<app>/services/<svc>/service-remote-published the federated remote\n//\n// The deploy half, from the manifests:\n// wave 1 (inf): one docker container per service deploys its inf stack, all\n// concurrently. Containers run only the CDK CLI against the mounted\n// assembly, the workspace (and its npm-linked quidproquo packages) never\n// needs to exist inside the image.\n// wave 2 (api + web): once every inf stack is done, api and web stacks for\n// all services deploy concurrently (they depend only on inf, not on each\n// other).\n// views: the built bundles are synced to S3, one aws-cli container per\n// service, all concurrently.\n// publish: the built federated remotes (backends that opt in with\n// defineFederatedModuleStore(...)) are synced to S3 and their manifests\n// flipped, one aws-cli container per service, all concurrently. Follows\n// every api deploy, so a lambda never runs a previous release's stories.\n//\n// domain/bootstrap menu options deploy host-side exactly like `qpq go`:\n// a single stack gains nothing from docker.\n//\n// Requires the same env as `go` (the build half included: `cdk synth` still\n// looks up hosted zones and VPCs) plus a running docker daemon for the deploy\n// half. Knobs: GO_DOCKER_BUILD_CONCURRENCY (default: the machine's core count,\n// local builds are CPU-bound) and GO_DOCKER_DEPLOY_CONCURRENCY (default\n// unlimited, deploys just wait on CloudFormation).\nimport { QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\nimport { getServiceRspackConfig, runRspack } from '@qpqjs/deploy-rspack';\n\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\n\nimport { synthCommand } from '../../commands/synth';\nimport { DeployPlan, StackType } from '../../lib/deployPrompts';\nimport { getRoot, getServiceDirectory, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { GoDockerMode } from '../../lib/goDockerMode';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { createOutput } from '../../lib/out';\nimport { getServiceNamesWithFederation, loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { nextPrefixColor, runCommand, runCommandBestEffort, runCommandPrefixed } from '../../lib/runCommand';\nimport { assertNoFailures, runTasks } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews, getViewsDistDir } from '../../lib/views';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { getCdkAppCommand, getCdkCliVersion, getDockerDir } from './cdkApp';\nimport { getDeployEnv } from './getDeployEnv';\nimport {\n fromManifestPath,\n getGoDockerAssemblyDir,\n getGoDockerBuildDir,\n GoDockerBuildManifest,\n GoDockerRemoteEntry,\n GoDockerViewsEntry,\n readGoDockerBuildManifest,\n toManifestPath,\n writeGoDockerBuildManifest,\n} from './goDockerManifest';\nimport { buildRemote, resolvePublishTarget } from './remote';\nimport { deployAccountStack, deployBootstrapStack, deployDomainStack } from './stacks';\nimport { getViewsS3Destinations, NO_CACHE_FILES } from './viewsSync';\n\nconst out = createOutput('aws:go-docker');\n\nconst IMAGE_TAG = 'qpq-cdk-deployer';\nconst AWS_CLI_IMAGE = 'amazon/aws-cli';\n\nconst BUILD_CONCURRENCY = Number(process.env.GO_DOCKER_BUILD_CONCURRENCY) || os.availableParallelism();\nconst DEPLOY_CONCURRENCY = Number(process.env.GO_DOCKER_DEPLOY_CONCURRENCY) || Infinity;\n\n// Credentials/region reach the containers via `docker run -e NAME` (value\n// inherited from this process's env, never on the docker command line).\nconst AWS_ENV_PASSTHROUGH = [\n 'AWS_ACCESS_KEY_ID',\n 'AWS_SECRET_ACCESS_KEY',\n 'AWS_SESSION_TOKEN',\n 'AWS_REGION',\n 'AWS_DEFAULT_REGION',\n 'AWS_DEFAULT_ACCOUNT',\n];\n\ntype ServicesPlan = Extract<DeployPlan, { kind: 'services' }>;\n\ntype StackNeeds = { inf: boolean; api: boolean; web: boolean; views: boolean };\n\nconst getStackNeeds = (stacks: StackType): StackNeeds => ({\n inf: stacks === 'all' || stacks === 'inf',\n api: stacks === 'all' || stacks === 'api',\n web: stacks === 'all' || stacks === 'web',\n views: stacks === 'all' || stacks === 'views',\n});\n\n// A container left behind by an interrupted run would block reusing its name.\n// Clear it first, best-effort: a missing container (exit 1) must not fail the\n// deploy. Was a `docker rm -f … >/dev/null 2>&1 ;` prefix on the run command,\n// but that only worked under `shell: true`; as a separate call it's shell-free.\nconst removeContainer = (containerName: string): Promise<void> => runCommandBestEffort('docker', ['rm', '-f', containerName]);\n\nconst assertDockerRunning = async (): Promise<void> => {\n try {\n await runCommand('docker', ['info', '--format', 'docker daemon ok — server {{.ServerVersion}}']);\n } catch {\n throw new Error('Docker daemon is not running (start Docker Desktop and retry).');\n }\n};\n\n// Pin the image's CDK CLI to the CLI's own aws-cdk version so it can always\n// read the assembly schema the host synthesized.\nconst buildDeployerImage = async (cdkVersion: string): Promise<void> => {\n out.log(`Building deployer image [${IMAGE_TAG}] (aws-cdk ${cdkVersion})`);\n await runCommand('docker', ['build', '-t', IMAGE_TAG, '--build-arg', `CDK_VERSION=${cdkVersion}`, getDockerDir()]);\n};\n\n// Deploy one stack from a pre-synthesized assembly in a throwaway container\n// named <service>-<stackType> (e.g. mini-web) so `docker ps` reads cleanly.\n// The assembly mounts read-only and is copied container-local first, the CDK\n// CLI writes lock files next to the assembly it reads, and the copy keeps\n// parallel api/web deploys of the same service fully isolated.\nconst dockerDeployStack = async (\n color: number,\n serviceName: string,\n stackType: 'inf' | 'api' | 'web',\n stackName: string,\n assemblyDir: string,\n): Promise<void> => {\n const containerName = `${serviceName}-${stackType}`;\n await removeContainer(containerName);\n await runCommandPrefixed(\n `${stackType}:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${assemblyDir}:/assembly:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n IMAGE_TAG,\n 'bash',\n '-c',\n `cp -r /assembly /work/assembly && cdk deploy ${stackName} --app /work/assembly --require-approval never --progress events`,\n ],\n { color },\n );\n};\n\n// Sync one service's pre-built views to S3 in a throwaway aws-cli container\n// named <service>-views. The official image's entrypoint is `aws`. Multiple\n// destinations (shell → website root + views prefix) run sequentially within\n// the service, reusing the container name. Mirrors the host-side syncViewsToS3\n// cache policy: hashed assets immutable, the fixed-name entry points re-uploaded\n// with no-cache every deploy (see NO_CACHE_FILES).\nconst dockerSyncViews = async (color: number, serviceName: string, views: GoDockerViewsEntry): Promise<void> => {\n const containerName = `${serviceName}-views`;\n const distDir = fromManifestPath(views.dir);\n\n const runAwsCli = async (awsArgs: string[]): Promise<void> => {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `views:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${distDir}:/views:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...awsArgs,\n ],\n { color },\n );\n };\n\n for (const destination of views.destinations) {\n await runAwsCli([\n 's3',\n 'sync',\n '/views',\n destination,\n '--cache-control',\n 'public,max-age=31536000,immutable',\n ...NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),\n ]);\n\n for (const file of NO_CACHE_FILES) {\n if (!fs.existsSync(path.join(distDir, file))) {\n continue;\n }\n\n await runAwsCli(['s3', 'cp', `/views/${file}`, `${destination}/${file}`, '--cache-control', 'no-cache']);\n }\n }\n};\n\n// Publish one service's already-built federated remote to S3 in a throwaway\n// aws-cli container named <service>-publish. The version dir (everything the\n// manifest references) syncs first, then the manifest.json is copied last:\n// same ordering guarantee as the host-side publish, so a reading lambda never\n// sees a manifest whose files aren't all present yet.\nconst dockerPublishRemote = async (color: number, serviceName: string, remote: GoDockerRemoteEntry): Promise<void> => {\n const { manifestHash, bucketName, servicePrefix } = remote;\n const publishPath = fromManifestPath(remote.dir);\n const containerName = `${serviceName}-publish`;\n\n // /publish is the service-remote-published dir; the hashed version subdir and\n // manifest.json both live directly under it.\n const s3Operations: string[][] = [\n ['s3', 'sync', `/publish/${manifestHash}`, `s3://${bucketName}/${servicePrefix}/${manifestHash}`],\n ['s3', 'cp', '/publish/manifest.json', `s3://${bucketName}/${servicePrefix}/manifest.json`],\n ];\n\n for (const s3Operation of s3Operations) {\n await removeContainer(containerName);\n await runCommandPrefixed(\n `publish:${serviceName}`,\n 'docker',\n [\n 'run',\n '--rm',\n '--name',\n containerName,\n '-v',\n `${publishPath}:/publish:ro`,\n ...AWS_ENV_PASSTHROUGH.flatMap((name) => ['-e', name]),\n AWS_CLI_IMAGE,\n ...s3Operation,\n ],\n { color },\n );\n }\n};\n\nconst resolveRemoteEntry = (appName: string, service: string): GoDockerRemoteEntry => {\n const { publishPath, manifestHash, bucketName, servicePrefix } = resolvePublishTarget(appName, service);\n return { dir: toManifestPath(publishPath), manifestHash, bucketName, servicePrefix };\n};\n\n// Everything the deploy half needs that only the live config can answer,\n// resolved here while the workspace is built and the config loads.\nconst resolveBuildManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n hasViews: boolean,\n hasRemote: boolean,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const qpqConfig = loadServiceQpqConfig(appName, service);\n\n return {\n cdkVersion,\n deploymentName,\n builtFor: stacks,\n stacks:\n stacks === 'views'\n ? null\n : {\n inf: qpqDeployAwsUtils.getInfStackName(qpqConfig),\n api: qpqDeployAwsUtils.getApiStackName(qpqConfig),\n web: qpqDeployAwsUtils.getWebStackName(qpqConfig),\n },\n views: hasViews ? { dir: toManifestPath(getViewsDistDir(appName, service)), destinations: getViewsS3Destinations(appName, service) } : null,\n remote: hasRemote ? resolveRemoteEntry(appName, service) : null,\n };\n};\n\n// The directories a CI job uploads to carry one service's saved build to the\n// deploy job, root-relative.\nconst getSavedBuildDirs = (appName: string, service: string, manifest: GoDockerBuildManifest): string[] => [\n toManifestPath(getGoDockerBuildDir(appName, service)),\n ...(manifest.views ? [manifest.views.dir] : []),\n ...(manifest.remote ? [manifest.remote.dir] : []),\n];\n\nconst buildGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkSynth = stacks !== 'views';\n\n const viewServices = need.views ? services.filter((service) => getServiceNamesWithViews(appName).includes(service)) : [];\n\n out.log('\\n=== Build ===\\n');\n\n // A stale assembly or manifest from an earlier build must not outlive a\n // change of stack selection, so every selected service starts empty.\n for (const service of services) {\n fs.rmSync(getGoDockerBuildDir(appName, service), { recursive: true, force: true });\n }\n\n await runAppHook(appName, 'predeploy');\n\n // Workspace packages resolve through their built dist/ (package.json main),\n // so bundles would ship stale code unless every lib is tsc'd first. Other\n // apps' packages are skipped: nothing this app deploys can import them\n // unless it declares them, and declared ones are built.\n out.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // Synth the selected services' QPQ configs (and shell's, which the views\n // destinations resolve from) so a config that fails to load fails here,\n // before any bundling. In-process: it's just config loads + JSON writes.\n const qpqSynthServices = [...new Set([...services, ...(need.views ? ['shell'] : [])])];\n for (const service of qpqSynthServices) {\n await synthCommand([service, '--app', appName]);\n }\n\n // Federated remotes are the backend story code, so they are rebuilt (and\n // later republished) whenever the api stack is. Skips services without\n // defineFederatedModuleStore(...). Detected here (after the workspace build)\n // because it loads each service's config.\n const federatedServices = need.api ? getServiceNamesWithFederation(appName, services) : [];\n\n if (needCdkSynth) {\n assertNoFailures(\n 'API bundling',\n await runTasks(\n services.map((service) => ({\n label: `bundle-api:${service}`,\n run: async () => {\n out.log(`Bundling api: [${service}]`);\n const qpqConfig = loadServiceQpqConfig(appName, service);\n await runRspack(getServiceRspackConfig(qpqConfig, path.join(getServiceDirectory(appName, service), 'service')));\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n assertNoFailures(\n 'Views bundling',\n await runTasks(\n viewServices.map((service) => ({\n label: `bundle-views:${service}`,\n run: async () => {\n out.log(`Bundling views: [${service}]`);\n await bundleViews(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n // Build the federated remotes now (rspack needs the workspace), so the\n // publish wave only has to sync the already-built output, mirroring how\n // views are bundled here and synced later.\n assertNoFailures(\n 'Remote bundling',\n await runTasks(\n federatedServices.map((service) => ({\n label: `bundle-remote:${service}`,\n run: async () => {\n out.log(`Bundling federated remote: [${service}]`);\n await buildRemote(appName, service);\n },\n })),\n BUILD_CONCURRENCY,\n ),\n );\n\n if (needCdkSynth) {\n // One self-contained cloud assembly per service (all its stacks + staged\n // assets), separate --output dirs so synths can run in parallel and\n // containers never share mutable state.\n assertNoFailures(\n 'CDK synth',\n await runTasks(\n services.map((service) => ({\n label: `cdk-synth:${service}`,\n run: () =>\n runCommandPrefixed(\n `cdk-synth:${service}`,\n 'npx',\n ['cdk', 'synth', '--quiet', '--app', getCdkAppCommand(), '--output', getGoDockerAssemblyDir(appName, service)],\n {\n cwd: getRoot(),\n env: getDeployEnv(appName, service),\n color: nextPrefixColor(),\n },\n ),\n })),\n BUILD_CONCURRENCY,\n ),\n );\n }\n\n // Manifests are written last, so one only ever exists beside a complete build.\n const cdkVersion = getCdkCliVersion();\n for (const service of services) {\n const manifest = resolveBuildManifest(\n appName,\n deploymentName,\n service,\n stacks,\n viewServices.includes(service),\n federatedServices.includes(service),\n cdkVersion,\n );\n writeGoDockerBuildManifest(appName, service, manifest);\n\n out.log(`Saved build for [${service}]:`);\n for (const dir of getSavedBuildDirs(appName, service, manifest)) {\n out.log(` ${dir}`);\n }\n }\n};\n\n// A deploy phase runs from a saved build only when that build was made for it:\n// `all` covers every phase, any other selection only its own. A build made for\n// `inf` has an assembly the api stack could deploy from, but no remote to\n// publish after it, which is exactly the stale-stories deploy the publish\n// ordering exists to prevent.\nconst readCheckedManifest = (\n appName: string,\n deploymentName: string,\n service: string,\n stacks: StackType,\n cdkVersion: string,\n): GoDockerBuildManifest => {\n const manifest = readGoDockerBuildManifest(appName, service);\n const rebuild = `rebuild it with \\`qpq go:docker ${service} ${stacks} --build-only --app ${appName} --deployment ${deploymentName}\\``;\n\n if (manifest.cdkVersion !== cdkVersion) {\n throw new Error(`saved build for [${service}] was synthesized with aws-cdk ${manifest.cdkVersion}, this qpq has ${cdkVersion}; ${rebuild}`);\n }\n if (manifest.deploymentName !== deploymentName) {\n throw new Error(`saved build for [${service}] is for deployment '${manifest.deploymentName}', not '${deploymentName}'; ${rebuild}`);\n }\n if (manifest.builtFor !== 'all' && manifest.builtFor !== stacks) {\n throw new Error(`saved build for [${service}] was built for '${manifest.builtFor}' stacks and cannot deploy '${stacks}'; ${rebuild}`);\n }\n\n return manifest;\n};\n\nconst getStackName = (manifest: GoDockerBuildManifest, service: string, stackType: 'inf' | 'api' | 'web'): string => {\n if (!manifest.stacks) {\n throw new Error(`saved build for [${service}] has no cloud assembly (it was built for views only)`);\n }\n return manifest.stacks[stackType];\n};\n\nconst deployGoDockerOutput = async (appName: string, deploymentName: string, plan: ServicesPlan): Promise<void> => {\n const { services, stacks } = plan;\n const need = getStackNeeds(stacks);\n const needCdkDeploys = stacks !== 'views';\n\n // Every manifest is read and checked up front, so one missing or mismatched\n // build fails the run before any container starts.\n const cdkVersion = getCdkCliVersion();\n const manifests = new Map(services.map((service) => [service, readCheckedManifest(appName, deploymentName, service, stacks, cdkVersion)]));\n const manifestFor = (service: string): GoDockerBuildManifest => manifests.get(service)!;\n\n const viewServices = need.views ? services.filter((service) => manifestFor(service).views !== null) : [];\n const federatedServices = need.api ? services.filter((service) => manifestFor(service).remote !== null) : [];\n\n // Federated publish needs the api stack (need.api ⇒ needCdkDeploys), so any\n // docker preflight it requires is already covered by these two checks.\n if (needCdkDeploys || viewServices.length > 0) {\n await assertDockerRunning();\n }\n if (needCdkDeploys) {\n await buildDeployerImage(cdkVersion);\n }\n\n // The aws-cli image backs both the views sync and the federated publish\n // waves. Pull once now so those waves don't race N containers into pulling\n // the same image.\n if (viewServices.length > 0 || federatedServices.length > 0) {\n await runCommand('docker', ['pull', AWS_CLI_IMAGE]);\n }\n\n // ---- Wave 1: inf stacks, one container per service, all concurrent ----\n if (need.inf) {\n out.log('\\n=== Deploy inf stacks (docker) ===\\n');\n logTimeStart('infWave');\n assertNoFailures(\n 'Inf deploy',\n await runTasks(\n services.map((service) => ({\n label: `inf:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n 'inf',\n getStackName(manifestFor(service), service, 'inf'),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('infWave');\n }\n\n // ---- Wave 2: api + web stacks, all concurrent ----\n if (need.api || need.web) {\n out.log('\\n=== Deploy api + web stacks (docker) ===\\n');\n logTimeStart('apiWebWave');\n assertNoFailures(\n 'Api/Web deploy',\n await runTasks(\n (['api', 'web'] as const)\n .filter((stackType) => (stackType === 'api' ? need.api : need.web))\n .flatMap((stackType) =>\n services.map((service) => ({\n label: `${stackType}:${service}`,\n run: () =>\n dockerDeployStack(\n nextPrefixColor(),\n service,\n stackType,\n getStackName(manifestFor(service), service, stackType),\n getGoDockerAssemblyDir(appName, service),\n ),\n })),\n ),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('apiWebWave');\n }\n\n // ---- Views: sync the pre-built bundles to S3, all concurrent ----\n if (viewServices.length > 0) {\n out.log('\\n=== Sync views to S3 (docker) ===\\n');\n logTimeStart('viewsWave');\n assertNoFailures(\n 'Views sync',\n await runTasks(\n viewServices.map((service) => ({\n label: `views:${service}`,\n run: () => dockerSyncViews(nextPrefixColor(), service, manifestFor(service).views!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('viewsWave');\n }\n\n // ---- Publish: the pre-built federated remotes to S3, all concurrent ----\n if (federatedServices.length > 0) {\n out.log('\\n=== Publish federated remotes to S3 (docker) ===\\n');\n logTimeStart('publishWave');\n assertNoFailures(\n 'Federated publish',\n await runTasks(\n federatedServices.map((service) => ({\n label: `publish:${service}`,\n run: () => dockerPublishRemote(nextPrefixColor(), service, manifestFor(service).remote!),\n })),\n DEPLOY_CONCURRENCY,\n ),\n );\n logTimeEnd('publishWave');\n }\n};\n\nexport const awsGoDocker = async (appName: string, plan: DeployPlan, mode: GoDockerMode): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n if ((await isAwsCredentialsValid()) === false) {\n out.log('Credentials are expired or invalid.');\n return;\n }\n\n logTimeStart('totalTime');\n\n if (plan.kind === 'account') {\n await deployAccountStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n if (plan.kind === 'bootstrap') {\n if (plan.includeDomain) {\n await deployDomainStack(plan.appName);\n }\n await deployBootstrapStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n // resolveDeployment primed the selection before this driver ran. The manifest\n // records it so a build for one deployment can never deploy to another.\n const deploymentName = process.env[QpqDeployEnvVar.deployName];\n if (!deploymentName) {\n throw new Error(`no deployment selected (${QpqDeployEnvVar.deployName} is unset)`);\n }\n\n out.log(`\\n\\nRunning dockerized deploy (${mode})\\n\\n`);\n out.log('Executing for services');\n out.log(plan.services.join(', '));\n\n if (mode !== 'from-build') {\n await buildGoDockerOutput(appName, deploymentName, plan);\n }\n if (mode !== 'build-only') {\n await deployGoDockerOutput(appName, deploymentName, plan);\n }\n\n logTimeEnd('totalTime');\n};\n"]}
@@ -4,12 +4,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.readGoDockerBuildManifest = exports.writeGoDockerBuildManifest = exports.fromManifestPath = exports.toManifestPath = exports.getGoDockerAssemblyDir = exports.getGoDockerBuildDir = void 0;
7
+ // The saved build `qpq go:docker --build-only` leaves behind and `--from-build`
8
+ // deploys from. Per service it is the CDK cloud assembly plus a manifest under
9
+ // dist/qpq/go-docker/<app>/<service>, with the views bundle and the federated
10
+ // remote left where their bundlers write them and pointed at from the manifest.
11
+ const core_1 = require("@qpqjs/core");
7
12
  const fs_1 = __importDefault(require("fs"));
8
13
  const path_1 = __importDefault(require("path"));
9
14
  const discovery_1 = require("../../lib/discovery");
10
15
  const MANIFEST_FILE = 'deploy.json';
11
16
  /** The per-service directory the build half owns: the cloud assembly and the manifest. */
12
- const getGoDockerBuildDir = (appName, serviceName) => path_1.default.join((0, discovery_1.getRoot)(), 'dist', 'qpq', 'go-docker', appName, serviceName);
17
+ const getGoDockerBuildDir = (appName, serviceName) => (0, core_1.getGoDockerBuildPath)((0, discovery_1.getRoot)(), appName, serviceName);
13
18
  exports.getGoDockerBuildDir = getGoDockerBuildDir;
14
19
  /** Where `cdk synth --output` writes the service's self-contained cloud assembly. */
15
20
  const getGoDockerAssemblyDir = (appName, serviceName) => path_1.default.join((0, exports.getGoDockerBuildDir)(appName, serviceName), 'assembly');
@@ -1 +1 @@
1
- {"version":3,"file":"goDockerManifest.js","sourceRoot":"","sources":["../../../../src/platforms/aws/goDockerManifest.ts"],"names":[],"mappings":";;;;;;AAMA,4CAAoB;AACpB,gDAAwB;AAGxB,mDAA8C;AA8B9C,MAAM,aAAa,GAAG,aAAa,CAAC;AAEpC,0FAA0F;AACnF,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAU,EAAE,CAClF,cAAI,CAAC,IAAI,CAAC,IAAA,mBAAO,GAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAD5D,QAAA,mBAAmB,uBACyC;AAEzE,qFAAqF;AAC9E,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAU,EAAE,CACrF,cAAI,CAAC,IAAI,CAAC,IAAA,2BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;AADtD,QAAA,sBAAsB,0BACgC;AAEnE,iEAAiE;AAC1D,MAAM,cAAc,GAAG,CAAC,YAAoB,EAAU,EAAE,CAAC,cAAI,CAAC,QAAQ,CAAC,IAAA,mBAAO,GAAE,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAApH,QAAA,cAAc,kBAAsG;AAEjI,oEAAoE;AAC7D,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAU,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,IAAA,mBAAO,GAAE,EAAE,YAAY,CAAC,CAAC;AAA3F,QAAA,gBAAgB,oBAA2E;AAEjG,MAAM,0BAA0B,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAE,QAA+B,EAAQ,EAAE;IACxH,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC3D,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC,CAAC;AAJW,QAAA,0BAA0B,8BAIrC;AAEF,uGAAuG;AAChG,MAAM,yBAAyB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAyB,EAAE;IACvG,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,2BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;IAEzF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,uBAAuB,WAAW,cAAc,YAAY,2BAA2B,WAAW,+BAA+B,OAAO,UAAU,CACnJ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAA0B,CAAC;AACrF,CAAC,CAAC;AAVW,QAAA,yBAAyB,6BAUpC","sourcesContent":["// The saved build `qpq go:docker --build-only` leaves behind and `--from-build`\n// deploys from. Per service it is the CDK cloud assembly plus a manifest under\n// dist/qpq/go-docker/<app>/<service>, with the views bundle and the federated\n// remote left where their bundlers write them and pointed at from the manifest.\nimport { Nullable } from '@qpqjs/core';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { StackType } from '../../lib/deployPrompts';\nimport { getRoot } from '../../lib/discovery';\n\n/** The CloudFormation stack names of one service's assembly. */\nexport type GoDockerStackNames = { inf: string; api: string; web: string };\n\n/** A built views bundle and the S3 locations it syncs to. */\nexport type GoDockerViewsEntry = { dir: string; destinations: string[] };\n\n/** A built federated remote (its publish dir and the store it goes into). */\nexport type GoDockerRemoteEntry = { dir: string; manifestHash: string; bucketName: string; servicePrefix: string };\n\n/**\n * Everything the deploy half needs for one service that only the live config can\n * answer, resolved by the build half. Paths are relative to the consumer root with\n * forward slashes, so a build saved on one machine deploys from another checkout.\n */\nexport type GoDockerBuildManifest = {\n // The aws-cdk that synthesized the assembly; the deploy half refuses any other.\n cdkVersion: string;\n deploymentName: string;\n // The stack selection the build ran with: `all` can deploy any phase, anything else only its own.\n builtFor: StackType;\n // Null for a views-only build, which synthesizes nothing.\n stacks: Nullable<GoDockerStackNames>;\n // Null when the service has no views or they were not built.\n views: Nullable<GoDockerViewsEntry>;\n // Null when the service has no defineFederatedModuleStore(...) or the api was not built.\n remote: Nullable<GoDockerRemoteEntry>;\n};\n\nconst MANIFEST_FILE = 'deploy.json';\n\n/** The per-service directory the build half owns: the cloud assembly and the manifest. */\nexport const getGoDockerBuildDir = (appName: string, serviceName: string): string =>\n path.join(getRoot(), 'dist', 'qpq', 'go-docker', appName, serviceName);\n\n/** Where `cdk synth --output` writes the service's self-contained cloud assembly. */\nexport const getGoDockerAssemblyDir = (appName: string, serviceName: string): string =>\n path.join(getGoDockerBuildDir(appName, serviceName), 'assembly');\n\n/** A path under the consumer root, as the manifest stores it. */\nexport const toManifestPath = (absolutePath: string): string => path.relative(getRoot(), absolutePath).split(path.sep).join('/');\n\n/** The absolute path a manifest entry points at on this machine. */\nexport const fromManifestPath = (manifestPath: string): string => path.resolve(getRoot(), manifestPath);\n\nexport const writeGoDockerBuildManifest = (appName: string, serviceName: string, manifest: GoDockerBuildManifest): void => {\n const buildDir = getGoDockerBuildDir(appName, serviceName);\n fs.mkdirSync(buildDir, { recursive: true });\n fs.writeFileSync(path.join(buildDir, MANIFEST_FILE), JSON.stringify(manifest, null, 2));\n};\n\n/** Throws, naming the directory and the command that fills it, when the service has no saved build. */\nexport const readGoDockerBuildManifest = (appName: string, serviceName: string): GoDockerBuildManifest => {\n const manifestPath = path.join(getGoDockerBuildDir(appName, serviceName), MANIFEST_FILE);\n\n if (!fs.existsSync(manifestPath)) {\n throw new Error(\n `no saved build for [${serviceName}] (missing ${manifestPath}) - run \\`qpq go:docker ${serviceName} <stack> --build-only --app ${appName}\\` first`,\n );\n }\n\n return JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as GoDockerBuildManifest;\n};\n"]}
1
+ {"version":3,"file":"goDockerManifest.js","sourceRoot":"","sources":["../../../../src/platforms/aws/goDockerManifest.ts"],"names":[],"mappings":";;;;;;AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,sCAA6D;AAE7D,4CAAoB;AACpB,gDAAwB;AAGxB,mDAA8C;AA8B9C,MAAM,aAAa,GAAG,aAAa,CAAC;AAEpC,0FAA0F;AACnF,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAU,EAAE,CAAC,IAAA,2BAAoB,EAAC,IAAA,mBAAO,GAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAA9H,QAAA,mBAAmB,uBAA2G;AAE3I,qFAAqF;AAC9E,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAU,EAAE,CACrF,cAAI,CAAC,IAAI,CAAC,IAAA,2BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;AADtD,QAAA,sBAAsB,0BACgC;AAEnE,iEAAiE;AAC1D,MAAM,cAAc,GAAG,CAAC,YAAoB,EAAU,EAAE,CAAC,cAAI,CAAC,QAAQ,CAAC,IAAA,mBAAO,GAAE,EAAE,YAAY,CAAC,CAAC,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAApH,QAAA,cAAc,kBAAsG;AAEjI,oEAAoE;AAC7D,MAAM,gBAAgB,GAAG,CAAC,YAAoB,EAAU,EAAE,CAAC,cAAI,CAAC,OAAO,CAAC,IAAA,mBAAO,GAAE,EAAE,YAAY,CAAC,CAAC;AAA3F,QAAA,gBAAgB,oBAA2E;AAEjG,MAAM,0BAA0B,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAE,QAA+B,EAAQ,EAAE;IACxH,MAAM,QAAQ,GAAG,IAAA,2BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC3D,YAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1F,CAAC,CAAC;AAJW,QAAA,0BAA0B,8BAIrC;AAEF,uGAAuG;AAChG,MAAM,yBAAyB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAyB,EAAE;IACvG,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,2BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;IAEzF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,uBAAuB,WAAW,cAAc,YAAY,2BAA2B,WAAW,+BAA+B,OAAO,UAAU,CACnJ,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAA0B,CAAC;AACrF,CAAC,CAAC;AAVW,QAAA,yBAAyB,6BAUpC","sourcesContent":["// The saved build `qpq go:docker --build-only` leaves behind and `--from-build`\n// deploys from. Per service it is the CDK cloud assembly plus a manifest under\n// dist/qpq/go-docker/<app>/<service>, with the views bundle and the federated\n// remote left where their bundlers write them and pointed at from the manifest.\nimport { getGoDockerBuildPath, Nullable } from '@qpqjs/core';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { StackType } from '../../lib/deployPrompts';\nimport { getRoot } from '../../lib/discovery';\n\n/** The CloudFormation stack names of one service's assembly. */\nexport type GoDockerStackNames = { inf: string; api: string; web: string };\n\n/** A built views bundle and the S3 locations it syncs to. */\nexport type GoDockerViewsEntry = { dir: string; destinations: string[] };\n\n/** A built federated remote (its publish dir and the store it goes into). */\nexport type GoDockerRemoteEntry = { dir: string; manifestHash: string; bucketName: string; servicePrefix: string };\n\n/**\n * Everything the deploy half needs for one service that only the live config can\n * answer, resolved by the build half. Paths are relative to the consumer root with\n * forward slashes, so a build saved on one machine deploys from another checkout.\n */\nexport type GoDockerBuildManifest = {\n // The aws-cdk that synthesized the assembly; the deploy half refuses any other.\n cdkVersion: string;\n deploymentName: string;\n // The stack selection the build ran with: `all` can deploy any phase, anything else only its own.\n builtFor: StackType;\n // Null for a views-only build, which synthesizes nothing.\n stacks: Nullable<GoDockerStackNames>;\n // Null when the service has no views or they were not built.\n views: Nullable<GoDockerViewsEntry>;\n // Null when the service has no defineFederatedModuleStore(...) or the api was not built.\n remote: Nullable<GoDockerRemoteEntry>;\n};\n\nconst MANIFEST_FILE = 'deploy.json';\n\n/** The per-service directory the build half owns: the cloud assembly and the manifest. */\nexport const getGoDockerBuildDir = (appName: string, serviceName: string): string => getGoDockerBuildPath(getRoot(), appName, serviceName);\n\n/** Where `cdk synth --output` writes the service's self-contained cloud assembly. */\nexport const getGoDockerAssemblyDir = (appName: string, serviceName: string): string =>\n path.join(getGoDockerBuildDir(appName, serviceName), 'assembly');\n\n/** A path under the consumer root, as the manifest stores it. */\nexport const toManifestPath = (absolutePath: string): string => path.relative(getRoot(), absolutePath).split(path.sep).join('/');\n\n/** The absolute path a manifest entry points at on this machine. */\nexport const fromManifestPath = (manifestPath: string): string => path.resolve(getRoot(), manifestPath);\n\nexport const writeGoDockerBuildManifest = (appName: string, serviceName: string, manifest: GoDockerBuildManifest): void => {\n const buildDir = getGoDockerBuildDir(appName, serviceName);\n fs.mkdirSync(buildDir, { recursive: true });\n fs.writeFileSync(path.join(buildDir, MANIFEST_FILE), JSON.stringify(manifest, null, 2));\n};\n\n/** Throws, naming the directory and the command that fills it, when the service has no saved build. */\nexport const readGoDockerBuildManifest = (appName: string, serviceName: string): GoDockerBuildManifest => {\n const manifestPath = path.join(getGoDockerBuildDir(appName, serviceName), MANIFEST_FILE);\n\n if (!fs.existsSync(manifestPath)) {\n throw new Error(\n `no saved build for [${serviceName}] (missing ${manifestPath}) - run \\`qpq go:docker ${serviceName} <stack> --build-only --app ${appName}\\` first`,\n );\n }\n\n return JSON.parse(fs.readFileSync(manifestPath, 'utf-8')) as GoDockerBuildManifest;\n};\n"]}
@@ -10,23 +10,25 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.awsPublish = exports.awsPublishDeploy = exports.awsPublishUpload = exports.awsPublishBuild = void 0;
13
- // AWS federated remote publishing — build each backend service as a
13
+ // AWS federated remote publishing, build each backend service as a
14
14
  // module-federation remote and publish it into that service's federated code
15
15
  // bucket (see ./remote for the three-phase mechanics).
16
+ const CliError_1 = require("../../lib/CliError");
17
+ const out_1 = require("../../lib/out");
16
18
  const awsCredentials_1 = require("./awsCredentials");
17
19
  const remote_1 = require("./remote");
20
+ const out = (0, out_1.createOutput)('aws:publish');
18
21
  const requireAwsCredentials = () => __awaiter(void 0, void 0, void 0, function* () {
19
22
  if (!(yield (0, awsCredentials_1.isAwsCredentialsValid)())) {
20
- console.error('AWS credentials are not valid. Configure them and retry.');
21
- process.exit(1);
23
+ throw new CliError_1.CliError('AWS credentials are not valid. Configure them and retry.');
22
24
  }
23
25
  });
24
26
  const awsPublishBuild = (appName, serviceNames) => __awaiter(void 0, void 0, void 0, function* () {
25
- console.log(`Building federated remotes for [${appName}]: ${serviceNames.join(', ')}`);
27
+ out.log(`Building federated remotes for [${appName}]: ${serviceNames.join(', ')}`);
26
28
  for (const serviceName of serviceNames) {
27
29
  yield (0, remote_1.buildRemote)(appName, serviceName);
28
30
  }
29
- console.log('Done. Next: qpq publish:upload, then qpq publish:deploy.');
31
+ out.log('Done. Next: qpq publish:upload, then qpq publish:deploy.');
30
32
  });
31
33
  exports.awsPublishBuild = awsPublishBuild;
32
34
  const awsPublishUpload = (appName, serviceNames) => __awaiter(void 0, void 0, void 0, function* () {
@@ -34,22 +36,22 @@ const awsPublishUpload = (appName, serviceNames) => __awaiter(void 0, void 0, vo
34
36
  // Resolve every target up front - a missing build fails the whole step
35
37
  // before a single byte is uploaded.
36
38
  const targets = serviceNames.map((serviceName) => (0, remote_1.resolvePublishTarget)(appName, serviceName));
37
- console.log(`Uploading federated remotes for [${appName}]: ${serviceNames.join(', ')}`);
39
+ out.log(`Uploading federated remotes for [${appName}]: ${serviceNames.join(', ')}`);
38
40
  yield Promise.all(targets.map((target) => (0, remote_1.uploadRemoteVersion)(target)));
39
- console.log('Done. Run qpq publish:deploy to flip lambdas to the new versions.');
41
+ out.log('Done. Run qpq publish:deploy to flip lambdas to the new versions.');
40
42
  });
41
43
  exports.awsPublishUpload = awsPublishUpload;
42
44
  const awsPublishDeploy = (appName, serviceNames) => __awaiter(void 0, void 0, void 0, function* () {
43
45
  yield requireAwsCredentials();
44
46
  const targets = serviceNames.map((serviceName) => (0, remote_1.resolvePublishTarget)(appName, serviceName));
45
- console.log(`Deploying federated remote manifests for [${appName}]: ${serviceNames.join(', ')}`);
47
+ out.log(`Deploying federated remote manifests for [${appName}]: ${serviceNames.join(', ')}`);
46
48
  yield Promise.all(targets.map((target) => (0, remote_1.deployRemoteManifest)(target)));
47
- console.log('Done. New lambda cold starts will federate these services from S3.');
49
+ out.log('Done. New lambda cold starts will federate these services from S3.');
48
50
  });
49
51
  exports.awsPublishDeploy = awsPublishDeploy;
50
52
  const awsPublish = (appName, serviceNames) => __awaiter(void 0, void 0, void 0, function* () {
51
53
  yield requireAwsCredentials();
52
- console.log(`Publishing federated remotes for [${appName}]: ${serviceNames.join(', ')}`);
54
+ out.log(`Publishing federated remotes for [${appName}]: ${serviceNames.join(', ')}`);
53
55
  // 1. Build everything first - any build failure bails before any upload,
54
56
  // so the buckets never end up with a half-published set of services.
55
57
  for (const serviceName of serviceNames) {
@@ -60,7 +62,7 @@ const awsPublish = (appName, serviceNames) => __awaiter(void 0, void 0, void 0,
60
62
  yield Promise.all(targets.map((target) => (0, remote_1.uploadRemoteVersion)(target)));
61
63
  // 3. Every version dir is fully uploaded - flip the manifests, in parallel.
62
64
  yield Promise.all(targets.map((target) => (0, remote_1.deployRemoteManifest)(target)));
63
- console.log('Done. New lambda cold starts will federate these services from S3.');
65
+ out.log('Done. New lambda cold starts will federate these services from S3.');
64
66
  });
65
67
  exports.awsPublish = awsPublish;
66
68
  //# sourceMappingURL=publish.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../../src/platforms/aws/publish.ts"],"names":[],"mappings":"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","sourcesContent":["// AWS federated remote publishing — build each backend service as a\n// module-federation remote and publish it into that service's federated code\n// bucket (see ./remote for the three-phase mechanics).\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { buildRemote, deployRemoteManifest, resolvePublishTarget, uploadRemoteVersion } from './remote';\n\nconst requireAwsCredentials = async (): Promise<void> => {\n if (!(await isAwsCredentialsValid())) {\n console.error('AWS credentials are not valid. Configure them and retry.');\n process.exit(1);\n }\n};\n\nexport const awsPublishBuild = async (appName: string, serviceNames: string[]): Promise<void> => {\n console.log(`Building federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n\n console.log('Done. Next: qpq publish:upload, then qpq publish:deploy.');\n};\n\nexport const awsPublishUpload = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n // Resolve every target up front - a missing build fails the whole step\n // before a single byte is uploaded.\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n console.log(`Uploading federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n console.log('Done. Run qpq publish:deploy to flip lambdas to the new versions.');\n};\n\nexport const awsPublishDeploy = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n console.log(`Deploying federated remote manifests for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n console.log('Done. New lambda cold starts will federate these services from S3.');\n};\n\nexport const awsPublish = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n console.log(`Publishing federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n // 1. Build everything first - any build failure bails before any upload,\n // so the buckets never end up with a half-published set of services.\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n // 2. Upload all version dirs in parallel - manifests untouched, nothing live yet.\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n // 3. Every version dir is fully uploaded - flip the manifests, in parallel.\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n console.log('Done. New lambda cold starts will federate these services from S3.');\n};\n"]}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../../src/platforms/aws/publish.ts"],"names":[],"mappings":"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","sourcesContent":["// AWS federated remote publishing, build each backend service as a\n// module-federation remote and publish it into that service's federated code\n// bucket (see ./remote for the three-phase mechanics).\nimport { CliError } from '../../lib/CliError';\nimport { createOutput } from '../../lib/out';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { buildRemote, deployRemoteManifest, resolvePublishTarget, uploadRemoteVersion } from './remote';\n\nconst out = createOutput('aws:publish');\n\nconst requireAwsCredentials = async (): Promise<void> => {\n if (!(await isAwsCredentialsValid())) {\n throw new CliError('AWS credentials are not valid. Configure them and retry.');\n }\n};\n\nexport const awsPublishBuild = async (appName: string, serviceNames: string[]): Promise<void> => {\n out.log(`Building federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n\n out.log('Done. Next: qpq publish:upload, then qpq publish:deploy.');\n};\n\nexport const awsPublishUpload = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n // Resolve every target up front - a missing build fails the whole step\n // before a single byte is uploaded.\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n out.log(`Uploading federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n out.log('Done. Run qpq publish:deploy to flip lambdas to the new versions.');\n};\n\nexport const awsPublishDeploy = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n out.log(`Deploying federated remote manifests for [${appName}]: ${serviceNames.join(', ')}`);\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n out.log('Done. New lambda cold starts will federate these services from S3.');\n};\n\nexport const awsPublish = async (appName: string, serviceNames: string[]): Promise<void> => {\n await requireAwsCredentials();\n\n out.log(`Publishing federated remotes for [${appName}]: ${serviceNames.join(', ')}`);\n\n // 1. Build everything first - any build failure bails before any upload,\n // so the buckets never end up with a half-published set of services.\n for (const serviceName of serviceNames) {\n await buildRemote(appName, serviceName);\n }\n const targets = serviceNames.map((serviceName) => resolvePublishTarget(appName, serviceName));\n\n // 2. Upload all version dirs in parallel - manifests untouched, nothing live yet.\n await Promise.all(targets.map((target) => uploadRemoteVersion(target)));\n\n // 3. Every version dir is fully uploaded - flip the manifests, in parallel.\n await Promise.all(targets.map((target) => deployRemoteManifest(target)));\n\n out.log('Done. New lambda cold starts will federate these services from S3.');\n};\n"]}