@qpqjs/cli 0.4.0 → 0.6.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 (185) hide show
  1. package/lib/commonjs/cli/runCli.js +2 -2
  2. package/lib/commonjs/cli/runCli.js.map +1 -1
  3. package/lib/commonjs/commands/checkCircular.js +2 -2
  4. package/lib/commonjs/commands/checkCircular.js.map +1 -1
  5. package/lib/commonjs/commands/goDev.js +2 -2
  6. package/lib/commonjs/commands/goDev.js.map +1 -1
  7. package/lib/commonjs/commands/goDevApi.js +6 -5
  8. package/lib/commonjs/commands/goDevApi.js.map +1 -1
  9. package/lib/commonjs/commands/goDevWeb.js +3 -3
  10. package/lib/commonjs/commands/goDevWeb.js.map +1 -1
  11. package/lib/commonjs/commands/goDocker.js +2 -2
  12. package/lib/commonjs/commands/goDocker.js.map +1 -1
  13. package/lib/commonjs/commands/hooks.js +2 -2
  14. package/lib/commonjs/commands/hooks.js.map +1 -1
  15. package/lib/commonjs/commands/migrate.js +2 -2
  16. package/lib/commonjs/commands/migrate.js.map +1 -1
  17. package/lib/commonjs/commands/prep.js +2 -2
  18. package/lib/commonjs/commands/prep.js.map +1 -1
  19. package/lib/commonjs/commands/scriptBuild.js +2 -2
  20. package/lib/commonjs/commands/scriptBuild.js.map +1 -1
  21. package/lib/commonjs/commands/scriptBuilderLayer.js +2 -2
  22. package/lib/commonjs/commands/scriptBuilderLayer.js.map +1 -1
  23. package/lib/commonjs/commands/scriptNew.js +2 -2
  24. package/lib/commonjs/commands/scriptNew.js.map +1 -1
  25. package/lib/commonjs/commands/setup.js +2 -2
  26. package/lib/commonjs/commands/setup.js.map +1 -1
  27. package/lib/commonjs/commands/synth.js +2 -2
  28. package/lib/commonjs/commands/synth.js.map +1 -1
  29. package/lib/commonjs/lib/{out.d.ts → Output.d.ts} +2 -1
  30. package/lib/commonjs/lib/Output.js +3 -0
  31. package/lib/commonjs/lib/Output.js.map +1 -0
  32. package/lib/commonjs/lib/clearResourcesPlan.js +2 -2
  33. package/lib/commonjs/lib/clearResourcesPlan.js.map +1 -1
  34. package/lib/commonjs/lib/createOutput.d.ts +2 -0
  35. package/lib/commonjs/lib/{out.js → createOutput.js} +13 -4
  36. package/lib/commonjs/lib/createOutput.js.map +1 -0
  37. package/lib/commonjs/lib/deployPrompts.js +3 -3
  38. package/lib/commonjs/lib/deployPrompts.js.map +1 -1
  39. package/lib/commonjs/lib/hooks.js +2 -2
  40. package/lib/commonjs/lib/hooks.js.map +1 -1
  41. package/lib/commonjs/lib/killChildWithEscalation.js +2 -2
  42. package/lib/commonjs/lib/killChildWithEscalation.js.map +1 -1
  43. package/lib/commonjs/lib/killStaleListeners.js +3 -3
  44. package/lib/commonjs/lib/killStaleListeners.js.map +1 -1
  45. package/lib/commonjs/lib/prompts.js +2 -2
  46. package/lib/commonjs/lib/prompts.js.map +1 -1
  47. package/lib/commonjs/lib/qpqConfigs.d.ts +1 -0
  48. package/lib/commonjs/lib/qpqConfigs.js +9 -4
  49. package/lib/commonjs/lib/qpqConfigs.js.map +1 -1
  50. package/lib/commonjs/lib/requireDriverCapability.js +2 -2
  51. package/lib/commonjs/lib/requireDriverCapability.js.map +1 -1
  52. package/lib/commonjs/lib/resolveAppSelection.js +3 -3
  53. package/lib/commonjs/lib/resolveAppSelection.js.map +1 -1
  54. package/lib/commonjs/lib/resolveDeployment.js +3 -3
  55. package/lib/commonjs/lib/resolveDeployment.js.map +1 -1
  56. package/lib/commonjs/lib/runCommand.js +2 -2
  57. package/lib/commonjs/lib/runCommand.js.map +1 -1
  58. package/lib/commonjs/lib/runTasks.js +2 -2
  59. package/lib/commonjs/lib/runTasks.js.map +1 -1
  60. package/lib/commonjs/lib/timing.js +2 -2
  61. package/lib/commonjs/lib/timing.js.map +1 -1
  62. package/lib/commonjs/lib/typeWatcher.js +3 -3
  63. package/lib/commonjs/lib/typeWatcher.js.map +1 -1
  64. package/lib/commonjs/lib/userScriptBuilderLayer.js +1 -1
  65. package/lib/commonjs/lib/userScriptBuilderLayer.js.map +1 -1
  66. package/lib/commonjs/platforms/aws/awsCredentials.js +2 -2
  67. package/lib/commonjs/platforms/aws/awsCredentials.js.map +1 -1
  68. package/lib/commonjs/platforms/aws/clearResources.js +4 -3
  69. package/lib/commonjs/platforms/aws/clearResources.js.map +1 -1
  70. package/lib/commonjs/platforms/aws/go.js +2 -2
  71. package/lib/commonjs/platforms/aws/go.js.map +1 -1
  72. package/lib/commonjs/platforms/aws/goDocker.js +2 -2
  73. package/lib/commonjs/platforms/aws/goDocker.js.map +1 -1
  74. package/lib/commonjs/platforms/aws/publish.js +2 -2
  75. package/lib/commonjs/platforms/aws/publish.js.map +1 -1
  76. package/lib/commonjs/platforms/aws/remote.js +2 -2
  77. package/lib/commonjs/platforms/aws/remote.js.map +1 -1
  78. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js +2 -2
  79. package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
  80. package/lib/commonjs/platforms/aws/stacks.js +4 -8
  81. package/lib/commonjs/platforms/aws/stacks.js.map +1 -1
  82. package/lib/commonjs/platforms/aws/teardown.js +2 -2
  83. package/lib/commonjs/platforms/aws/teardown.js.map +1 -1
  84. package/lib/commonjs/platforms/aws/viewsSync.js +2 -2
  85. package/lib/commonjs/platforms/aws/viewsSync.js.map +1 -1
  86. package/lib/commonjs/platforms/docker/go.js +2 -2
  87. package/lib/commonjs/platforms/docker/go.js.map +1 -1
  88. package/lib/commonjs/platforms/docker/index.js +2 -2
  89. package/lib/commonjs/platforms/docker/index.js.map +1 -1
  90. package/lib/commonjs/platforms/index.js +2 -2
  91. package/lib/commonjs/platforms/index.js.map +1 -1
  92. package/lib/esm/cli/runCli.js +1 -1
  93. package/lib/esm/cli/runCli.js.map +1 -1
  94. package/lib/esm/commands/checkCircular.js +1 -1
  95. package/lib/esm/commands/checkCircular.js.map +1 -1
  96. package/lib/esm/commands/goDev.js +1 -1
  97. package/lib/esm/commands/goDev.js.map +1 -1
  98. package/lib/esm/commands/goDevApi.js +4 -4
  99. package/lib/esm/commands/goDevApi.js.map +1 -1
  100. package/lib/esm/commands/goDevWeb.js +2 -2
  101. package/lib/esm/commands/goDevWeb.js.map +1 -1
  102. package/lib/esm/commands/goDocker.js +1 -1
  103. package/lib/esm/commands/goDocker.js.map +1 -1
  104. package/lib/esm/commands/hooks.js +1 -1
  105. package/lib/esm/commands/hooks.js.map +1 -1
  106. package/lib/esm/commands/migrate.js +1 -1
  107. package/lib/esm/commands/migrate.js.map +1 -1
  108. package/lib/esm/commands/prep.js +1 -1
  109. package/lib/esm/commands/prep.js.map +1 -1
  110. package/lib/esm/commands/scriptBuild.js +1 -1
  111. package/lib/esm/commands/scriptBuild.js.map +1 -1
  112. package/lib/esm/commands/scriptBuilderLayer.js +1 -1
  113. package/lib/esm/commands/scriptBuilderLayer.js.map +1 -1
  114. package/lib/esm/commands/scriptNew.js +1 -1
  115. package/lib/esm/commands/scriptNew.js.map +1 -1
  116. package/lib/esm/commands/setup.js +1 -1
  117. package/lib/esm/commands/setup.js.map +1 -1
  118. package/lib/esm/commands/synth.js +1 -1
  119. package/lib/esm/commands/synth.js.map +1 -1
  120. package/lib/esm/lib/{out.d.ts → Output.d.ts} +2 -1
  121. package/lib/esm/lib/Output.js +2 -0
  122. package/lib/esm/lib/Output.js.map +1 -0
  123. package/lib/esm/lib/clearResourcesPlan.js +1 -1
  124. package/lib/esm/lib/clearResourcesPlan.js.map +1 -1
  125. package/lib/esm/lib/createOutput.d.ts +2 -0
  126. package/lib/esm/lib/{out.js → createOutput.js} +13 -4
  127. package/lib/esm/lib/createOutput.js.map +1 -0
  128. package/lib/esm/lib/deployPrompts.js +2 -2
  129. package/lib/esm/lib/deployPrompts.js.map +1 -1
  130. package/lib/esm/lib/hooks.js +1 -1
  131. package/lib/esm/lib/hooks.js.map +1 -1
  132. package/lib/esm/lib/killChildWithEscalation.js +1 -1
  133. package/lib/esm/lib/killChildWithEscalation.js.map +1 -1
  134. package/lib/esm/lib/killStaleListeners.js +2 -2
  135. package/lib/esm/lib/killStaleListeners.js.map +1 -1
  136. package/lib/esm/lib/prompts.js +1 -1
  137. package/lib/esm/lib/prompts.js.map +1 -1
  138. package/lib/esm/lib/qpqConfigs.d.ts +1 -0
  139. package/lib/esm/lib/qpqConfigs.js +7 -3
  140. package/lib/esm/lib/qpqConfigs.js.map +1 -1
  141. package/lib/esm/lib/requireDriverCapability.js +1 -1
  142. package/lib/esm/lib/requireDriverCapability.js.map +1 -1
  143. package/lib/esm/lib/resolveAppSelection.js +2 -2
  144. package/lib/esm/lib/resolveAppSelection.js.map +1 -1
  145. package/lib/esm/lib/resolveDeployment.js +2 -2
  146. package/lib/esm/lib/resolveDeployment.js.map +1 -1
  147. package/lib/esm/lib/runCommand.js +1 -1
  148. package/lib/esm/lib/runCommand.js.map +1 -1
  149. package/lib/esm/lib/runTasks.js +1 -1
  150. package/lib/esm/lib/runTasks.js.map +1 -1
  151. package/lib/esm/lib/timing.js +1 -1
  152. package/lib/esm/lib/timing.js.map +1 -1
  153. package/lib/esm/lib/typeWatcher.js +2 -2
  154. package/lib/esm/lib/typeWatcher.js.map +1 -1
  155. package/lib/esm/lib/userScriptBuilderLayer.js +1 -1
  156. package/lib/esm/lib/userScriptBuilderLayer.js.map +1 -1
  157. package/lib/esm/platforms/aws/awsCredentials.js +1 -1
  158. package/lib/esm/platforms/aws/awsCredentials.js.map +1 -1
  159. package/lib/esm/platforms/aws/clearResources.js +3 -2
  160. package/lib/esm/platforms/aws/clearResources.js.map +1 -1
  161. package/lib/esm/platforms/aws/go.js +1 -1
  162. package/lib/esm/platforms/aws/go.js.map +1 -1
  163. package/lib/esm/platforms/aws/goDocker.js +1 -1
  164. package/lib/esm/platforms/aws/goDocker.js.map +1 -1
  165. package/lib/esm/platforms/aws/publish.js +1 -1
  166. package/lib/esm/platforms/aws/publish.js.map +1 -1
  167. package/lib/esm/platforms/aws/remote.js +1 -1
  168. package/lib/esm/platforms/aws/remote.js.map +1 -1
  169. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js +1 -1
  170. package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
  171. package/lib/esm/platforms/aws/stacks.js +5 -9
  172. package/lib/esm/platforms/aws/stacks.js.map +1 -1
  173. package/lib/esm/platforms/aws/teardown.js +1 -1
  174. package/lib/esm/platforms/aws/teardown.js.map +1 -1
  175. package/lib/esm/platforms/aws/viewsSync.js +1 -1
  176. package/lib/esm/platforms/aws/viewsSync.js.map +1 -1
  177. package/lib/esm/platforms/docker/go.js +1 -1
  178. package/lib/esm/platforms/docker/go.js.map +1 -1
  179. package/lib/esm/platforms/docker/index.js +1 -1
  180. package/lib/esm/platforms/docker/index.js.map +1 -1
  181. package/lib/esm/platforms/index.js +1 -1
  182. package/lib/esm/platforms/index.js.map +1 -1
  183. package/package.json +11 -11
  184. package/lib/commonjs/lib/out.js.map +0 -1
  185. package/lib/esm/lib/out.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../../src/platforms/aws/teardown.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,wEAAwE;AACxE,+EAA+E;AAC/E,2EAA2E;AAC3E,6DAA6D;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAG;IACrB,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,EAAE;CAClE,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,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,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7B,IAAI,CAAC,MAAM,qBAAqB,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;QAC9C,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,0EAA0E;IAC1E,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC3C,MAAM,GAAG,CAAC;QACV,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,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,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YAC3C,MAAM,GAAG,CAAC;YACV,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAC","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 { createOutput } from '../../lib/out';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { destroyServiceStack } from './stacks';\n\nconst out = createOutput('aws:teardown');\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 out.log('\\n\\nRunning automated teardown\\n\\n');\n out.log('Executing for services');\n out.log(services.join(', '));\n\n if ((await isAwsCredentialsValid()) === false) {\n out.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 out.log(`Destroy ${label}: `, service);\n await destroyServiceStack(service, getStackName(qpqConfigForService), appName);\n }, Promise.resolve());\n }\n\n logTimeEnd('totalTime');\n};\n"]}
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../../src/platforms/aws/teardown.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,wEAAwE;AACxE,+EAA+E;AAC/E,2EAA2E;AAC3E,6DAA6D;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,MAAM,GAAG,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;AAEzC,MAAM,cAAc,GAAG;IACrB,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,EAAE;IACjE,EAAE,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,CAAC,eAAe,EAAE;CAClE,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,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,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAClC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE7B,IAAI,CAAC,MAAM,qBAAqB,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;QAC9C,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QAC/C,OAAO;IACT,CAAC;IAED,YAAY,CAAC,WAAW,CAAC,CAAC;IAE1B,0EAA0E;IAC1E,MAAM,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC3C,MAAM,GAAG,CAAC;QACV,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC,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,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YAC3C,MAAM,GAAG,CAAC;YACV,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,MAAM,mBAAmB,CAAC,OAAO,EAAE,YAAY,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,UAAU,CAAC,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAC","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 { createOutput } from '../../lib/createOutput';\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 out = createOutput('aws:teardown');\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 out.log('\\n\\nRunning automated teardown\\n\\n');\n out.log('Executing for services');\n out.log(services.join(', '));\n\n if ((await isAwsCredentialsValid()) === false) {\n out.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 out.log(`Destroy ${label}: `, service);\n await destroyServiceStack(service, getStackName(qpqConfigForService), appName);\n }, Promise.resolve());\n }\n\n logTimeEnd('totalTime');\n};\n"]}
@@ -7,7 +7,7 @@ import { awsNamingUtils } from '@qpqjs/config-aws';
7
7
  import { qpqWebServerUtils } from '@qpqjs/webserver';
8
8
  import fs from 'fs';
9
9
  import path from 'path';
10
- import { createOutput } from '../../lib/out';
10
+ import { createOutput } from '../../lib/createOutput';
11
11
  import { loadServiceQpqConfig } from '../../lib/qpqConfigs';
12
12
  import { runCommand } from '../../lib/runCommand';
13
13
  import { getViewsDistDir } from '../../lib/views';
@@ -1 +1 @@
1
- {"version":3,"file":"viewsSync.js","sourceRoot":"","sources":["../../../../src/platforms/aws/viewsSync.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// 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 { qpqWebServerUtils } from '@qpqjs/webserver';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { createOutput } from '../../lib/out';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\nimport { getViewsDistDir } from '../../lib/views';\n\nconst out = createOutput('aws:views-sync');\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\n// The service that owns the shared views bucket and the root website.\nconst SHELL_SERVICE_NAME = 'shell';\n// The drive every service's views are uploaded into, under the service's prefix.\nconst SHARED_VIEWS_DRIVE_NAME = 'views';\n// Shell's bucket root from before `syncServiceViews`, kept when it declares no host drive.\nconst LEGACY_WEBSITE_DRIVE_NAME = 'website';\n\n// Content-hashed assets never change under their name, so they cache for a year; the\n// entry points above must be revalidated on every load.\nconst IMMUTABLE_CACHE_CONTROL = 'public,max-age=31536000,immutable';\nconst NO_CACHE_CONTROL = 'no-cache';\n\nexport const getViewsS3Destinations = (appName: string, serviceName: string): string[] => {\n const shellConfig = loadServiceQpqConfig(appName, SHELL_SERVICE_NAME);\n const viewsBucketName = awsNamingUtils.getConfigRuntimeResourceNameFromConfig(SHARED_VIEWS_DRIVE_NAME, shellConfig);\n\n const destinations = [`s3://${viewsBucketName}/${serviceName}`];\n\n const serviceConfig = serviceName === SHELL_SERVICE_NAME ? 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_SERVICE_NAME && hostDrives.length === 0) {\n hostDrives.push(LEGACY_WEBSITE_DRIVE_NAME);\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 out.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 IMMUTABLE_CACHE_CONTROL,\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_CONTROL]);\n }\n }\n};\n"]}
1
+ {"version":3,"file":"viewsSync.js","sourceRoot":"","sources":["../../../../src/platforms/aws/viewsSync.ts"],"names":[],"mappings":"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","sourcesContent":["import { awsNamingUtils } from '@qpqjs/config-aws';\n// 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 { qpqWebServerUtils } from '@qpqjs/webserver';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { createOutput } from '../../lib/createOutput';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { runCommand } from '../../lib/runCommand';\nimport { getViewsDistDir } from '../../lib/views';\n\nconst out = createOutput('aws:views-sync');\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\n// The service that owns the shared views bucket and the root website.\nconst SHELL_SERVICE_NAME = 'shell';\n// The drive every service's views are uploaded into, under the service's prefix.\nconst SHARED_VIEWS_DRIVE_NAME = 'views';\n// Shell's bucket root from before `syncServiceViews`, kept when it declares no host drive.\nconst LEGACY_WEBSITE_DRIVE_NAME = 'website';\n\n// Content-hashed assets never change under their name, so they cache for a year; the\n// entry points above must be revalidated on every load.\nconst IMMUTABLE_CACHE_CONTROL = 'public,max-age=31536000,immutable';\nconst NO_CACHE_CONTROL = 'no-cache';\n\nexport const getViewsS3Destinations = (appName: string, serviceName: string): string[] => {\n const shellConfig = loadServiceQpqConfig(appName, SHELL_SERVICE_NAME);\n const viewsBucketName = awsNamingUtils.getConfigRuntimeResourceNameFromConfig(SHARED_VIEWS_DRIVE_NAME, shellConfig);\n\n const destinations = [`s3://${viewsBucketName}/${serviceName}`];\n\n const serviceConfig = serviceName === SHELL_SERVICE_NAME ? 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_SERVICE_NAME && hostDrives.length === 0) {\n hostDrives.push(LEGACY_WEBSITE_DRIVE_NAME);\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 out.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 IMMUTABLE_CACHE_CONTROL,\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_CONTROL]);\n }\n }\n};\n"]}
@@ -21,12 +21,12 @@ import { getWebEntryDir, getWebEntryPlacements } from '@qpqjs/dev-server';
21
21
  import { FEDERATED_VIEWS_SUBDOMAIN } from '@qpqjs/webserver';
22
22
  import fs from 'fs';
23
23
  import path from 'path';
24
+ import { createOutput } from '../../lib/createOutput';
24
25
  import { writeDevServerEntry, writeUserScriptChildEntry } from '../../lib/devServerEntry';
25
26
  import { readDevServerPorts } from '../../lib/devServerPorts';
26
27
  import { getRoot, getServiceNamesWithViews } from '../../lib/discovery';
27
28
  import { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';
28
29
  import { runAppHook, runHookForAppPackages } from '../../lib/hooks';
29
- import { createOutput } from '../../lib/out';
30
30
  import { getOwnPackageRoot } from '../../lib/packageRoot';
31
31
  import { runCommand } from '../../lib/runCommand';
32
32
  import { assertNoFailures } from '../../lib/runTasks';
@@ -1 +1 @@
1
- {"version":3,"file":"go.js","sourceRoot":"","sources":["../../../../src/platforms/docker/go.ts"],"names":[],"mappings":"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","sourcesContent":["// Docker platform deploy (`qpq go` with platform 'docker'), proof-of-concept\n// self-hosting: bakes the QPQ dev server (a full local platform emulation)\n// plus every service of the app and its pre-built views into one docker image.\n//\n// 1. Build workspace packages, then the dev-server bundle (all services).\n// 2. Build every views microfrontend with a same-origin module-federation\n// remote base (/<views subdomain>/<svc>), mirroring the AWS layout.\n// 3. Assemble an image context under dist/qpq/docker-image/<app>/, server\n// bundle, web root (every web entry, placed by its port or its domain),\n// a workspaces-stripped package.json for runtime deps, and the\n// locally-built quidproquo packages as a vendor overlay.\n// 4. docker build (buildx with a push when the deployment names a registry or\n// a target platform), write a docker-compose.yml, print how to run it.\n//\n// Not production-grade (single process, sqlite KVS, in-memory queues):\n// it's the whole product on one box with one command.\nimport { getQpqAppDeployment } from '@qpqjs/config-aws';\nimport { getDevServerDistPath, getDockerImageContextPath, isQpqPackageName, QpqDeployEnvVar } from '@qpqjs/core';\nimport { getAppServiceQpqConfigs, getDevServerRspackConfig, listInstalledQpqPackageNames, runRspack } from '@qpqjs/deploy-rspack';\nimport { getWebEntryDir, getWebEntryPlacements, WebEntryHost, WebEntryRoute } from '@qpqjs/dev-server';\nimport { FEDERATED_VIEWS_SUBDOMAIN } from '@qpqjs/webserver';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { DeployPlan } from '../../lib/deployPrompts';\nimport { writeDevServerEntry, writeUserScriptChildEntry } from '../../lib/devServerEntry';\nimport { readDevServerPorts } from '../../lib/devServerPorts';\nimport { getRoot, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { createOutput } from '../../lib/out';\nimport { getOwnPackageRoot } from '../../lib/packageRoot';\nimport { runCommand } from '../../lib/runCommand';\nimport { assertNoFailures } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews, getViewsDistDir } from '../../lib/views';\nimport { clearWebAddressingEnv, setWebAddressingEnv } from '../../lib/webAddressingEnv';\nimport { getContainerPorts } from './getContainerPorts';\nimport { getDockerPlatformSettings, ParsedDockerPlatformSettings } from './getDockerPlatformSettings';\nimport { getImageName } from './getImageName';\nimport { resolvePortMappings } from './resolvePortMappings';\nimport { writeComposeFile } from './writeComposeFile';\n\nconst out = createOutput('docker');\n\nconst getImageContextDir = (root: string, appName: string): string => getDockerImageContextPath(root, appName);\n\n// Every web entry's files go where the runtime looks for them. The federated views entry\n// is assembled from every service's views build (one folder per service, as on AWS);\n// anything else is its own buildPath. A missing build fails here rather than serving an\n// empty site later.\nconst copyWebEntryContent = (appName: string, contextDir: string, entry: WebEntryHost | WebEntryRoute, viewServices: string[]): void => {\n const label = `${entry.service}/${entry.entryName}`;\n const targetDir = getWebEntryDir(path.join(contextDir, 'web'), entry);\n\n if (entry.webEntry.domain.subDomainName === FEDERATED_VIEWS_SUBDOMAIN) {\n for (const serviceName of viewServices) {\n fs.cpSync(getViewsDistDir(appName, serviceName), path.join(targetDir, serviceName), { recursive: true });\n }\n return;\n }\n\n // A standalone host entry serves its own service's views build, as on AWS.\n if (entry.webEntry.storageDrive.syncServiceViews) {\n fs.cpSync(getViewsDistDir(appName, entry.service), targetDir, { recursive: true });\n return;\n }\n\n if (!entry.webEntry.buildPath) {\n throw new Error(`Web entry ${label} has no buildPath, so there is nothing to serve`);\n }\n const buildDir = path.resolve(entry.configRoot, entry.webEntry.buildPath);\n if (!fs.existsSync(path.join(buildDir, entry.webEntry.indexRoot))) {\n throw new Error(`Web entry ${label} has no ${entry.webEntry.indexRoot} under ${buildDir}; build it before qpq go`);\n }\n fs.cpSync(buildDir, targetDir, { recursive: true });\n};\n\n// Plain `docker build` into the local store unless the deployment asks for a registry or a\n// target platform, which need buildx: `--push` sends a cross-platform image straight to the\n// registry, `--load` keeps a same-machine one local.\nconst buildImage = async (imageName: string, contextDir: string, settings: ParsedDockerPlatformSettings): Promise<void> => {\n if (!settings.registry && !settings.arch) {\n await runCommand('docker', ['build', '-t', imageName, contextDir]);\n return;\n }\n\n const platformArgs = settings.arch ? ['--platform', settings.arch] : [];\n await runCommand('docker', ['buildx', 'build', ...platformArgs, '-t', imageName, settings.registry ? '--push' : '--load', contextDir]);\n};\n\n// The Dockerfile is shared; only its EXPOSE line depends on the app.\nconst writeDockerfile = (contextDir: string, containerPorts: number[]): void => {\n const template = fs.readFileSync(path.join(getOwnPackageRoot(), 'docker', 'dev-server', 'Dockerfile'), 'utf8');\n const dockerfile = template.replace(/^EXPOSE .*$/m, `EXPOSE ${containerPorts.join(' ')}`);\n fs.writeFileSync(path.join(contextDir, 'Dockerfile'), dockerfile);\n};\n\n// The consumer root package.json, stripped to what the image's npm install\n// needs: runtime dependencies (+ overrides). Workspaces/scripts/devDeps are\n// host-only concerns, the workspace packages themselves are bundled into the\n// server bundle from source.\n//\n// quidproquo deps declared as file: refs (a consumer living beside the qpq\n// monorepo) point outside the image context, where npm install would leave\n// dangling symlinks, rewrite them to the vendored copies inside the context.\nconst writeImagePackageJson = (root: string, contextDir: string): void => {\n const rootPackageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));\n\n const dependencies: Record<string, string> = { ...(rootPackageJson.dependencies ?? {}) };\n for (const [name, version] of Object.entries(dependencies)) {\n if (isQpqPackageName(name) && version.startsWith('file:')) {\n dependencies[name] = `file:./vendor/${name}`;\n }\n }\n\n const imagePackageJson = {\n name: `${rootPackageJson.name}-qpq-docker`,\n version: rootPackageJson.version ?? '0.0.0',\n private: true,\n dependencies,\n overrides: rootPackageJson.overrides,\n };\n\n fs.writeFileSync(path.join(contextDir, 'package.json'), JSON.stringify(imagePackageJson, null, 2) + '\\n');\n};\n\n// Copy the locally-built quidproquo packages (which may be npm-linked\n// checkouts newer than the registry) into vendor/ so the image runs the same\n// qpq code the bundle was built against. Follows the node_modules symlinks;\n// lib/config only, no node_modules, no src.\nconst vendorQuidproquoPackages = (root: string, contextDir: string): number => {\n const nodeModules = path.join(root, 'node_modules');\n const vendorDir = path.join(contextDir, 'vendor');\n let vendored = 0;\n\n for (const name of listInstalledQpqPackageNames(nodeModules)) {\n const packageDir = fs.realpathSync(path.join(nodeModules, name));\n const targetDir = path.join(vendorDir, name);\n fs.mkdirSync(targetDir, { recursive: true });\n\n fs.copyFileSync(path.join(packageDir, 'package.json'), path.join(targetDir, 'package.json'));\n for (const sub of ['lib', 'config']) {\n const subDir = path.join(packageDir, sub);\n if (fs.existsSync(subDir)) {\n fs.cpSync(subDir, path.join(targetDir, sub), { recursive: true, dereference: true });\n }\n }\n vendored += 1;\n }\n\n return vendored;\n};\n\nexport const dockerGo = async (appName: string, plan: DeployPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n if (plan.kind === 'account' || plan.kind === 'bootstrap') {\n out.log(`Nothing to do — the docker platform has no ${plan.kind} stacks.`);\n return;\n }\n\n const root = getRoot();\n const deploymentName = process.env[QpqDeployEnvVar.deployName]!;\n const dockerSettings = getDockerPlatformSettings(deploymentName, getQpqAppDeployment(root, appName, deploymentName));\n\n const applicationName = process.env[QpqDeployEnvVar.applicationName]!;\n const imageName = getImageName(applicationName, dockerSettings);\n const containerName = `qpq-${applicationName}`;\n const volumeName = `${containerName}-data`;\n\n // The dev server hosts every service of the app, so per-service/stack\n // selections don't apply, the image is always the whole app.\n out.log(`\\n\\nBuilding docker image [${imageName}] — the whole app deploys as one image\\n\\n`);\n\n logTimeStart('totalTime');\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.\n out.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // ---- Server bundle: the dev server + every service, one main.js ----\n out.log('Bundling server (dev server + all services)');\n const qpqConfigs = getAppServiceQpqConfigs(root, appName);\n\n // Resolved before anything slow runs, so a bad port or domain fails the build up front.\n const devServerPorts = readDevServerPorts(appName);\n const { hosts: webEntryHosts, routes: webEntryRoutes } = getWebEntryPlacements(qpqConfigs, Object.values(devServerPorts));\n const containerPorts = getContainerPorts(devServerPorts, webEntryHosts);\n const portMappings = resolvePortMappings(deploymentName, dockerSettings, devServerPorts.api, containerPorts);\n const mapHostPort = (containerPort: number): number => portMappings.find((mapping) => mapping.container === containerPort)?.host ?? containerPort;\n\n // Nothing deploys into the container, so the image runs its own pending migrations on start.\n const entry = writeDevServerEntry(root, appName, 'migrate-then-serve');\n const userScriptChildEntry = writeUserScriptChildEntry(root);\n // The image installs its own node_modules next to the bundle, so externals\n // must stay bare; host-resolved absolute paths do not exist in the container.\n await runRspack(getDevServerRspackConfig({ root, entry, userScriptChildEntry, qpqConfigs, portableExternals: true }));\n\n // ---- Views: production builds with same-origin federation remotes ----\n // The browser reaches everything on the page's own host, on the HOST side of the port\n // mappings; an unmapped port stays as is (nothing outside the container can reach it anyway).\n setWebAddressingEnv(qpqConfigs, { api: devServerPorts.api, webSocket: devServerPorts.webSocket, mapHostPort });\n process.env.QPQ_VIEWS_REMOTE_BASE = `/${FEDERATED_VIEWS_SUBDOMAIN}`;\n const viewServices = getServiceNamesWithViews(appName);\n for (const serviceName of viewServices) {\n out.log(`Bundling views: [${serviceName}]`);\n await bundleViews(appName, serviceName);\n }\n delete process.env.QPQ_VIEWS_REMOTE_BASE;\n clearWebAddressingEnv();\n\n // ---- Assemble the image context ----\n out.log('Assembling image context');\n const contextDir = getImageContextDir(root, appName);\n fs.rmSync(contextDir, { recursive: true, force: true });\n fs.mkdirSync(contextDir, { recursive: true });\n\n writeDockerfile(contextDir, containerPorts);\n writeImagePackageJson(root, contextDir);\n\n const vendored = vendorQuidproquoPackages(root, contextDir);\n out.log(`Vendored ${vendored} quidproquo packages`);\n\n fs.cpSync(getDevServerDistPath(root), path.join(contextDir, 'server'), { recursive: true });\n\n for (const entry of [...webEntryRoutes, ...webEntryHosts]) {\n copyWebEntryContent(appName, contextDir, entry, viewServices);\n }\n\n const composePath = writeComposeFile({\n contextDir,\n imageName,\n serviceName: containerName,\n volumeName,\n portMappings,\n dataPath: dockerSettings.dataPath ?? null,\n mounts: dockerSettings.mounts ?? [],\n publicHost: dockerSettings.publicHost ?? null,\n publicFileStoragePort: mapHostPort(devServerPorts.fileStorage),\n });\n\n // ---- Build the image ----\n out.log(\n `Building docker image${dockerSettings.arch ? ` for ${dockerSettings.arch}` : ''}${dockerSettings.registry ? `, pushing to ${dockerSettings.registry}` : ''}`,\n );\n await buildImage(imageName, contextDir, dockerSettings);\n\n logTimeEnd('totalTime');\n\n const hostUrl = (containerPort: number): string => {\n const hostPort = portMappings.find((mapping) => mapping.container === containerPort)?.host;\n return hostPort === undefined ? `(container port ${containerPort} is not mapped)` : `http://localhost${hostPort === 80 ? '' : `:${hostPort}`}`;\n };\n const siteUrl = hostUrl(devServerPorts.api);\n const entryLines = [\n ...webEntryRoutes.map((route) => ` ${route.service}/${route.entryName}: ${siteUrl}${route.path === '/' ? '' : route.path}`),\n ...webEntryHosts.map((host) => ` ${host.service}/${host.entryName}: ${hostUrl(host.port)}`),\n ].join('\\n');\n const where = dockerSettings.registry ? `pushed to [${imageName}]` : `[${imageName}] in the local docker store`;\n const onHost = dockerSettings.registry\n ? `On the host (Unraid: Compose Manager, or any docker host), copy the compose file there and run:`\n : `Run it here:`;\n out.log(`\nDone. The image is ${where}.\n\n${onHost}\n\n docker compose -f ${composePath} up -d\n\nThen open ${siteUrl} (replace localhost with the host's address)\n${entryLines ? `\\nWeb entries:\\n${entryLines}\\n` : ''}\nPorts come from the deployment's platformSettings.portMappings (${portMappings.map((m) => `${m.host}:${m.container}`).join(', ')})\nand are baked into the frontend, so a host must map the same ones. App state lives in ${dockerSettings.dataPath ?? `the ${volumeName} volume`}.${\n dockerSettings.mounts?.length\n ? `\\nAlso mounted: ${dockerSettings.mounts.map((mount) => `${mount.host} at ${mount.container}${mount.readOnly ? ' (read-only)' : ''}`).join(', ')}.`\n : ''\n }${\n dockerSettings.publicHost\n ? ''\n : `\\nSecure file urls point at localhost; set platformSettings.publicHost to the address browsers use for this host.`\n }\n`);\n};\n"]}
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../../../src/platforms/docker/go.ts"],"names":[],"mappings":"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","sourcesContent":["// Docker platform deploy (`qpq go` with platform 'docker'), proof-of-concept\n// self-hosting: bakes the QPQ dev server (a full local platform emulation)\n// plus every service of the app and its pre-built views into one docker image.\n//\n// 1. Build workspace packages, then the dev-server bundle (all services).\n// 2. Build every views microfrontend with a same-origin module-federation\n// remote base (/<views subdomain>/<svc>), mirroring the AWS layout.\n// 3. Assemble an image context under dist/qpq/docker-image/<app>/, server\n// bundle, web root (every web entry, placed by its port or its domain),\n// a workspaces-stripped package.json for runtime deps, and the\n// locally-built quidproquo packages as a vendor overlay.\n// 4. docker build (buildx with a push when the deployment names a registry or\n// a target platform), write a docker-compose.yml, print how to run it.\n//\n// Not production-grade (single process, sqlite KVS, in-memory queues):\n// it's the whole product on one box with one command.\nimport { getQpqAppDeployment } from '@qpqjs/config-aws';\nimport { getDevServerDistPath, getDockerImageContextPath, isQpqPackageName, QpqDeployEnvVar } from '@qpqjs/core';\nimport { getAppServiceQpqConfigs, getDevServerRspackConfig, listInstalledQpqPackageNames, runRspack } from '@qpqjs/deploy-rspack';\nimport { getWebEntryDir, getWebEntryPlacements, WebEntryHost, WebEntryRoute } from '@qpqjs/dev-server';\nimport { FEDERATED_VIEWS_SUBDOMAIN } from '@qpqjs/webserver';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { createOutput } from '../../lib/createOutput';\nimport { DeployPlan } from '../../lib/deployPrompts';\nimport { writeDevServerEntry, writeUserScriptChildEntry } from '../../lib/devServerEntry';\nimport { readDevServerPorts } from '../../lib/devServerPorts';\nimport { getRoot, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { getOwnPackageRoot } from '../../lib/packageRoot';\nimport { runCommand } from '../../lib/runCommand';\nimport { assertNoFailures } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews, getViewsDistDir } from '../../lib/views';\nimport { clearWebAddressingEnv, setWebAddressingEnv } from '../../lib/webAddressingEnv';\nimport { getContainerPorts } from './getContainerPorts';\nimport { getDockerPlatformSettings, ParsedDockerPlatformSettings } from './getDockerPlatformSettings';\nimport { getImageName } from './getImageName';\nimport { resolvePortMappings } from './resolvePortMappings';\nimport { writeComposeFile } from './writeComposeFile';\n\nconst out = createOutput('docker');\n\nconst getImageContextDir = (root: string, appName: string): string => getDockerImageContextPath(root, appName);\n\n// Every web entry's files go where the runtime looks for them. The federated views entry\n// is assembled from every service's views build (one folder per service, as on AWS);\n// anything else is its own buildPath. A missing build fails here rather than serving an\n// empty site later.\nconst copyWebEntryContent = (appName: string, contextDir: string, entry: WebEntryHost | WebEntryRoute, viewServices: string[]): void => {\n const label = `${entry.service}/${entry.entryName}`;\n const targetDir = getWebEntryDir(path.join(contextDir, 'web'), entry);\n\n if (entry.webEntry.domain.subDomainName === FEDERATED_VIEWS_SUBDOMAIN) {\n for (const serviceName of viewServices) {\n fs.cpSync(getViewsDistDir(appName, serviceName), path.join(targetDir, serviceName), { recursive: true });\n }\n return;\n }\n\n // A standalone host entry serves its own service's views build, as on AWS.\n if (entry.webEntry.storageDrive.syncServiceViews) {\n fs.cpSync(getViewsDistDir(appName, entry.service), targetDir, { recursive: true });\n return;\n }\n\n if (!entry.webEntry.buildPath) {\n throw new Error(`Web entry ${label} has no buildPath, so there is nothing to serve`);\n }\n const buildDir = path.resolve(entry.configRoot, entry.webEntry.buildPath);\n if (!fs.existsSync(path.join(buildDir, entry.webEntry.indexRoot))) {\n throw new Error(`Web entry ${label} has no ${entry.webEntry.indexRoot} under ${buildDir}; build it before qpq go`);\n }\n fs.cpSync(buildDir, targetDir, { recursive: true });\n};\n\n// Plain `docker build` into the local store unless the deployment asks for a registry or a\n// target platform, which need buildx: `--push` sends a cross-platform image straight to the\n// registry, `--load` keeps a same-machine one local.\nconst buildImage = async (imageName: string, contextDir: string, settings: ParsedDockerPlatformSettings): Promise<void> => {\n if (!settings.registry && !settings.arch) {\n await runCommand('docker', ['build', '-t', imageName, contextDir]);\n return;\n }\n\n const platformArgs = settings.arch ? ['--platform', settings.arch] : [];\n await runCommand('docker', ['buildx', 'build', ...platformArgs, '-t', imageName, settings.registry ? '--push' : '--load', contextDir]);\n};\n\n// The Dockerfile is shared; only its EXPOSE line depends on the app.\nconst writeDockerfile = (contextDir: string, containerPorts: number[]): void => {\n const template = fs.readFileSync(path.join(getOwnPackageRoot(), 'docker', 'dev-server', 'Dockerfile'), 'utf8');\n const dockerfile = template.replace(/^EXPOSE .*$/m, `EXPOSE ${containerPorts.join(' ')}`);\n fs.writeFileSync(path.join(contextDir, 'Dockerfile'), dockerfile);\n};\n\n// The consumer root package.json, stripped to what the image's npm install\n// needs: runtime dependencies (+ overrides). Workspaces/scripts/devDeps are\n// host-only concerns, the workspace packages themselves are bundled into the\n// server bundle from source.\n//\n// quidproquo deps declared as file: refs (a consumer living beside the qpq\n// monorepo) point outside the image context, where npm install would leave\n// dangling symlinks, rewrite them to the vendored copies inside the context.\nconst writeImagePackageJson = (root: string, contextDir: string): void => {\n const rootPackageJson = JSON.parse(fs.readFileSync(path.join(root, 'package.json'), 'utf8'));\n\n const dependencies: Record<string, string> = { ...(rootPackageJson.dependencies ?? {}) };\n for (const [name, version] of Object.entries(dependencies)) {\n if (isQpqPackageName(name) && version.startsWith('file:')) {\n dependencies[name] = `file:./vendor/${name}`;\n }\n }\n\n const imagePackageJson = {\n name: `${rootPackageJson.name}-qpq-docker`,\n version: rootPackageJson.version ?? '0.0.0',\n private: true,\n dependencies,\n overrides: rootPackageJson.overrides,\n };\n\n fs.writeFileSync(path.join(contextDir, 'package.json'), JSON.stringify(imagePackageJson, null, 2) + '\\n');\n};\n\n// Copy the locally-built quidproquo packages (which may be npm-linked\n// checkouts newer than the registry) into vendor/ so the image runs the same\n// qpq code the bundle was built against. Follows the node_modules symlinks;\n// lib/config only, no node_modules, no src.\nconst vendorQuidproquoPackages = (root: string, contextDir: string): number => {\n const nodeModules = path.join(root, 'node_modules');\n const vendorDir = path.join(contextDir, 'vendor');\n let vendored = 0;\n\n for (const name of listInstalledQpqPackageNames(nodeModules)) {\n const packageDir = fs.realpathSync(path.join(nodeModules, name));\n const targetDir = path.join(vendorDir, name);\n fs.mkdirSync(targetDir, { recursive: true });\n\n fs.copyFileSync(path.join(packageDir, 'package.json'), path.join(targetDir, 'package.json'));\n for (const sub of ['lib', 'config']) {\n const subDir = path.join(packageDir, sub);\n if (fs.existsSync(subDir)) {\n fs.cpSync(subDir, path.join(targetDir, sub), { recursive: true, dereference: true });\n }\n }\n vendored += 1;\n }\n\n return vendored;\n};\n\nexport const dockerGo = async (appName: string, plan: DeployPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n if (plan.kind === 'account' || plan.kind === 'bootstrap') {\n out.log(`Nothing to do — the docker platform has no ${plan.kind} stacks.`);\n return;\n }\n\n const root = getRoot();\n const deploymentName = process.env[QpqDeployEnvVar.deployName]!;\n const dockerSettings = getDockerPlatformSettings(deploymentName, getQpqAppDeployment(root, appName, deploymentName));\n\n const applicationName = process.env[QpqDeployEnvVar.applicationName]!;\n const imageName = getImageName(applicationName, dockerSettings);\n const containerName = `qpq-${applicationName}`;\n const volumeName = `${containerName}-data`;\n\n // The dev server hosts every service of the app, so per-service/stack\n // selections don't apply, the image is always the whole app.\n out.log(`\\n\\nBuilding docker image [${imageName}] — the whole app deploys as one image\\n\\n`);\n\n logTimeStart('totalTime');\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.\n out.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // ---- Server bundle: the dev server + every service, one main.js ----\n out.log('Bundling server (dev server + all services)');\n const qpqConfigs = getAppServiceQpqConfigs(root, appName);\n\n // Resolved before anything slow runs, so a bad port or domain fails the build up front.\n const devServerPorts = readDevServerPorts(appName);\n const { hosts: webEntryHosts, routes: webEntryRoutes } = getWebEntryPlacements(qpqConfigs, Object.values(devServerPorts));\n const containerPorts = getContainerPorts(devServerPorts, webEntryHosts);\n const portMappings = resolvePortMappings(deploymentName, dockerSettings, devServerPorts.api, containerPorts);\n const mapHostPort = (containerPort: number): number => portMappings.find((mapping) => mapping.container === containerPort)?.host ?? containerPort;\n\n // Nothing deploys into the container, so the image runs its own pending migrations on start.\n const entry = writeDevServerEntry(root, appName, 'migrate-then-serve');\n const userScriptChildEntry = writeUserScriptChildEntry(root);\n // The image installs its own node_modules next to the bundle, so externals\n // must stay bare; host-resolved absolute paths do not exist in the container.\n await runRspack(getDevServerRspackConfig({ root, entry, userScriptChildEntry, qpqConfigs, portableExternals: true }));\n\n // ---- Views: production builds with same-origin federation remotes ----\n // The browser reaches everything on the page's own host, on the HOST side of the port\n // mappings; an unmapped port stays as is (nothing outside the container can reach it anyway).\n setWebAddressingEnv(qpqConfigs, { api: devServerPorts.api, webSocket: devServerPorts.webSocket, mapHostPort });\n process.env.QPQ_VIEWS_REMOTE_BASE = `/${FEDERATED_VIEWS_SUBDOMAIN}`;\n const viewServices = getServiceNamesWithViews(appName);\n for (const serviceName of viewServices) {\n out.log(`Bundling views: [${serviceName}]`);\n await bundleViews(appName, serviceName);\n }\n delete process.env.QPQ_VIEWS_REMOTE_BASE;\n clearWebAddressingEnv();\n\n // ---- Assemble the image context ----\n out.log('Assembling image context');\n const contextDir = getImageContextDir(root, appName);\n fs.rmSync(contextDir, { recursive: true, force: true });\n fs.mkdirSync(contextDir, { recursive: true });\n\n writeDockerfile(contextDir, containerPorts);\n writeImagePackageJson(root, contextDir);\n\n const vendored = vendorQuidproquoPackages(root, contextDir);\n out.log(`Vendored ${vendored} quidproquo packages`);\n\n fs.cpSync(getDevServerDistPath(root), path.join(contextDir, 'server'), { recursive: true });\n\n for (const entry of [...webEntryRoutes, ...webEntryHosts]) {\n copyWebEntryContent(appName, contextDir, entry, viewServices);\n }\n\n const composePath = writeComposeFile({\n contextDir,\n imageName,\n serviceName: containerName,\n volumeName,\n portMappings,\n dataPath: dockerSettings.dataPath ?? null,\n mounts: dockerSettings.mounts ?? [],\n publicHost: dockerSettings.publicHost ?? null,\n publicFileStoragePort: mapHostPort(devServerPorts.fileStorage),\n });\n\n // ---- Build the image ----\n out.log(\n `Building docker image${dockerSettings.arch ? ` for ${dockerSettings.arch}` : ''}${dockerSettings.registry ? `, pushing to ${dockerSettings.registry}` : ''}`,\n );\n await buildImage(imageName, contextDir, dockerSettings);\n\n logTimeEnd('totalTime');\n\n const hostUrl = (containerPort: number): string => {\n const hostPort = portMappings.find((mapping) => mapping.container === containerPort)?.host;\n return hostPort === undefined ? `(container port ${containerPort} is not mapped)` : `http://localhost${hostPort === 80 ? '' : `:${hostPort}`}`;\n };\n const siteUrl = hostUrl(devServerPorts.api);\n const entryLines = [\n ...webEntryRoutes.map((route) => ` ${route.service}/${route.entryName}: ${siteUrl}${route.path === '/' ? '' : route.path}`),\n ...webEntryHosts.map((host) => ` ${host.service}/${host.entryName}: ${hostUrl(host.port)}`),\n ].join('\\n');\n const where = dockerSettings.registry ? `pushed to [${imageName}]` : `[${imageName}] in the local docker store`;\n const onHost = dockerSettings.registry\n ? `On the host (Unraid: Compose Manager, or any docker host), copy the compose file there and run:`\n : `Run it here:`;\n out.log(`\nDone. The image is ${where}.\n\n${onHost}\n\n docker compose -f ${composePath} up -d\n\nThen open ${siteUrl} (replace localhost with the host's address)\n${entryLines ? `\\nWeb entries:\\n${entryLines}\\n` : ''}\nPorts come from the deployment's platformSettings.portMappings (${portMappings.map((m) => `${m.host}:${m.container}`).join(', ')})\nand are baked into the frontend, so a host must map the same ones. App state lives in ${dockerSettings.dataPath ?? `the ${volumeName} volume`}.${\n dockerSettings.mounts?.length\n ? `\\nAlso mounted: ${dockerSettings.mounts.map((mount) => `${mount.host} at ${mount.container}${mount.readOnly ? ' (read-only)' : ''}`).join(', ')}.`\n : ''\n }${\n dockerSettings.publicHost\n ? ''\n : `\\nSecure file urls point at localhost; set platformSettings.publicHost to the address browsers use for this host.`\n }\n`);\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { CliError } from '../../lib/CliError';
2
+ import { createOutput } from '../../lib/createOutput';
2
3
  import { BUILD_ONLY_FLAG, FROM_BUILD_FLAG } from '../../lib/goDockerMode';
3
- import { createOutput } from '../../lib/out';
4
4
  import { getDockerPlatformSettings } from './getDockerPlatformSettings';
5
5
  import { dockerGo } from './go';
6
6
  const out = createOutput('docker');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/docker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAgB,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,mBAAmB,GAAG,KAAK,IAAmB,EAAE;IACpD,MAAM,IAAI,QAAQ,CAAC,mHAAmH,CAAC,CAAC;AAC1I,CAAC,CAAC;AAEF,kFAAkF;AAClF,kFAAkF;AAClF,mEAAmE;AACnE,MAAM,cAAc,GAAG,KAAK,EAAE,OAAe,EAAE,IAAgB,EAAE,IAAkB,EAAiB,EAAE;IACpG,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAChB,uDAAuD,eAAe,QAAQ,eAAe,gDAAgD,CAC9I,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,2FAA2F;IAC3F,oFAAoF;IACpF,iBAAiB,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,EAAE;QAChD,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,cAAc;IAExB,OAAO,EAAE,mBAAmB;IAC5B,YAAY,EAAE,mBAAmB;IACjC,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;CACnC,CAAC","sourcesContent":["import { CliError } from '../../lib/CliError';\nimport { DeployPlan } from '../../lib/deployPrompts';\nimport { BUILD_ONLY_FLAG, FROM_BUILD_FLAG, GoDockerMode } from '../../lib/goDockerMode';\nimport { createOutput } from '../../lib/out';\nimport { QpqPlatformDriver } from '../types';\nimport { getDockerPlatformSettings } from './getDockerPlatformSettings';\nimport { dockerGo } from './go';\n\nconst out = createOutput('docker');\n\nconst publishNotSupported = async (): Promise<void> => {\n throw new CliError('The docker platform has no federated code store: story code is baked into the image. Rebuild with qpq go instead.');\n};\n\n// A docker platform's deploy already is the containerised one, so `qpq go:docker`\n// (what a scaffolded app's `npm run deploy` runs) is the same build. The image is\n// the deploy, so there is no saved build to split across two runs.\nconst dockerGoDocker = async (appName: string, plan: DeployPlan, mode: GoDockerMode): Promise<void> => {\n if (mode !== 'full') {\n throw new CliError(\n `The docker platform builds and deploys in one step; ${BUILD_ONLY_FLAG} and ${FROM_BUILD_FLAG} do not apply. Run qpq go:docker without them.`,\n );\n }\n\n await dockerGo(appName, plan);\n};\n\nexport const dockerPlatformDriver: QpqPlatformDriver = {\n // No identity to prime. Mappings are only parsed here; which container ports exist depends\n // on the app's config, which is not loaded yet, so that check happens in the build.\n prepareDeployment: (deploymentName, deployment) => {\n getDockerPlatformSettings(deploymentName, deployment);\n },\n\n go: dockerGo,\n goDocker: dockerGoDocker,\n\n publish: publishNotSupported,\n publishBuild: publishNotSupported,\n publishUpload: publishNotSupported,\n publishDeploy: publishNotSupported,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/platforms/docker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAgB,MAAM,wBAAwB,CAAC;AAExF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,mBAAmB,GAAG,KAAK,IAAmB,EAAE;IACpD,MAAM,IAAI,QAAQ,CAAC,mHAAmH,CAAC,CAAC;AAC1I,CAAC,CAAC;AAEF,kFAAkF;AAClF,kFAAkF;AAClF,mEAAmE;AACnE,MAAM,cAAc,GAAG,KAAK,EAAE,OAAe,EAAE,IAAgB,EAAE,IAAkB,EAAiB,EAAE;IACpG,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAChB,uDAAuD,eAAe,QAAQ,eAAe,gDAAgD,CAC9I,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,2FAA2F;IAC3F,oFAAoF;IACpF,iBAAiB,EAAE,CAAC,cAAc,EAAE,UAAU,EAAE,EAAE;QAChD,yBAAyB,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,cAAc;IAExB,OAAO,EAAE,mBAAmB;IAC5B,YAAY,EAAE,mBAAmB;IACjC,aAAa,EAAE,mBAAmB;IAClC,aAAa,EAAE,mBAAmB;CACnC,CAAC","sourcesContent":["import { CliError } from '../../lib/CliError';\nimport { createOutput } from '../../lib/createOutput';\nimport { DeployPlan } from '../../lib/deployPrompts';\nimport { BUILD_ONLY_FLAG, FROM_BUILD_FLAG, GoDockerMode } from '../../lib/goDockerMode';\nimport { QpqPlatformDriver } from '../types';\nimport { getDockerPlatformSettings } from './getDockerPlatformSettings';\nimport { dockerGo } from './go';\n\nconst out = createOutput('docker');\n\nconst publishNotSupported = async (): Promise<void> => {\n throw new CliError('The docker platform has no federated code store: story code is baked into the image. Rebuild with qpq go instead.');\n};\n\n// A docker platform's deploy already is the containerised one, so `qpq go:docker`\n// (what a scaffolded app's `npm run deploy` runs) is the same build. The image is\n// the deploy, so there is no saved build to split across two runs.\nconst dockerGoDocker = async (appName: string, plan: DeployPlan, mode: GoDockerMode): Promise<void> => {\n if (mode !== 'full') {\n throw new CliError(\n `The docker platform builds and deploys in one step; ${BUILD_ONLY_FLAG} and ${FROM_BUILD_FLAG} do not apply. Run qpq go:docker without them.`,\n );\n }\n\n await dockerGo(appName, plan);\n};\n\nexport const dockerPlatformDriver: QpqPlatformDriver = {\n // No identity to prime. Mappings are only parsed here; which container ports exist depends\n // on the app's config, which is not loaded yet, so that check happens in the build.\n prepareDeployment: (deploymentName, deployment) => {\n getDockerPlatformSettings(deploymentName, deployment);\n },\n\n go: dockerGo,\n goDocker: dockerGoDocker,\n\n publish: publishNotSupported,\n publishBuild: publishNotSupported,\n publishUpload: publishNotSupported,\n publishDeploy: publishNotSupported,\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  import { CliError } from '../lib/CliError';
2
- import { createOutput } from '../lib/out';
2
+ import { createOutput } from '../lib/createOutput';
3
3
  import { awsPlatformDriver } from './aws';
4
4
  import { dockerPlatformDriver } from './docker';
5
5
  import { QpqDeployPlatform } from './types';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platforms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,SAAS,CAAC;AAE/D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AAErC,MAAM,eAAe,GAAsC;IACzD,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,iBAAiB;IAC1C,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,oBAAoB;CACjD,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAqB,EAAE;IACvE,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,4BAA4B,QAAQ,2BAA2B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/H,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,cAAc,SAAS,CAAC","sourcesContent":["import { CliError } from '../lib/CliError';\nimport { createOutput } from '../lib/out';\nimport { awsPlatformDriver } from './aws';\nimport { dockerPlatformDriver } from './docker';\nimport { QpqDeployPlatform, QpqPlatformDriver } from './types';\n\nconst out = createOutput('platform');\n\nconst platformDrivers: Record<string, QpqPlatformDriver> = {\n [QpqDeployPlatform.aws]: awsPlatformDriver,\n [QpqDeployPlatform.docker]: dockerPlatformDriver,\n};\n\nexport const getPlatformDriver = (platform: string): QpqPlatformDriver => {\n const driver = platformDrivers[platform];\n\n if (!driver) {\n throw new CliError(`Unknown deploy platform '${platform}'. Supported platforms: ${Object.keys(platformDrivers).join(', ')}`);\n }\n\n return driver;\n};\n\nexport * from './types';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platforms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAqB,MAAM,SAAS,CAAC;AAE/D,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AAErC,MAAM,eAAe,GAAsC;IACzD,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,iBAAiB;IAC1C,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,oBAAoB;CACjD,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAqB,EAAE;IACvE,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAAC,4BAA4B,QAAQ,2BAA2B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/H,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,cAAc,SAAS,CAAC","sourcesContent":["import { CliError } from '../lib/CliError';\nimport { createOutput } from '../lib/createOutput';\nimport { awsPlatformDriver } from './aws';\nimport { dockerPlatformDriver } from './docker';\nimport { QpqDeployPlatform, QpqPlatformDriver } from './types';\n\nconst out = createOutput('platform');\n\nconst platformDrivers: Record<string, QpqPlatformDriver> = {\n [QpqDeployPlatform.aws]: awsPlatformDriver,\n [QpqDeployPlatform.docker]: dockerPlatformDriver,\n};\n\nexport const getPlatformDriver = (platform: string): QpqPlatformDriver => {\n const driver = platformDrivers[platform];\n\n if (!driver) {\n throw new CliError(`Unknown deploy platform '${platform}'. Supported platforms: ${Object.keys(platformDrivers).join(', ')}`);\n }\n\n return driver;\n};\n\nexport * from './types';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qpqjs/cli",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "The qpq CLI: build, dev and deploy orchestration for quidproquo apps.",
5
5
  "main": "./lib/commonjs/index.js",
6
6
  "module": "./lib/esm/index.js",
@@ -55,15 +55,15 @@
55
55
  "@aws-sdk/client-s3": "^3.1093.0",
56
56
  "@aws-sdk/client-sts": "^3.1093.0",
57
57
  "@inquirer/prompts": "^8.5.2",
58
- "@qpqjs/actionprocessor-aws": "0.4.0",
59
- "@qpqjs/actionprocessor-node": "0.4.0",
60
- "@qpqjs/config-aws": "0.4.0",
61
- "@qpqjs/core": "0.4.0",
62
- "@qpqjs/deploy-aws": "0.4.0",
63
- "@qpqjs/deploy-rspack": "0.4.0",
64
- "@qpqjs/dev-server": "0.4.0",
65
- "@qpqjs/user-script": "0.4.0",
66
- "@qpqjs/webserver": "0.4.0",
58
+ "@qpqjs/actionprocessor-aws": "0.6.0",
59
+ "@qpqjs/actionprocessor-node": "0.6.0",
60
+ "@qpqjs/config-aws": "0.6.0",
61
+ "@qpqjs/core": "0.6.0",
62
+ "@qpqjs/deploy-aws": "0.6.0",
63
+ "@qpqjs/deploy-rspack": "0.6.0",
64
+ "@qpqjs/dev-server": "0.6.0",
65
+ "@qpqjs/user-script": "0.6.0",
66
+ "@qpqjs/webserver": "0.6.0",
67
67
  "@rspack/dev-server": "^2.1.0",
68
68
  "aws-cdk": "^2.1146.1",
69
69
  "madge": "^8.0.0",
@@ -73,7 +73,7 @@
73
73
  "devDependencies": {
74
74
  "@rspack/core": "^2.1.2",
75
75
  "@types/node": "^22.13.13",
76
- "@qpqjs/tsconfig": "0.4.0"
76
+ "@qpqjs/tsconfig": "0.6.0"
77
77
  },
78
78
  "bin": {
79
79
  "qpq": "./lib/commonjs/bin/qpq.js"
@@ -1 +0,0 @@
1
- {"version":3,"file":"out.js","sourceRoot":"","sources":["../../../src/lib/out.ts"],"names":[],"mappings":";;;AAaA,6FAA6F;AAC7F,qFAAqF;AAC9E,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IACnD,MAAM,MAAM,GAAG,QAAQ,IAAI,GAAG,CAAC;IAE/B,6FAA6F;IAC7F,yFAAyF;IACzF,qFAAqF;IACrF,MAAM,UAAU,GAAG,CAAC,MAAyC,EAAS,EAAE;QACtE,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE;YAClB,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;YAE/B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC;QACtB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;QAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC,CAAC;AA1BW,QAAA,YAAY,gBA0BvB","sourcesContent":["/* eslint-disable no-console */\ntype Print = (...parts: unknown[]) => void;\n\nexport type Output = {\n log: Print;\n info: Print;\n warn: Print;\n error: Print;\n // A named stopwatch, printed on end.\n time: (label: string) => void;\n timeEnd: (label: string) => void;\n};\n\n// Every line the cli prints carries `[qpq:<area>]`, so output from the concurrent and nested\n// commands reads as one program. This is the only place the cli touches the console.\nexport const createOutput = (area: string): Output => {\n const prefix = `[qpq:${area}]`;\n\n // A leading string is joined onto the prefix; anything else (an error, an object) is printed\n // after it as its own argument so the console keeps formatting it. The console method is\n // looked up per call, not captured, so a test can spy on it after this module loads.\n const withPrefix = (method: 'log' | 'info' | 'warn' | 'error'): Print => {\n return (...parts) => {\n const [first, ...rest] = parts;\n\n if (typeof first === 'string') {\n return console[method](`${prefix} ${first}`, ...rest);\n }\n\n return console[method](prefix, ...parts);\n };\n };\n\n return {\n log: withPrefix('log'),\n info: withPrefix('info'),\n warn: withPrefix('warn'),\n error: withPrefix('error'),\n time: (label) => console.time(`${prefix} ${label}`),\n timeEnd: (label) => console.timeEnd(`${prefix} ${label}`),\n };\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"out.js","sourceRoot":"","sources":["../../../src/lib/out.ts"],"names":[],"mappings":"AAaA,6FAA6F;AAC7F,qFAAqF;AACrF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAU,EAAE;IACnD,MAAM,MAAM,GAAG,QAAQ,IAAI,GAAG,CAAC;IAE/B,6FAA6F;IAC7F,yFAAyF;IACzF,qFAAqF;IACrF,MAAM,UAAU,GAAG,CAAC,MAAyC,EAAS,EAAE;QACtE,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE;YAClB,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;YAE/B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;YACxD,CAAC;YAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC;QACtB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;QAC1B,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/* eslint-disable no-console */\ntype Print = (...parts: unknown[]) => void;\n\nexport type Output = {\n log: Print;\n info: Print;\n warn: Print;\n error: Print;\n // A named stopwatch, printed on end.\n time: (label: string) => void;\n timeEnd: (label: string) => void;\n};\n\n// Every line the cli prints carries `[qpq:<area>]`, so output from the concurrent and nested\n// commands reads as one program. This is the only place the cli touches the console.\nexport const createOutput = (area: string): Output => {\n const prefix = `[qpq:${area}]`;\n\n // A leading string is joined onto the prefix; anything else (an error, an object) is printed\n // after it as its own argument so the console keeps formatting it. The console method is\n // looked up per call, not captured, so a test can spy on it after this module loads.\n const withPrefix = (method: 'log' | 'info' | 'warn' | 'error'): Print => {\n return (...parts) => {\n const [first, ...rest] = parts;\n\n if (typeof first === 'string') {\n return console[method](`${prefix} ${first}`, ...rest);\n }\n\n return console[method](prefix, ...parts);\n };\n };\n\n return {\n log: withPrefix('log'),\n info: withPrefix('info'),\n warn: withPrefix('warn'),\n error: withPrefix('error'),\n time: (label) => console.time(`${prefix} ${label}`),\n timeEnd: (label) => console.timeEnd(`${prefix} ${label}`),\n };\n};\n"]}