quidproquo-cli 0.1.5

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 (268) hide show
  1. package/README.md +3 -0
  2. package/docker/cdk-deployer/Dockerfile +13 -0
  3. package/docker/dev-server/Dockerfile +48 -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/index.d.ts +1 -0
  11. package/lib/commonjs/cli/index.js +18 -0
  12. package/lib/commonjs/cli/index.js.map +1 -0
  13. package/lib/commonjs/cli/runCli.d.ts +1 -0
  14. package/lib/commonjs/cli/runCli.js +80 -0
  15. package/lib/commonjs/cli/runCli.js.map +1 -0
  16. package/lib/commonjs/commands/go.d.ts +1 -0
  17. package/lib/commonjs/commands/go.js +28 -0
  18. package/lib/commonjs/commands/go.js.map +1 -0
  19. package/lib/commonjs/commands/goDev.d.ts +1 -0
  20. package/lib/commonjs/commands/goDev.js +143 -0
  21. package/lib/commonjs/commands/goDev.js.map +1 -0
  22. package/lib/commonjs/commands/goDevWeb.d.ts +1 -0
  23. package/lib/commonjs/commands/goDevWeb.js +122 -0
  24. package/lib/commonjs/commands/goDevWeb.js.map +1 -0
  25. package/lib/commonjs/commands/goDocker.d.ts +1 -0
  26. package/lib/commonjs/commands/goDocker.js +32 -0
  27. package/lib/commonjs/commands/goDocker.js.map +1 -0
  28. package/lib/commonjs/commands/hooks.d.ts +1 -0
  29. package/lib/commonjs/commands/hooks.js +26 -0
  30. package/lib/commonjs/commands/hooks.js.map +1 -0
  31. package/lib/commonjs/commands/prep.d.ts +1 -0
  32. package/lib/commonjs/commands/prep.js +28 -0
  33. package/lib/commonjs/commands/prep.js.map +1 -0
  34. package/lib/commonjs/commands/publish.d.ts +4 -0
  35. package/lib/commonjs/commands/publish.js +54 -0
  36. package/lib/commonjs/commands/publish.js.map +1 -0
  37. package/lib/commonjs/commands/synth.d.ts +1 -0
  38. package/lib/commonjs/commands/synth.js +79 -0
  39. package/lib/commonjs/commands/synth.js.map +1 -0
  40. package/lib/commonjs/commands/teardown.d.ts +1 -0
  41. package/lib/commonjs/commands/teardown.js +33 -0
  42. package/lib/commonjs/commands/teardown.js.map +1 -0
  43. package/lib/commonjs/index.d.ts +1 -0
  44. package/lib/commonjs/index.js +18 -0
  45. package/lib/commonjs/index.js.map +1 -0
  46. package/lib/commonjs/lib/args.d.ts +2 -0
  47. package/lib/commonjs/lib/args.js +21 -0
  48. package/lib/commonjs/lib/args.js.map +1 -0
  49. package/lib/commonjs/lib/deployEnv.d.ts +6 -0
  50. package/lib/commonjs/lib/deployEnv.js +76 -0
  51. package/lib/commonjs/lib/deployEnv.js.map +1 -0
  52. package/lib/commonjs/lib/deployPrompts.d.ts +25 -0
  53. package/lib/commonjs/lib/deployPrompts.js +83 -0
  54. package/lib/commonjs/lib/deployPrompts.js.map +1 -0
  55. package/lib/commonjs/lib/devServerEntry.d.ts +1 -0
  56. package/lib/commonjs/lib/devServerEntry.js +53 -0
  57. package/lib/commonjs/lib/devServerEntry.js.map +1 -0
  58. package/lib/commonjs/lib/discovery.d.ts +10 -0
  59. package/lib/commonjs/lib/discovery.js +56 -0
  60. package/lib/commonjs/lib/discovery.js.map +1 -0
  61. package/lib/commonjs/lib/hooks.d.ts +2 -0
  62. package/lib/commonjs/lib/hooks.js +45 -0
  63. package/lib/commonjs/lib/hooks.js.map +1 -0
  64. package/lib/commonjs/lib/packageRoot.d.ts +1 -0
  65. package/lib/commonjs/lib/packageRoot.js +21 -0
  66. package/lib/commonjs/lib/packageRoot.js.map +1 -0
  67. package/lib/commonjs/lib/prompts.d.ts +3 -0
  68. package/lib/commonjs/lib/prompts.js +64 -0
  69. package/lib/commonjs/lib/prompts.js.map +1 -0
  70. package/lib/commonjs/lib/qpqConfigs.d.ts +3 -0
  71. package/lib/commonjs/lib/qpqConfigs.js +19 -0
  72. package/lib/commonjs/lib/qpqConfigs.js.map +1 -0
  73. package/lib/commonjs/lib/resolveAppSelection.d.ts +6 -0
  74. package/lib/commonjs/lib/resolveAppSelection.js +58 -0
  75. package/lib/commonjs/lib/resolveAppSelection.js.map +1 -0
  76. package/lib/commonjs/lib/rspackRun.d.ts +2 -0
  77. package/lib/commonjs/lib/rspackRun.js +23 -0
  78. package/lib/commonjs/lib/rspackRun.js.map +1 -0
  79. package/lib/commonjs/lib/runCommand.d.ts +13 -0
  80. package/lib/commonjs/lib/runCommand.js +78 -0
  81. package/lib/commonjs/lib/runCommand.js.map +1 -0
  82. package/lib/commonjs/lib/runTasks.d.ts +10 -0
  83. package/lib/commonjs/lib/runTasks.js +42 -0
  84. package/lib/commonjs/lib/runTasks.js.map +1 -0
  85. package/lib/commonjs/lib/timing.d.ts +2 -0
  86. package/lib/commonjs/lib/timing.js +11 -0
  87. package/lib/commonjs/lib/timing.js.map +1 -0
  88. package/lib/commonjs/lib/views.d.ts +2 -0
  89. package/lib/commonjs/lib/views.js +32 -0
  90. package/lib/commonjs/lib/views.js.map +1 -0
  91. package/lib/commonjs/platforms/aws/awsCredentials.d.ts +1 -0
  92. package/lib/commonjs/platforms/aws/awsCredentials.js +28 -0
  93. package/lib/commonjs/platforms/aws/awsCredentials.js.map +1 -0
  94. package/lib/commonjs/platforms/aws/cdkApp.d.ts +2 -0
  95. package/lib/commonjs/platforms/aws/cdkApp.js +19 -0
  96. package/lib/commonjs/platforms/aws/cdkApp.js.map +1 -0
  97. package/lib/commonjs/platforms/aws/go.d.ts +2 -0
  98. package/lib/commonjs/platforms/aws/go.js +116 -0
  99. package/lib/commonjs/platforms/aws/go.js.map +1 -0
  100. package/lib/commonjs/platforms/aws/goDocker.d.ts +2 -0
  101. package/lib/commonjs/platforms/aws/goDocker.js +287 -0
  102. package/lib/commonjs/platforms/aws/goDocker.js.map +1 -0
  103. package/lib/commonjs/platforms/aws/identity.d.ts +2 -0
  104. package/lib/commonjs/platforms/aws/identity.js +26 -0
  105. package/lib/commonjs/platforms/aws/identity.js.map +1 -0
  106. package/lib/commonjs/platforms/aws/index.d.ts +2 -0
  107. package/lib/commonjs/platforms/aws/index.js +19 -0
  108. package/lib/commonjs/platforms/aws/index.js.map +1 -0
  109. package/lib/commonjs/platforms/aws/publish.d.ts +4 -0
  110. package/lib/commonjs/platforms/aws/publish.js +66 -0
  111. package/lib/commonjs/platforms/aws/publish.js.map +1 -0
  112. package/lib/commonjs/platforms/aws/remote.d.ts +11 -0
  113. package/lib/commonjs/platforms/aws/remote.js +106 -0
  114. package/lib/commonjs/platforms/aws/remote.js.map +1 -0
  115. package/lib/commonjs/platforms/aws/stacks.d.ts +7 -0
  116. package/lib/commonjs/platforms/aws/stacks.js +91 -0
  117. package/lib/commonjs/platforms/aws/stacks.js.map +1 -0
  118. package/lib/commonjs/platforms/aws/teardown.d.ts +2 -0
  119. package/lib/commonjs/platforms/aws/teardown.js +59 -0
  120. package/lib/commonjs/platforms/aws/teardown.js.map +1 -0
  121. package/lib/commonjs/platforms/aws/viewsSync.d.ts +2 -0
  122. package/lib/commonjs/platforms/aws/viewsSync.js +39 -0
  123. package/lib/commonjs/platforms/aws/viewsSync.js.map +1 -0
  124. package/lib/commonjs/platforms/docker/go.d.ts +2 -0
  125. package/lib/commonjs/platforms/docker/go.js +160 -0
  126. package/lib/commonjs/platforms/docker/go.js.map +1 -0
  127. package/lib/commonjs/platforms/docker/index.d.ts +2 -0
  128. package/lib/commonjs/platforms/docker/index.js +27 -0
  129. package/lib/commonjs/platforms/docker/index.js.map +1 -0
  130. package/lib/commonjs/platforms/index.d.ts +4 -0
  131. package/lib/commonjs/platforms/index.js +39 -0
  132. package/lib/commonjs/platforms/index.js.map +1 -0
  133. package/lib/commonjs/platforms/types.d.ts +16 -0
  134. package/lib/commonjs/platforms/types.js +9 -0
  135. package/lib/commonjs/platforms/types.js.map +1 -0
  136. package/lib/esm/bin/qpq.d.ts +2 -0
  137. package/lib/esm/bin/qpq.js +4 -0
  138. package/lib/esm/bin/qpq.js.map +1 -0
  139. package/lib/esm/bin/qpqCdkApp.d.ts +1 -0
  140. package/lib/esm/bin/qpqCdkApp.js +6 -0
  141. package/lib/esm/bin/qpqCdkApp.js.map +1 -0
  142. package/lib/esm/cli/index.d.ts +1 -0
  143. package/lib/esm/cli/index.js +2 -0
  144. package/lib/esm/cli/index.js.map +1 -0
  145. package/lib/esm/cli/runCli.d.ts +1 -0
  146. package/lib/esm/cli/runCli.js +67 -0
  147. package/lib/esm/cli/runCli.js.map +1 -0
  148. package/lib/esm/commands/go.d.ts +1 -0
  149. package/lib/esm/commands/go.js +15 -0
  150. package/lib/esm/commands/go.js.map +1 -0
  151. package/lib/esm/commands/goDev.d.ts +1 -0
  152. package/lib/esm/commands/goDev.js +127 -0
  153. package/lib/esm/commands/goDev.js.map +1 -0
  154. package/lib/esm/commands/goDevWeb.d.ts +1 -0
  155. package/lib/esm/commands/goDevWeb.js +107 -0
  156. package/lib/esm/commands/goDevWeb.js.map +1 -0
  157. package/lib/esm/commands/goDocker.d.ts +1 -0
  158. package/lib/esm/commands/goDocker.js +19 -0
  159. package/lib/esm/commands/goDocker.js.map +1 -0
  160. package/lib/esm/commands/hooks.d.ts +1 -0
  161. package/lib/esm/commands/hooks.js +13 -0
  162. package/lib/esm/commands/hooks.js.map +1 -0
  163. package/lib/esm/commands/prep.d.ts +1 -0
  164. package/lib/esm/commands/prep.js +15 -0
  165. package/lib/esm/commands/prep.js.map +1 -0
  166. package/lib/esm/commands/publish.d.ts +4 -0
  167. package/lib/esm/commands/publish.js +38 -0
  168. package/lib/esm/commands/publish.js.map +1 -0
  169. package/lib/esm/commands/synth.d.ts +1 -0
  170. package/lib/esm/commands/synth.js +63 -0
  171. package/lib/esm/commands/synth.js.map +1 -0
  172. package/lib/esm/commands/teardown.d.ts +1 -0
  173. package/lib/esm/commands/teardown.js +20 -0
  174. package/lib/esm/commands/teardown.js.map +1 -0
  175. package/lib/esm/index.d.ts +1 -0
  176. package/lib/esm/index.js +2 -0
  177. package/lib/esm/index.js.map +1 -0
  178. package/lib/esm/lib/args.d.ts +2 -0
  179. package/lib/esm/lib/args.js +16 -0
  180. package/lib/esm/lib/args.js.map +1 -0
  181. package/lib/esm/lib/deployEnv.d.ts +6 -0
  182. package/lib/esm/lib/deployEnv.js +60 -0
  183. package/lib/esm/lib/deployEnv.js.map +1 -0
  184. package/lib/esm/lib/deployPrompts.d.ts +25 -0
  185. package/lib/esm/lib/deployPrompts.js +69 -0
  186. package/lib/esm/lib/deployPrompts.js.map +1 -0
  187. package/lib/esm/lib/devServerEntry.d.ts +1 -0
  188. package/lib/esm/lib/devServerEntry.js +46 -0
  189. package/lib/esm/lib/devServerEntry.js.map +1 -0
  190. package/lib/esm/lib/discovery.d.ts +10 -0
  191. package/lib/esm/lib/discovery.js +40 -0
  192. package/lib/esm/lib/discovery.js.map +1 -0
  193. package/lib/esm/lib/hooks.d.ts +2 -0
  194. package/lib/esm/lib/hooks.js +27 -0
  195. package/lib/esm/lib/hooks.js.map +1 -0
  196. package/lib/esm/lib/packageRoot.d.ts +1 -0
  197. package/lib/esm/lib/packageRoot.js +14 -0
  198. package/lib/esm/lib/packageRoot.js.map +1 -0
  199. package/lib/esm/lib/prompts.d.ts +3 -0
  200. package/lib/esm/lib/prompts.js +16 -0
  201. package/lib/esm/lib/prompts.js.map +1 -0
  202. package/lib/esm/lib/qpqConfigs.d.ts +3 -0
  203. package/lib/esm/lib/qpqConfigs.js +14 -0
  204. package/lib/esm/lib/qpqConfigs.js.map +1 -0
  205. package/lib/esm/lib/resolveAppSelection.d.ts +6 -0
  206. package/lib/esm/lib/resolveAppSelection.js +45 -0
  207. package/lib/esm/lib/resolveAppSelection.js.map +1 -0
  208. package/lib/esm/lib/rspackRun.d.ts +2 -0
  209. package/lib/esm/lib/rspackRun.js +19 -0
  210. package/lib/esm/lib/rspackRun.js.map +1 -0
  211. package/lib/esm/lib/runCommand.d.ts +13 -0
  212. package/lib/esm/lib/runCommand.js +69 -0
  213. package/lib/esm/lib/runCommand.js.map +1 -0
  214. package/lib/esm/lib/runTasks.d.ts +10 -0
  215. package/lib/esm/lib/runTasks.js +28 -0
  216. package/lib/esm/lib/runTasks.js.map +1 -0
  217. package/lib/esm/lib/timing.d.ts +2 -0
  218. package/lib/esm/lib/timing.js +6 -0
  219. package/lib/esm/lib/timing.js.map +1 -0
  220. package/lib/esm/lib/views.d.ts +2 -0
  221. package/lib/esm/lib/views.js +15 -0
  222. package/lib/esm/lib/views.js.map +1 -0
  223. package/lib/esm/platforms/aws/awsCredentials.d.ts +1 -0
  224. package/lib/esm/platforms/aws/awsCredentials.js +15 -0
  225. package/lib/esm/platforms/aws/awsCredentials.js.map +1 -0
  226. package/lib/esm/platforms/aws/cdkApp.d.ts +2 -0
  227. package/lib/esm/platforms/aws/cdkApp.js +11 -0
  228. package/lib/esm/platforms/aws/cdkApp.js.map +1 -0
  229. package/lib/esm/platforms/aws/go.d.ts +2 -0
  230. package/lib/esm/platforms/aws/go.js +100 -0
  231. package/lib/esm/platforms/aws/go.js.map +1 -0
  232. package/lib/esm/platforms/aws/goDocker.d.ts +2 -0
  233. package/lib/esm/platforms/aws/goDocker.js +271 -0
  234. package/lib/esm/platforms/aws/goDocker.js.map +1 -0
  235. package/lib/esm/platforms/aws/identity.d.ts +2 -0
  236. package/lib/esm/platforms/aws/identity.js +22 -0
  237. package/lib/esm/platforms/aws/identity.js.map +1 -0
  238. package/lib/esm/platforms/aws/index.d.ts +2 -0
  239. package/lib/esm/platforms/aws/index.js +16 -0
  240. package/lib/esm/platforms/aws/index.js.map +1 -0
  241. package/lib/esm/platforms/aws/publish.d.ts +4 -0
  242. package/lib/esm/platforms/aws/publish.js +50 -0
  243. package/lib/esm/platforms/aws/publish.js.map +1 -0
  244. package/lib/esm/platforms/aws/remote.d.ts +11 -0
  245. package/lib/esm/platforms/aws/remote.js +90 -0
  246. package/lib/esm/platforms/aws/remote.js.map +1 -0
  247. package/lib/esm/platforms/aws/stacks.d.ts +7 -0
  248. package/lib/esm/platforms/aws/stacks.js +69 -0
  249. package/lib/esm/platforms/aws/stacks.js.map +1 -0
  250. package/lib/esm/platforms/aws/teardown.d.ts +2 -0
  251. package/lib/esm/platforms/aws/teardown.js +46 -0
  252. package/lib/esm/platforms/aws/teardown.js.map +1 -0
  253. package/lib/esm/platforms/aws/viewsSync.d.ts +2 -0
  254. package/lib/esm/platforms/aws/viewsSync.js +25 -0
  255. package/lib/esm/platforms/aws/viewsSync.js.map +1 -0
  256. package/lib/esm/platforms/docker/go.d.ts +2 -0
  257. package/lib/esm/platforms/docker/go.js +143 -0
  258. package/lib/esm/platforms/docker/go.js.map +1 -0
  259. package/lib/esm/platforms/docker/index.d.ts +2 -0
  260. package/lib/esm/platforms/docker/index.js +15 -0
  261. package/lib/esm/platforms/docker/index.js.map +1 -0
  262. package/lib/esm/platforms/index.d.ts +4 -0
  263. package/lib/esm/platforms/index.js +20 -0
  264. package/lib/esm/platforms/index.js.map +1 -0
  265. package/lib/esm/platforms/types.d.ts +16 -0
  266. package/lib/esm/platforms/types.js +6 -0
  267. package/lib/esm/platforms/types.js.map +1 -0
  268. package/package.json +63 -0
@@ -0,0 +1,26 @@
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.hooksCommand = void 0;
13
+ // `qpq hooks <name>` — run the `qpq:<name>` script of every app that defines
14
+ // one (apps/<app>/package.json). Wire the root package.json's lifecycle to it,
15
+ // e.g. "postinstall": "qpq hooks postinstall".
16
+ const hooks_1 = require("../lib/hooks");
17
+ const hooksCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
18
+ const [hook] = argv.filter((a) => !a.startsWith('--'));
19
+ if (!hook) {
20
+ console.error('Usage: qpq hooks <name> (runs qpq:<name> in every app that defines it)');
21
+ process.exit(1);
22
+ }
23
+ yield (0, hooks_1.runAppHookForAllApps)(hook);
24
+ });
25
+ exports.hooksCommand = hooksCommand;
26
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/commands/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,+CAA+C;AAC/C,wCAAoD;AAE7C,MAAM,YAAY,GAAG,CAAO,IAAc,EAAiB,EAAE;IAClE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAA,4BAAoB,EAAC,IAAI,CAAC,CAAC;AACnC,CAAC,CAAA,CAAC;AATW,QAAA,YAAY,gBASvB","sourcesContent":["// `qpq hooks <name>` — run the `qpq:<name>` script of every app that defines\n// one (apps/<app>/package.json). Wire the root package.json's lifecycle to it,\n// e.g. \"postinstall\": \"qpq hooks postinstall\".\nimport { runAppHookForAllApps } from '../lib/hooks';\n\nexport const hooksCommand = async (argv: string[]): Promise<void> => {\n const [hook] = argv.filter((a) => !a.startsWith('--'));\n\n if (!hook) {\n console.error('Usage: qpq hooks <name> (runs qpq:<name> in every app that defines it)');\n process.exit(1);\n }\n\n await runAppHookForAllApps(hook);\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const prepCommand: (argv: string[]) => Promise<void>;
@@ -0,0 +1,28 @@
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.prepCommand = void 0;
13
+ // `qpq prep` — regenerates apps/<app>/tsconfig.federated.json (the TypeScript
14
+ // path aliases for cross-view federated imports). Run after adding/removing a
15
+ // `// federated.export` marker.
16
+ const quidproquo_deploy_rspack_1 = require("quidproquo-deploy-rspack");
17
+ const discovery_1 = require("../lib/discovery");
18
+ const resolveAppSelection_1 = require("../lib/resolveAppSelection");
19
+ const prepCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const selection = yield (0, resolveAppSelection_1.resolveAppSelection)({ argv, allowAll: true });
21
+ const appNames = selection === 'all' ? (0, discovery_1.getAvailableApps)() : [selection];
22
+ for (const appName of appNames) {
23
+ const exposeCount = (0, quidproquo_deploy_rspack_1.writeFederatedTsconfigForApp)((0, discovery_1.getRoot)(), appName);
24
+ console.log(`prep: wrote ${exposeCount} federated aliases to apps/${appName}/tsconfig.federated.json`);
25
+ }
26
+ });
27
+ exports.prepCommand = prepCommand;
28
+ //# sourceMappingURL=prep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prep.js","sourceRoot":"","sources":["../../../src/commands/prep.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,gCAAgC;AAChC,uEAAwE;AAExE,gDAA6D;AAC7D,oEAAiE;AAE1D,MAAM,WAAW,GAAG,CAAO,IAAc,EAAiB,EAAE;IACjE,MAAM,SAAS,GAAG,MAAM,IAAA,yCAAmB,EAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAA,4BAAgB,GAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAExE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAA,uDAA4B,EAAC,IAAA,mBAAO,GAAE,EAAE,OAAO,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,8BAA8B,OAAO,0BAA0B,CAAC,CAAC;IACzG,CAAC;AACH,CAAC,CAAA,CAAC;AARW,QAAA,WAAW,eAQtB","sourcesContent":["// `qpq prep` — regenerates apps/<app>/tsconfig.federated.json (the TypeScript\n// path aliases for cross-view federated imports). Run after adding/removing a\n// `// federated.export` marker.\nimport { writeFederatedTsconfigForApp } from 'quidproquo-deploy-rspack';\n\nimport { getAvailableApps, getRoot } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\nexport const prepCommand = async (argv: string[]): Promise<void> => {\n const selection = await resolveAppSelection({ argv, allowAll: true });\n const appNames = selection === 'all' ? getAvailableApps() : [selection];\n\n for (const appName of appNames) {\n const exposeCount = writeFederatedTsconfigForApp(getRoot(), appName);\n console.log(`prep: wrote ${exposeCount} federated aliases to apps/${appName}/tsconfig.federated.json`);\n }\n};\n"]}
@@ -0,0 +1,4 @@
1
+ export declare const publishCommand: (argv: string[]) => Promise<void>;
2
+ export declare const publishBuildCommand: (argv: string[]) => Promise<void>;
3
+ export declare const publishUploadCommand: (argv: string[]) => Promise<void>;
4
+ export declare const publishDeployCommand: (argv: string[]) => Promise<void>;
@@ -0,0 +1,54 @@
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.publishDeployCommand = exports.publishUploadCommand = exports.publishBuildCommand = exports.publishCommand = void 0;
13
+ // `qpq publish[:build|:upload|:deploy]` — build each backend service as a
14
+ // module-federation remote and publish it into the platform's federated code
15
+ // store, so the deployed backends federate their story code instead of running
16
+ // the bundled copy. The mechanics live in the platform driver (AWS: S3-backed,
17
+ // see platforms/aws/publish).
18
+ //
19
+ // Usage:
20
+ // qpq publish --app docgen (all services)
21
+ // qpq publish --app docgen --service template
22
+ const args_1 = require("../lib/args");
23
+ const deployEnv_1 = require("../lib/deployEnv");
24
+ const discovery_1 = require("../lib/discovery");
25
+ const resolveAppSelection_1 = require("../lib/resolveAppSelection");
26
+ const platforms_1 = require("../platforms");
27
+ const resolvePublishSelection = (argv) => __awaiter(void 0, void 0, void 0, function* () {
28
+ const appName = yield (0, resolveAppSelection_1.resolveAppSelection)({ argv, envVar: 'DEPLOY_APP_NAME' });
29
+ const { platform } = yield (0, deployEnv_1.resolveDeployEnvironment)(argv, appName);
30
+ const requestedService = (0, args_1.getArgValue)(argv, '--service');
31
+ const serviceNames = requestedService ? [requestedService] : (0, discovery_1.getServiceNames)(appName);
32
+ return { driver: (0, platforms_1.getPlatformDriver)(platform), appName, serviceNames };
33
+ });
34
+ const publishCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
35
+ const { driver, appName, serviceNames } = yield resolvePublishSelection(argv);
36
+ yield driver.publish(appName, serviceNames);
37
+ });
38
+ exports.publishCommand = publishCommand;
39
+ const publishBuildCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
40
+ const { driver, appName, serviceNames } = yield resolvePublishSelection(argv);
41
+ yield driver.publishBuild(appName, serviceNames);
42
+ });
43
+ exports.publishBuildCommand = publishBuildCommand;
44
+ const publishUploadCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
45
+ const { driver, appName, serviceNames } = yield resolvePublishSelection(argv);
46
+ yield driver.publishUpload(appName, serviceNames);
47
+ });
48
+ exports.publishUploadCommand = publishUploadCommand;
49
+ const publishDeployCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
50
+ const { driver, appName, serviceNames } = yield resolvePublishSelection(argv);
51
+ yield driver.publishDeploy(appName, serviceNames);
52
+ });
53
+ exports.publishDeployCommand = publishDeployCommand;
54
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/publish.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,8BAA8B;AAC9B,EAAE;AACF,SAAS;AACT,+DAA+D;AAC/D,gDAAgD;AAChD,sCAA0C;AAC1C,gDAA4D;AAC5D,gDAAmD;AACnD,oEAAiE;AACjE,4CAAoE;AAQpE,MAAM,uBAAuB,GAAG,CAAO,IAAc,EAA6B,EAAE;IAClF,MAAM,OAAO,GAAG,MAAM,IAAA,yCAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,oCAAwB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEnE,MAAM,gBAAgB,GAAG,IAAA,kBAAW,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAA,2BAAe,EAAC,OAAO,CAAC,CAAC;IAEtF,OAAO,EAAE,MAAM,EAAE,IAAA,6BAAiB,EAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACxE,CAAC,CAAA,CAAC;AAEK,MAAM,cAAc,GAAG,CAAO,IAAc,EAAiB,EAAE;IACpE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC,CAAA,CAAC;AAHW,QAAA,cAAc,kBAGzB;AAEK,MAAM,mBAAmB,GAAG,CAAO,IAAc,EAAiB,EAAE;IACzE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC,CAAA,CAAC;AAHW,QAAA,mBAAmB,uBAG9B;AAEK,MAAM,oBAAoB,GAAG,CAAO,IAAc,EAAiB,EAAE;IAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC,CAAA,CAAC;AAHW,QAAA,oBAAoB,wBAG/B;AAEK,MAAM,oBAAoB,GAAG,CAAO,IAAc,EAAiB,EAAE;IAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC,CAAA,CAAC;AAHW,QAAA,oBAAoB,wBAG/B","sourcesContent":["// `qpq publish[:build|:upload|:deploy]` — build each backend service as a\n// module-federation remote and publish it into the platform's federated code\n// store, so the deployed backends federate their story code instead of running\n// the bundled copy. The mechanics live in the platform driver (AWS: S3-backed,\n// see platforms/aws/publish).\n//\n// Usage:\n// qpq publish --app docgen (all services)\n// qpq publish --app docgen --service template\nimport { getArgValue } from '../lib/args';\nimport { resolveDeployEnvironment } from '../lib/deployEnv';\nimport { getServiceNames } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { getPlatformDriver, QpqPlatformDriver } from '../platforms';\n\ntype PublishSelection = {\n driver: QpqPlatformDriver;\n appName: string;\n serviceNames: string[];\n};\n\nconst resolvePublishSelection = async (argv: string[]): Promise<PublishSelection> => {\n const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });\n const { platform } = await resolveDeployEnvironment(argv, appName);\n\n const requestedService = getArgValue(argv, '--service');\n const serviceNames = requestedService ? [requestedService] : getServiceNames(appName);\n\n return { driver: getPlatformDriver(platform), appName, serviceNames };\n};\n\nexport const publishCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publish(appName, serviceNames);\n};\n\nexport const publishBuildCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publishBuild(appName, serviceNames);\n};\n\nexport const publishUploadCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publishUpload(appName, serviceNames);\n};\n\nexport const publishDeployCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publishDeploy(appName, serviceNames);\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const synthCommand: (argv: string[]) => Promise<void>;
@@ -0,0 +1,79 @@
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.synthCommand = void 0;
16
+ // `qpq synth [service]` — synthesizes each backend service's QPQ config to
17
+ // dist/apps/<app>/infrastructure/<module>-config.json.
18
+ //
19
+ // Runs with ts-node hooks registered (see runCli), which transpiles each
20
+ // service's infrastructure.ts on require. Cross-package `@scope/*` imports
21
+ // resolve through the workspace node_modules symlinks to already-built dist.
22
+ const quidproquo_core_1 = require("quidproquo-core");
23
+ const fs_1 = __importDefault(require("fs"));
24
+ const path_1 = __importDefault(require("path"));
25
+ const args_1 = require("../lib/args");
26
+ const deployEnv_1 = require("../lib/deployEnv");
27
+ const discovery_1 = require("../lib/discovery");
28
+ const qpqConfigs_1 = require("../lib/qpqConfigs");
29
+ const resolveAppSelection_1 = require("../lib/resolveAppSelection");
30
+ const processConfig = (folderName, appName) => {
31
+ console.log(`Processing infrastructure: [${folderName}] for app [${appName}]`);
32
+ const qpqConfig = (0, qpqConfigs_1.loadServiceQpqConfig)(appName, folderName);
33
+ const moduleName = quidproquo_core_1.qpqCoreUtils.getApplicationModuleName(qpqConfig);
34
+ const directoryPath = path_1.default.join((0, discovery_1.getRoot)(), 'dist', 'apps', appName, 'infrastructure');
35
+ fs_1.default.mkdirSync(directoryPath, { recursive: true });
36
+ fs_1.default.writeFileSync(path_1.default.join(directoryPath, `${moduleName}-config.json`), JSON.stringify(qpqConfig, null, 2));
37
+ console.log(` -> ${appName}/infrastructure/${moduleName}-config.json`);
38
+ };
39
+ const synthCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
40
+ const [specifiedServiceName] = (0, args_1.getPositionalArgs)(argv, ['--app', '--env']);
41
+ const hasExplicitApp = argv.includes('--app') || argv.some((a) => a.startsWith('--app=')) || !!process.env.npm_config_app || !!process.env.DEPLOY_APP_NAME;
42
+ let appNames;
43
+ if (specifiedServiceName && !hasExplicitApp) {
44
+ // A bare service name is unambiguous — synth it in whichever app owns it.
45
+ const appWithService = (0, discovery_1.getAvailableApps)().find((appName) => (0, discovery_1.getServiceNamesWithSubdir)(appName, 'service').includes(specifiedServiceName));
46
+ if (!appWithService) {
47
+ console.error(`Service '${specifiedServiceName}' not found in any app`);
48
+ process.exit(1);
49
+ }
50
+ appNames = [appWithService];
51
+ }
52
+ else {
53
+ const selection = yield (0, resolveAppSelection_1.resolveAppSelection)({
54
+ argv,
55
+ envVar: 'DEPLOY_APP_NAME',
56
+ allowAll: true,
57
+ });
58
+ appNames = selection === 'all' ? (0, discovery_1.getAvailableApps)() : [selection];
59
+ }
60
+ console.log(`QPQ synthesizing apps: ${appNames.join(', ')}`);
61
+ for (const appName of appNames) {
62
+ // Service configs read ENVIRONMENT / AWS_DEFAULT_* at require time. When
63
+ // invoked inside a deploy they're already primed; standalone synth primes
64
+ // them from deploy.config.json (development default).
65
+ (0, deployEnv_1.primeDeployEnvFromConfig)(appName);
66
+ const serviceNames = specifiedServiceName ? [specifiedServiceName] : (0, discovery_1.getServiceNamesWithSubdir)(appName, 'service');
67
+ for (const folderName of serviceNames) {
68
+ try {
69
+ processConfig(folderName, appName);
70
+ }
71
+ catch (error) {
72
+ console.error(`Failed to process ${folderName} in ${appName}:`, error);
73
+ process.exitCode = 1;
74
+ }
75
+ }
76
+ }
77
+ });
78
+ exports.synthCommand = synthCommand;
79
+ //# sourceMappingURL=synth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synth.js","sourceRoot":"","sources":["../../../src/commands/synth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2EAA2E;AAC3E,uDAAuD;AACvD,EAAE;AACF,yEAAyE;AACzE,2EAA2E;AAC3E,6EAA6E;AAC7E,qDAA+C;AAE/C,4CAAoB;AACpB,gDAAwB;AAExB,sCAAgD;AAChD,gDAA4D;AAC5D,gDAAwF;AACxF,kDAAyD;AACzD,oEAAiE;AAEjE,MAAM,aAAa,GAAG,CAAC,UAAkB,EAAE,OAAe,EAAQ,EAAE;IAClE,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,cAAc,OAAO,GAAG,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAA,iCAAoB,EAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,8BAAY,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAEpE,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,mBAAO,GAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACtF,YAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,YAAE,CAAC,aAAa,CAAC,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,UAAU,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5G,OAAO,CAAC,GAAG,CAAC,QAAQ,OAAO,mBAAmB,UAAU,cAAc,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEK,MAAM,YAAY,GAAG,CAAO,IAAc,EAAiB,EAAE;IAClE,MAAM,CAAC,oBAAoB,CAAC,GAAG,IAAA,wBAAiB,EAAC,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAE3E,MAAM,cAAc,GAClB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAEtI,IAAI,QAAkB,CAAC;IACvB,IAAI,oBAAoB,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5C,0EAA0E;QAC1E,MAAM,cAAc,GAAG,IAAA,4BAAgB,GAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,qCAAyB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC1I,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,YAAY,oBAAoB,wBAAwB,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,QAAQ,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,MAAM,IAAA,yCAAmB,EAAC;YAC1C,IAAI;YACJ,MAAM,EAAE,iBAAiB;YACzB,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QACH,QAAQ,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAA,4BAAgB,GAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE7D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,yEAAyE;QACzE,0EAA0E;QAC1E,sDAAsD;QACtD,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC;QAElC,MAAM,YAAY,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAA,qCAAyB,EAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEnH,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,UAAU,OAAO,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;gBACvE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAA,CAAC;AA3CW,QAAA,YAAY,gBA2CvB","sourcesContent":["// `qpq synth [service]` — synthesizes each backend service's QPQ config to\n// dist/apps/<app>/infrastructure/<module>-config.json.\n//\n// Runs with ts-node hooks registered (see runCli), which transpiles each\n// service's infrastructure.ts on require. Cross-package `@scope/*` imports\n// resolve through the workspace node_modules symlinks to already-built dist.\nimport { qpqCoreUtils } from 'quidproquo-core';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { getPositionalArgs } from '../lib/args';\nimport { primeDeployEnvFromConfig } from '../lib/deployEnv';\nimport { getAvailableApps, getRoot, getServiceNamesWithSubdir } from '../lib/discovery';\nimport { loadServiceQpqConfig } from '../lib/qpqConfigs';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\nconst processConfig = (folderName: string, appName: string): void => {\n console.log(`Processing infrastructure: [${folderName}] for app [${appName}]`);\n const qpqConfig = loadServiceQpqConfig(appName, folderName);\n const moduleName = qpqCoreUtils.getApplicationModuleName(qpqConfig);\n\n const directoryPath = path.join(getRoot(), 'dist', 'apps', appName, 'infrastructure');\n fs.mkdirSync(directoryPath, { recursive: true });\n fs.writeFileSync(path.join(directoryPath, `${moduleName}-config.json`), JSON.stringify(qpqConfig, null, 2));\n console.log(` -> ${appName}/infrastructure/${moduleName}-config.json`);\n};\n\nexport const synthCommand = async (argv: string[]): Promise<void> => {\n const [specifiedServiceName] = getPositionalArgs(argv, ['--app', '--env']);\n\n const hasExplicitApp =\n argv.includes('--app') || argv.some((a) => a.startsWith('--app=')) || !!process.env.npm_config_app || !!process.env.DEPLOY_APP_NAME;\n\n let appNames: string[];\n if (specifiedServiceName && !hasExplicitApp) {\n // A bare service name is unambiguous — synth it in whichever app owns it.\n const appWithService = getAvailableApps().find((appName) => getServiceNamesWithSubdir(appName, 'service').includes(specifiedServiceName));\n if (!appWithService) {\n console.error(`Service '${specifiedServiceName}' not found in any app`);\n process.exit(1);\n }\n appNames = [appWithService];\n } else {\n const selection = await resolveAppSelection({\n argv,\n envVar: 'DEPLOY_APP_NAME',\n allowAll: true,\n });\n appNames = selection === 'all' ? getAvailableApps() : [selection];\n }\n\n console.log(`QPQ synthesizing apps: ${appNames.join(', ')}`);\n\n for (const appName of appNames) {\n // Service configs read ENVIRONMENT / AWS_DEFAULT_* at require time. When\n // invoked inside a deploy they're already primed; standalone synth primes\n // them from deploy.config.json (development default).\n primeDeployEnvFromConfig(appName);\n\n const serviceNames = specifiedServiceName ? [specifiedServiceName] : getServiceNamesWithSubdir(appName, 'service');\n\n for (const folderName of serviceNames) {\n try {\n processConfig(folderName, appName);\n } catch (error) {\n console.error(`Failed to process ${folderName} in ${appName}:`, error);\n process.exitCode = 1;\n }\n }\n }\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const teardownCommand: (argv: string[]) => Promise<void>;
@@ -0,0 +1,33 @@
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.teardownCommand = void 0;
13
+ // `qpq teardown` — interactive destroy, the counterpart of `qpq go`. Resolves
14
+ // the app + environment the same way, asks which services to tear down (with
15
+ // a typed confirmation — this deletes stored data), then hands off to the
16
+ // platform driver to destroy the web, api and inf stacks in that order.
17
+ const deployEnv_1 = require("../lib/deployEnv");
18
+ const deployPrompts_1 = require("../lib/deployPrompts");
19
+ const resolveAppSelection_1 = require("../lib/resolveAppSelection");
20
+ const platforms_1 = require("../platforms");
21
+ const teardownCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
22
+ const appName = yield (0, resolveAppSelection_1.resolveAppSelection)({ argv, envVar: 'DEPLOY_APP_NAME' });
23
+ const { platform } = yield (0, deployEnv_1.resolveDeployEnvironment)(argv, appName);
24
+ const driver = (0, platforms_1.getPlatformDriver)(platform);
25
+ if (!driver.teardown) {
26
+ console.error(`The '${platform}' platform has no teardown strategy.`);
27
+ process.exit(1);
28
+ }
29
+ const plan = yield (0, deployPrompts_1.promptTeardownPlan)(appName);
30
+ yield driver.teardown(appName, plan);
31
+ });
32
+ exports.teardownCommand = teardownCommand;
33
+ //# sourceMappingURL=teardown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../src/commands/teardown.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,wEAAwE;AACxE,gDAA4D;AAC5D,wDAA0D;AAC1D,oEAAiE;AACjE,4CAAiD;AAE1C,MAAM,eAAe,GAAG,CAAO,IAAc,EAAiB,EAAE;IACrE,MAAM,OAAO,GAAG,MAAM,IAAA,yCAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAA,oCAAwB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,QAAQ,sCAAsC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAA,kCAAkB,EAAC,OAAO,CAAC,CAAC;IAE/C,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC,CAAA,CAAC;AAbW,QAAA,eAAe,mBAa1B","sourcesContent":["// `qpq teardown` — interactive destroy, the counterpart of `qpq go`. Resolves\n// the app + environment the same way, asks which services to tear down (with\n// a typed confirmation — this deletes stored data), then hands off to the\n// platform driver to destroy the web, api and inf stacks in that order.\nimport { resolveDeployEnvironment } from '../lib/deployEnv';\nimport { promptTeardownPlan } from '../lib/deployPrompts';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { getPlatformDriver } from '../platforms';\n\nexport const teardownCommand = async (argv: string[]): Promise<void> => {\n const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });\n const { platform } = await resolveDeployEnvironment(argv, appName);\n const driver = getPlatformDriver(platform);\n\n if (!driver.teardown) {\n console.error(`The '${platform}' platform has no teardown strategy.`);\n process.exit(1);\n }\n\n const plan = await promptTeardownPlan(appName);\n\n await driver.teardown(appName, plan);\n};\n"]}
@@ -0,0 +1 @@
1
+ export * from './cli';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cli"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wCAAsB","sourcesContent":["export * from './cli';\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const getArgValue: (argv: string[], flag: string) => string | undefined;
2
+ export declare const getPositionalArgs: (argv: string[], valueFlags: string[]) => string[];
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPositionalArgs = exports.getArgValue = void 0;
4
+ // Flag parsing over the command's argv (everything after the command name).
5
+ const getArgValue = (argv, flag) => {
6
+ const eq = argv.find((a) => a.startsWith(`${flag}=`));
7
+ if (eq)
8
+ return eq.slice(`${flag}=`.length);
9
+ const idx = argv.indexOf(flag);
10
+ return idx >= 0 ? argv[idx + 1] : undefined;
11
+ };
12
+ exports.getArgValue = getArgValue;
13
+ // Positional args = non-flag args, skipping values consumed by known flags.
14
+ const getPositionalArgs = (argv, valueFlags) => argv.filter((arg, index) => {
15
+ if (arg.startsWith('--'))
16
+ return false;
17
+ const previous = argv[index - 1];
18
+ return !(previous && valueFlags.includes(previous));
19
+ });
20
+ exports.getPositionalArgs = getPositionalArgs;
21
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/args.ts"],"names":[],"mappings":";;;AAAA,4EAA4E;AACrE,MAAM,WAAW,GAAG,CAAC,IAAc,EAAE,IAAY,EAAsB,EAAE;IAC9E,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACtD,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC,CAAC;AALW,QAAA,WAAW,eAKtB;AAEF,4EAA4E;AACrE,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAE,UAAoB,EAAY,EAAE,CAClF,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;IACzB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC;AALQ,QAAA,iBAAiB,qBAKzB","sourcesContent":["// Flag parsing over the command's argv (everything after the command name).\nexport const getArgValue = (argv: string[], flag: string): string | undefined => {\n const eq = argv.find((a) => a.startsWith(`${flag}=`));\n if (eq) return eq.slice(`${flag}=`.length);\n const idx = argv.indexOf(flag);\n return idx >= 0 ? argv[idx + 1] : undefined;\n};\n\n// Positional args = non-flag args, skipping values consumed by known flags.\nexport const getPositionalArgs = (argv: string[], valueFlags: string[]): string[] =>\n argv.filter((arg, index) => {\n if (arg.startsWith('--')) return false;\n const previous = argv[index - 1];\n return !(previous && valueFlags.includes(previous));\n });\n"]}
@@ -0,0 +1,6 @@
1
+ export declare const primeDeployEnvFromConfig: (appName: string, defaultEnvironment?: string) => void;
2
+ export interface ResolvedDeployEnvironment {
3
+ environment: string;
4
+ platform: string;
5
+ }
6
+ export declare const resolveDeployEnvironment: (argv: string[], appName: string) => Promise<ResolvedDeployEnvironment>;
@@ -0,0 +1,76 @@
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.resolveDeployEnvironment = exports.primeDeployEnvFromConfig = void 0;
13
+ const quidproquo_deploy_awscdk_1 = require("quidproquo-deploy-awscdk");
14
+ const platforms_1 = require("../platforms");
15
+ const args_1 = require("./args");
16
+ const discovery_1 = require("./discovery");
17
+ const prompts_1 = require("./prompts");
18
+ // Best-effort identity priming for local dev/build commands (go:dev, synth):
19
+ // fills ENVIRONMENT and the platform driver's identity env vars from the app's
20
+ // deploy.config.json when they're unset — never prompts, never exits. Service
21
+ // configs read those env vars at load time, so this must run before any
22
+ // infrastructure.ts is required.
23
+ const primeDeployEnvFromConfig = (appName, defaultEnvironment = 'development') => {
24
+ var _a, _b;
25
+ process.env.ENVIRONMENT = process.env.ENVIRONMENT || defaultEnvironment;
26
+ try {
27
+ const deployConfig = (0, quidproquo_deploy_awscdk_1.getQpqAppDeployConfig)((0, discovery_1.getRoot)(), appName);
28
+ const target = (_a = deployConfig.environments) === null || _a === void 0 ? void 0 : _a[process.env.ENVIRONMENT];
29
+ (_b = (0, platforms_1.findPlatformDriver)((target === null || target === void 0 ? void 0 : target.platform) || platforms_1.QpqDeployPlatform.aws)) === null || _b === void 0 ? void 0 : _b.primeDeployIdentity(target);
30
+ }
31
+ catch (_c) {
32
+ // no deploy.config.json — fine for local dev
33
+ }
34
+ };
35
+ exports.primeDeployEnvFromConfig = primeDeployEnvFromConfig;
36
+ // Resolves the deploy identity for an app and primes the process environment
37
+ // with it. The app's deploy.config.json owns environment -> platform +
38
+ // identity (config-owned identity); already-set env vars win, so CI overrides
39
+ // and older setups keep working.
40
+ //
41
+ // Environment resolution: --env flag, then the sole configured environment,
42
+ // then an interactive prompt over the configured environments (a shell
43
+ // ENVIRONMENT is only the prompt's default, never a silent pick), then — for
44
+ // headless runs and configs without an environments map — ENVIRONMENT itself.
45
+ const resolveDeployEnvironment = (argv, appName) => __awaiter(void 0, void 0, void 0, function* () {
46
+ var _a, _b;
47
+ const deployConfig = (0, quidproquo_deploy_awscdk_1.getQpqAppDeployConfig)((0, discovery_1.getRoot)(), appName);
48
+ const configuredEnvironments = Object.keys((_a = deployConfig.environments) !== null && _a !== void 0 ? _a : {});
49
+ let environment = (0, args_1.getArgValue)(argv, '--env');
50
+ if (!environment && configuredEnvironments.length === 1) {
51
+ environment = configuredEnvironments[0];
52
+ console.log(`Using environment: ${environment}`);
53
+ }
54
+ if (!environment && configuredEnvironments.length > 1 && process.stdin.isTTY) {
55
+ const defaultEnvironment = process.env.ENVIRONMENT && configuredEnvironments.includes(process.env.ENVIRONMENT) ? process.env.ENVIRONMENT : undefined;
56
+ environment = yield (0, prompts_1.promptSelect)('Select environment', configuredEnvironments, defaultEnvironment);
57
+ }
58
+ if (!environment) {
59
+ environment = process.env.ENVIRONMENT;
60
+ }
61
+ if (!environment) {
62
+ console.error(`No environment selected — pass --env <name> or add "environments" to apps/${appName}/deploy.config.json`);
63
+ process.exit(1);
64
+ }
65
+ process.env.ENVIRONMENT = environment;
66
+ const target = (_b = deployConfig.environments) === null || _b === void 0 ? void 0 : _b[environment];
67
+ const platform = (0, args_1.getArgValue)(argv, '--platform') || (target === null || target === void 0 ? void 0 : target.platform) || platforms_1.QpqDeployPlatform.aws;
68
+ const missingIdentity = (0, platforms_1.getPlatformDriver)(platform).primeDeployIdentity(target);
69
+ if (missingIdentity.length > 0) {
70
+ console.error(`Deploy identity for environment '${environment}' (platform '${platform}') is incomplete — missing ${missingIdentity.join(', ')}. Add it to apps/${appName}/deploy.config.json under "environments".`);
71
+ process.exit(1);
72
+ }
73
+ return { environment, platform };
74
+ });
75
+ exports.resolveDeployEnvironment = resolveDeployEnvironment;
76
+ //# sourceMappingURL=deployEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployEnv.js","sourceRoot":"","sources":["../../../src/lib/deployEnv.ts"],"names":[],"mappings":"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","sourcesContent":["import { getQpqAppDeployConfig } from 'quidproquo-deploy-awscdk';\n\nimport { findPlatformDriver, getPlatformDriver, QpqDeployPlatform } from '../platforms';\nimport { getArgValue } from './args';\nimport { getRoot } from './discovery';\nimport { promptSelect } from './prompts';\n\n// Best-effort identity priming for local dev/build commands (go:dev, synth):\n// fills ENVIRONMENT and the platform driver's identity env vars from the app's\n// deploy.config.json when they're unset — never prompts, never exits. Service\n// configs read those env vars at load time, so this must run before any\n// infrastructure.ts is required.\nexport const primeDeployEnvFromConfig = (appName: string, defaultEnvironment = 'development'): void => {\n process.env.ENVIRONMENT = process.env.ENVIRONMENT || defaultEnvironment;\n\n try {\n const deployConfig = getQpqAppDeployConfig(getRoot(), appName);\n const target = deployConfig.environments?.[process.env.ENVIRONMENT];\n\n findPlatformDriver(target?.platform || QpqDeployPlatform.aws)?.primeDeployIdentity(target);\n } catch {\n // no deploy.config.json — fine for local dev\n }\n};\n\nexport interface ResolvedDeployEnvironment {\n environment: string;\n // The deploy platform driver for this environment: --platform flag, then\n // the environment's \"platform\" in deploy.config.json, then aws.\n platform: string;\n}\n\n// Resolves the deploy identity for an app and primes the process environment\n// with it. The app's deploy.config.json owns environment -> platform +\n// identity (config-owned identity); already-set env vars win, so CI overrides\n// and older setups keep working.\n//\n// Environment resolution: --env flag, then the sole configured environment,\n// then an interactive prompt over the configured environments (a shell\n// ENVIRONMENT is only the prompt's default, never a silent pick), then — for\n// headless runs and configs without an environments map — ENVIRONMENT itself.\nexport const resolveDeployEnvironment = async (argv: string[], appName: string): Promise<ResolvedDeployEnvironment> => {\n const deployConfig = getQpqAppDeployConfig(getRoot(), appName);\n const configuredEnvironments = Object.keys(deployConfig.environments ?? {});\n\n let environment = getArgValue(argv, '--env');\n\n if (!environment && configuredEnvironments.length === 1) {\n environment = configuredEnvironments[0];\n console.log(`Using environment: ${environment}`);\n }\n\n if (!environment && configuredEnvironments.length > 1 && process.stdin.isTTY) {\n const defaultEnvironment =\n process.env.ENVIRONMENT && configuredEnvironments.includes(process.env.ENVIRONMENT) ? process.env.ENVIRONMENT : undefined;\n environment = await promptSelect('Select environment', configuredEnvironments, defaultEnvironment);\n }\n\n if (!environment) {\n environment = process.env.ENVIRONMENT;\n }\n\n if (!environment) {\n console.error(`No environment selected — pass --env <name> or add \"environments\" to apps/${appName}/deploy.config.json`);\n process.exit(1);\n }\n\n process.env.ENVIRONMENT = environment;\n\n const target = deployConfig.environments?.[environment];\n const platform = getArgValue(argv, '--platform') || target?.platform || QpqDeployPlatform.aws;\n\n const missingIdentity = getPlatformDriver(platform).primeDeployIdentity(target);\n if (missingIdentity.length > 0) {\n console.error(\n `Deploy identity for environment '${environment}' (platform '${platform}') is incomplete — missing ${missingIdentity.join(', ')}. Add it to apps/${appName}/deploy.config.json under \"environments\".`,\n );\n process.exit(1);\n }\n\n return { environment, platform };\n};\n"]}
@@ -0,0 +1,25 @@
1
+ export type StackType = 'all' | 'inf' | 'api' | 'web' | 'views';
2
+ export type DeployPlan = {
3
+ kind: 'cancelled';
4
+ } | {
5
+ kind: 'account';
6
+ appName: string;
7
+ } | {
8
+ kind: 'bootstrap';
9
+ appName: string;
10
+ includeDomain: boolean;
11
+ } | {
12
+ kind: 'services';
13
+ appName: string;
14
+ services: string[];
15
+ stacks: StackType;
16
+ };
17
+ export declare const promptDeployPlan: (appName: string) => Promise<DeployPlan>;
18
+ export type TeardownPlan = {
19
+ kind: 'cancelled';
20
+ } | {
21
+ kind: 'services';
22
+ appName: string;
23
+ services: string[];
24
+ };
25
+ export declare const promptTeardownPlan: (appName: string) => Promise<TeardownPlan>;
@@ -0,0 +1,83 @@
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.promptTeardownPlan = exports.promptDeployPlan = void 0;
13
+ // The interactive question flow shared by `qpq go` (sequential AWS deploy) and
14
+ // a future dockerized variant: pick an app, confirm the target, pick services
15
+ // (or domain/bootstrap), pick stacks.
16
+ const discovery_1 = require("./discovery");
17
+ const prompts_1 = require("./prompts");
18
+ const promptDeployPlan = (appName) => __awaiter(void 0, void 0, void 0, function* () {
19
+ const deployInfo = process.env.ACTOR_NAME
20
+ ? `${appName}-${process.env.ENVIRONMENT}-${process.env.ACTOR_NAME}`
21
+ : `${appName}-${process.env.ENVIRONMENT}`;
22
+ if (!(yield (0, prompts_1.promptYesNo)(`Deploying to: [${deployInfo}]`))) {
23
+ console.log('Exiting!');
24
+ return { kind: 'cancelled' };
25
+ }
26
+ let services = [];
27
+ do {
28
+ const allServices = (0, discovery_1.getServiceNames)(appName);
29
+ // Bracketed so the meta options can't be mistaken for actual services.
30
+ const allText = '[ all ]';
31
+ const accountText = '[ account ]';
32
+ const domainEnvText = '[ domain ]';
33
+ const bootstrapEnvText = '[ bootstrap environment ]';
34
+ const service = yield (0, prompts_1.promptSelect)('Select services to deploy', [allText, ...allServices, accountText, domainEnvText, bootstrapEnvText]);
35
+ if (service === allText) {
36
+ services = allServices;
37
+ break;
38
+ }
39
+ if (service === accountText) {
40
+ return { kind: 'account', appName };
41
+ }
42
+ if (service === domainEnvText) {
43
+ return { kind: 'bootstrap', appName, includeDomain: true };
44
+ }
45
+ if (service === bootstrapEnvText) {
46
+ return { kind: 'bootstrap', appName, includeDomain: false };
47
+ }
48
+ services.push(service);
49
+ } while (yield (0, prompts_1.promptYesNo)('Do you want to deploy another service?'));
50
+ services = [...new Set(services)];
51
+ const stacks = (yield (0, prompts_1.promptSelect)('Stacks to deploy', ['all', 'inf', 'api', 'web', 'views']));
52
+ return { kind: 'services', appName, services, stacks };
53
+ });
54
+ exports.promptDeployPlan = promptDeployPlan;
55
+ // The question flow for `qpq teardown`: pick services, then type the deploy
56
+ // target back to confirm — destroying inf stacks takes user data (key value
57
+ // stores, user directories) with it, so a y/n prompt isn't enough friction.
58
+ const promptTeardownPlan = (appName) => __awaiter(void 0, void 0, void 0, function* () {
59
+ const deployInfo = process.env.ACTOR_NAME
60
+ ? `${appName}-${process.env.ENVIRONMENT}-${process.env.ACTOR_NAME}`
61
+ : `${appName}-${process.env.ENVIRONMENT}`;
62
+ let services = [];
63
+ do {
64
+ const allServices = (0, discovery_1.getServiceNames)(appName);
65
+ const allText = '[ all ]';
66
+ const service = yield (0, prompts_1.promptSelect)('Select services to tear down', [allText, ...allServices]);
67
+ if (service === allText) {
68
+ services = allServices;
69
+ break;
70
+ }
71
+ services.push(service);
72
+ } while (yield (0, prompts_1.promptYesNo)('Do you want to tear down another service?'));
73
+ services = [...new Set(services)];
74
+ console.log(`\nThis will DESTROY the web, api and inf stacks (including all stored data) for: ${services.join(', ')}`);
75
+ const confirmation = yield (0, prompts_1.promptText)(`Type '${deployInfo}' to confirm`);
76
+ if (confirmation !== deployInfo) {
77
+ console.log('Confirmation did not match. Exiting!');
78
+ return { kind: 'cancelled' };
79
+ }
80
+ return { kind: 'services', appName, services };
81
+ });
82
+ exports.promptTeardownPlan = promptTeardownPlan;
83
+ //# sourceMappingURL=deployPrompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployPrompts.js","sourceRoot":"","sources":["../../../src/lib/deployPrompts.ts"],"names":[],"mappings":"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","sourcesContent":["// The interactive question flow shared by `qpq go` (sequential AWS deploy) and\n// a future dockerized variant: pick an app, confirm the target, pick services\n// (or domain/bootstrap), pick stacks.\nimport { getServiceNames } from './discovery';\nimport { promptSelect, promptText, promptYesNo } from './prompts';\n\nexport type StackType = 'all' | 'inf' | 'api' | 'web' | 'views';\n\nexport type DeployPlan =\n | { kind: 'cancelled' }\n // Deploy only the account-level guardrails stack (one per AWS account).\n | { kind: 'account'; appName: string }\n // Deploy the bootstrap stack (and optionally the domain stack first).\n | { kind: 'bootstrap'; appName: string; includeDomain: boolean }\n // Deploy the selected stacks for the selected services.\n | {\n kind: 'services';\n appName: string;\n services: string[];\n stacks: StackType;\n };\n\nexport const promptDeployPlan = async (appName: string): Promise<DeployPlan> => {\n const deployInfo = process.env.ACTOR_NAME\n ? `${appName}-${process.env.ENVIRONMENT}-${process.env.ACTOR_NAME}`\n : `${appName}-${process.env.ENVIRONMENT}`;\n\n if (!(await promptYesNo(`Deploying to: [${deployInfo}]`))) {\n console.log('Exiting!');\n return { kind: 'cancelled' };\n }\n\n let services: string[] = [];\n\n do {\n const allServices = getServiceNames(appName);\n\n // Bracketed so the meta options can't be mistaken for actual services.\n const allText = '[ all ]';\n const accountText = '[ account ]';\n const domainEnvText = '[ domain ]';\n const bootstrapEnvText = '[ bootstrap environment ]';\n\n const service = await promptSelect('Select services to deploy', [allText, ...allServices, accountText, domainEnvText, bootstrapEnvText]);\n\n if (service === allText) {\n services = allServices;\n break;\n }\n if (service === accountText) {\n return { kind: 'account', appName };\n }\n if (service === domainEnvText) {\n return { kind: 'bootstrap', appName, includeDomain: true };\n }\n if (service === bootstrapEnvText) {\n return { kind: 'bootstrap', appName, includeDomain: false };\n }\n\n services.push(service);\n } while (await promptYesNo('Do you want to deploy another service?'));\n\n services = [...new Set(services)];\n\n const stacks = (await promptSelect('Stacks to deploy', ['all', 'inf', 'api', 'web', 'views'])) as StackType;\n\n return { kind: 'services', appName, services, stacks };\n};\n\nexport type TeardownPlan =\n | { kind: 'cancelled' }\n // Destroy the web, api and inf stacks for the selected services.\n | { kind: 'services'; appName: string; services: string[] };\n\n// The question flow for `qpq teardown`: pick services, then type the deploy\n// target back to confirm — destroying inf stacks takes user data (key value\n// stores, user directories) with it, so a y/n prompt isn't enough friction.\nexport const promptTeardownPlan = async (appName: string): Promise<TeardownPlan> => {\n const deployInfo = process.env.ACTOR_NAME\n ? `${appName}-${process.env.ENVIRONMENT}-${process.env.ACTOR_NAME}`\n : `${appName}-${process.env.ENVIRONMENT}`;\n\n let services: string[] = [];\n\n do {\n const allServices = getServiceNames(appName);\n const allText = '[ all ]';\n\n const service = await promptSelect('Select services to tear down', [allText, ...allServices]);\n\n if (service === allText) {\n services = allServices;\n break;\n }\n\n services.push(service);\n } while (await promptYesNo('Do you want to tear down another service?'));\n\n services = [...new Set(services)];\n\n console.log(`\\nThis will DESTROY the web, api and inf stacks (including all stored data) for: ${services.join(', ')}`);\n const confirmation = await promptText(`Type '${deployInfo}' to confirm`);\n\n if (confirmation !== deployInfo) {\n console.log('Confirmation did not match. Exiting!');\n return { kind: 'cancelled' };\n }\n\n return { kind: 'services', appName, services };\n};\n"]}
@@ -0,0 +1 @@
1
+ export declare const writeDevServerEntry: (root: string, appName: string) => string;