@qpqjs/cli 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (549) hide show
  1. package/README.md +92 -2
  2. package/docker/cdk-deployer/Dockerfile +13 -0
  3. package/docker/dev-server/Dockerfile +47 -0
  4. package/lib/commonjs/bin/qpq.d.ts +2 -0
  5. package/lib/commonjs/bin/qpq.js +6 -0
  6. package/lib/commonjs/bin/qpq.js.map +1 -0
  7. package/lib/commonjs/bin/qpqCdkApp.d.ts +1 -0
  8. package/lib/commonjs/bin/qpqCdkApp.js +8 -0
  9. package/lib/commonjs/bin/qpqCdkApp.js.map +1 -0
  10. package/lib/commonjs/cli/commandMenu.d.ts +2 -0
  11. package/lib/commonjs/cli/commandMenu.js +81 -0
  12. package/lib/commonjs/cli/commandMenu.js.map +1 -0
  13. package/lib/commonjs/cli/commandRegistry.d.ts +10 -0
  14. package/lib/commonjs/cli/commandRegistry.js +177 -0
  15. package/lib/commonjs/cli/commandRegistry.js.map +1 -0
  16. package/lib/commonjs/cli/index.d.ts +1 -0
  17. package/lib/commonjs/cli/index.js +18 -0
  18. package/lib/commonjs/cli/index.js.map +1 -0
  19. package/lib/commonjs/cli/runCli.d.ts +1 -0
  20. package/lib/commonjs/cli/runCli.js +86 -0
  21. package/lib/commonjs/cli/runCli.js.map +1 -0
  22. package/lib/commonjs/commands/checkCircular.d.ts +1 -0
  23. package/lib/commonjs/commands/checkCircular.js +70 -0
  24. package/lib/commonjs/commands/checkCircular.js.map +1 -0
  25. package/lib/commonjs/commands/clearResources.d.ts +1 -0
  26. package/lib/commonjs/commands/clearResources.js +36 -0
  27. package/lib/commonjs/commands/clearResources.js.map +1 -0
  28. package/lib/commonjs/commands/go.d.ts +1 -0
  29. package/lib/commonjs/commands/go.js +30 -0
  30. package/lib/commonjs/commands/go.js.map +1 -0
  31. package/lib/commonjs/commands/goDev.d.ts +1 -0
  32. package/lib/commonjs/commands/goDev.js +46 -0
  33. package/lib/commonjs/commands/goDev.js.map +1 -0
  34. package/lib/commonjs/commands/goDevApi.d.ts +1 -0
  35. package/lib/commonjs/commands/goDevApi.js +158 -0
  36. package/lib/commonjs/commands/goDevApi.js.map +1 -0
  37. package/lib/commonjs/commands/goDevWeb.d.ts +4 -0
  38. package/lib/commonjs/commands/goDevWeb.js +144 -0
  39. package/lib/commonjs/commands/goDevWeb.js.map +1 -0
  40. package/lib/commonjs/commands/goDocker.d.ts +1 -0
  41. package/lib/commonjs/commands/goDocker.js +43 -0
  42. package/lib/commonjs/commands/goDocker.js.map +1 -0
  43. package/lib/commonjs/commands/hooks.d.ts +1 -0
  44. package/lib/commonjs/commands/hooks.js +39 -0
  45. package/lib/commonjs/commands/hooks.js.map +1 -0
  46. package/lib/commonjs/commands/migrate.d.ts +1 -0
  47. package/lib/commonjs/commands/migrate.js +70 -0
  48. package/lib/commonjs/commands/migrate.js.map +1 -0
  49. package/lib/commonjs/commands/prep.d.ts +1 -0
  50. package/lib/commonjs/commands/prep.js +28 -0
  51. package/lib/commonjs/commands/prep.js.map +1 -0
  52. package/lib/commonjs/commands/publish.d.ts +4 -0
  53. package/lib/commonjs/commands/publish.js +54 -0
  54. package/lib/commonjs/commands/publish.js.map +1 -0
  55. package/lib/commonjs/commands/scriptBuild.d.ts +1 -0
  56. package/lib/commonjs/commands/scriptBuild.js +46 -0
  57. package/lib/commonjs/commands/scriptBuild.js.map +1 -0
  58. package/lib/commonjs/commands/scriptBuilderLayer.d.ts +1 -0
  59. package/lib/commonjs/commands/scriptBuilderLayer.js +48 -0
  60. package/lib/commonjs/commands/scriptBuilderLayer.js.map +1 -0
  61. package/lib/commonjs/commands/scriptNew.d.ts +1 -0
  62. package/lib/commonjs/commands/scriptNew.js +35 -0
  63. package/lib/commonjs/commands/scriptNew.js.map +1 -0
  64. package/lib/commonjs/commands/setup.d.ts +1 -0
  65. package/lib/commonjs/commands/setup.js +102 -0
  66. package/lib/commonjs/commands/setup.js.map +1 -0
  67. package/lib/commonjs/commands/synth.d.ts +1 -0
  68. package/lib/commonjs/commands/synth.js +89 -0
  69. package/lib/commonjs/commands/synth.js.map +1 -0
  70. package/lib/commonjs/commands/teardown.d.ts +1 -0
  71. package/lib/commonjs/commands/teardown.js +33 -0
  72. package/lib/commonjs/commands/teardown.js.map +1 -0
  73. package/lib/commonjs/index.d.ts +1 -0
  74. package/lib/commonjs/index.js +18 -0
  75. package/lib/commonjs/index.js.map +1 -0
  76. package/lib/commonjs/lib/args.d.ts +3 -0
  77. package/lib/commonjs/lib/args.js +31 -0
  78. package/lib/commonjs/lib/args.js.map +1 -0
  79. package/lib/commonjs/lib/circularImports.d.ts +3 -0
  80. package/lib/commonjs/lib/circularImports.js +79 -0
  81. package/lib/commonjs/lib/circularImports.js.map +1 -0
  82. package/lib/commonjs/lib/clearResourcesPlan.d.ts +15 -0
  83. package/lib/commonjs/lib/clearResourcesPlan.js +79 -0
  84. package/lib/commonjs/lib/clearResourcesPlan.js.map +1 -0
  85. package/lib/commonjs/lib/deployPrompts.d.ts +26 -0
  86. package/lib/commonjs/lib/deployPrompts.js +118 -0
  87. package/lib/commonjs/lib/deployPrompts.js.map +1 -0
  88. package/lib/commonjs/lib/devServerEntry.d.ts +22 -0
  89. package/lib/commonjs/lib/devServerEntry.js +135 -0
  90. package/lib/commonjs/lib/devServerEntry.js.map +1 -0
  91. package/lib/commonjs/lib/devServerPorts.d.ts +13 -0
  92. package/lib/commonjs/lib/devServerPorts.js +36 -0
  93. package/lib/commonjs/lib/devServerPorts.js.map +1 -0
  94. package/lib/commonjs/lib/discovery.d.ts +10 -0
  95. package/lib/commonjs/lib/discovery.js +56 -0
  96. package/lib/commonjs/lib/discovery.js.map +1 -0
  97. package/lib/commonjs/lib/getDefaultHookJobs.d.ts +2 -0
  98. package/lib/commonjs/lib/getDefaultHookJobs.js +11 -0
  99. package/lib/commonjs/lib/getDefaultHookJobs.js.map +1 -0
  100. package/lib/commonjs/lib/getDeployTargetLabel.d.ts +2 -0
  101. package/lib/commonjs/lib/getDeployTargetLabel.js +12 -0
  102. package/lib/commonjs/lib/getDeployTargetLabel.js.map +1 -0
  103. package/lib/commonjs/lib/goDockerMode.d.ts +6 -0
  104. package/lib/commonjs/lib/goDockerMode.js +23 -0
  105. package/lib/commonjs/lib/goDockerMode.js.map +1 -0
  106. package/lib/commonjs/lib/hooks.d.ts +9 -0
  107. package/lib/commonjs/lib/hooks.js +178 -0
  108. package/lib/commonjs/lib/hooks.js.map +1 -0
  109. package/lib/commonjs/lib/keepOtherDevServersFlag.d.ts +1 -0
  110. package/lib/commonjs/lib/keepOtherDevServersFlag.js +11 -0
  111. package/lib/commonjs/lib/keepOtherDevServersFlag.js.map +1 -0
  112. package/lib/commonjs/lib/killChildWithEscalation.d.ts +10 -0
  113. package/lib/commonjs/lib/killChildWithEscalation.js +33 -0
  114. package/lib/commonjs/lib/killChildWithEscalation.js.map +1 -0
  115. package/lib/commonjs/lib/killStaleListeners.d.ts +17 -0
  116. package/lib/commonjs/lib/killStaleListeners.js +220 -0
  117. package/lib/commonjs/lib/killStaleListeners.js.map +1 -0
  118. package/lib/commonjs/lib/packageRoot.d.ts +1 -0
  119. package/lib/commonjs/lib/packageRoot.js +21 -0
  120. package/lib/commonjs/lib/packageRoot.js.map +1 -0
  121. package/lib/commonjs/lib/prompts.d.ts +15 -0
  122. package/lib/commonjs/lib/prompts.js +78 -0
  123. package/lib/commonjs/lib/prompts.js.map +1 -0
  124. package/lib/commonjs/lib/qpqConfigs.d.ts +4 -0
  125. package/lib/commonjs/lib/qpqConfigs.js +27 -0
  126. package/lib/commonjs/lib/qpqConfigs.js.map +1 -0
  127. package/lib/commonjs/lib/resolveAppSelection.d.ts +6 -0
  128. package/lib/commonjs/lib/resolveAppSelection.js +58 -0
  129. package/lib/commonjs/lib/resolveAppSelection.js.map +1 -0
  130. package/lib/commonjs/lib/resolveDeployment.d.ts +14 -0
  131. package/lib/commonjs/lib/resolveDeployment.js +58 -0
  132. package/lib/commonjs/lib/resolveDeployment.js.map +1 -0
  133. package/lib/commonjs/lib/runCommand.d.ts +14 -0
  134. package/lib/commonjs/lib/runCommand.js +103 -0
  135. package/lib/commonjs/lib/runCommand.js.map +1 -0
  136. package/lib/commonjs/lib/runTasks.d.ts +15 -0
  137. package/lib/commonjs/lib/runTasks.js +123 -0
  138. package/lib/commonjs/lib/runTasks.js.map +1 -0
  139. package/lib/commonjs/lib/setupStep.d.ts +16 -0
  140. package/lib/commonjs/lib/setupStep.js +3 -0
  141. package/lib/commonjs/lib/setupStep.js.map +1 -0
  142. package/lib/commonjs/lib/timing.d.ts +2 -0
  143. package/lib/commonjs/lib/timing.js +11 -0
  144. package/lib/commonjs/lib/timing.js.map +1 -0
  145. package/lib/commonjs/lib/typeWatcher.d.ts +2 -0
  146. package/lib/commonjs/lib/typeWatcher.js +59 -0
  147. package/lib/commonjs/lib/typeWatcher.js.map +1 -0
  148. package/lib/commonjs/lib/userScriptBuilderLayer.d.ts +23 -0
  149. package/lib/commonjs/lib/userScriptBuilderLayer.js +74 -0
  150. package/lib/commonjs/lib/userScriptBuilderLayer.js.map +1 -0
  151. package/lib/commonjs/lib/userScriptTemplate.d.ts +6 -0
  152. package/lib/commonjs/lib/userScriptTemplate.js +47 -0
  153. package/lib/commonjs/lib/userScriptTemplate.js.map +1 -0
  154. package/lib/commonjs/lib/views.d.ts +2 -0
  155. package/lib/commonjs/lib/views.js +31 -0
  156. package/lib/commonjs/lib/views.js.map +1 -0
  157. package/lib/commonjs/lib/webAddressingEnv.d.ts +7 -0
  158. package/lib/commonjs/lib/webAddressingEnv.js +16 -0
  159. package/lib/commonjs/lib/webAddressingEnv.js.map +1 -0
  160. package/lib/commonjs/platforms/aws/awsCredentials.d.ts +1 -0
  161. package/lib/commonjs/platforms/aws/awsCredentials.js +28 -0
  162. package/lib/commonjs/platforms/aws/awsCredentials.js.map +1 -0
  163. package/lib/commonjs/platforms/aws/cdkApp.d.ts +3 -0
  164. package/lib/commonjs/platforms/aws/cdkApp.js +31 -0
  165. package/lib/commonjs/platforms/aws/cdkApp.js.map +1 -0
  166. package/lib/commonjs/platforms/aws/clearResources.d.ts +2 -0
  167. package/lib/commonjs/platforms/aws/clearResources.js +167 -0
  168. package/lib/commonjs/platforms/aws/clearResources.js.map +1 -0
  169. package/lib/commonjs/platforms/aws/go.d.ts +2 -0
  170. package/lib/commonjs/platforms/aws/go.js +131 -0
  171. package/lib/commonjs/platforms/aws/go.js.map +1 -0
  172. package/lib/commonjs/platforms/aws/goDocker.d.ts +3 -0
  173. package/lib/commonjs/platforms/aws/goDocker.js +457 -0
  174. package/lib/commonjs/platforms/aws/goDocker.js.map +1 -0
  175. package/lib/commonjs/platforms/aws/goDockerManifest.d.ts +44 -0
  176. package/lib/commonjs/platforms/aws/goDockerManifest.js +38 -0
  177. package/lib/commonjs/platforms/aws/goDockerManifest.js.map +1 -0
  178. package/lib/commonjs/platforms/aws/index.d.ts +2 -0
  179. package/lib/commonjs/platforms/aws/index.js +23 -0
  180. package/lib/commonjs/platforms/aws/index.js.map +1 -0
  181. package/lib/commonjs/platforms/aws/prepareDeployment.d.ts +3 -0
  182. package/lib/commonjs/platforms/aws/prepareDeployment.js +10 -0
  183. package/lib/commonjs/platforms/aws/prepareDeployment.js.map +1 -0
  184. package/lib/commonjs/platforms/aws/publish.d.ts +4 -0
  185. package/lib/commonjs/platforms/aws/publish.js +66 -0
  186. package/lib/commonjs/platforms/aws/publish.js.map +1 -0
  187. package/lib/commonjs/platforms/aws/remote.d.ts +11 -0
  188. package/lib/commonjs/platforms/aws/remote.js +105 -0
  189. package/lib/commonjs/platforms/aws/remote.js.map +1 -0
  190. package/lib/commonjs/platforms/aws/setup/awsSetupContext.d.ts +12 -0
  191. package/lib/commonjs/platforms/aws/setup/awsSetupContext.js +20 -0
  192. package/lib/commonjs/platforms/aws/setup/awsSetupContext.js.map +1 -0
  193. package/lib/commonjs/platforms/aws/setup/awsSetupSteps.d.ts +8 -0
  194. package/lib/commonjs/platforms/aws/setup/awsSetupSteps.js +44 -0
  195. package/lib/commonjs/platforms/aws/setup/awsSetupSteps.js.map +1 -0
  196. package/lib/commonjs/platforms/aws/setup/buildBucketNamesStep.d.ts +4 -0
  197. package/lib/commonjs/platforms/aws/setup/buildBucketNamesStep.js +77 -0
  198. package/lib/commonjs/platforms/aws/setup/buildBucketNamesStep.js.map +1 -0
  199. package/lib/commonjs/platforms/aws/setup/buildCdkBootstrapSteps.d.ts +5 -0
  200. package/lib/commonjs/platforms/aws/setup/buildCdkBootstrapSteps.js +38 -0
  201. package/lib/commonjs/platforms/aws/setup/buildCdkBootstrapSteps.js.map +1 -0
  202. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.d.ts +4 -0
  203. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js +55 -0
  204. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -0
  205. package/lib/commonjs/platforms/aws/setup/buildGithubOidcProviderStep.d.ts +4 -0
  206. package/lib/commonjs/platforms/aws/setup/buildGithubOidcProviderStep.js +54 -0
  207. package/lib/commonjs/platforms/aws/setup/buildGithubOidcProviderStep.js.map +1 -0
  208. package/lib/commonjs/platforms/aws/setup/buildHostedZonesStep.d.ts +4 -0
  209. package/lib/commonjs/platforms/aws/setup/buildHostedZonesStep.js +63 -0
  210. package/lib/commonjs/platforms/aws/setup/buildHostedZonesStep.js.map +1 -0
  211. package/lib/commonjs/platforms/aws/setup/buildIamCapabilityStep.d.ts +4 -0
  212. package/lib/commonjs/platforms/aws/setup/buildIamCapabilityStep.js +48 -0
  213. package/lib/commonjs/platforms/aws/setup/buildIamCapabilityStep.js.map +1 -0
  214. package/lib/commonjs/platforms/aws/setup/buildIdentityStep.d.ts +4 -0
  215. package/lib/commonjs/platforms/aws/setup/buildIdentityStep.js +39 -0
  216. package/lib/commonjs/platforms/aws/setup/buildIdentityStep.js.map +1 -0
  217. package/lib/commonjs/platforms/aws/setup/buildStackSteps.d.ts +5 -0
  218. package/lib/commonjs/platforms/aws/setup/buildStackSteps.js +32 -0
  219. package/lib/commonjs/platforms/aws/setup/buildStackSteps.js.map +1 -0
  220. package/lib/commonjs/platforms/aws/setup/describeStackStatus.d.ts +4 -0
  221. package/lib/commonjs/platforms/aws/setup/describeStackStatus.js +32 -0
  222. package/lib/commonjs/platforms/aws/setup/describeStackStatus.js.map +1 -0
  223. package/lib/commonjs/platforms/aws/setup/index.d.ts +1 -0
  224. package/lib/commonjs/platforms/aws/setup/index.js +18 -0
  225. package/lib/commonjs/platforms/aws/setup/index.js.map +1 -0
  226. package/lib/commonjs/platforms/aws/stacks.d.ts +7 -0
  227. package/lib/commonjs/platforms/aws/stacks.js +94 -0
  228. package/lib/commonjs/platforms/aws/stacks.js.map +1 -0
  229. package/lib/commonjs/platforms/aws/teardown.d.ts +2 -0
  230. package/lib/commonjs/platforms/aws/teardown.js +59 -0
  231. package/lib/commonjs/platforms/aws/teardown.js.map +1 -0
  232. package/lib/commonjs/platforms/aws/viewsSync.d.ts +3 -0
  233. package/lib/commonjs/platforms/aws/viewsSync.js +77 -0
  234. package/lib/commonjs/platforms/aws/viewsSync.js.map +1 -0
  235. package/lib/commonjs/platforms/docker/QpqDockerPlatformSettings.d.ts +10 -0
  236. package/lib/commonjs/platforms/docker/QpqDockerPlatformSettings.js +3 -0
  237. package/lib/commonjs/platforms/docker/QpqDockerPlatformSettings.js.map +1 -0
  238. package/lib/commonjs/platforms/docker/getContainerPorts.d.ts +4 -0
  239. package/lib/commonjs/platforms/docker/getContainerPorts.js +12 -0
  240. package/lib/commonjs/platforms/docker/getContainerPorts.js.map +1 -0
  241. package/lib/commonjs/platforms/docker/getDefaultPortMappings.d.ts +3 -0
  242. package/lib/commonjs/platforms/docker/getDefaultPortMappings.js +10 -0
  243. package/lib/commonjs/platforms/docker/getDefaultPortMappings.js.map +1 -0
  244. package/lib/commonjs/platforms/docker/getDockerPlatformSettings.d.ts +14 -0
  245. package/lib/commonjs/platforms/docker/getDockerPlatformSettings.js +39 -0
  246. package/lib/commonjs/platforms/docker/getDockerPlatformSettings.js.map +1 -0
  247. package/lib/commonjs/platforms/docker/getImageName.d.ts +6 -0
  248. package/lib/commonjs/platforms/docker/getImageName.js +10 -0
  249. package/lib/commonjs/platforms/docker/getImageName.js.map +1 -0
  250. package/lib/commonjs/platforms/docker/go.d.ts +2 -0
  251. package/lib/commonjs/platforms/docker/go.js +261 -0
  252. package/lib/commonjs/platforms/docker/go.js.map +1 -0
  253. package/lib/commonjs/platforms/docker/index.d.ts +2 -0
  254. package/lib/commonjs/platforms/docker/index.js +43 -0
  255. package/lib/commonjs/platforms/docker/index.js.map +1 -0
  256. package/lib/commonjs/platforms/docker/parseMounts.d.ts +7 -0
  257. package/lib/commonjs/platforms/docker/parseMounts.js +27 -0
  258. package/lib/commonjs/platforms/docker/parseMounts.js.map +1 -0
  259. package/lib/commonjs/platforms/docker/parsePortMappings.d.ts +8 -0
  260. package/lib/commonjs/platforms/docker/parsePortMappings.js +26 -0
  261. package/lib/commonjs/platforms/docker/parsePortMappings.js.map +1 -0
  262. package/lib/commonjs/platforms/docker/resolvePortMappings.d.ts +8 -0
  263. package/lib/commonjs/platforms/docker/resolvePortMappings.js +23 -0
  264. package/lib/commonjs/platforms/docker/resolvePortMappings.js.map +1 -0
  265. package/lib/commonjs/platforms/docker/writeComposeFile.d.ts +20 -0
  266. package/lib/commonjs/platforms/docker/writeComposeFile.js +44 -0
  267. package/lib/commonjs/platforms/docker/writeComposeFile.js.map +1 -0
  268. package/lib/commonjs/platforms/index.d.ts +3 -0
  269. package/lib/commonjs/platforms/index.js +35 -0
  270. package/lib/commonjs/platforms/index.js.map +1 -0
  271. package/lib/commonjs/platforms/types.d.ts +21 -0
  272. package/lib/commonjs/platforms/types.js +9 -0
  273. package/lib/commonjs/platforms/types.js.map +1 -0
  274. package/lib/esm/bin/qpq.d.ts +2 -0
  275. package/lib/esm/bin/qpq.js +4 -0
  276. package/lib/esm/bin/qpq.js.map +1 -0
  277. package/lib/esm/bin/qpqCdkApp.d.ts +1 -0
  278. package/lib/esm/bin/qpqCdkApp.js +6 -0
  279. package/lib/esm/bin/qpqCdkApp.js.map +1 -0
  280. package/lib/esm/cli/commandMenu.d.ts +2 -0
  281. package/lib/esm/cli/commandMenu.js +67 -0
  282. package/lib/esm/cli/commandMenu.js.map +1 -0
  283. package/lib/esm/cli/commandRegistry.d.ts +10 -0
  284. package/lib/esm/cli/commandRegistry.js +161 -0
  285. package/lib/esm/cli/commandRegistry.js.map +1 -0
  286. package/lib/esm/cli/index.d.ts +1 -0
  287. package/lib/esm/cli/index.js +2 -0
  288. package/lib/esm/cli/index.js.map +1 -0
  289. package/lib/esm/cli/runCli.d.ts +1 -0
  290. package/lib/esm/cli/runCli.js +73 -0
  291. package/lib/esm/cli/runCli.js.map +1 -0
  292. package/lib/esm/commands/checkCircular.d.ts +1 -0
  293. package/lib/esm/commands/checkCircular.js +55 -0
  294. package/lib/esm/commands/checkCircular.js.map +1 -0
  295. package/lib/esm/commands/clearResources.d.ts +1 -0
  296. package/lib/esm/commands/clearResources.js +23 -0
  297. package/lib/esm/commands/clearResources.js.map +1 -0
  298. package/lib/esm/commands/go.d.ts +1 -0
  299. package/lib/esm/commands/go.js +16 -0
  300. package/lib/esm/commands/go.js.map +1 -0
  301. package/lib/esm/commands/goDev.d.ts +1 -0
  302. package/lib/esm/commands/goDev.js +33 -0
  303. package/lib/esm/commands/goDev.js.map +1 -0
  304. package/lib/esm/commands/goDevApi.d.ts +1 -0
  305. package/lib/esm/commands/goDevApi.js +142 -0
  306. package/lib/esm/commands/goDevApi.js.map +1 -0
  307. package/lib/esm/commands/goDevWeb.d.ts +4 -0
  308. package/lib/esm/commands/goDevWeb.js +129 -0
  309. package/lib/esm/commands/goDevWeb.js.map +1 -0
  310. package/lib/esm/commands/goDocker.d.ts +1 -0
  311. package/lib/esm/commands/goDocker.js +29 -0
  312. package/lib/esm/commands/goDocker.js.map +1 -0
  313. package/lib/esm/commands/hooks.d.ts +1 -0
  314. package/lib/esm/commands/hooks.js +26 -0
  315. package/lib/esm/commands/hooks.js.map +1 -0
  316. package/lib/esm/commands/migrate.d.ts +1 -0
  317. package/lib/esm/commands/migrate.js +57 -0
  318. package/lib/esm/commands/migrate.js.map +1 -0
  319. package/lib/esm/commands/prep.d.ts +1 -0
  320. package/lib/esm/commands/prep.js +15 -0
  321. package/lib/esm/commands/prep.js.map +1 -0
  322. package/lib/esm/commands/publish.d.ts +4 -0
  323. package/lib/esm/commands/publish.js +38 -0
  324. package/lib/esm/commands/publish.js.map +1 -0
  325. package/lib/esm/commands/scriptBuild.d.ts +1 -0
  326. package/lib/esm/commands/scriptBuild.js +29 -0
  327. package/lib/esm/commands/scriptBuild.js.map +1 -0
  328. package/lib/esm/commands/scriptBuilderLayer.d.ts +1 -0
  329. package/lib/esm/commands/scriptBuilderLayer.js +34 -0
  330. package/lib/esm/commands/scriptBuilderLayer.js.map +1 -0
  331. package/lib/esm/commands/scriptNew.d.ts +1 -0
  332. package/lib/esm/commands/scriptNew.js +19 -0
  333. package/lib/esm/commands/scriptNew.js.map +1 -0
  334. package/lib/esm/commands/setup.d.ts +1 -0
  335. package/lib/esm/commands/setup.js +88 -0
  336. package/lib/esm/commands/setup.js.map +1 -0
  337. package/lib/esm/commands/synth.d.ts +1 -0
  338. package/lib/esm/commands/synth.js +73 -0
  339. package/lib/esm/commands/synth.js.map +1 -0
  340. package/lib/esm/commands/teardown.d.ts +1 -0
  341. package/lib/esm/commands/teardown.js +20 -0
  342. package/lib/esm/commands/teardown.js.map +1 -0
  343. package/lib/esm/index.d.ts +1 -0
  344. package/lib/esm/index.js +2 -0
  345. package/lib/esm/index.js.map +1 -0
  346. package/lib/esm/lib/args.d.ts +3 -0
  347. package/lib/esm/lib/args.js +25 -0
  348. package/lib/esm/lib/args.js.map +1 -0
  349. package/lib/esm/lib/circularImports.d.ts +3 -0
  350. package/lib/esm/lib/circularImports.js +61 -0
  351. package/lib/esm/lib/circularImports.js.map +1 -0
  352. package/lib/esm/lib/clearResourcesPlan.d.ts +15 -0
  353. package/lib/esm/lib/clearResourcesPlan.js +65 -0
  354. package/lib/esm/lib/clearResourcesPlan.js.map +1 -0
  355. package/lib/esm/lib/deployPrompts.d.ts +26 -0
  356. package/lib/esm/lib/deployPrompts.js +103 -0
  357. package/lib/esm/lib/deployPrompts.js.map +1 -0
  358. package/lib/esm/lib/devServerEntry.d.ts +22 -0
  359. package/lib/esm/lib/devServerEntry.js +127 -0
  360. package/lib/esm/lib/devServerEntry.js.map +1 -0
  361. package/lib/esm/lib/devServerPorts.d.ts +13 -0
  362. package/lib/esm/lib/devServerPorts.js +27 -0
  363. package/lib/esm/lib/devServerPorts.js.map +1 -0
  364. package/lib/esm/lib/discovery.d.ts +10 -0
  365. package/lib/esm/lib/discovery.js +40 -0
  366. package/lib/esm/lib/discovery.js.map +1 -0
  367. package/lib/esm/lib/getDefaultHookJobs.d.ts +2 -0
  368. package/lib/esm/lib/getDefaultHookJobs.js +4 -0
  369. package/lib/esm/lib/getDefaultHookJobs.js.map +1 -0
  370. package/lib/esm/lib/getDeployTargetLabel.d.ts +2 -0
  371. package/lib/esm/lib/getDeployTargetLabel.js +8 -0
  372. package/lib/esm/lib/getDeployTargetLabel.js.map +1 -0
  373. package/lib/esm/lib/goDockerMode.d.ts +6 -0
  374. package/lib/esm/lib/goDockerMode.js +19 -0
  375. package/lib/esm/lib/goDockerMode.js.map +1 -0
  376. package/lib/esm/lib/hooks.d.ts +9 -0
  377. package/lib/esm/lib/hooks.js +154 -0
  378. package/lib/esm/lib/hooks.js.map +1 -0
  379. package/lib/esm/lib/keepOtherDevServersFlag.d.ts +1 -0
  380. package/lib/esm/lib/keepOtherDevServersFlag.js +8 -0
  381. package/lib/esm/lib/keepOtherDevServersFlag.js.map +1 -0
  382. package/lib/esm/lib/killChildWithEscalation.d.ts +10 -0
  383. package/lib/esm/lib/killChildWithEscalation.js +29 -0
  384. package/lib/esm/lib/killChildWithEscalation.js.map +1 -0
  385. package/lib/esm/lib/killStaleListeners.d.ts +17 -0
  386. package/lib/esm/lib/killStaleListeners.js +210 -0
  387. package/lib/esm/lib/killStaleListeners.js.map +1 -0
  388. package/lib/esm/lib/packageRoot.d.ts +1 -0
  389. package/lib/esm/lib/packageRoot.js +14 -0
  390. package/lib/esm/lib/packageRoot.js.map +1 -0
  391. package/lib/esm/lib/prompts.d.ts +15 -0
  392. package/lib/esm/lib/prompts.js +28 -0
  393. package/lib/esm/lib/prompts.js.map +1 -0
  394. package/lib/esm/lib/qpqConfigs.d.ts +4 -0
  395. package/lib/esm/lib/qpqConfigs.js +21 -0
  396. package/lib/esm/lib/qpqConfigs.js.map +1 -0
  397. package/lib/esm/lib/resolveAppSelection.d.ts +6 -0
  398. package/lib/esm/lib/resolveAppSelection.js +45 -0
  399. package/lib/esm/lib/resolveAppSelection.js.map +1 -0
  400. package/lib/esm/lib/resolveDeployment.d.ts +14 -0
  401. package/lib/esm/lib/resolveDeployment.js +45 -0
  402. package/lib/esm/lib/resolveDeployment.js.map +1 -0
  403. package/lib/esm/lib/runCommand.d.ts +14 -0
  404. package/lib/esm/lib/runCommand.js +92 -0
  405. package/lib/esm/lib/runCommand.js.map +1 -0
  406. package/lib/esm/lib/runTasks.d.ts +15 -0
  407. package/lib/esm/lib/runTasks.js +108 -0
  408. package/lib/esm/lib/runTasks.js.map +1 -0
  409. package/lib/esm/lib/setupStep.d.ts +16 -0
  410. package/lib/esm/lib/setupStep.js +2 -0
  411. package/lib/esm/lib/setupStep.js.map +1 -0
  412. package/lib/esm/lib/timing.d.ts +2 -0
  413. package/lib/esm/lib/timing.js +6 -0
  414. package/lib/esm/lib/timing.js.map +1 -0
  415. package/lib/esm/lib/typeWatcher.d.ts +2 -0
  416. package/lib/esm/lib/typeWatcher.js +51 -0
  417. package/lib/esm/lib/typeWatcher.js.map +1 -0
  418. package/lib/esm/lib/userScriptBuilderLayer.d.ts +23 -0
  419. package/lib/esm/lib/userScriptBuilderLayer.js +65 -0
  420. package/lib/esm/lib/userScriptBuilderLayer.js.map +1 -0
  421. package/lib/esm/lib/userScriptTemplate.d.ts +6 -0
  422. package/lib/esm/lib/userScriptTemplate.js +39 -0
  423. package/lib/esm/lib/userScriptTemplate.js.map +1 -0
  424. package/lib/esm/lib/views.d.ts +2 -0
  425. package/lib/esm/lib/views.js +14 -0
  426. package/lib/esm/lib/views.js.map +1 -0
  427. package/lib/esm/lib/webAddressingEnv.d.ts +7 -0
  428. package/lib/esm/lib/webAddressingEnv.js +11 -0
  429. package/lib/esm/lib/webAddressingEnv.js.map +1 -0
  430. package/lib/esm/platforms/aws/awsCredentials.d.ts +1 -0
  431. package/lib/esm/platforms/aws/awsCredentials.js +15 -0
  432. package/lib/esm/platforms/aws/awsCredentials.js.map +1 -0
  433. package/lib/esm/platforms/aws/cdkApp.d.ts +3 -0
  434. package/lib/esm/platforms/aws/cdkApp.js +22 -0
  435. package/lib/esm/platforms/aws/cdkApp.js.map +1 -0
  436. package/lib/esm/platforms/aws/clearResources.d.ts +2 -0
  437. package/lib/esm/platforms/aws/clearResources.js +151 -0
  438. package/lib/esm/platforms/aws/clearResources.js.map +1 -0
  439. package/lib/esm/platforms/aws/go.d.ts +2 -0
  440. package/lib/esm/platforms/aws/go.js +115 -0
  441. package/lib/esm/platforms/aws/go.js.map +1 -0
  442. package/lib/esm/platforms/aws/goDocker.d.ts +3 -0
  443. package/lib/esm/platforms/aws/goDocker.js +441 -0
  444. package/lib/esm/platforms/aws/goDocker.js.map +1 -0
  445. package/lib/esm/platforms/aws/goDockerManifest.d.ts +44 -0
  446. package/lib/esm/platforms/aws/goDockerManifest.js +26 -0
  447. package/lib/esm/platforms/aws/goDockerManifest.js.map +1 -0
  448. package/lib/esm/platforms/aws/index.d.ts +2 -0
  449. package/lib/esm/platforms/aws/index.js +20 -0
  450. package/lib/esm/platforms/aws/index.js.map +1 -0
  451. package/lib/esm/platforms/aws/prepareDeployment.d.ts +3 -0
  452. package/lib/esm/platforms/aws/prepareDeployment.js +6 -0
  453. package/lib/esm/platforms/aws/prepareDeployment.js.map +1 -0
  454. package/lib/esm/platforms/aws/publish.d.ts +4 -0
  455. package/lib/esm/platforms/aws/publish.js +50 -0
  456. package/lib/esm/platforms/aws/publish.js.map +1 -0
  457. package/lib/esm/platforms/aws/remote.d.ts +11 -0
  458. package/lib/esm/platforms/aws/remote.js +89 -0
  459. package/lib/esm/platforms/aws/remote.js.map +1 -0
  460. package/lib/esm/platforms/aws/setup/awsSetupContext.d.ts +12 -0
  461. package/lib/esm/platforms/aws/setup/awsSetupContext.js +16 -0
  462. package/lib/esm/platforms/aws/setup/awsSetupContext.js.map +1 -0
  463. package/lib/esm/platforms/aws/setup/awsSetupSteps.d.ts +8 -0
  464. package/lib/esm/platforms/aws/setup/awsSetupSteps.js +31 -0
  465. package/lib/esm/platforms/aws/setup/awsSetupSteps.js.map +1 -0
  466. package/lib/esm/platforms/aws/setup/buildBucketNamesStep.d.ts +4 -0
  467. package/lib/esm/platforms/aws/setup/buildBucketNamesStep.js +62 -0
  468. package/lib/esm/platforms/aws/setup/buildBucketNamesStep.js.map +1 -0
  469. package/lib/esm/platforms/aws/setup/buildCdkBootstrapSteps.d.ts +5 -0
  470. package/lib/esm/platforms/aws/setup/buildCdkBootstrapSteps.js +24 -0
  471. package/lib/esm/platforms/aws/setup/buildCdkBootstrapSteps.js.map +1 -0
  472. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.d.ts +4 -0
  473. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js +40 -0
  474. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -0
  475. package/lib/esm/platforms/aws/setup/buildGithubOidcProviderStep.d.ts +4 -0
  476. package/lib/esm/platforms/aws/setup/buildGithubOidcProviderStep.js +40 -0
  477. package/lib/esm/platforms/aws/setup/buildGithubOidcProviderStep.js.map +1 -0
  478. package/lib/esm/platforms/aws/setup/buildHostedZonesStep.d.ts +4 -0
  479. package/lib/esm/platforms/aws/setup/buildHostedZonesStep.js +49 -0
  480. package/lib/esm/platforms/aws/setup/buildHostedZonesStep.js.map +1 -0
  481. package/lib/esm/platforms/aws/setup/buildIamCapabilityStep.d.ts +4 -0
  482. package/lib/esm/platforms/aws/setup/buildIamCapabilityStep.js +34 -0
  483. package/lib/esm/platforms/aws/setup/buildIamCapabilityStep.js.map +1 -0
  484. package/lib/esm/platforms/aws/setup/buildIdentityStep.d.ts +4 -0
  485. package/lib/esm/platforms/aws/setup/buildIdentityStep.js +26 -0
  486. package/lib/esm/platforms/aws/setup/buildIdentityStep.js.map +1 -0
  487. package/lib/esm/platforms/aws/setup/buildStackSteps.d.ts +5 -0
  488. package/lib/esm/platforms/aws/setup/buildStackSteps.js +17 -0
  489. package/lib/esm/platforms/aws/setup/buildStackSteps.js.map +1 -0
  490. package/lib/esm/platforms/aws/setup/describeStackStatus.d.ts +4 -0
  491. package/lib/esm/platforms/aws/setup/describeStackStatus.js +17 -0
  492. package/lib/esm/platforms/aws/setup/describeStackStatus.js.map +1 -0
  493. package/lib/esm/platforms/aws/setup/index.d.ts +1 -0
  494. package/lib/esm/platforms/aws/setup/index.js +2 -0
  495. package/lib/esm/platforms/aws/setup/index.js.map +1 -0
  496. package/lib/esm/platforms/aws/stacks.d.ts +7 -0
  497. package/lib/esm/platforms/aws/stacks.js +72 -0
  498. package/lib/esm/platforms/aws/stacks.js.map +1 -0
  499. package/lib/esm/platforms/aws/teardown.d.ts +2 -0
  500. package/lib/esm/platforms/aws/teardown.js +46 -0
  501. package/lib/esm/platforms/aws/teardown.js.map +1 -0
  502. package/lib/esm/platforms/aws/viewsSync.d.ts +3 -0
  503. package/lib/esm/platforms/aws/viewsSync.js +60 -0
  504. package/lib/esm/platforms/aws/viewsSync.js.map +1 -0
  505. package/lib/esm/platforms/docker/QpqDockerPlatformSettings.d.ts +10 -0
  506. package/lib/esm/platforms/docker/QpqDockerPlatformSettings.js +2 -0
  507. package/lib/esm/platforms/docker/QpqDockerPlatformSettings.js.map +1 -0
  508. package/lib/esm/platforms/docker/getContainerPorts.d.ts +4 -0
  509. package/lib/esm/platforms/docker/getContainerPorts.js +8 -0
  510. package/lib/esm/platforms/docker/getContainerPorts.js.map +1 -0
  511. package/lib/esm/platforms/docker/getDefaultPortMappings.d.ts +3 -0
  512. package/lib/esm/platforms/docker/getDefaultPortMappings.js +6 -0
  513. package/lib/esm/platforms/docker/getDefaultPortMappings.js.map +1 -0
  514. package/lib/esm/platforms/docker/getDockerPlatformSettings.d.ts +14 -0
  515. package/lib/esm/platforms/docker/getDockerPlatformSettings.js +34 -0
  516. package/lib/esm/platforms/docker/getDockerPlatformSettings.js.map +1 -0
  517. package/lib/esm/platforms/docker/getImageName.d.ts +6 -0
  518. package/lib/esm/platforms/docker/getImageName.js +6 -0
  519. package/lib/esm/platforms/docker/getImageName.js.map +1 -0
  520. package/lib/esm/platforms/docker/go.d.ts +2 -0
  521. package/lib/esm/platforms/docker/go.js +242 -0
  522. package/lib/esm/platforms/docker/go.js.map +1 -0
  523. package/lib/esm/platforms/docker/index.d.ts +2 -0
  524. package/lib/esm/platforms/docker/index.js +31 -0
  525. package/lib/esm/platforms/docker/index.js.map +1 -0
  526. package/lib/esm/platforms/docker/parseMounts.d.ts +7 -0
  527. package/lib/esm/platforms/docker/parseMounts.js +23 -0
  528. package/lib/esm/platforms/docker/parseMounts.js.map +1 -0
  529. package/lib/esm/platforms/docker/parsePortMappings.d.ts +8 -0
  530. package/lib/esm/platforms/docker/parsePortMappings.js +21 -0
  531. package/lib/esm/platforms/docker/parsePortMappings.js.map +1 -0
  532. package/lib/esm/platforms/docker/resolvePortMappings.d.ts +8 -0
  533. package/lib/esm/platforms/docker/resolvePortMappings.js +18 -0
  534. package/lib/esm/platforms/docker/resolvePortMappings.js.map +1 -0
  535. package/lib/esm/platforms/docker/writeComposeFile.d.ts +20 -0
  536. package/lib/esm/platforms/docker/writeComposeFile.js +37 -0
  537. package/lib/esm/platforms/docker/writeComposeFile.js.map +1 -0
  538. package/lib/esm/platforms/index.d.ts +3 -0
  539. package/lib/esm/platforms/index.js +17 -0
  540. package/lib/esm/platforms/index.js.map +1 -0
  541. package/lib/esm/platforms/types.d.ts +21 -0
  542. package/lib/esm/platforms/types.js +6 -0
  543. package/lib/esm/platforms/types.js.map +1 -0
  544. package/package.json +71 -3
  545. package/templates/user-script/README.md +28 -0
  546. package/templates/user-script/gitignore +2 -0
  547. package/templates/user-script/package.json +16 -0
  548. package/templates/user-script/src/main.ts +15 -0
  549. package/templates/user-script/tsconfig.json +12 -0
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.awsTeardown = void 0;
13
+ // AWS sequential teardown (`qpq teardown`) — the stack phases of `qpq go` in
14
+ // reverse. Per phase it destroys every selected service's web, then api, then
15
+ // inf CDK stacks. Phases don't cross-reference each other's CFN outputs
16
+ // (values flow through SSM), so this order is prudence, not a hard dependency.
17
+ // Bootstrap, domain and account stacks are deliberately out of scope — they
18
+ // outlive any one service and are torn down by hand if ever.
19
+ const deploy_aws_1 = require("@qpqjs/deploy-aws");
20
+ const synth_1 = require("../../commands/synth");
21
+ const qpqConfigs_1 = require("../../lib/qpqConfigs");
22
+ const timing_1 = require("../../lib/timing");
23
+ const awsCredentials_1 = require("./awsCredentials");
24
+ const stacks_1 = require("./stacks");
25
+ const teardownPhases = [
26
+ { label: 'Web', getStackName: deploy_aws_1.qpqDeployAwsUtils.getWebStackName },
27
+ { label: 'Api', getStackName: deploy_aws_1.qpqDeployAwsUtils.getApiStackName },
28
+ { label: 'Inf', getStackName: deploy_aws_1.qpqDeployAwsUtils.getInfStackName },
29
+ ];
30
+ const awsTeardown = (appName, plan) => __awaiter(void 0, void 0, void 0, function* () {
31
+ if (plan.kind === 'cancelled') {
32
+ return;
33
+ }
34
+ const { services } = plan;
35
+ console.log('\n\nRunning automated teardown\n\n');
36
+ console.log('Executing for services');
37
+ console.log(services.join(', '));
38
+ if ((yield (0, awsCredentials_1.isAwsCredentialsValid)()) === false) {
39
+ console.log('Credentials are expired or invalid.');
40
+ return;
41
+ }
42
+ (0, timing_1.logTimeStart)('totalTime');
43
+ // The stack-name utils and the cdk app both read the synthed QPQ configs.
44
+ yield services.reduce((cur, service) => __awaiter(void 0, void 0, void 0, function* () {
45
+ yield cur;
46
+ yield (0, synth_1.synthCommand)([service, '--app', appName]);
47
+ }), Promise.resolve());
48
+ for (const { label, getStackName } of teardownPhases) {
49
+ yield services.reduce((cur, service) => __awaiter(void 0, void 0, void 0, function* () {
50
+ yield cur;
51
+ const qpqConfigForService = (0, qpqConfigs_1.loadServiceQpqConfig)(appName, service);
52
+ console.log(`Destroy ${label}: `, service);
53
+ yield (0, stacks_1.destroyServiceStack)(service, getStackName(qpqConfigForService), appName);
54
+ }), Promise.resolve());
55
+ }
56
+ (0, timing_1.logTimeEnd)('totalTime');
57
+ });
58
+ exports.awsTeardown = awsTeardown;
59
+ //# sourceMappingURL=teardown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../../src/platforms/aws/teardown.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,wEAAwE;AACxE,+EAA+E;AAC/E,4EAA4E;AAC5E,6DAA6D;AAC7D,kDAAsD;AAEtD,gDAAoD;AAEpD,qDAA4D;AAC5D,6CAA4D;AAC5D,qDAAyD;AACzD,qCAA+C;AAE/C,MAAM,cAAc,GAAG;IACrB,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,8BAAiB,CAAC,eAAe,EAAE;CAClE,CAAC;AAEK,MAAM,WAAW,GAAG,CAAO,OAAe,EAAE,IAAkB,EAAiB,EAAE;IACtF,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE1B,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEjC,IAAI,CAAC,MAAM,IAAA,sCAAqB,GAAE,CAAC,KAAK,KAAK,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAA,qBAAY,EAAC,WAAW,CAAC,CAAC;IAE1B,0EAA0E;IAC1E,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,OAAO,EAAE,EAAE;QAC3C,MAAM,GAAG,CAAC;QACV,MAAM,IAAA,oBAAY,EAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEtB,KAAK,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,cAAc,EAAE,CAAC;QACrD,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,OAAO,EAAE,EAAE;YAC3C,MAAM,GAAG,CAAC;YACV,MAAM,mBAAmB,GAAG,IAAA,iCAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,IAAA,4BAAmB,EAAC,OAAO,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAA,CAAC;AAlCW,QAAA,WAAW,eAkCtB","sourcesContent":["// AWS sequential teardown (`qpq teardown`) — the stack phases of `qpq go` in\n// reverse. Per phase it destroys every selected service's web, then api, then\n// inf CDK stacks. Phases don't cross-reference each other's CFN outputs\n// (values flow through SSM), so this order is prudence, not a hard dependency.\n// Bootstrap, domain and account stacks are deliberately out of scope — they\n// outlive any one service and are torn down by hand if ever.\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\n\nimport { synthCommand } from '../../commands/synth';\nimport { TeardownPlan } from '../../lib/deployPrompts';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { destroyServiceStack } from './stacks';\n\nconst teardownPhases = [\n { label: 'Web', getStackName: qpqDeployAwsUtils.getWebStackName },\n { label: 'Api', getStackName: qpqDeployAwsUtils.getApiStackName },\n { label: 'Inf', getStackName: qpqDeployAwsUtils.getInfStackName },\n];\n\nexport const awsTeardown = async (appName: string, plan: TeardownPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n const { services } = plan;\n\n console.log('\\n\\nRunning automated teardown\\n\\n');\n console.log('Executing for services');\n console.log(services.join(', '));\n\n if ((await isAwsCredentialsValid()) === false) {\n console.log('Credentials are expired or invalid.');\n return;\n }\n\n logTimeStart('totalTime');\n\n // The stack-name utils and the cdk app both read the synthed QPQ configs.\n await services.reduce(async (cur, service) => {\n await cur;\n await synthCommand([service, '--app', appName]);\n }, Promise.resolve());\n\n for (const { label, getStackName } of teardownPhases) {\n await services.reduce(async (cur, service) => {\n await cur;\n const qpqConfigForService = loadServiceQpqConfig(appName, service);\n console.log(`Destroy ${label}: `, service);\n await destroyServiceStack(service, getStackName(qpqConfigForService), appName);\n }, Promise.resolve());\n }\n\n logTimeEnd('totalTime');\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export declare const NO_CACHE_FILES: string[];
2
+ export declare const getViewsS3Destinations: (appName: string, serviceName: string) => string[];
3
+ export declare const syncViewsToS3: (appName: string, serviceName: string) => Promise<void>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.syncViewsToS3 = exports.getViewsS3Destinations = exports.NO_CACHE_FILES = void 0;
16
+ // Views upload to S3. Every service's views go to its prefix in the shared
17
+ // 'views' bucket (owned by shell). A service can also be a standalone host on
18
+ // its own domain: each of its web entries marked `storageDrive.syncServiceViews`
19
+ // gets the bundle at its drive's root. shell is the root website, which predates
20
+ // that flag, so it keeps its 'website' bucket root when it declares none.
21
+ const actionprocessor_aws_1 = require("@qpqjs/actionprocessor-aws");
22
+ const webserver_1 = require("@qpqjs/webserver");
23
+ const fs_1 = __importDefault(require("fs"));
24
+ const path_1 = __importDefault(require("path"));
25
+ const qpqConfigs_1 = require("../../lib/qpqConfigs");
26
+ const runCommand_1 = require("../../lib/runCommand");
27
+ const views_1 = require("../../lib/views");
28
+ // The mutable entry points: fixed names whose CONTENT changes every deploy. They
29
+ // must never be cached without revalidation — a browser holding a stale
30
+ // mf-manifest.json or remoteEntry.js keeps running the previous deploy's bundle
31
+ // (the module-reload hot-swap and plain page refreshes both depend on these being
32
+ // fresh). Everything else in a views dist is content-hashed and safely immutable.
33
+ exports.NO_CACHE_FILES = ['mf-manifest.json', 'remoteEntry.js', 'index.html', 'favicon.ico'];
34
+ const getViewsS3Destinations = (appName, serviceName) => {
35
+ const shellConfig = (0, qpqConfigs_1.loadServiceQpqConfig)(appName, 'shell');
36
+ const viewsBucketName = actionprocessor_aws_1.awsNamingUtils.getConfigRuntimeResourceNameFromConfig('views', shellConfig);
37
+ const destinations = [`s3://${viewsBucketName}/${serviceName}`];
38
+ const serviceConfig = serviceName === 'shell' ? shellConfig : (0, qpqConfigs_1.loadServiceQpqConfig)(appName, serviceName);
39
+ const hostDrives = webserver_1.qpqWebServerUtils
40
+ .getWebEntryConfigs(serviceConfig)
41
+ .filter((webEntry) => webEntry.storageDrive.syncServiceViews && webEntry.storageDrive.sourceStorageDrive)
42
+ .map((webEntry) => webEntry.storageDrive.sourceStorageDrive);
43
+ if (serviceName === 'shell' && hostDrives.length === 0) {
44
+ hostDrives.push('website');
45
+ }
46
+ for (const drive of hostDrives) {
47
+ destinations.push(`s3://${actionprocessor_aws_1.awsNamingUtils.getConfigRuntimeResourceNameFromConfig(drive, serviceConfig)}`);
48
+ }
49
+ return destinations;
50
+ };
51
+ exports.getViewsS3Destinations = getViewsS3Destinations;
52
+ const syncViewsToS3 = (appName, serviceName) => __awaiter(void 0, void 0, void 0, function* () {
53
+ const distDir = (0, views_1.getViewsDistDir)(appName, serviceName);
54
+ for (const destination of (0, exports.getViewsS3Destinations)(appName, serviceName)) {
55
+ console.log(`Copying [${serviceName}] views to [${destination}]`);
56
+ // Content-hashed assets: cache forever.
57
+ yield (0, runCommand_1.runCommand)('aws', [
58
+ 's3',
59
+ 'sync',
60
+ distDir,
61
+ destination,
62
+ '--cache-control',
63
+ 'public,max-age=31536000,immutable',
64
+ ...exports.NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),
65
+ ]);
66
+ // Entry points: cp (not sync) so the no-cache header is (re)applied on every
67
+ // deploy even when a body happens to be byte-identical.
68
+ for (const file of exports.NO_CACHE_FILES) {
69
+ if (!fs_1.default.existsSync(path_1.default.join(distDir, file))) {
70
+ continue;
71
+ }
72
+ yield (0, runCommand_1.runCommand)('aws', ['s3', 'cp', path_1.default.join(distDir, file), `${destination}/${file}`, '--cache-control', 'no-cache']);
73
+ }
74
+ }
75
+ });
76
+ exports.syncViewsToS3 = syncViewsToS3;
77
+ //# sourceMappingURL=viewsSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewsSync.js","sourceRoot":"","sources":["../../../../src/platforms/aws/viewsSync.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,iFAAiF;AACjF,iFAAiF;AACjF,0EAA0E;AAC1E,oEAA4D;AAC5D,gDAAqD;AAErD,4CAAoB;AACpB,gDAAwB;AAExB,qDAA4D;AAC5D,qDAAkD;AAClD,2CAAkD;AAElD,iFAAiF;AACjF,wEAAwE;AACxE,gFAAgF;AAChF,kFAAkF;AAClF,kFAAkF;AACrE,QAAA,cAAc,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;AAE3F,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAY,EAAE;IACvF,MAAM,WAAW,GAAG,IAAA,iCAAoB,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC3D,MAAM,eAAe,GAAG,oCAAc,CAAC,sCAAsC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEpG,MAAM,YAAY,GAAG,CAAC,QAAQ,eAAe,IAAI,WAAW,EAAE,CAAC,CAAC;IAEhE,MAAM,aAAa,GAAG,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAA,iCAAoB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACzG,MAAM,UAAU,GAAG,6BAAiB;SACjC,kBAAkB,CAAC,aAAa,CAAC;SACjC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,gBAAgB,IAAI,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC;SACxG,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAmB,CAAC,CAAC;IAEhE,IAAI,WAAW,KAAK,OAAO,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,YAAY,CAAC,IAAI,CAAC,QAAQ,oCAAc,CAAC,sCAAsC,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AArBW,QAAA,sBAAsB,0BAqBjC;AAEK,MAAM,aAAa,GAAG,CAAO,OAAe,EAAE,WAAmB,EAAiB,EAAE;IACzF,MAAM,OAAO,GAAG,IAAA,uBAAe,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEtD,KAAK,MAAM,WAAW,IAAI,IAAA,8BAAsB,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,YAAY,WAAW,eAAe,WAAW,GAAG,CAAC,CAAC;QAElE,wCAAwC;QACxC,MAAM,IAAA,uBAAU,EAAC,KAAK,EAAE;YACtB,IAAI;YACJ,MAAM;YACN,OAAO;YACP,WAAW;YACX,iBAAiB;YACjB,mCAAmC;YACnC,GAAG,sBAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;SACzD,CAAC,CAAC;QAEH,6EAA6E;QAC7E,wDAAwD;QACxD,KAAK,MAAM,IAAI,IAAI,sBAAc,EAAE,CAAC;YAClC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YAED,MAAM,IAAA,uBAAU,EAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,WAAW,IAAI,IAAI,EAAE,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC,CAAC;QAC3H,CAAC;IACH,CAAC;AACH,CAAC,CAAA,CAAC;AA3BW,QAAA,aAAa,iBA2BxB","sourcesContent":["// Views upload to S3. Every service's views go to its prefix in the shared\n// 'views' bucket (owned by shell). A service can also be a standalone host on\n// its own domain: each of its web entries marked `storageDrive.syncServiceViews`\n// gets the bundle at its drive's root. shell is the root website, which predates\n// that flag, so it keeps its 'website' bucket root when it declares none.\nimport { awsNamingUtils } from '@qpqjs/actionprocessor-aws';\nimport { qpqWebServerUtils } from '@qpqjs/webserver';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\nimport { getViewsDistDir } from '../../lib/views';\n\n// The mutable entry points: fixed names whose CONTENT changes every deploy. They\n// must never be cached without revalidation — a browser holding a stale\n// mf-manifest.json or remoteEntry.js keeps running the previous deploy's bundle\n// (the module-reload hot-swap and plain page refreshes both depend on these being\n// fresh). Everything else in a views dist is content-hashed and safely immutable.\nexport const NO_CACHE_FILES = ['mf-manifest.json', 'remoteEntry.js', 'index.html', 'favicon.ico'];\n\nexport const getViewsS3Destinations = (appName: string, serviceName: string): string[] => {\n const shellConfig = loadServiceQpqConfig(appName, 'shell');\n const viewsBucketName = awsNamingUtils.getConfigRuntimeResourceNameFromConfig('views', shellConfig);\n\n const destinations = [`s3://${viewsBucketName}/${serviceName}`];\n\n const serviceConfig = serviceName === 'shell' ? shellConfig : loadServiceQpqConfig(appName, serviceName);\n const hostDrives = qpqWebServerUtils\n .getWebEntryConfigs(serviceConfig)\n .filter((webEntry) => webEntry.storageDrive.syncServiceViews && webEntry.storageDrive.sourceStorageDrive)\n .map((webEntry) => webEntry.storageDrive.sourceStorageDrive!);\n\n if (serviceName === 'shell' && hostDrives.length === 0) {\n hostDrives.push('website');\n }\n\n for (const drive of hostDrives) {\n destinations.push(`s3://${awsNamingUtils.getConfigRuntimeResourceNameFromConfig(drive, serviceConfig)}`);\n }\n\n return destinations;\n};\n\nexport const syncViewsToS3 = async (appName: string, serviceName: string): Promise<void> => {\n const distDir = getViewsDistDir(appName, serviceName);\n\n for (const destination of getViewsS3Destinations(appName, serviceName)) {\n console.log(`Copying [${serviceName}] views to [${destination}]`);\n\n // Content-hashed assets: cache forever.\n await runCommand('aws', [\n 's3',\n 'sync',\n distDir,\n destination,\n '--cache-control',\n 'public,max-age=31536000,immutable',\n ...NO_CACHE_FILES.flatMap((file) => ['--exclude', file]),\n ]);\n\n // Entry points: cp (not sync) so the no-cache header is (re)applied on every\n // deploy even when a body happens to be byte-identical.\n for (const file of NO_CACHE_FILES) {\n if (!fs.existsSync(path.join(distDir, file))) {\n continue;\n }\n\n await runCommand('aws', ['s3', 'cp', path.join(distDir, file), `${destination}/${file}`, '--cache-control', 'no-cache']);\n }\n }\n};\n"]}
@@ -0,0 +1,10 @@
1
+ /** The docker entry's `platformSettings`: how the image is named, built and mapped onto a host. */
2
+ export type QpqDockerPlatformSettings = {
3
+ portMappings?: string;
4
+ registry?: string;
5
+ arch?: string;
6
+ tag?: string;
7
+ publicHost?: string;
8
+ dataPath?: string;
9
+ mounts?: string;
10
+ };
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=QpqDockerPlatformSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QpqDockerPlatformSettings.js","sourceRoot":"","sources":["../../../../src/platforms/docker/QpqDockerPlatformSettings.ts"],"names":[],"mappings":"","sourcesContent":["/** The docker entry's `platformSettings`: how the image is named, built and mapped onto a host. */\nexport type QpqDockerPlatformSettings = {\n // Comma-separated docker `host:container` pairs, e.g. \"80:8080, 8888:8888, 3090:3090\". Container\n // ports are 8080 (api + site), 8888 (websockets), 3001 (file storage), plus the port of every\n // web entry listed in a service's defineDevServerOptions. Default: 80 to the site and every\n // container port to itself. The host side is baked into the frontend, so a host must map the\n // same ports.\n portMappings?: string;\n\n // Registry to push the image to, e.g. \"192.168.8.88:5000\" or \"ghcr.io/me\". Without it the image\n // only lands in the local docker store.\n registry?: string;\n\n // Target platform for the image, e.g. \"linux/amd64\" for an x86 host built from an arm Mac.\n // Default: the building machine's own.\n arch?: string;\n\n // Image tag. Default: the deployment's environment.\n tag?: string;\n\n // The address browsers reach the host on, e.g. \"192.168.8.88\" or \"unraid.local\". Secure file\n // upload/download urls are absolute and point here. Default: localhost.\n publicHost?: string;\n\n // Host directory for the app's state (key-value stores, file storage), e.g.\n // \"/mnt/user/appdata/qpq-myapp\". Default: a docker named volume.\n dataPath?: string;\n\n // Comma-separated host folders to mount into the container, as docker `host:container` pairs\n // with both absolute, optionally ending \":ro\" for read-only, e.g.\n // \"/mnt/user/media/downloads:/mnt/user/media/downloads, /mnt/user/tv:/tv:ro\". For apps that\n // read or write files on the host outside their own state. Default: none.\n mounts?: string;\n};\n"]}
@@ -0,0 +1,4 @@
1
+ import { WebEntryHost } from '@qpqjs/dev-server';
2
+ import { ResolvedDevServerPorts } from '../../lib/devServerPorts';
3
+ /** Every port the image listens on: the app's dev-server ports plus one per hosted web entry. */
4
+ export declare const getContainerPorts: (devServerPorts: ResolvedDevServerPorts, hosts: WebEntryHost[]) => number[];
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getContainerPorts = void 0;
4
+ /** Every port the image listens on: the app's dev-server ports plus one per hosted web entry. */
5
+ const getContainerPorts = (devServerPorts, hosts) => [
6
+ devServerPorts.api,
7
+ devServerPorts.webSocket,
8
+ devServerPorts.fileStorage,
9
+ ...hosts.map((host) => host.port),
10
+ ];
11
+ exports.getContainerPorts = getContainerPorts;
12
+ //# sourceMappingURL=getContainerPorts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getContainerPorts.js","sourceRoot":"","sources":["../../../../src/platforms/docker/getContainerPorts.ts"],"names":[],"mappings":";;;AAIA,iGAAiG;AAC1F,MAAM,iBAAiB,GAAG,CAAC,cAAsC,EAAE,KAAqB,EAAY,EAAE,CAAC;IAC5G,cAAc,CAAC,GAAG;IAClB,cAAc,CAAC,SAAS;IACxB,cAAc,CAAC,WAAW;IAC1B,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;CAClC,CAAC;AALW,QAAA,iBAAiB,qBAK5B","sourcesContent":["import { WebEntryHost } from '@qpqjs/dev-server';\n\nimport { ResolvedDevServerPorts } from '../../lib/devServerPorts';\n\n/** Every port the image listens on: the app's dev-server ports plus one per hosted web entry. */\nexport const getContainerPorts = (devServerPorts: ResolvedDevServerPorts, hosts: WebEntryHost[]): number[] => [\n devServerPorts.api,\n devServerPorts.webSocket,\n devServerPorts.fileStorage,\n ...hosts.map((host) => host.port),\n];\n"]}
@@ -0,0 +1,3 @@
1
+ import { PortMapping } from './parsePortMappings';
2
+ /** Each container port on the same host port, plus 80 for the site, when the deployment sets no `portMappings`. */
3
+ export declare const getDefaultPortMappings: (apiPort: number, containerPorts: number[]) => PortMapping[];
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultPortMappings = void 0;
4
+ /** Each container port on the same host port, plus 80 for the site, when the deployment sets no `portMappings`. */
5
+ const getDefaultPortMappings = (apiPort, containerPorts) => [
6
+ { host: 80, container: apiPort },
7
+ ...containerPorts.map((port) => ({ host: port, container: port })),
8
+ ];
9
+ exports.getDefaultPortMappings = getDefaultPortMappings;
10
+ //# sourceMappingURL=getDefaultPortMappings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDefaultPortMappings.js","sourceRoot":"","sources":["../../../../src/platforms/docker/getDefaultPortMappings.ts"],"names":[],"mappings":";;;AAEA,mHAAmH;AAC5G,MAAM,sBAAsB,GAAG,CAAC,OAAe,EAAE,cAAwB,EAAiB,EAAE,CAAC;IAClG,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE;IAChC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;CACnE,CAAC;AAHW,QAAA,sBAAsB,0BAGjC","sourcesContent":["import { PortMapping } from './parsePortMappings';\n\n/** Each container port on the same host port, plus 80 for the site, when the deployment sets no `portMappings`. */\nexport const getDefaultPortMappings = (apiPort: number, containerPorts: number[]): PortMapping[] => [\n { host: 80, container: apiPort },\n ...containerPorts.map((port) => ({ host: port, container: port })),\n];\n"]}
@@ -0,0 +1,14 @@
1
+ import { QpqAppDeployment } from '@qpqjs/core';
2
+ import { Mount } from './parseMounts';
3
+ import { PortMapping } from './parsePortMappings';
4
+ export type ParsedDockerPlatformSettings = {
5
+ portMappings?: PortMapping[];
6
+ registry?: string;
7
+ arch?: string;
8
+ tag: string;
9
+ publicHost?: string;
10
+ dataPath?: string;
11
+ mounts?: Mount[];
12
+ };
13
+ /** The docker entry's platform settings, parsed; throws for a malformed value, naming the deployment. */
14
+ export declare const getDockerPlatformSettings: (deploymentName: string, deployment: QpqAppDeployment) => ParsedDockerPlatformSettings;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDockerPlatformSettings = void 0;
4
+ const parseMounts_1 = require("./parseMounts");
5
+ const parsePortMappings_1 = require("./parsePortMappings");
6
+ const asOptionalString = (deploymentName, name, value) => {
7
+ if (value === undefined) {
8
+ return undefined;
9
+ }
10
+ if (typeof value !== 'string' || value.trim() === '') {
11
+ throw new Error(`Invalid docker deployment '${deploymentName}': platformSettings.${name} must be a non-empty string`);
12
+ }
13
+ return value.trim().replace(/\/+$/, '');
14
+ };
15
+ /** The docker entry's platform settings, parsed; throws for a malformed value, naming the deployment. */
16
+ const getDockerPlatformSettings = (deploymentName, deployment) => {
17
+ var _a, _b;
18
+ const settings = (_a = deployment.platformSettings) !== null && _a !== void 0 ? _a : {};
19
+ let portMappings;
20
+ let mounts;
21
+ try {
22
+ portMappings = settings.portMappings === undefined ? undefined : (0, parsePortMappings_1.parsePortMappings)(settings.portMappings);
23
+ mounts = settings.mounts === undefined ? undefined : (0, parseMounts_1.parseMounts)(settings.mounts);
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Invalid docker deployment '${deploymentName}': ${error instanceof Error ? error.message : String(error)}`);
27
+ }
28
+ return {
29
+ portMappings,
30
+ registry: asOptionalString(deploymentName, 'registry', settings.registry),
31
+ arch: asOptionalString(deploymentName, 'arch', settings.arch),
32
+ tag: (_b = asOptionalString(deploymentName, 'tag', settings.tag)) !== null && _b !== void 0 ? _b : deployment.environment,
33
+ publicHost: asOptionalString(deploymentName, 'publicHost', settings.publicHost),
34
+ dataPath: asOptionalString(deploymentName, 'dataPath', settings.dataPath),
35
+ mounts,
36
+ };
37
+ };
38
+ exports.getDockerPlatformSettings = getDockerPlatformSettings;
39
+ //# sourceMappingURL=getDockerPlatformSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDockerPlatformSettings.js","sourceRoot":"","sources":["../../../../src/platforms/docker/getDockerPlatformSettings.ts"],"names":[],"mappings":";;;AAEA,+CAAmD;AACnD,2DAAqE;AAcrE,MAAM,gBAAgB,GAAG,CAAC,cAAsB,EAAE,IAAY,EAAE,KAAc,EAAsB,EAAE;IACpG,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,8BAA8B,cAAc,uBAAuB,IAAI,6BAA6B,CAAC,CAAC;IACxH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF,yGAAyG;AAClG,MAAM,yBAAyB,GAAG,CAAC,cAAsB,EAAE,UAA4B,EAAgC,EAAE;;IAC9H,MAAM,QAAQ,GAAG,MAAA,UAAU,CAAC,gBAAgB,mCAAI,EAAE,CAAC;IAEnD,IAAI,YAAuC,CAAC;IAC5C,IAAI,MAA2B,CAAC;IAChC,IAAI,CAAC;QACH,YAAY,GAAG,QAAQ,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,qCAAiB,EAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC1G,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAA,yBAAW,EAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,cAAc,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9H,CAAC;IAED,OAAO;QACL,YAAY;QACZ,QAAQ,EAAE,gBAAgB,CAAC,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC;QACzE,IAAI,EAAE,gBAAgB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC;QAC7D,GAAG,EAAE,MAAA,gBAAgB,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,mCAAI,UAAU,CAAC,WAAW;QACpF,UAAU,EAAE,gBAAgB,CAAC,cAAc,EAAE,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC;QAC/E,QAAQ,EAAE,gBAAgB,CAAC,cAAc,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC;QACzE,MAAM;KACP,CAAC;AACJ,CAAC,CAAC;AArBW,QAAA,yBAAyB,6BAqBpC","sourcesContent":["import { QpqAppDeployment } from '@qpqjs/core';\n\nimport { Mount, parseMounts } from './parseMounts';\nimport { parsePortMappings, PortMapping } from './parsePortMappings';\n\nexport type ParsedDockerPlatformSettings = {\n // Absent when the deployment sets no `portMappings`; the defaults depend on the app's config.\n portMappings?: PortMapping[];\n registry?: string;\n arch?: string;\n tag: string;\n publicHost?: string;\n dataPath?: string;\n // Absent when the deployment mounts nothing beyond its state directory.\n mounts?: Mount[];\n};\n\nconst asOptionalString = (deploymentName: string, name: string, value: unknown): string | undefined => {\n if (value === undefined) {\n return undefined;\n }\n if (typeof value !== 'string' || value.trim() === '') {\n throw new Error(`Invalid docker deployment '${deploymentName}': platformSettings.${name} must be a non-empty string`);\n }\n return value.trim().replace(/\\/+$/, '');\n};\n\n/** The docker entry's platform settings, parsed; throws for a malformed value, naming the deployment. */\nexport const getDockerPlatformSettings = (deploymentName: string, deployment: QpqAppDeployment): ParsedDockerPlatformSettings => {\n const settings = deployment.platformSettings ?? {};\n\n let portMappings: PortMapping[] | undefined;\n let mounts: Mount[] | undefined;\n try {\n portMappings = settings.portMappings === undefined ? undefined : parsePortMappings(settings.portMappings);\n mounts = settings.mounts === undefined ? undefined : parseMounts(settings.mounts);\n } catch (error) {\n throw new Error(`Invalid docker deployment '${deploymentName}': ${error instanceof Error ? error.message : String(error)}`);\n }\n\n return {\n portMappings,\n registry: asOptionalString(deploymentName, 'registry', settings.registry),\n arch: asOptionalString(deploymentName, 'arch', settings.arch),\n tag: asOptionalString(deploymentName, 'tag', settings.tag) ?? deployment.environment,\n publicHost: asOptionalString(deploymentName, 'publicHost', settings.publicHost),\n dataPath: asOptionalString(deploymentName, 'dataPath', settings.dataPath),\n mounts,\n };\n};\n"]}
@@ -0,0 +1,6 @@
1
+ import { ParsedDockerPlatformSettings } from './getDockerPlatformSettings';
2
+ /**
3
+ * `[<registry>/]qpq-<application>:<tag>`. Named by the deployment's application, not the app
4
+ * folder, so two products built from one codebase get separate images and data volumes.
5
+ */
6
+ export declare const getImageName: (applicationName: string, settings: ParsedDockerPlatformSettings) => string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getImageName = void 0;
4
+ /**
5
+ * `[<registry>/]qpq-<application>:<tag>`. Named by the deployment's application, not the app
6
+ * folder, so two products built from one codebase get separate images and data volumes.
7
+ */
8
+ const getImageName = (applicationName, settings) => `${settings.registry ? `${settings.registry}/` : ''}qpq-${applicationName}:${settings.tag}`;
9
+ exports.getImageName = getImageName;
10
+ //# sourceMappingURL=getImageName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getImageName.js","sourceRoot":"","sources":["../../../../src/platforms/docker/getImageName.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AACI,MAAM,YAAY,GAAG,CAAC,eAAuB,EAAE,QAAsC,EAAU,EAAE,CACtG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,eAAe,IAAI,QAAQ,CAAC,GAAG,EAAE,CAAC;AADjF,QAAA,YAAY,gBACqE","sourcesContent":["import { ParsedDockerPlatformSettings } from './getDockerPlatformSettings';\n\n/**\n * `[<registry>/]qpq-<application>:<tag>`. Named by the deployment's application, not the app\n * folder, so two products built from one codebase get separate images and data volumes.\n */\nexport const getImageName = (applicationName: string, settings: ParsedDockerPlatformSettings): string =>\n `${settings.registry ? `${settings.registry}/` : ''}qpq-${applicationName}:${settings.tag}`;\n"]}
@@ -0,0 +1,2 @@
1
+ import { DeployPlan } from '../../lib/deployPrompts';
2
+ export declare const dockerGo: (appName: string, plan: DeployPlan) => Promise<void>;
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.dockerGo = void 0;
16
+ // Docker platform deploy (`qpq go` with platform 'docker') — proof-of-concept
17
+ // self-hosting: bakes the QPQ dev server (a full local platform emulation)
18
+ // plus every service of the app and its pre-built views into one docker image.
19
+ //
20
+ // 1. Build workspace packages, then the dev-server bundle (all services).
21
+ // 2. Build every views microfrontend with a same-origin module-federation
22
+ // remote base (/<views subdomain>/<svc>), mirroring the AWS layout.
23
+ // 3. Assemble an image context under dist/qpq/docker-image/<app>/ — server
24
+ // bundle, web root (every web entry, placed by its port or its domain),
25
+ // a workspaces-stripped package.json for runtime deps, and the
26
+ // locally-built quidproquo packages as a vendor overlay.
27
+ // 4. docker build (buildx with a push when the deployment names a registry or
28
+ // a target platform), write a docker-compose.yml, print how to run it.
29
+ //
30
+ // Not production-grade (single process, sqlite KVS, in-memory queues) —
31
+ // it's the whole product on one box with one command.
32
+ const config_aws_1 = require("@qpqjs/config-aws");
33
+ const core_1 = require("@qpqjs/core");
34
+ const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
35
+ const dev_server_1 = require("@qpqjs/dev-server");
36
+ const webserver_1 = require("@qpqjs/webserver");
37
+ const fs_1 = __importDefault(require("fs"));
38
+ const path_1 = __importDefault(require("path"));
39
+ const devServerEntry_1 = require("../../lib/devServerEntry");
40
+ const devServerPorts_1 = require("../../lib/devServerPorts");
41
+ const discovery_1 = require("../../lib/discovery");
42
+ const getDefaultHookJobs_1 = require("../../lib/getDefaultHookJobs");
43
+ const hooks_1 = require("../../lib/hooks");
44
+ const packageRoot_1 = require("../../lib/packageRoot");
45
+ const runCommand_1 = require("../../lib/runCommand");
46
+ const runTasks_1 = require("../../lib/runTasks");
47
+ const timing_1 = require("../../lib/timing");
48
+ const views_1 = require("../../lib/views");
49
+ const webAddressingEnv_1 = require("../../lib/webAddressingEnv");
50
+ const getContainerPorts_1 = require("./getContainerPorts");
51
+ const getDockerPlatformSettings_1 = require("./getDockerPlatformSettings");
52
+ const getImageName_1 = require("./getImageName");
53
+ const resolvePortMappings_1 = require("./resolvePortMappings");
54
+ const writeComposeFile_1 = require("./writeComposeFile");
55
+ const getImageContextDir = (root, appName) => path_1.default.join(root, 'dist', 'qpq', 'docker-image', appName);
56
+ // Every web entry's files go where the runtime looks for them. The federated views entry
57
+ // is assembled from every service's views build (one folder per service, as on AWS);
58
+ // anything else is its own buildPath. A missing build fails here rather than serving an
59
+ // empty site later.
60
+ const copyWebEntryContent = (appName, contextDir, entry, viewServices) => {
61
+ const label = `${entry.service}/${entry.entryName}`;
62
+ const targetDir = (0, dev_server_1.getWebEntryDir)(path_1.default.join(contextDir, 'web'), entry);
63
+ if (entry.webEntry.domain.subDomainName === webserver_1.FEDERATED_VIEWS_SUBDOMAIN) {
64
+ for (const serviceName of viewServices) {
65
+ fs_1.default.cpSync((0, views_1.getViewsDistDir)(appName, serviceName), path_1.default.join(targetDir, serviceName), { recursive: true });
66
+ }
67
+ return;
68
+ }
69
+ // A standalone host entry serves its own service's views build, as on AWS.
70
+ if (entry.webEntry.storageDrive.syncServiceViews) {
71
+ fs_1.default.cpSync((0, views_1.getViewsDistDir)(appName, entry.service), targetDir, { recursive: true });
72
+ return;
73
+ }
74
+ if (!entry.webEntry.buildPath) {
75
+ throw new Error(`Web entry ${label} has no buildPath, so there is nothing to serve`);
76
+ }
77
+ const buildDir = path_1.default.resolve(entry.configRoot, entry.webEntry.buildPath);
78
+ if (!fs_1.default.existsSync(path_1.default.join(buildDir, entry.webEntry.indexRoot))) {
79
+ throw new Error(`Web entry ${label} has no ${entry.webEntry.indexRoot} under ${buildDir}; build it before qpq go`);
80
+ }
81
+ fs_1.default.cpSync(buildDir, targetDir, { recursive: true });
82
+ };
83
+ // Plain `docker build` into the local store unless the deployment asks for a registry or a
84
+ // target platform, which need buildx: `--push` sends a cross-platform image straight to the
85
+ // registry, `--load` keeps a same-machine one local.
86
+ const buildImage = (imageName, contextDir, settings) => __awaiter(void 0, void 0, void 0, function* () {
87
+ if (!settings.registry && !settings.arch) {
88
+ yield (0, runCommand_1.runCommand)('docker', ['build', '-t', imageName, contextDir]);
89
+ return;
90
+ }
91
+ const platformArgs = settings.arch ? ['--platform', settings.arch] : [];
92
+ yield (0, runCommand_1.runCommand)('docker', ['buildx', 'build', ...platformArgs, '-t', imageName, settings.registry ? '--push' : '--load', contextDir]);
93
+ });
94
+ // The Dockerfile is shared; only its EXPOSE line depends on the app.
95
+ const writeDockerfile = (contextDir, containerPorts) => {
96
+ const template = fs_1.default.readFileSync(path_1.default.join((0, packageRoot_1.getOwnPackageRoot)(), 'docker', 'dev-server', 'Dockerfile'), 'utf8');
97
+ const dockerfile = template.replace(/^EXPOSE .*$/m, `EXPOSE ${containerPorts.join(' ')}`);
98
+ fs_1.default.writeFileSync(path_1.default.join(contextDir, 'Dockerfile'), dockerfile);
99
+ };
100
+ // The consumer root package.json, stripped to what the image's npm install
101
+ // needs: runtime dependencies (+ overrides). Workspaces/scripts/devDeps are
102
+ // host-only concerns — the workspace packages themselves are bundled into the
103
+ // server bundle from source.
104
+ //
105
+ // quidproquo deps declared as file: refs (a consumer living beside the qpq
106
+ // monorepo) point outside the image context, where npm install would leave
107
+ // dangling symlinks — rewrite them to the vendored copies inside the context.
108
+ const writeImagePackageJson = (root, contextDir) => {
109
+ var _a, _b;
110
+ const rootPackageJson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(root, 'package.json'), 'utf8'));
111
+ const dependencies = Object.assign({}, ((_a = rootPackageJson.dependencies) !== null && _a !== void 0 ? _a : {}));
112
+ for (const [name, version] of Object.entries(dependencies)) {
113
+ if ((0, core_1.isQpqPackageName)(name) && version.startsWith('file:')) {
114
+ dependencies[name] = `file:./vendor/${name}`;
115
+ }
116
+ }
117
+ const imagePackageJson = {
118
+ name: `${rootPackageJson.name}-qpq-docker`,
119
+ version: (_b = rootPackageJson.version) !== null && _b !== void 0 ? _b : '0.0.0',
120
+ private: true,
121
+ dependencies,
122
+ overrides: rootPackageJson.overrides,
123
+ };
124
+ fs_1.default.writeFileSync(path_1.default.join(contextDir, 'package.json'), JSON.stringify(imagePackageJson, null, 2) + '\n');
125
+ };
126
+ // Copy the locally-built quidproquo packages (which may be npm-linked
127
+ // checkouts newer than the registry) into vendor/ so the image runs the same
128
+ // qpq code the bundle was built against. Follows the node_modules symlinks;
129
+ // lib/config only — no node_modules, no src.
130
+ const vendorQuidproquoPackages = (root, contextDir) => {
131
+ const nodeModules = path_1.default.join(root, 'node_modules');
132
+ const vendorDir = path_1.default.join(contextDir, 'vendor');
133
+ let vendored = 0;
134
+ for (const name of (0, deploy_rspack_1.listInstalledQpqPackageNames)(nodeModules)) {
135
+ const packageDir = fs_1.default.realpathSync(path_1.default.join(nodeModules, name));
136
+ const targetDir = path_1.default.join(vendorDir, name);
137
+ fs_1.default.mkdirSync(targetDir, { recursive: true });
138
+ fs_1.default.copyFileSync(path_1.default.join(packageDir, 'package.json'), path_1.default.join(targetDir, 'package.json'));
139
+ for (const sub of ['lib', 'config']) {
140
+ const subDir = path_1.default.join(packageDir, sub);
141
+ if (fs_1.default.existsSync(subDir)) {
142
+ fs_1.default.cpSync(subDir, path_1.default.join(targetDir, sub), { recursive: true, dereference: true });
143
+ }
144
+ }
145
+ vendored += 1;
146
+ }
147
+ return vendored;
148
+ };
149
+ const dockerGo = (appName, plan) => __awaiter(void 0, void 0, void 0, function* () {
150
+ var _a, _b, _c, _d, _e;
151
+ if (plan.kind === 'cancelled') {
152
+ return;
153
+ }
154
+ if (plan.kind === 'account' || plan.kind === 'bootstrap') {
155
+ console.log(`Nothing to do — the docker platform has no ${plan.kind} stacks.`);
156
+ return;
157
+ }
158
+ const root = (0, discovery_1.getRoot)();
159
+ const deploymentName = process.env[core_1.QpqDeployEnvVar.deployName];
160
+ const dockerSettings = (0, getDockerPlatformSettings_1.getDockerPlatformSettings)(deploymentName, (0, config_aws_1.getQpqAppDeployment)(root, appName, deploymentName));
161
+ const applicationName = process.env[core_1.QpqDeployEnvVar.applicationName];
162
+ const imageName = (0, getImageName_1.getImageName)(applicationName, dockerSettings);
163
+ const containerName = `qpq-${applicationName}`;
164
+ const volumeName = `${containerName}-data`;
165
+ // The dev server hosts every service of the app, so per-service/stack
166
+ // selections don't apply — the image is always the whole app.
167
+ console.log(`\n\nBuilding docker image [${imageName}] — the whole app deploys as one image\n\n`);
168
+ (0, timing_1.logTimeStart)('totalTime');
169
+ yield (0, hooks_1.runAppHook)(appName, 'predeploy');
170
+ // Workspace packages resolve through their built dist/ (package.json main),
171
+ // so bundles would ship stale code unless every lib is tsc'd first.
172
+ console.log('Building workspace packages');
173
+ (0, runTasks_1.assertNoFailures)('Workspace build', yield (0, hooks_1.runHookForAppPackages)('build', appName, (0, getDefaultHookJobs_1.getDefaultHookJobs)()));
174
+ // ---- Server bundle: the dev server + every service, one main.js ----
175
+ console.log('Bundling server (dev server + all services)');
176
+ const qpqConfigs = (0, deploy_rspack_1.getAppServiceQpqConfigs)(root, appName);
177
+ // Resolved before anything slow runs, so a bad port or domain fails the build up front.
178
+ const devServerPorts = (0, devServerPorts_1.readDevServerPorts)(appName);
179
+ const { hosts: webEntryHosts, routes: webEntryRoutes } = (0, dev_server_1.getWebEntryPlacements)(qpqConfigs, Object.values(devServerPorts));
180
+ const containerPorts = (0, getContainerPorts_1.getContainerPorts)(devServerPorts, webEntryHosts);
181
+ const portMappings = (0, resolvePortMappings_1.resolvePortMappings)(deploymentName, dockerSettings, devServerPorts.api, containerPorts);
182
+ const mapHostPort = (containerPort) => { var _a, _b; return (_b = (_a = portMappings.find((mapping) => mapping.container === containerPort)) === null || _a === void 0 ? void 0 : _a.host) !== null && _b !== void 0 ? _b : containerPort; };
183
+ // Nothing deploys into the container, so the image runs its own pending migrations on start.
184
+ const entry = (0, devServerEntry_1.writeDevServerEntry)(root, appName, 'migrate-then-serve');
185
+ const userScriptChildEntry = (0, devServerEntry_1.writeUserScriptChildEntry)(root);
186
+ // The image installs its own node_modules next to the bundle, so externals
187
+ // must stay bare; host-resolved absolute paths do not exist in the container.
188
+ yield (0, deploy_rspack_1.runRspack)((0, deploy_rspack_1.getDevServerRspackConfig)({ root, entry, userScriptChildEntry, qpqConfigs, portableExternals: true }));
189
+ // ---- Views: production builds with same-origin federation remotes ----
190
+ // The browser reaches everything on the page's own host, on the HOST side of the port
191
+ // mappings; an unmapped port stays as is (nothing outside the container can reach it anyway).
192
+ (0, webAddressingEnv_1.setWebAddressingEnv)(qpqConfigs, { api: devServerPorts.api, webSocket: devServerPorts.webSocket, mapHostPort });
193
+ process.env.QPQ_VIEWS_REMOTE_BASE = `/${webserver_1.FEDERATED_VIEWS_SUBDOMAIN}`;
194
+ const viewServices = (0, discovery_1.getServiceNamesWithViews)(appName);
195
+ for (const serviceName of viewServices) {
196
+ console.log(`Bundling views: [${serviceName}]`);
197
+ yield (0, views_1.bundleViews)(appName, serviceName);
198
+ }
199
+ delete process.env.QPQ_VIEWS_REMOTE_BASE;
200
+ (0, webAddressingEnv_1.clearWebAddressingEnv)();
201
+ // ---- Assemble the image context ----
202
+ console.log('Assembling image context');
203
+ const contextDir = getImageContextDir(root, appName);
204
+ fs_1.default.rmSync(contextDir, { recursive: true, force: true });
205
+ fs_1.default.mkdirSync(contextDir, { recursive: true });
206
+ writeDockerfile(contextDir, containerPorts);
207
+ writeImagePackageJson(root, contextDir);
208
+ const vendored = vendorQuidproquoPackages(root, contextDir);
209
+ console.log(`Vendored ${vendored} quidproquo packages`);
210
+ fs_1.default.cpSync(path_1.default.join(root, 'dist', 'qpq', 'dev-server'), path_1.default.join(contextDir, 'server'), { recursive: true });
211
+ for (const entry of [...webEntryRoutes, ...webEntryHosts]) {
212
+ copyWebEntryContent(appName, contextDir, entry, viewServices);
213
+ }
214
+ const composePath = (0, writeComposeFile_1.writeComposeFile)({
215
+ contextDir,
216
+ imageName,
217
+ serviceName: containerName,
218
+ volumeName,
219
+ portMappings,
220
+ dataPath: (_a = dockerSettings.dataPath) !== null && _a !== void 0 ? _a : null,
221
+ mounts: (_b = dockerSettings.mounts) !== null && _b !== void 0 ? _b : [],
222
+ publicHost: (_c = dockerSettings.publicHost) !== null && _c !== void 0 ? _c : null,
223
+ publicFileStoragePort: mapHostPort(devServerPorts.fileStorage),
224
+ });
225
+ // ---- Build the image ----
226
+ console.log(`Building docker image${dockerSettings.arch ? ` for ${dockerSettings.arch}` : ''}${dockerSettings.registry ? `, pushing to ${dockerSettings.registry}` : ''}`);
227
+ yield buildImage(imageName, contextDir, dockerSettings);
228
+ (0, timing_1.logTimeEnd)('totalTime');
229
+ const hostUrl = (containerPort) => {
230
+ var _a;
231
+ const hostPort = (_a = portMappings.find((mapping) => mapping.container === containerPort)) === null || _a === void 0 ? void 0 : _a.host;
232
+ return hostPort === undefined ? `(container port ${containerPort} is not mapped)` : `http://localhost${hostPort === 80 ? '' : `:${hostPort}`}`;
233
+ };
234
+ const siteUrl = hostUrl(devServerPorts.api);
235
+ const entryLines = [
236
+ ...webEntryRoutes.map((route) => ` ${route.service}/${route.entryName}: ${siteUrl}${route.path === '/' ? '' : route.path}`),
237
+ ...webEntryHosts.map((host) => ` ${host.service}/${host.entryName}: ${hostUrl(host.port)}`),
238
+ ].join('\n');
239
+ const where = dockerSettings.registry ? `pushed to [${imageName}]` : `[${imageName}] in the local docker store`;
240
+ const onHost = dockerSettings.registry
241
+ ? `On the host (Unraid: Compose Manager, or any docker host), copy the compose file there and run:`
242
+ : `Run it here:`;
243
+ console.log(`
244
+ Done. The image is ${where}.
245
+
246
+ ${onHost}
247
+
248
+ docker compose -f ${composePath} up -d
249
+
250
+ Then open ${siteUrl} (replace localhost with the host's address)
251
+ ${entryLines ? `\nWeb entries:\n${entryLines}\n` : ''}
252
+ Ports come from the deployment's platformSettings.portMappings (${portMappings.map((m) => `${m.host}:${m.container}`).join(', ')})
253
+ and are baked into the frontend, so a host must map the same ones. App state lives in ${(_d = dockerSettings.dataPath) !== null && _d !== void 0 ? _d : `the ${volumeName} volume`}.${((_e = dockerSettings.mounts) === null || _e === void 0 ? void 0 : _e.length)
254
+ ? `\nAlso mounted: ${dockerSettings.mounts.map((mount) => `${mount.host} at ${mount.container}${mount.readOnly ? ' (read-only)' : ''}`).join(', ')}.`
255
+ : ''}${dockerSettings.publicHost
256
+ ? ''
257
+ : `\nSecure file urls point at localhost; set platformSettings.publicHost to the address browsers use for this host.`}
258
+ `);
259
+ });
260
+ exports.dockerGo = dockerGo;
261
+ //# sourceMappingURL=go.js.map