@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
@@ -11,10 +11,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.runCli = void 0;
13
13
  const CliError_1 = require("../lib/CliError");
14
- const out_1 = require("../lib/out");
14
+ const createOutput_1 = require("../lib/createOutput");
15
15
  const commandMenu_1 = require("./commandMenu");
16
16
  const commandRegistry_1 = require("./commandRegistry");
17
- const out = (0, out_1.createOutput)('cli');
17
+ const out = (0, createOutput_1.createOutput)('cli');
18
18
  // Service infrastructure.ts files (and app config fragments) are TypeScript, so
19
19
  // register ts-node's transpile-only require hook so the CLI can require them
20
20
  // directly, using the consumer root's tsconfig.json ts-node settings.
@@ -1 +1 @@
1
- {"version":3,"file":"runCli.js","sourceRoot":"","sources":["../../../src/cli/runCli.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,8CAA2C;AAC3C,oCAA0C;AAC1C,+CAAsD;AACtD,uDAAwE;AAExE,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,KAAK,CAAC,CAAC;AAEhC,gFAAgF;AAChF,6EAA6E;AAC7E,sEAAsE;AACtE,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,mEAAmE;AACnE,4EAA4E;AAC5E,MAAM,cAAc,GAAG,GAAS,EAAE;IAChC,iEAAiE;IACjE,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,wEAAwE;AACxE,iCAAiC;AACjC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC;AAE7G,0EAA0E;AAC1E,4EAA4E;AAC5E,MAAM,2BAA2B,GAAG,GAA4E,EAAE;IAChH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,mCAAqB,EAAC,6BAAW,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC;AAEK,MAAM,MAAM,GAAG,CAAO,IAAc,EAAiB,EAAE;IAC5D,MAAM,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;IAExC,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,IAAA,4BAAU,GAAE,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAI,OAA+B,CAAC;IACpC,IAAI,WAAW,GAAa,EAAE,CAAC;IAE/B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,2EAA2E;QAC3E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAA,4BAAU,GAAE,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,2BAA2B,EAAE,CAAC;QAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,6BAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAC1D,WAAW,GAAG,QAAQ,CAAC;QAEvB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;YAC7C,GAAG,CAAC,GAAG,CAAC,IAAA,4BAAU,GAAE,CAAC,CAAC;YACtB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,cAAc,EAAE,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,mBAAQ,EAAE,CAAC;YAC9B,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAClC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAA,CAAC;AAnDW,QAAA,MAAM,UAmDjB","sourcesContent":["import { Nullable } from '@qpqjs/core';\n\nimport { CliError } from '../lib/CliError';\nimport { createOutput } from '../lib/out';\nimport { promptCommandFromMenu } from './commandMenu';\nimport { buildUsage, CliCommand, cliCommands } from './commandRegistry';\n\nconst out = createOutput('cli');\n\n// Service infrastructure.ts files (and app config fragments) are TypeScript, so\n// register ts-node's transpile-only require hook so the CLI can require them\n// directly, using the consumer root's tsconfig.json ts-node settings.\n//\n// CONTRACT: JavaScript apps (create-qpq-app --language javascript) also lean\n// on this hook, their tsconfig.json ts-node block sets allowJs (so their\n// ESM-syntax infrastructure.js compiles at require time) and scope/scopeDir\n// (so the hook never touches quidproquo libs outside the app). Any\n// replacement for ts-node here must honour those consumer tsconfig options.\nconst registerTsNode = (): void => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require('ts-node').register({ transpileOnly: true });\n};\n\n// Inquirer throws ExitPromptError on ctrl-c; treat that as a quiet exit\n// rather than a command failure.\nconst isPromptExit = (error: unknown): boolean => error instanceof Error && error.name === 'ExitPromptError';\n\n// Bare `qpq` on a terminal: drill through the command menu, gathering any\n// arguments the picked command needs. Returns null when the user bails out.\nconst resolveCommandInteractively = async (): Promise<Nullable<{ command: CliCommand; commandArgv: string[] }>> => {\n try {\n const command = await promptCommandFromMenu(cliCommands);\n const commandArgv = command.promptArgs ? await command.promptArgs() : [];\n\n return { command, commandArgv };\n } catch (error) {\n if (isPromptExit(error)) {\n return null;\n }\n\n throw error;\n }\n};\n\nexport const runCli = async (argv: string[]): Promise<void> => {\n const [commandName, ...argvRest] = argv;\n\n if (commandName === 'help' || commandName === '--help') {\n out.log(buildUsage());\n return;\n }\n\n let command: CliCommand | undefined;\n let commandArgv: string[] = [];\n\n if (!commandName) {\n // Only prompt on a real terminal; piped/CI invocations get the usage text.\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n out.log(buildUsage());\n return;\n }\n\n const resolved = await resolveCommandInteractively();\n\n if (!resolved) {\n return;\n }\n\n ({ command, commandArgv } = resolved);\n } else {\n command = cliCommands.find((c) => c.name === commandName);\n commandArgv = argvRest;\n\n if (!command) {\n out.error(`Unknown command: ${commandName}`);\n out.log(buildUsage());\n process.exitCode = 1;\n return;\n }\n }\n\n registerTsNode();\n\n try {\n await command.run(commandArgv);\n } catch (error) {\n if (error instanceof CliError) {\n out.error(error.message);\n process.exitCode = error.exitCode;\n return;\n }\n\n out.error(`qpq ${command.name} failed:`, error);\n process.exitCode = 1;\n }\n};\n"]}
1
+ {"version":3,"file":"runCli.js","sourceRoot":"","sources":["../../../src/cli/runCli.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,8CAA2C;AAC3C,sDAAmD;AACnD,+CAAsD;AACtD,uDAAwE;AAExE,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,KAAK,CAAC,CAAC;AAEhC,gFAAgF;AAChF,6EAA6E;AAC7E,sEAAsE;AACtE,EAAE;AACF,6EAA6E;AAC7E,yEAAyE;AACzE,4EAA4E;AAC5E,mEAAmE;AACnE,4EAA4E;AAC5E,MAAM,cAAc,GAAG,GAAS,EAAE;IAChC,iEAAiE;IACjE,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,wEAAwE;AACxE,iCAAiC;AACjC,MAAM,YAAY,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,CAAC;AAE7G,0EAA0E;AAC1E,4EAA4E;AAC5E,MAAM,2BAA2B,GAAG,GAA4E,EAAE;IAChH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,mCAAqB,EAAC,6BAAW,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEzE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC;AAEK,MAAM,MAAM,GAAG,CAAO,IAAc,EAAiB,EAAE;IAC5D,MAAM,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC;IAExC,IAAI,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,IAAA,4BAAU,GAAE,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAI,OAA+B,CAAC;IACpC,IAAI,WAAW,GAAa,EAAE,CAAC;IAE/B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,2EAA2E;QAC3E,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClD,GAAG,CAAC,GAAG,CAAC,IAAA,4BAAU,GAAE,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,2BAA2B,EAAE,CAAC;QAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,6BAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QAC1D,WAAW,GAAG,QAAQ,CAAC;QAEvB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;YAC7C,GAAG,CAAC,GAAG,CAAC,IAAA,4BAAU,GAAE,CAAC,CAAC;YACtB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,cAAc,EAAE,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,mBAAQ,EAAE,CAAC;YAC9B,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAClC,OAAO;QACT,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC,CAAA,CAAC;AAnDW,QAAA,MAAM,UAmDjB","sourcesContent":["import { Nullable } from '@qpqjs/core';\n\nimport { CliError } from '../lib/CliError';\nimport { createOutput } from '../lib/createOutput';\nimport { promptCommandFromMenu } from './commandMenu';\nimport { buildUsage, CliCommand, cliCommands } from './commandRegistry';\n\nconst out = createOutput('cli');\n\n// Service infrastructure.ts files (and app config fragments) are TypeScript, so\n// register ts-node's transpile-only require hook so the CLI can require them\n// directly, using the consumer root's tsconfig.json ts-node settings.\n//\n// CONTRACT: JavaScript apps (create-qpq-app --language javascript) also lean\n// on this hook, their tsconfig.json ts-node block sets allowJs (so their\n// ESM-syntax infrastructure.js compiles at require time) and scope/scopeDir\n// (so the hook never touches quidproquo libs outside the app). Any\n// replacement for ts-node here must honour those consumer tsconfig options.\nconst registerTsNode = (): void => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n require('ts-node').register({ transpileOnly: true });\n};\n\n// Inquirer throws ExitPromptError on ctrl-c; treat that as a quiet exit\n// rather than a command failure.\nconst isPromptExit = (error: unknown): boolean => error instanceof Error && error.name === 'ExitPromptError';\n\n// Bare `qpq` on a terminal: drill through the command menu, gathering any\n// arguments the picked command needs. Returns null when the user bails out.\nconst resolveCommandInteractively = async (): Promise<Nullable<{ command: CliCommand; commandArgv: string[] }>> => {\n try {\n const command = await promptCommandFromMenu(cliCommands);\n const commandArgv = command.promptArgs ? await command.promptArgs() : [];\n\n return { command, commandArgv };\n } catch (error) {\n if (isPromptExit(error)) {\n return null;\n }\n\n throw error;\n }\n};\n\nexport const runCli = async (argv: string[]): Promise<void> => {\n const [commandName, ...argvRest] = argv;\n\n if (commandName === 'help' || commandName === '--help') {\n out.log(buildUsage());\n return;\n }\n\n let command: CliCommand | undefined;\n let commandArgv: string[] = [];\n\n if (!commandName) {\n // Only prompt on a real terminal; piped/CI invocations get the usage text.\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n out.log(buildUsage());\n return;\n }\n\n const resolved = await resolveCommandInteractively();\n\n if (!resolved) {\n return;\n }\n\n ({ command, commandArgv } = resolved);\n } else {\n command = cliCommands.find((c) => c.name === commandName);\n commandArgv = argvRest;\n\n if (!command) {\n out.error(`Unknown command: ${commandName}`);\n out.log(buildUsage());\n process.exitCode = 1;\n return;\n }\n }\n\n registerTsNode();\n\n try {\n await command.run(commandArgv);\n } catch (error) {\n if (error instanceof CliError) {\n out.error(error.message);\n process.exitCode = error.exitCode;\n return;\n }\n\n out.error(`qpq ${command.name} failed:`, error);\n process.exitCode = 1;\n }\n};\n"]}
@@ -16,9 +16,9 @@ exports.checkCircularCommand = void 0;
16
16
  // QPQ_CIRCULAR_DEPS_WARN=1 is a temporary escape hatch that reports without
17
17
  // failing while fixing.
18
18
  const circularImports_1 = require("../lib/circularImports");
19
+ const createOutput_1 = require("../lib/createOutput");
19
20
  const discovery_1 = require("../lib/discovery");
20
- const out_1 = require("../lib/out");
21
- const out = (0, out_1.createOutput)('check:circular');
21
+ const out = (0, createOutput_1.createOutput)('check:circular');
22
22
  // madge reports every distinct loop path; one tangled module can produce dozens
23
23
  // of chains through the same files. Merge chains that share any file into one
24
24
  // group so the report shows each tangle once, with its full blast radius.
@@ -1 +1 @@
1
- {"version":3,"file":"checkCircular.js","sourceRoot":"","sources":["../../../src/commands/checkCircular.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq check:circular`, scan every workspace's src for circular imports (the\n// class of bug that TDZ-crashes ESM bundles and silently drops exports under\n// CJS). Cycles fail the command (exit 1), they are never acceptable; --warn or\n// QPQ_CIRCULAR_DEPS_WARN=1 is a temporary escape hatch that reports without\n// failing while fixing.\nimport { findWorkspaceImportCycles, ImportCycle } from '../lib/circularImports';\nimport { getRoot } from '../lib/discovery';\nimport { createOutput } from '../lib/out';\n\nconst out = createOutput('check:circular');\n\ntype CycleGroup = { files: string[]; chainCount: number };\n\n// madge reports every distinct loop path; one tangled module can produce dozens\n// of chains through the same files. Merge chains that share any file into one\n// group so the report shows each tangle once, with its full blast radius.\nconst groupCycles = (cycles: ImportCycle[]): CycleGroup[] => {\n const parent = new Map<string, string>();\n\n const find = (file: string): string => {\n const found = parent.get(file) ?? file;\n if (found === file) {\n return file;\n }\n const rootFile = find(found);\n parent.set(file, rootFile);\n return rootFile;\n };\n\n for (const cycle of cycles) {\n const [first] = cycle;\n if (first === undefined) continue;\n for (const file of cycle) {\n parent.set(find(file), find(first));\n }\n }\n\n const groups = new Map<string, CycleGroup>();\n for (const cycle of cycles) {\n const [first] = cycle;\n if (first === undefined) continue;\n const key = find(first);\n const group = groups.get(key) ?? { files: [], chainCount: 0 };\n group.chainCount += 1;\n group.files = [...new Set([...group.files, ...cycle])];\n groups.set(key, group);\n }\n\n return [...groups.values()];\n};\n\nexport const checkCircularCommand = async (argv: string[]): Promise<void> => {\n const warnOnly = argv.includes('--warn') || !!process.env.QPQ_CIRCULAR_DEPS_WARN;\n\n const cycles = await findWorkspaceImportCycles(getRoot());\n\n if (cycles.length === 0) {\n out.log('check:circular: no circular imports found');\n return;\n }\n\n const groups = groupCycles(cycles);\n\n const colour = warnOnly ? '\\x1b[33m' : '\\x1b[31m';\n for (const group of groups) {\n const chainNote = group.chainCount > 1 ? `, ${group.chainCount} distinct loops` : '';\n out.warn(`${colour}Circular imports (${group.files.length} files${chainNote}):\\n ${group.files.join('\\n ')}\\x1b[0m`);\n }\n out.warn(`${colour}check:circular: ${groups.length} circular import group(s) found (${cycles.length} loops)\\x1b[0m`);\n\n if (!warnOnly) {\n process.exitCode = 1;\n }\n};\n"]}
1
+ {"version":3,"file":"checkCircular.js","sourceRoot":"","sources":["../../../src/commands/checkCircular.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq check:circular`, scan every workspace's src for circular imports (the\n// class of bug that TDZ-crashes ESM bundles and silently drops exports under\n// CJS). Cycles fail the command (exit 1), they are never acceptable; --warn or\n// QPQ_CIRCULAR_DEPS_WARN=1 is a temporary escape hatch that reports without\n// failing while fixing.\nimport { findWorkspaceImportCycles, ImportCycle } from '../lib/circularImports';\nimport { createOutput } from '../lib/createOutput';\nimport { getRoot } from '../lib/discovery';\n\nconst out = createOutput('check:circular');\n\ntype CycleGroup = { files: string[]; chainCount: number };\n\n// madge reports every distinct loop path; one tangled module can produce dozens\n// of chains through the same files. Merge chains that share any file into one\n// group so the report shows each tangle once, with its full blast radius.\nconst groupCycles = (cycles: ImportCycle[]): CycleGroup[] => {\n const parent = new Map<string, string>();\n\n const find = (file: string): string => {\n const found = parent.get(file) ?? file;\n if (found === file) {\n return file;\n }\n const rootFile = find(found);\n parent.set(file, rootFile);\n return rootFile;\n };\n\n for (const cycle of cycles) {\n const [first] = cycle;\n if (first === undefined) continue;\n for (const file of cycle) {\n parent.set(find(file), find(first));\n }\n }\n\n const groups = new Map<string, CycleGroup>();\n for (const cycle of cycles) {\n const [first] = cycle;\n if (first === undefined) continue;\n const key = find(first);\n const group = groups.get(key) ?? { files: [], chainCount: 0 };\n group.chainCount += 1;\n group.files = [...new Set([...group.files, ...cycle])];\n groups.set(key, group);\n }\n\n return [...groups.values()];\n};\n\nexport const checkCircularCommand = async (argv: string[]): Promise<void> => {\n const warnOnly = argv.includes('--warn') || !!process.env.QPQ_CIRCULAR_DEPS_WARN;\n\n const cycles = await findWorkspaceImportCycles(getRoot());\n\n if (cycles.length === 0) {\n out.log('check:circular: no circular imports found');\n return;\n }\n\n const groups = groupCycles(cycles);\n\n const colour = warnOnly ? '\\x1b[33m' : '\\x1b[31m';\n for (const group of groups) {\n const chainNote = group.chainCount > 1 ? `, ${group.chainCount} distinct loops` : '';\n out.warn(`${colour}Circular imports (${group.files.length} files${chainNote}):\\n ${group.files.join('\\n ')}\\x1b[0m`);\n }\n out.warn(`${colour}check:circular: ${groups.length} circular import group(s) found (${cycles.length} loops)\\x1b[0m`);\n\n if (!warnOnly) {\n process.exitCode = 1;\n }\n};\n"]}
@@ -17,14 +17,14 @@ exports.goDevCommand = void 0;
17
17
  // once here and handed to both sub-commands via QPQ_DEV_APP, the deployment
18
18
  // likewise via DEPLOY_NAME, so neither asks again; their output shares the terminal.
19
19
  const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
20
+ const createOutput_1 = require("../lib/createOutput");
20
21
  const discovery_1 = require("../lib/discovery");
21
- const out_1 = require("../lib/out");
22
22
  const resolveAppSelection_1 = require("../lib/resolveAppSelection");
23
23
  const resolveDeployment_1 = require("../lib/resolveDeployment");
24
24
  const typeWatcher_1 = require("../lib/typeWatcher");
25
25
  const goDevApi_1 = require("./goDevApi");
26
26
  const goDevWeb_1 = require("./goDevWeb");
27
- const out = (0, out_1.createOutput)('go:dev');
27
+ const out = (0, createOutput_1.createOutput)('go:dev');
28
28
  const goDevCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
29
29
  const appName = yield (0, resolveAppSelection_1.resolveAppSelection)({ argv, envVar: 'QPQ_DEV_APP' });
30
30
  process.env.QPQ_DEV_APP = appName;
@@ -1 +1 @@
1
- {"version":3,"file":"goDev.js","sourceRoot":"","sources":["../../../src/commands/goDev.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,qFAAqF;AACrF,wDAAmD;AAEnD,gDAA2C;AAC3C,oCAA0C;AAC1C,oEAAiE;AACjE,gEAA6D;AAC7D,oDAAsD;AACtD,yCAA6C;AAC7C,yCAA6C;AAE7C,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,QAAQ,CAAC,CAAC;AAE5B,MAAM,YAAY,GAAG,CAAO,IAAc,EAAiB,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,IAAA,yCAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IAClC,MAAM,IAAA,qCAAiB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEvC,uEAAuE;IACvE,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,8BAAgB,EAAC,IAAA,mBAAO,GAAE,CAAC,CAAC;IACrF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,0EAA0E;IAC1E,kCAAkC;IAClC,MAAM,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,IAAA,2BAAW,EAAC,IAAA,mBAAO,GAAE,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,MAAM,IAAA,0BAAe,EAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAA,CAAC;AAtBW,QAAA,YAAY,gBAsBvB","sourcesContent":["// `qpq go:dev`, the whole local dev stack in one process: the API dev server\n// (go:dev:api) plus every views dev server (go:dev:web), so a single ctrl+c\n// tears it all down. A background tsc watcher keeps workspace declaration\n// output fresh for the editor (--no-types to skip it). The app is resolved\n// once here and handed to both sub-commands via QPQ_DEV_APP, the deployment\n// likewise via DEPLOY_NAME, so neither asks again; their output shares the terminal.\nimport { getAllViews } from '@qpqjs/deploy-rspack';\n\nimport { getRoot } from '../lib/discovery';\nimport { createOutput } from '../lib/out';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { startTypeWatcher } from '../lib/typeWatcher';\nimport { goDevApiCommand } from './goDevApi';\nimport { goDevWebCommand } from './goDevWeb';\n\nconst out = createOutput('go:dev');\n\nexport const goDevCommand = async (argv: string[]): Promise<void> => {\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n process.env.QPQ_DEV_APP = appName;\n await resolveDeployment(argv, appName);\n\n // Editor/type freshness only: the rspack builds below bundle workspace\n // source directly, so the dev loop itself never waits on tsc.\n const typeWatcher = argv.includes('--no-types') ? null : startTypeWatcher(getRoot());\n if (typeWatcher) {\n process.on('exit', () => typeWatcher.kill());\n }\n\n // Kicks off the rspack watch and returns; the API server keeps running in\n // the background of this process.\n await goDevApiCommand(argv);\n\n if (getAllViews(getRoot(), appName).length === 0) {\n out.log('No views projects found. Running the API dev server only.');\n return;\n }\n\n await goDevWebCommand(argv, { hideStartedStatus: true });\n};\n"]}
1
+ {"version":3,"file":"goDev.js","sourceRoot":"","sources":["../../../src/commands/goDev.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,4EAA4E;AAC5E,qFAAqF;AACrF,wDAAmD;AAEnD,sDAAmD;AACnD,gDAA2C;AAC3C,oEAAiE;AACjE,gEAA6D;AAC7D,oDAAsD;AACtD,yCAA6C;AAC7C,yCAA6C;AAE7C,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,QAAQ,CAAC,CAAC;AAE5B,MAAM,YAAY,GAAG,CAAO,IAAc,EAAiB,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,IAAA,yCAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IAClC,MAAM,IAAA,qCAAiB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEvC,uEAAuE;IACvE,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,8BAAgB,EAAC,IAAA,mBAAO,GAAE,CAAC,CAAC;IACrF,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,0EAA0E;IAC1E,kCAAkC;IAClC,MAAM,IAAA,0BAAe,EAAC,IAAI,CAAC,CAAC;IAE5B,IAAI,IAAA,2BAAW,EAAC,IAAA,mBAAO,GAAE,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,MAAM,IAAA,0BAAe,EAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3D,CAAC,CAAA,CAAC;AAtBW,QAAA,YAAY,gBAsBvB","sourcesContent":["// `qpq go:dev`, the whole local dev stack in one process: the API dev server\n// (go:dev:api) plus every views dev server (go:dev:web), so a single ctrl+c\n// tears it all down. A background tsc watcher keeps workspace declaration\n// output fresh for the editor (--no-types to skip it). The app is resolved\n// once here and handed to both sub-commands via QPQ_DEV_APP, the deployment\n// likewise via DEPLOY_NAME, so neither asks again; their output shares the terminal.\nimport { getAllViews } from '@qpqjs/deploy-rspack';\n\nimport { createOutput } from '../lib/createOutput';\nimport { getRoot } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { startTypeWatcher } from '../lib/typeWatcher';\nimport { goDevApiCommand } from './goDevApi';\nimport { goDevWebCommand } from './goDevWeb';\n\nconst out = createOutput('go:dev');\n\nexport const goDevCommand = async (argv: string[]): Promise<void> => {\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n process.env.QPQ_DEV_APP = appName;\n await resolveDeployment(argv, appName);\n\n // Editor/type freshness only: the rspack builds below bundle workspace\n // source directly, so the dev loop itself never waits on tsc.\n const typeWatcher = argv.includes('--no-types') ? null : startTypeWatcher(getRoot());\n if (typeWatcher) {\n process.on('exit', () => typeWatcher.kill());\n }\n\n // Kicks off the rspack watch and returns; the API server keeps running in\n // the background of this process.\n await goDevApiCommand(argv);\n\n if (getAllViews(getRoot(), appName).length === 0) {\n out.log('No views projects found. Running the API dev server only.');\n return;\n }\n\n await goDevWebCommand(argv, { hideStartedStatus: true });\n};\n"]}
@@ -30,17 +30,17 @@ const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
30
30
  const path_1 = __importDefault(require("path"));
31
31
  const core_2 = require("@rspack/core");
32
32
  const args_1 = require("../lib/args");
33
+ const createOutput_1 = require("../lib/createOutput");
33
34
  const devServerEntry_1 = require("../lib/devServerEntry");
34
35
  const devServerPorts_1 = require("../lib/devServerPorts");
35
36
  const discovery_1 = require("../lib/discovery");
36
37
  const keepOtherDevServersFlag_1 = require("../lib/keepOtherDevServersFlag");
37
38
  const killChildWithEscalation_1 = require("../lib/killChildWithEscalation");
38
39
  const killStaleListeners_1 = require("../lib/killStaleListeners");
39
- const out_1 = require("../lib/out");
40
40
  const resolveAppSelection_1 = require("../lib/resolveAppSelection");
41
41
  const resolveDeployment_1 = require("../lib/resolveDeployment");
42
42
  const runCommand_1 = require("../lib/runCommand");
43
- const out = (0, out_1.createOutput)('go:dev:api');
43
+ const out = (0, createOutput_1.createOutput)('go:dev:api');
44
44
  // 8080/8888 are set in the generated entry; 3001 is the @qpqjs/dev-server
45
45
  // file-storage (secure URL) default port.
46
46
  const getDevServerPortList = (appName) => Object.values((0, devServerPorts_1.readDevServerPorts)(appName));
@@ -105,9 +105,10 @@ const goDevApiCommand = (argv) => __awaiter(void 0, void 0, void 0, function* ()
105
105
  void (0, killChildWithEscalation_1.killChildWithEscalation)(child);
106
106
  };
107
107
  out.log('Bundling dev server (watch mode)...');
108
- let lastHash;
108
+ let lastHash = null;
109
109
  const compiler = (0, core_2.rspack)(rspackConfig);
110
110
  compiler.watch({ aggregateTimeout: 200 }, (err, stats) => {
111
+ var _a, _b;
111
112
  if (err) {
112
113
  out.error(err);
113
114
  return;
@@ -119,10 +120,10 @@ const goDevApiCommand = (argv) => __awaiter(void 0, void 0, void 0, function* ()
119
120
  }
120
121
  // Skip no-op rebuilds (e.g. the virtual-module-triggered second compile at
121
122
  // startup): only restart when the output actually changed.
122
- if ((stats === null || stats === void 0 ? void 0 : stats.hash) === lastHash && child) {
123
+ if (((_a = stats === null || stats === void 0 ? void 0 : stats.hash) !== null && _a !== void 0 ? _a : null) === lastHash && child) {
123
124
  return;
124
125
  }
125
- lastHash = stats === null || stats === void 0 ? void 0 : stats.hash;
126
+ lastHash = (_b = stats === null || stats === void 0 ? void 0 : stats.hash) !== null && _b !== void 0 ? _b : null;
126
127
  out.log(child ? 'Rebuilt. Restarting dev server...' : 'Dev server bundled. Starting...');
127
128
  restartServer();
128
129
  });
@@ -1 +1 @@
1
- {"version":3,"file":"goDevApi.js","sourceRoot":"","sources":["../../../src/commands/goDevApi.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sEAAsE;AACtE,6EAA6E;AAC7E,4EAA4E;AAC5E,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,0DAA0D;AAC1D,EAAE;AACF,+EAA+E;AAC/E,mEAAmE;AACnE,yEAAyE;AACzE,wBAAwB;AACxB,sCAA6D;AAC7D,wDAAyF;AAGzF,gDAAwB;AACxB,uCAAsC;AAEtC,sCAAyC;AACzC,0DAAuF;AACvF,0DAA2D;AAC3D,gDAA2C;AAC3C,4EAA6E;AAC7E,4EAAyE;AACzE,kEAA4G;AAC5G,oCAA0C;AAC1C,oEAAiE;AACjE,gEAA6D;AAC7D,kDAAiD;AAEjD,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,YAAY,CAAC,CAAC;AAEvC,0EAA0E;AAC1E,0CAA0C;AAC1C,MAAM,oBAAoB,GAAG,CAAC,OAAe,EAAY,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAA,mCAAkB,EAAC,OAAO,CAAC,CAAC,CAAC;AACvG,MAAM,sBAAsB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,IAAA,2BAAoB,EAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;AAEnG,MAAM,eAAe,GAAG,CAAO,IAAc,EAAiB,EAAE;IACrE,MAAM,IAAI,GAAG,IAAA,mBAAO,GAAE,CAAC;IACvB,MAAM,OAAO,GAAG,MAAM,IAAA,yCAAmB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IAClC,MAAM,IAAA,qCAAiB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,GAAG,CAAC,GAAG,CAAC,uBAAuB,OAAO,GAAG,CAAC,CAAC;IAE3C,uEAAuE;IACvE,yEAAyE;IACzE,4EAA4E;IAC5E,yEAAyE;IACzE,4DAA4D;IAC5D,IAAI,IAAA,iBAAU,EAAC,IAAI,EAAE,qDAA2B,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,GAAG,qDAA2B,oCAAoC,CAAC,CAAC;QAC5E,IAAA,sCAAiB,EAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,sEAAsE;QACtE,sEAAsE;QACtE,+DAA+D;QAC/D,IAAA,6CAAwB,EAAC,IAAI,CAAC,CAAC;QAC/B,IAAA,uCAAkB,EAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjH,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,uCAAuB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAA,oCAAmB,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,oBAAoB,GAAG,IAAA,0CAAyB,EAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,YAAY,GAAG,IAAA,wCAAwB,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,CAAC,CAAC;IACjG,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAErC,8EAA8E;IAC9E,IAAI,KAAK,GAA2B,IAAI,CAAC;IACzC,IAAI,aAAa,GAAG,KAAK,CAAC;IAE1B,MAAM,WAAW,GAAG,GAAS,EAAE;QAC7B,KAAK,GAAG,IAAA,yBAAY,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,KAAK,GAAG,IAAI,CAAC;YACb,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,qEAAqE;gBACrE,uDAAuD;gBACvD,GAAG,CAAC,GAAG,CAAC,+BAA+B,IAAI,8BAA8B,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAS,EAAE;QAC/B,IAAI,aAAa;YAAE,OAAO;QAC1B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,WAAW,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,aAAa,GAAG,IAAI,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,aAAa,GAAG,KAAK,CAAC;YACtB,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,2EAA2E;QAC3E,2EAA2E;QAC3E,6DAA6D;QAC7D,KAAK,IAAA,iDAAuB,EAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC;IAEF,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IAC/C,IAAI,QAAmC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACvD,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QACD,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,EAAE,EAAE,CAAC;YACvB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAC3E,GAAG,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;YAClF,OAAO;QACT,CAAC;QACD,2EAA2E;QAC3E,2DAA2D;QAC3D,IAAI,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,MAAK,QAAQ,IAAI,KAAK,EAAE,CAAC;YACtC,OAAO;QACT,CAAC;QACD,QAAQ,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC;QACzF,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,4EAA4E;IAC5E,uEAAuE;IACvE,EAAE;IACF,6EAA6E;IAC7E,uEAAuE;IACvE,yEAAyE;IACzE,6EAA6E;IAC7E,oEAAoE;IACpE,2EAA2E;IAC3E,uEAAuE;IACvE,gBAAgB;IAChB,IAAI,YAAY,GAAG,KAAK,CAAC;IAEzB,MAAM,oBAAoB,GAAG,GAAwB,EAAE;QACrD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;QAEpB,aAAa,GAAG,IAAI,CAAC,CAAC,2DAA2D;QAEjF,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAA,iDAAuB,EAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAED,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAA,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,KAAK,oBAAoB,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,KAAK,oBAAoB,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AA3HW,QAAA,eAAe,mBA2H1B","sourcesContent":["// `qpq go:dev:api`, boots the QPQ local dev server. Resolves the app,\n// generates the dev-server entry, builds the rspack config, then runs rspack\n// in watch mode, restarting the server process on every successful rebuild.\n//\n// A restart is not instant: the server drains in-flight work and checkpoints\n// its stores on the way out (typically tens of ms, 5s worst case), and this\n// command waits for that before starting the replacement.\n//\n// The one thing NOT hot-reloaded is the qpq configs themselves: each service's\n// infrastructure.ts is evaluated once at launch and baked into the\n// `quidproquo-dynamic-loader` virtual module, config changes need a full\n// `go:dev:api` restart.\nimport { getDevServerDistPath, Nullable } from '@qpqjs/core';\nimport { getAppServiceQpqConfigs, getDevServerRspackConfig } from '@qpqjs/deploy-rspack';\n\nimport { ChildProcess } from 'child_process';\nimport path from 'path';\nimport { rspack } from '@rspack/core';\n\nimport { hasArgFlag } from '../lib/args';\nimport { writeDevServerEntry, writeUserScriptChildEntry } from '../lib/devServerEntry';\nimport { readDevServerPorts } from '../lib/devServerPorts';\nimport { getRoot } from '../lib/discovery';\nimport { KEEP_OTHER_DEV_SERVERS_FLAG } from '../lib/keepOtherDevServersFlag';\nimport { killChildWithEscalation } from '../lib/killChildWithEscalation';\nimport { killOtherQpqDevProcesses, killStaleListeners, reportPortHolders } from '../lib/killStaleListeners';\nimport { createOutput } from '../lib/out';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { spawnCommand } from '../lib/runCommand';\n\nconst out = createOutput('go:dev:api');\n\n// 8080/8888 are set in the generated entry; 3001 is the @qpqjs/dev-server\n// file-storage (secure URL) default port.\nconst getDevServerPortList = (appName: string): number[] => Object.values(readDevServerPorts(appName));\nconst getDevServerBundlePath = (root: string): string => path.join(getDevServerDistPath(root), 'main.js');\n\nexport const goDevApiCommand = async (argv: string[]): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n process.env.QPQ_DEV_APP = appName;\n await resolveDeployment(argv, appName);\n out.log(`Dev server for app [${appName}]`);\n\n // The sweep matches on a RELATIVE bundle path, so every checkout's dev\n // server looks like ours and a sibling worktree gets taken down with it.\n // Opting out spares it, at the cost of this one not starting: the ports are\n // the same either way, so what you get instead is EADDRINUSE. Report who\n // holds them, or that failure says nothing about the cause.\n if (hasArgFlag(argv, KEEP_OTHER_DEV_SERVERS_FLAG)) {\n out.log(`${KEEP_OTHER_DEV_SERVERS_FLAG}: leaving other dev servers alone.`);\n reportPortHolders(getDevServerPortList(appName));\n } else {\n // Catches a lingering watcher from a previous run even if its spawned\n // child already exited (see killOtherQpqDevProcesses), then the usual\n // port-based sweep for anything else still bound to our ports.\n killOtherQpqDevProcesses(root);\n killStaleListeners(getDevServerPortList(appName), (command) => command.includes(getDevServerBundlePath(root)));\n }\n\n const qpqConfigs = getAppServiceQpqConfigs(root, appName);\n const entry = writeDevServerEntry(root, appName);\n const userScriptChildEntry = writeUserScriptChildEntry(root);\n const rspackConfig = getDevServerRspackConfig({ root, entry, userScriptChildEntry, qpqConfigs });\n const bundlePath = getDevServerBundlePath(root);\n const env = { QPQ_DEV_APP: appName };\n\n // The long-lived server process (HTTP 8080 / WS 8888), restarted per rebuild.\n let child: Nullable<ChildProcess> = null;\n let restartQueued = false;\n\n const startServer = (): void => {\n child = spawnCommand('node', [bundlePath], { env });\n child.on('exit', (code) => {\n child = null;\n if (!restartQueued) {\n // Crashed (or exited) on its own, leave it down; the next successful\n // rebuild (i.e. the next file save) brings it back up.\n out.log(`Dev server exited with code ${code}. Save a file to restart it.`);\n }\n });\n };\n\n const restartServer = (): void => {\n if (restartQueued) return;\n if (!child) {\n startServer();\n return;\n }\n restartQueued = true;\n child.once('exit', () => {\n restartQueued = false;\n startServer();\n });\n\n // Not a bare kill: the server drains in-flight work before it exits, so it\n // needs asking properly and then a hard backstop if it wedges. Waiting for\n // the exit is what keeps the ports free for the replacement.\n void killChildWithEscalation(child);\n };\n\n out.log('Bundling dev server (watch mode)...');\n let lastHash: string | null | undefined;\n const compiler = rspack(rspackConfig);\n compiler.watch({ aggregateTimeout: 200 }, (err, stats) => {\n if (err) {\n out.error(err);\n return;\n }\n if (stats?.hasErrors()) {\n out.error(stats.toString({ colors: true, chunks: false, modules: false }));\n out.log('Build failed — dev server not restarted. Fix the error and save again.');\n return;\n }\n // Skip no-op rebuilds (e.g. the virtual-module-triggered second compile at\n // startup): only restart when the output actually changed.\n if (stats?.hash === lastHash && child) {\n return;\n }\n lastHash = stats?.hash;\n out.log(child ? 'Rebuilt. Restarting dev server...' : 'Dev server bundled. Starting...');\n restartServer();\n });\n\n // Wait for the server to finish draining before tearing the watcher down and\n // exiting: closing the compiler first would exit the parent while the child\n // is still writing, which is the race this whole path exists to close.\n //\n // SIGTERM as well as SIGINT, and it is load-bearing rather than symmetry for\n // its own sake. This process is a WRAPPER: the dev server that handles\n // signals and drains its work is the child it spawned. Without a handler\n // here, SIGTERM (what `docker stop` sends, and what any script stopping this\n // programmatically sends) kills the wrapper outright on the default\n // disposition, the child never gets asked to stop, and every guarantee the\n // dev server's shutdown sequence makes is bypassed. go:dev:web already\n // handles both.\n let shuttingDown = false;\n\n const handleShutdownSignal = async (): Promise<void> => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n\n restartQueued = true; // suppress the crash log / rebuild-restart on our own kill\n\n if (child) {\n await killChildWithEscalation(child);\n }\n\n compiler.close(() => process.exit(0));\n };\n\n process.on('SIGINT', () => {\n void handleShutdownSignal();\n });\n\n process.on('SIGTERM', () => {\n void handleShutdownSignal();\n });\n};\n"]}
1
+ {"version":3,"file":"goDevApi.js","sourceRoot":"","sources":["../../../src/commands/goDevApi.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:dev:api`, boots the QPQ local dev server. Resolves the app,\n// generates the dev-server entry, builds the rspack config, then runs rspack\n// in watch mode, restarting the server process on every successful rebuild.\n//\n// A restart is not instant: the server drains in-flight work and checkpoints\n// its stores on the way out (typically tens of ms, 5s worst case), and this\n// command waits for that before starting the replacement.\n//\n// The one thing NOT hot-reloaded is the qpq configs themselves: each service's\n// infrastructure.ts is evaluated once at launch and baked into the\n// `quidproquo-dynamic-loader` virtual module, config changes need a full\n// `go:dev:api` restart.\nimport { getDevServerDistPath, Nullable } from '@qpqjs/core';\nimport { getAppServiceQpqConfigs, getDevServerRspackConfig } from '@qpqjs/deploy-rspack';\n\nimport { ChildProcess } from 'child_process';\nimport path from 'path';\nimport { rspack } from '@rspack/core';\n\nimport { hasArgFlag } from '../lib/args';\nimport { createOutput } from '../lib/createOutput';\nimport { writeDevServerEntry, writeUserScriptChildEntry } from '../lib/devServerEntry';\nimport { readDevServerPorts } from '../lib/devServerPorts';\nimport { getRoot } from '../lib/discovery';\nimport { KEEP_OTHER_DEV_SERVERS_FLAG } from '../lib/keepOtherDevServersFlag';\nimport { killChildWithEscalation } from '../lib/killChildWithEscalation';\nimport { killOtherQpqDevProcesses, killStaleListeners, reportPortHolders } from '../lib/killStaleListeners';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { spawnCommand } from '../lib/runCommand';\n\nconst out = createOutput('go:dev:api');\n\n// 8080/8888 are set in the generated entry; 3001 is the @qpqjs/dev-server\n// file-storage (secure URL) default port.\nconst getDevServerPortList = (appName: string): number[] => Object.values(readDevServerPorts(appName));\nconst getDevServerBundlePath = (root: string): string => path.join(getDevServerDistPath(root), 'main.js');\n\nexport const goDevApiCommand = async (argv: string[]): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n process.env.QPQ_DEV_APP = appName;\n await resolveDeployment(argv, appName);\n out.log(`Dev server for app [${appName}]`);\n\n // The sweep matches on a RELATIVE bundle path, so every checkout's dev\n // server looks like ours and a sibling worktree gets taken down with it.\n // Opting out spares it, at the cost of this one not starting: the ports are\n // the same either way, so what you get instead is EADDRINUSE. Report who\n // holds them, or that failure says nothing about the cause.\n if (hasArgFlag(argv, KEEP_OTHER_DEV_SERVERS_FLAG)) {\n out.log(`${KEEP_OTHER_DEV_SERVERS_FLAG}: leaving other dev servers alone.`);\n reportPortHolders(getDevServerPortList(appName));\n } else {\n // Catches a lingering watcher from a previous run even if its spawned\n // child already exited (see killOtherQpqDevProcesses), then the usual\n // port-based sweep for anything else still bound to our ports.\n killOtherQpqDevProcesses(root);\n killStaleListeners(getDevServerPortList(appName), (command) => command.includes(getDevServerBundlePath(root)));\n }\n\n const qpqConfigs = getAppServiceQpqConfigs(root, appName);\n const entry = writeDevServerEntry(root, appName);\n const userScriptChildEntry = writeUserScriptChildEntry(root);\n const rspackConfig = getDevServerRspackConfig({ root, entry, userScriptChildEntry, qpqConfigs });\n const bundlePath = getDevServerBundlePath(root);\n const env = { QPQ_DEV_APP: appName };\n\n // The long-lived server process (HTTP 8080 / WS 8888), restarted per rebuild.\n let child: Nullable<ChildProcess> = null;\n let restartQueued = false;\n\n const startServer = (): void => {\n child = spawnCommand('node', [bundlePath], { env });\n child.on('exit', (code) => {\n child = null;\n if (!restartQueued) {\n // Crashed (or exited) on its own, leave it down; the next successful\n // rebuild (i.e. the next file save) brings it back up.\n out.log(`Dev server exited with code ${code}. Save a file to restart it.`);\n }\n });\n };\n\n const restartServer = (): void => {\n if (restartQueued) return;\n if (!child) {\n startServer();\n return;\n }\n restartQueued = true;\n child.once('exit', () => {\n restartQueued = false;\n startServer();\n });\n\n // Not a bare kill: the server drains in-flight work before it exits, so it\n // needs asking properly and then a hard backstop if it wedges. Waiting for\n // the exit is what keeps the ports free for the replacement.\n void killChildWithEscalation(child);\n };\n\n out.log('Bundling dev server (watch mode)...');\n let lastHash: Nullable<string> = null;\n const compiler = rspack(rspackConfig);\n compiler.watch({ aggregateTimeout: 200 }, (err, stats) => {\n if (err) {\n out.error(err);\n return;\n }\n if (stats?.hasErrors()) {\n out.error(stats.toString({ colors: true, chunks: false, modules: false }));\n out.log('Build failed — dev server not restarted. Fix the error and save again.');\n return;\n }\n // Skip no-op rebuilds (e.g. the virtual-module-triggered second compile at\n // startup): only restart when the output actually changed.\n if ((stats?.hash ?? null) === lastHash && child) {\n return;\n }\n lastHash = stats?.hash ?? null;\n out.log(child ? 'Rebuilt. Restarting dev server...' : 'Dev server bundled. Starting...');\n restartServer();\n });\n\n // Wait for the server to finish draining before tearing the watcher down and\n // exiting: closing the compiler first would exit the parent while the child\n // is still writing, which is the race this whole path exists to close.\n //\n // SIGTERM as well as SIGINT, and it is load-bearing rather than symmetry for\n // its own sake. This process is a WRAPPER: the dev server that handles\n // signals and drains its work is the child it spawned. Without a handler\n // here, SIGTERM (what `docker stop` sends, and what any script stopping this\n // programmatically sends) kills the wrapper outright on the default\n // disposition, the child never gets asked to stop, and every guarantee the\n // dev server's shutdown sequence makes is bypassed. go:dev:web already\n // handles both.\n let shuttingDown = false;\n\n const handleShutdownSignal = async (): Promise<void> => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n\n restartQueued = true; // suppress the crash log / rebuild-restart on our own kill\n\n if (child) {\n await killChildWithEscalation(child);\n }\n\n compiler.close(() => process.exit(0));\n };\n\n process.on('SIGINT', () => {\n void handleShutdownSignal();\n });\n\n process.on('SIGTERM', () => {\n void handleShutdownSignal();\n });\n};\n"]}
@@ -29,15 +29,15 @@ const core_1 = require("@rspack/core");
29
29
  const dev_server_1 = require("@rspack/dev-server");
30
30
  const args_1 = require("../lib/args");
31
31
  const args_2 = require("../lib/args");
32
+ const createOutput_1 = require("../lib/createOutput");
32
33
  const devServerPorts_1 = require("../lib/devServerPorts");
33
34
  const discovery_1 = require("../lib/discovery");
34
35
  const keepOtherDevServersFlag_1 = require("../lib/keepOtherDevServersFlag");
35
36
  const killStaleListeners_1 = require("../lib/killStaleListeners");
36
- const out_1 = require("../lib/out");
37
37
  const resolveAppSelection_1 = require("../lib/resolveAppSelection");
38
38
  const resolveDeployment_1 = require("../lib/resolveDeployment");
39
39
  const webAddressingEnv_1 = require("../lib/webAddressingEnv");
40
- const out = (0, out_1.createOutput)('go:dev:web');
40
+ const out = (0, createOutput_1.createOutput)('go:dev:web');
41
41
  const goDevWebCommand = (argv_1, ...args_3) => __awaiter(void 0, [argv_1, ...args_3], void 0, function* (argv, options = {}) {
42
42
  var _a;
43
43
  const root = (0, discovery_1.getRoot)();
@@ -103,7 +103,7 @@ const goDevWebCommand = (argv_1, ...args_3) => __awaiter(void 0, [argv_1, ...arg
103
103
  }
104
104
  const line = ` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)} \x1b[33m(started)\x1b[0m`;
105
105
  const up = linesBelowList + (views.length - index);
106
- process.stdout.write(`\x1b[${up}F\x1b[2K${line}\x1b[${up}E`);
106
+ out.rewriteLineAbove(up, line);
107
107
  };
108
108
  const pollUntilStarted = (index) => {
109
109
  const attempt = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"goDevWeb.js","sourceRoot":"","sources":["../../../src/commands/goDevWeb.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:dev:web`, boots every views microfrontend's Rspack dev server\n// in-process (shell is the MF host app, plus all remotes on their own ports).\n// Everything is served dynamically; remotes resolve at runtime via\n// mf-manifest.json on localhost ports. Programmatic, no per-views\n// rspack.config.ts or npm serve script needed.\n//\n// Usage:\n// qpq go:dev:web\n// qpq go:dev:web --only shell,design\n// qpq go:dev:web --app <name>\nimport { getAllViews, getAppServiceQpqConfigs, getViewsRspackConfig } from '@qpqjs/deploy-rspack';\n\nimport http from 'http';\nimport { rspack } from '@rspack/core';\nimport { RspackDevServer } from '@rspack/dev-server';\n\nimport { getArgValue } from '../lib/args';\nimport { hasArgFlag } from '../lib/args';\nimport { readDevServerPorts } from '../lib/devServerPorts';\nimport { getRoot } from '../lib/discovery';\nimport { KEEP_OTHER_DEV_SERVERS_FLAG } from '../lib/keepOtherDevServersFlag';\nimport { isQpqCliCommand, killStaleListeners, reportPortHolders } from '../lib/killStaleListeners';\nimport { createOutput } from '../lib/out';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { setWebAddressingEnv } from '../lib/webAddressingEnv';\n\nconst out = createOutput('go:dev:web');\n\nexport type GoDevWebOptions = {\n // The in-place \"(started)\" chip rewrite assumes this command owns the\n // terminal; when stdout is shared with the API dev server (combined\n // `qpq go:dev`) the cursor math breaks. The plain-line fallback is just a\n // wall of \" auth started\" noise interleaved with the API output, so drop\n // the ready status altogether there.\n hideStartedStatus?: boolean;\n};\n\nexport const goDevWebCommand = async (argv: string[], options: GoDevWebOptions = {}): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n\n process.env.LOCAL_DEV_SERVER = 'true';\n process.env.NODE_ENV = 'development';\n await resolveDeployment(argv, appName);\n\n // Local pages address the api dev server and each other by port on localhost.\n const devServerPorts = readDevServerPorts(appName);\n setWebAddressingEnv(getAppServiceQpqConfigs(root, appName), {\n api: devServerPorts.api,\n webSocket: devServerPorts.webSocket,\n mapHostPort: (port) => port,\n });\n\n const only = getArgValue(argv, '--only')\n ?.split(',')\n .map((s) => s.trim());\n\n let views = getAllViews(root, appName);\n if (only) views = views.filter((v) => only.includes(v.service));\n if (views.length === 0) {\n out.error('No views projects found.');\n process.exit(1);\n }\n\n // See goDevApi for why this is opt-out rather than always-on.\n if (hasArgFlag(argv, KEEP_OTHER_DEV_SERVERS_FLAG)) {\n reportPortHolders(views.map((v) => v.port));\n } else {\n killStaleListeners(\n views.map((v) => v.port),\n isQpqCliCommand,\n );\n }\n\n // Every RspackDevServer.start() registers its own SIGINT/SIGTERM handler on\n // process, with a dozen views servers in one process that trips node's\n // default 10-listener warning. Size the limit to the fleet.\n process.setMaxListeners(Math.max(process.getMaxListeners(), views.length * 2 + 10));\n\n // Service names are padded to a common width so the \"(started)\" chips align.\n const serviceColumnWidth = Math.max(...views.map((v) => v.service.length));\n\n out.log(`Starting ${views.length} views dev servers for [${appName}]:`);\n for (const v of views) out.log(` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)}`);\n\n const servers: RspackDevServer[] = [];\n let shuttingDown = false;\n\n const shutdown = (code: number): void => {\n if (shuttingDown) return;\n shuttingDown = true;\n Promise.allSettled(servers.map((server) => server.stop())).then(() => process.exit(code));\n };\n\n // The URL list above gets a yellow \"(started)\" chip appended in place as\n // each dev server begins answering HTTP. The in-place rewrite moves the\n // cursor up past everything printed since the list, so every line printed\n // below it MUST go through logBelowList to keep the offset accurate.\n let linesBelowList = 0;\n\n const logBelowList = (line: string): void => {\n out.log(line);\n linesBelowList += 1;\n };\n\n const markStarted = (index: number): void => {\n const v = views[index];\n if (!v) return;\n if (!process.stdout.isTTY) {\n logBelowList(` ${v.service} started`);\n return;\n }\n const line = ` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)} \\x1b[33m(started)\\x1b[0m`;\n const up = linesBelowList + (views.length - index);\n process.stdout.write(`\\x1b[${up}F\\x1b[2K${line}\\x1b[${up}E`);\n };\n\n const pollUntilStarted = (index: number): void => {\n const attempt = (): void => {\n if (shuttingDown) return;\n const req = http.get(\n {\n host: 'localhost',\n port: views[index]?.port,\n path: '/',\n timeout: 1000,\n },\n (res) => {\n res.resume();\n markStarted(index);\n },\n );\n req.on('error', () => setTimeout(attempt, 500));\n req.on('timeout', () => req.destroy());\n };\n attempt();\n };\n\n for (const [index, view] of views.entries()) {\n const config = getViewsRspackConfig(view.viewsDir);\n const compiler = rspack(config);\n const server = new RspackDevServer(config.devServer || { port: view.port }, compiler);\n servers.push(server);\n\n try {\n await server.start();\n } catch (e) {\n logBelowList(` [${view.service}] failed to start: ${(e as Error).message} — shutting down all views servers.`);\n shutdown(1);\n return;\n }\n\n // markStarted is the only consumer of the ready signal, so there is\n // nothing to poll for when the status is hidden.\n if (!options.hideStartedStatus) pollUntilStarted(index);\n }\n\n process.on('SIGINT', () => shutdown(0));\n process.on('SIGTERM', () => shutdown(0));\n};\n"]}
1
+ {"version":3,"file":"goDevWeb.js","sourceRoot":"","sources":["../../../src/commands/goDevWeb.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:dev:web`, boots every views microfrontend's Rspack dev server\n// in-process (shell is the MF host app, plus all remotes on their own ports).\n// Everything is served dynamically; remotes resolve at runtime via\n// mf-manifest.json on localhost ports. Programmatic, no per-views\n// rspack.config.ts or npm serve script needed.\n//\n// Usage:\n// qpq go:dev:web\n// qpq go:dev:web --only shell,design\n// qpq go:dev:web --app <name>\nimport { getAllViews, getAppServiceQpqConfigs, getViewsRspackConfig } from '@qpqjs/deploy-rspack';\n\nimport http from 'http';\nimport { rspack } from '@rspack/core';\nimport { RspackDevServer } from '@rspack/dev-server';\n\nimport { getArgValue } from '../lib/args';\nimport { hasArgFlag } from '../lib/args';\nimport { createOutput } from '../lib/createOutput';\nimport { readDevServerPorts } from '../lib/devServerPorts';\nimport { getRoot } from '../lib/discovery';\nimport { KEEP_OTHER_DEV_SERVERS_FLAG } from '../lib/keepOtherDevServersFlag';\nimport { isQpqCliCommand, killStaleListeners, reportPortHolders } from '../lib/killStaleListeners';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { setWebAddressingEnv } from '../lib/webAddressingEnv';\n\nconst out = createOutput('go:dev:web');\n\nexport type GoDevWebOptions = {\n // The in-place \"(started)\" chip rewrite assumes this command owns the\n // terminal; when stdout is shared with the API dev server (combined\n // `qpq go:dev`) the cursor math breaks. The plain-line fallback is just a\n // wall of \" auth started\" noise interleaved with the API output, so drop\n // the ready status altogether there.\n hideStartedStatus?: boolean;\n};\n\nexport const goDevWebCommand = async (argv: string[], options: GoDevWebOptions = {}): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n\n process.env.LOCAL_DEV_SERVER = 'true';\n process.env.NODE_ENV = 'development';\n await resolveDeployment(argv, appName);\n\n // Local pages address the api dev server and each other by port on localhost.\n const devServerPorts = readDevServerPorts(appName);\n setWebAddressingEnv(getAppServiceQpqConfigs(root, appName), {\n api: devServerPorts.api,\n webSocket: devServerPorts.webSocket,\n mapHostPort: (port) => port,\n });\n\n const only = getArgValue(argv, '--only')\n ?.split(',')\n .map((s) => s.trim());\n\n let views = getAllViews(root, appName);\n if (only) views = views.filter((v) => only.includes(v.service));\n if (views.length === 0) {\n out.error('No views projects found.');\n process.exit(1);\n }\n\n // See goDevApi for why this is opt-out rather than always-on.\n if (hasArgFlag(argv, KEEP_OTHER_DEV_SERVERS_FLAG)) {\n reportPortHolders(views.map((v) => v.port));\n } else {\n killStaleListeners(\n views.map((v) => v.port),\n isQpqCliCommand,\n );\n }\n\n // Every RspackDevServer.start() registers its own SIGINT/SIGTERM handler on\n // process, with a dozen views servers in one process that trips node's\n // default 10-listener warning. Size the limit to the fleet.\n process.setMaxListeners(Math.max(process.getMaxListeners(), views.length * 2 + 10));\n\n // Service names are padded to a common width so the \"(started)\" chips align.\n const serviceColumnWidth = Math.max(...views.map((v) => v.service.length));\n\n out.log(`Starting ${views.length} views dev servers for [${appName}]:`);\n for (const v of views) out.log(` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)}`);\n\n const servers: RspackDevServer[] = [];\n let shuttingDown = false;\n\n const shutdown = (code: number): void => {\n if (shuttingDown) return;\n shuttingDown = true;\n Promise.allSettled(servers.map((server) => server.stop())).then(() => process.exit(code));\n };\n\n // The URL list above gets a yellow \"(started)\" chip appended in place as\n // each dev server begins answering HTTP. The in-place rewrite moves the\n // cursor up past everything printed since the list, so every line printed\n // below it MUST go through logBelowList to keep the offset accurate.\n let linesBelowList = 0;\n\n const logBelowList = (line: string): void => {\n out.log(line);\n linesBelowList += 1;\n };\n\n const markStarted = (index: number): void => {\n const v = views[index];\n if (!v) return;\n if (!process.stdout.isTTY) {\n logBelowList(` ${v.service} started`);\n return;\n }\n const line = ` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)} \\x1b[33m(started)\\x1b[0m`;\n const up = linesBelowList + (views.length - index);\n out.rewriteLineAbove(up, line);\n };\n\n const pollUntilStarted = (index: number): void => {\n const attempt = (): void => {\n if (shuttingDown) return;\n const req = http.get(\n {\n host: 'localhost',\n port: views[index]?.port,\n path: '/',\n timeout: 1000,\n },\n (res) => {\n res.resume();\n markStarted(index);\n },\n );\n req.on('error', () => setTimeout(attempt, 500));\n req.on('timeout', () => req.destroy());\n };\n attempt();\n };\n\n for (const [index, view] of views.entries()) {\n const config = getViewsRspackConfig(view.viewsDir);\n const compiler = rspack(config);\n const server = new RspackDevServer(config.devServer || { port: view.port }, compiler);\n servers.push(server);\n\n try {\n await server.start();\n } catch (e) {\n logBelowList(` [${view.service}] failed to start: ${(e as Error).message} — shutting down all views servers.`);\n shutdown(1);\n return;\n }\n\n // markStarted is the only consumer of the ready signal, so there is\n // nothing to poll for when the status is hidden.\n if (!options.hideStartedStatus) pollUntilStarted(index);\n }\n\n process.on('SIGINT', () => shutdown(0));\n process.on('SIGTERM', () => shutdown(0));\n};\n"]}
@@ -14,12 +14,12 @@ exports.goDockerCommand = void 0;
14
14
  // platform driver's parallel containerized deploy (drivers without a docker
15
15
  // strategy don't offer one). `--build-only` and `--from-build` split that run
16
16
  // into a build half and a deploy half that can run on different machines.
17
+ const createOutput_1 = require("../lib/createOutput");
17
18
  const deployPrompts_1 = require("../lib/deployPrompts");
18
19
  const goDockerMode_1 = require("../lib/goDockerMode");
19
- const out_1 = require("../lib/out");
20
20
  const requireDriverCapability_1 = require("../lib/requireDriverCapability");
21
21
  const resolveCommandContext_1 = require("../lib/resolveCommandContext");
22
- const out = (0, out_1.createOutput)('go:docker');
22
+ const out = (0, createOutput_1.createOutput)('go:docker');
23
23
  const goDockerCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
24
24
  var _a;
25
25
  const mode = (0, goDockerMode_1.resolveGoDockerMode)(argv);
@@ -1 +1 @@
1
- {"version":3,"file":"goDocker.js","sourceRoot":"","sources":["../../../src/commands/goDocker.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sEAAsE;AACtE,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,wDAAiF;AACjF,sDAA4F;AAC5F,oCAA0C;AAC1C,4EAAyE;AACzE,wEAAqE;AAErE,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,WAAW,CAAC,CAAC;AAE/B,MAAM,eAAe,GAAG,CAAO,IAAc,EAAiB,EAAE;;IACrE,MAAM,IAAI,GAAG,IAAA,kCAAmB,EAAC,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,IAAA,6CAAqB,EAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAA,iDAAuB,EAAC,OAAO,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACrF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,4EAA4E;IAC5E,MAAM,IAAI,GAAG,MAAA,IAAA,uCAAuB,EAAC,OAAO,EAAE,IAAI,CAAC,mCAAI,CAAC,MAAM,IAAA,gCAAgB,EAAC,OAAO,CAAC,CAAC,CAAC;IAEzF,8EAA8E;IAC9E,qEAAqE;IACrE,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,GAAG,8BAAe,QAAQ,8BAAe,mFAAmF,CAAC,CAAC;QACxI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC,CAAA,CAAC;AAjBW,QAAA,eAAe,mBAiB1B","sourcesContent":["// `qpq go:docker`, asks the same questions as `qpq go`, then runs the\n// platform driver's parallel containerized deploy (drivers without a docker\n// strategy don't offer one). `--build-only` and `--from-build` split that run\n// into a build half and a deploy half that can run on different machines.\nimport { buildDeployPlanFromArgs, promptDeployPlan } from '../lib/deployPrompts';\nimport { BUILD_ONLY_FLAG, FROM_BUILD_FLAG, resolveGoDockerMode } from '../lib/goDockerMode';\nimport { createOutput } from '../lib/out';\nimport { requireDriverCapability } from '../lib/requireDriverCapability';\nimport { resolveCommandContext } from '../lib/resolveCommandContext';\n\nconst out = createOutput('go:docker');\n\nexport const goDockerCommand = async (argv: string[]): Promise<void> => {\n const mode = resolveGoDockerMode(argv);\n const context = await resolveCommandContext(argv);\n const goDocker = requireDriverCapability(context, 'goDocker', 'Use qpq go instead.');\n const { appName } = context;\n\n // Positional args (`qpq go:docker all all`) run prompt-free; otherwise ask.\n const plan = buildDeployPlanFromArgs(appName, argv) ?? (await promptDeployPlan(appName));\n\n // account, domain and bootstrap stacks deploy host-side through the workspace\n // CDK app in one step; there is no saved build to split them across.\n if (mode !== 'full' && (plan.kind === 'account' || plan.kind === 'bootstrap')) {\n out.error(`${BUILD_ONLY_FLAG} and ${FROM_BUILD_FLAG} apply to service deploys only; account, domain and bootstrap deploy in one step.`);\n process.exit(1);\n }\n\n await goDocker(appName, plan, mode);\n};\n"]}
1
+ {"version":3,"file":"goDocker.js","sourceRoot":"","sources":["../../../src/commands/goDocker.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sEAAsE;AACtE,4EAA4E;AAC5E,8EAA8E;AAC9E,0EAA0E;AAC1E,sDAAmD;AACnD,wDAAiF;AACjF,sDAA4F;AAC5F,4EAAyE;AACzE,wEAAqE;AAErE,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,WAAW,CAAC,CAAC;AAE/B,MAAM,eAAe,GAAG,CAAO,IAAc,EAAiB,EAAE;;IACrE,MAAM,IAAI,GAAG,IAAA,kCAAmB,EAAC,IAAI,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,IAAA,6CAAqB,EAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAA,iDAAuB,EAAC,OAAO,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACrF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE5B,4EAA4E;IAC5E,MAAM,IAAI,GAAG,MAAA,IAAA,uCAAuB,EAAC,OAAO,EAAE,IAAI,CAAC,mCAAI,CAAC,MAAM,IAAA,gCAAgB,EAAC,OAAO,CAAC,CAAC,CAAC;IAEzF,8EAA8E;IAC9E,qEAAqE;IACrE,IAAI,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,GAAG,8BAAe,QAAQ,8BAAe,mFAAmF,CAAC,CAAC;QACxI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC,CAAA,CAAC;AAjBW,QAAA,eAAe,mBAiB1B","sourcesContent":["// `qpq go:docker`, asks the same questions as `qpq go`, then runs the\n// platform driver's parallel containerized deploy (drivers without a docker\n// strategy don't offer one). `--build-only` and `--from-build` split that run\n// into a build half and a deploy half that can run on different machines.\nimport { createOutput } from '../lib/createOutput';\nimport { buildDeployPlanFromArgs, promptDeployPlan } from '../lib/deployPrompts';\nimport { BUILD_ONLY_FLAG, FROM_BUILD_FLAG, resolveGoDockerMode } from '../lib/goDockerMode';\nimport { requireDriverCapability } from '../lib/requireDriverCapability';\nimport { resolveCommandContext } from '../lib/resolveCommandContext';\n\nconst out = createOutput('go:docker');\n\nexport const goDockerCommand = async (argv: string[]): Promise<void> => {\n const mode = resolveGoDockerMode(argv);\n const context = await resolveCommandContext(argv);\n const goDocker = requireDriverCapability(context, 'goDocker', 'Use qpq go instead.');\n const { appName } = context;\n\n // Positional args (`qpq go:docker all all`) run prompt-free; otherwise ask.\n const plan = buildDeployPlanFromArgs(appName, argv) ?? (await promptDeployPlan(appName));\n\n // account, domain and bootstrap stacks deploy host-side through the workspace\n // CDK app in one step; there is no saved build to split them across.\n if (mode !== 'full' && (plan.kind === 'account' || plan.kind === 'bootstrap')) {\n out.error(`${BUILD_ONLY_FLAG} and ${FROM_BUILD_FLAG} apply to service deploys only; account, domain and bootstrap deploy in one step.`);\n process.exit(1);\n }\n\n await goDocker(appName, plan, mode);\n};\n"]}
@@ -16,11 +16,11 @@ exports.hooksCommand = void 0;
16
16
  // Wire the root package.json's lifecycle to it, e.g.
17
17
  // "postinstall": "qpq hooks postinstall". Use --jobs=1 to force serial runs.
18
18
  const args_1 = require("../lib/args");
19
+ const createOutput_1 = require("../lib/createOutput");
19
20
  const getDefaultHookJobs_1 = require("../lib/getDefaultHookJobs");
20
21
  const hooks_1 = require("../lib/hooks");
21
- const out_1 = require("../lib/out");
22
22
  const runTasks_1 = require("../lib/runTasks");
23
- const out = (0, out_1.createOutput)('hooks');
23
+ const out = (0, createOutput_1.createOutput)('hooks');
24
24
  const getJobs = (argv) => {
25
25
  const parsed = Number((0, args_1.getArgValue)(argv, '--jobs'));
26
26
  if (Number.isFinite(parsed) && parsed >= 1) {
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/commands/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,iEAAiE;AACjE,qDAAqD;AACrD,6EAA6E;AAC7E,sCAA0C;AAC1C,kEAA+D;AAC/D,wCAAqD;AACrD,oCAA0C;AAC1C,8CAAmD;AAEnD,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,OAAO,CAAC,CAAC;AAElC,MAAM,OAAO,GAAG,CAAC,IAAc,EAAU,EAAE;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAA,kBAAW,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAA,uCAAkB,GAAE,CAAC;AAC9B,CAAC,CAAC;AAEK,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,GAAG,CAAC,KAAK,CAAC,+GAA+G,CAAC,CAAC;QAC3H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,6BAAqB,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,IAAA,2BAAgB,EAAC,SAAS,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC,CAAA,CAAC;AAVW,QAAA,YAAY,gBAUvB","sourcesContent":["// `qpq hooks <name>`, run the `qpq:<name>` script (or the plain `<name>`\n// script when no qpq:-prefixed one exists) of every app and workspace package\n// that defines one, in dependency order with parallel execution.\n// Wire the root package.json's lifecycle to it, e.g.\n// \"postinstall\": \"qpq hooks postinstall\". Use --jobs=1 to force serial runs.\nimport { getArgValue } from '../lib/args';\nimport { getDefaultHookJobs } from '../lib/getDefaultHookJobs';\nimport { runHookForAllPackages } from '../lib/hooks';\nimport { createOutput } from '../lib/out';\nimport { assertNoFailures } from '../lib/runTasks';\n\nconst out = createOutput('hooks');\n\nconst getJobs = (argv: string[]): number => {\n const parsed = Number(getArgValue(argv, '--jobs'));\n if (Number.isFinite(parsed) && parsed >= 1) {\n return Math.floor(parsed);\n }\n return getDefaultHookJobs();\n};\n\nexport const hooksCommand = async (argv: string[]): Promise<void> => {\n const [hook] = argv.filter((a) => !a.startsWith('--'));\n\n if (!hook) {\n out.error('Usage: qpq hooks <name> [--jobs=N] (runs qpq:<name>, or plain <name>, in every app/package that defines it)');\n process.exit(1);\n }\n\n const failures = await runHookForAllPackages(hook, getJobs(argv));\n assertNoFailures(`hooks ${hook}`, failures);\n};\n"]}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/commands/hooks.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,yEAAyE;AACzE,8EAA8E;AAC9E,iEAAiE;AACjE,qDAAqD;AACrD,6EAA6E;AAC7E,sCAA0C;AAC1C,sDAAmD;AACnD,kEAA+D;AAC/D,wCAAqD;AACrD,8CAAmD;AAEnD,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,OAAO,CAAC,CAAC;AAElC,MAAM,OAAO,GAAG,CAAC,IAAc,EAAU,EAAE;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAA,kBAAW,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAA,uCAAkB,GAAE,CAAC;AAC9B,CAAC,CAAC;AAEK,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,GAAG,CAAC,KAAK,CAAC,+GAA+G,CAAC,CAAC;QAC3H,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAA,6BAAqB,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,IAAA,2BAAgB,EAAC,SAAS,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC,CAAA,CAAC;AAVW,QAAA,YAAY,gBAUvB","sourcesContent":["// `qpq hooks <name>`, run the `qpq:<name>` script (or the plain `<name>`\n// script when no qpq:-prefixed one exists) of every app and workspace package\n// that defines one, in dependency order with parallel execution.\n// Wire the root package.json's lifecycle to it, e.g.\n// \"postinstall\": \"qpq hooks postinstall\". Use --jobs=1 to force serial runs.\nimport { getArgValue } from '../lib/args';\nimport { createOutput } from '../lib/createOutput';\nimport { getDefaultHookJobs } from '../lib/getDefaultHookJobs';\nimport { runHookForAllPackages } from '../lib/hooks';\nimport { assertNoFailures } from '../lib/runTasks';\n\nconst out = createOutput('hooks');\n\nconst getJobs = (argv: string[]): number => {\n const parsed = Number(getArgValue(argv, '--jobs'));\n if (Number.isFinite(parsed) && parsed >= 1) {\n return Math.floor(parsed);\n }\n return getDefaultHookJobs();\n};\n\nexport const hooksCommand = async (argv: string[]): Promise<void> => {\n const [hook] = argv.filter((a) => !a.startsWith('--'));\n\n if (!hook) {\n out.error('Usage: qpq hooks <name> [--jobs=N] (runs qpq:<name>, or plain <name>, in every app/package that defines it)');\n process.exit(1);\n }\n\n const failures = await runHookForAllPackages(hook, getJobs(argv));\n assertNoFailures(`hooks ${hook}`, failures);\n};\n"]}
@@ -26,13 +26,13 @@ const core_1 = require("@qpqjs/core");
26
26
  const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
27
27
  const path_1 = __importDefault(require("path"));
28
28
  const core_2 = require("@rspack/core");
29
+ const createOutput_1 = require("../lib/createOutput");
29
30
  const devServerEntry_1 = require("../lib/devServerEntry");
30
31
  const discovery_1 = require("../lib/discovery");
31
- const out_1 = require("../lib/out");
32
32
  const resolveAppSelection_1 = require("../lib/resolveAppSelection");
33
33
  const resolveDeployment_1 = require("../lib/resolveDeployment");
34
34
  const runCommand_1 = require("../lib/runCommand");
35
- const out = (0, out_1.createOutput)('migrate');
35
+ const out = (0, createOutput_1.createOutput)('migrate');
36
36
  const migrateCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
37
37
  const root = (0, discovery_1.getRoot)();
38
38
  const appName = yield (0, resolveAppSelection_1.resolveAppSelection)({ argv, envVar: 'QPQ_DEV_APP' });
@@ -1 +1 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/commands/migrate.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDevServerDistPath } from '@qpqjs/core';\n// `qpq migrate`, run every pending migration against the LOCAL dev store, once, then exit.\n//\n// Deployed, migrations are triggered by a stack update. Nothing locally ever deploys, so\n// without this a migration is first executed in a real environment, which is a poor place to\n// discover what it does. This bundles exactly what `go:dev:api` bundles and runs the same\n// queue path, so a local run rehearses the deployed one rather than a convenient lookalike.\n//\n// Migrations are recorded as they run, in the same store the deploy path uses, so running\n// this twice is a no-op the second time.\nimport { getAppServiceQpqConfigs, getDevServerRspackConfig } from '@qpqjs/deploy-rspack';\n\nimport path from 'path';\nimport { rspack } from '@rspack/core';\n\nimport { writeDevServerEntry } from '../lib/devServerEntry';\nimport { getRoot } from '../lib/discovery';\nimport { createOutput } from '../lib/out';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { spawnCommand } from '../lib/runCommand';\n\nconst out = createOutput('migrate');\n\nexport const migrateCommand = async (argv: string[]): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n process.env.QPQ_DEV_APP = appName;\n await resolveDeployment(argv, appName);\n\n out.log(`Running local migrations for app [${appName}]`);\n\n const qpqConfigs = getAppServiceQpqConfigs(root, appName);\n const entry = writeDevServerEntry(root, appName, 'migrate');\n const rspackConfig = getDevServerRspackConfig({ root, entry, qpqConfigs });\n\n // Same bundle shape as the dev server, different output name so a running `go:dev:api`\n // watcher does not fight over the file.\n const bundlePath = path.join(getDevServerDistPath(root), 'migrate.js');\n const migrateConfig = {\n ...rspackConfig,\n output: { ...rspackConfig.output, filename: 'migrate.js' },\n };\n\n await new Promise<void>((resolve, reject) => {\n rspack(migrateConfig as any, (error, stats) => {\n if (error) {\n return reject(error);\n }\n\n if (stats?.hasErrors()) {\n out.error(stats.toString({ colors: true, all: false, errors: true }));\n return reject(new Error('Failed to bundle migrations'));\n }\n\n resolve();\n });\n });\n\n // The bundle exits non-zero on failure; mirror that so a shell chain or CI notices instead\n // of carrying on as though the data were migrated.\n const exitCode = await new Promise<number>((resolve) => {\n const child = spawnCommand('node', [bundlePath], { env: { QPQ_DEV_APP: appName } });\n child.on('exit', (code) => resolve(code ?? 1));\n });\n\n if (exitCode !== 0) {\n process.exitCode = exitCode;\n }\n};\n"]}
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../../src/commands/migrate.ts"],"names":[],"mappings":"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","sourcesContent":["import { getDevServerDistPath } from '@qpqjs/core';\n// `qpq migrate`, run every pending migration against the LOCAL dev store, once, then exit.\n//\n// Deployed, migrations are triggered by a stack update. Nothing locally ever deploys, so\n// without this a migration is first executed in a real environment, which is a poor place to\n// discover what it does. This bundles exactly what `go:dev:api` bundles and runs the same\n// queue path, so a local run rehearses the deployed one rather than a convenient lookalike.\n//\n// Migrations are recorded as they run, in the same store the deploy path uses, so running\n// this twice is a no-op the second time.\nimport { getAppServiceQpqConfigs, getDevServerRspackConfig } from '@qpqjs/deploy-rspack';\n\nimport path from 'path';\nimport { rspack } from '@rspack/core';\n\nimport { createOutput } from '../lib/createOutput';\nimport { writeDevServerEntry } from '../lib/devServerEntry';\nimport { getRoot } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { resolveDeployment } from '../lib/resolveDeployment';\nimport { spawnCommand } from '../lib/runCommand';\n\nconst out = createOutput('migrate');\n\nexport const migrateCommand = async (argv: string[]): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n process.env.QPQ_DEV_APP = appName;\n await resolveDeployment(argv, appName);\n\n out.log(`Running local migrations for app [${appName}]`);\n\n const qpqConfigs = getAppServiceQpqConfigs(root, appName);\n const entry = writeDevServerEntry(root, appName, 'migrate');\n const rspackConfig = getDevServerRspackConfig({ root, entry, qpqConfigs });\n\n // Same bundle shape as the dev server, different output name so a running `go:dev:api`\n // watcher does not fight over the file.\n const bundlePath = path.join(getDevServerDistPath(root), 'migrate.js');\n const migrateConfig = {\n ...rspackConfig,\n output: { ...rspackConfig.output, filename: 'migrate.js' },\n };\n\n await new Promise<void>((resolve, reject) => {\n rspack(migrateConfig as any, (error, stats) => {\n if (error) {\n return reject(error);\n }\n\n if (stats?.hasErrors()) {\n out.error(stats.toString({ colors: true, all: false, errors: true }));\n return reject(new Error('Failed to bundle migrations'));\n }\n\n resolve();\n });\n });\n\n // The bundle exits non-zero on failure; mirror that so a shell chain or CI notices instead\n // of carrying on as though the data were migrated.\n const exitCode = await new Promise<number>((resolve) => {\n const child = spawnCommand('node', [bundlePath], { env: { QPQ_DEV_APP: appName } });\n child.on('exit', (code) => resolve(code ?? 1));\n });\n\n if (exitCode !== 0) {\n process.exitCode = exitCode;\n }\n};\n"]}
@@ -14,10 +14,10 @@ exports.prepCommand = void 0;
14
14
  // path aliases for cross-view federated imports). Run after adding/removing a
15
15
  // `// federated.export` marker.
16
16
  const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
17
+ const createOutput_1 = require("../lib/createOutput");
17
18
  const discovery_1 = require("../lib/discovery");
18
- const out_1 = require("../lib/out");
19
19
  const resolveAppSelection_1 = require("../lib/resolveAppSelection");
20
- const out = (0, out_1.createOutput)('prep');
20
+ const out = (0, createOutput_1.createOutput)('prep');
21
21
  const prepCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
22
22
  const selection = yield (0, resolveAppSelection_1.resolveAppSelection)({ argv, allowAll: true });
23
23
  const appNames = selection === 'all' ? (0, discovery_1.getAvailableApps)() : [selection];
@@ -1 +1 @@
1
- {"version":3,"file":"prep.js","sourceRoot":"","sources":["../../../src/commands/prep.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,gCAAgC;AAChC,wDAAoE;AAEpE,gDAA6D;AAC7D,oCAA0C;AAC1C,oEAAiE;AAEjE,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,MAAM,CAAC,CAAC;AAE1B,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,4CAA4B,EAAC,IAAA,mBAAO,GAAE,EAAE,OAAO,CAAC,CAAC;QACrE,GAAG,CAAC,GAAG,CAAC,eAAe,WAAW,8BAA8B,OAAO,0BAA0B,CAAC,CAAC;IACrG,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 '@qpqjs/deploy-rspack';\n\nimport { getAvailableApps, getRoot } from '../lib/discovery';\nimport { createOutput } from '../lib/out';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\nconst out = createOutput('prep');\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 out.log(`prep: wrote ${exposeCount} federated aliases to apps/${appName}/tsconfig.federated.json`);\n }\n};\n"]}
1
+ {"version":3,"file":"prep.js","sourceRoot":"","sources":["../../../src/commands/prep.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,gCAAgC;AAChC,wDAAoE;AAEpE,sDAAmD;AACnD,gDAA6D;AAC7D,oEAAiE;AAEjE,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,MAAM,CAAC,CAAC;AAE1B,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,4CAA4B,EAAC,IAAA,mBAAO,GAAE,EAAE,OAAO,CAAC,CAAC;QACrE,GAAG,CAAC,GAAG,CAAC,eAAe,WAAW,8BAA8B,OAAO,0BAA0B,CAAC,CAAC;IACrG,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 '@qpqjs/deploy-rspack';\n\nimport { createOutput } from '../lib/createOutput';\nimport { getAvailableApps, getRoot } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\nconst out = createOutput('prep');\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 out.log(`prep: wrote ${exposeCount} federated aliases to apps/${appName}/tsconfig.federated.json`);\n }\n};\n"]}
@@ -19,8 +19,8 @@ exports.scriptBuildCommand = void 0;
19
19
  const user_script_1 = require("@qpqjs/user-script");
20
20
  const path_1 = __importDefault(require("path"));
21
21
  const args_1 = require("../lib/args");
22
- const out_1 = require("../lib/out");
23
- const out = (0, out_1.createOutput)('script:build');
22
+ const createOutput_1 = require("../lib/createOutput");
23
+ const out = (0, createOutput_1.createOutput)('script:build');
24
24
  const scriptBuildCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
25
25
  var _a;
26
26
  const [projectDir] = (0, args_1.getPositionalArgs)(argv, ['--out']);
@@ -1 +1 @@
1
- {"version":3,"file":"scriptBuild.js","sourceRoot":"","sources":["../../../src/commands/scriptBuild.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sFAAsF;AACtF,mFAAmF;AACnF,oEAAoE;AACpE,oDAAkG;AAElG,gDAAwB;AAExB,sCAAyE;AACzE,oCAA0C;AAE1C,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,cAAc,CAAC,CAAC;AAElC,MAAM,kBAAkB,GAAG,CAAO,IAAc,EAAiB,EAAE;;IACxE,MAAM,CAAC,UAAU,CAAC,GAAG,IAAA,wBAAiB,EAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAA,IAAA,kBAAW,EAAC,IAAI,EAAE,OAAO,CAAC,mCAAI,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAe,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAA,iBAAU,EAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1G,yFAAyF;QACzF,MAAM,OAAO,GAAG,IAAA,mCAAqB,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,kCAAoB,EAAE,CAAC;YAC1C,GAAG,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC;AAtBW,QAAA,kBAAkB,sBAsB7B","sourcesContent":["// `qpq script:build <dir> [--out <dir>] [--source-map]`, bundle a user-script project\n// into one main.js that askUserScriptExecute can load from a drive. `--source-map`\n// embeds the map in main.js; no separate .map file is ever written.\nimport { buildUserScript, checkUserScriptOutput, UserScriptBuildError } from '@qpqjs/user-script';\n\nimport path from 'path';\n\nimport { getArgValue, getPositionalArgs, hasArgFlag } from '../lib/args';\nimport { createOutput } from '../lib/out';\n\nconst out = createOutput('script:build');\n\nexport const scriptBuildCommand = async (argv: string[]): Promise<void> => {\n const [projectDir] = getPositionalArgs(argv, ['--out']);\n if (!projectDir) {\n out.error('Usage: qpq script:build <dir> [--out <dir>] [--source-map]');\n process.exit(1);\n }\n\n const outDir = getArgValue(argv, '--out') ?? path.join(projectDir, 'dist');\n\n try {\n const result = await buildUserScript({ projectDir, outDir, sourceMap: hasArgFlag(argv, '--source-map') });\n // A developer's own build is checked in this process; a platform build asks the sandbox.\n const exports = checkUserScriptOutput(result.entryPath);\n out.log(`script:build: wrote ${result.entryPath}`);\n out.log(` exports: ${exports.join(', ')}`);\n } catch (error) {\n if (error instanceof UserScriptBuildError) {\n out.error(`script:build: ${error.code}: ${error.message}`);\n process.exit(1);\n }\n throw error;\n }\n};\n"]}
1
+ {"version":3,"file":"scriptBuild.js","sourceRoot":"","sources":["../../../src/commands/scriptBuild.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sFAAsF;AACtF,mFAAmF;AACnF,oEAAoE;AACpE,oDAAkG;AAElG,gDAAwB;AAExB,sCAAyE;AACzE,sDAAmD;AAEnD,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,cAAc,CAAC,CAAC;AAElC,MAAM,kBAAkB,GAAG,CAAO,IAAc,EAAiB,EAAE;;IACxE,MAAM,CAAC,UAAU,CAAC,GAAG,IAAA,wBAAiB,EAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAA,IAAA,kBAAW,EAAC,IAAI,EAAE,OAAO,CAAC,mCAAI,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,6BAAe,EAAC,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAA,iBAAU,EAAC,IAAI,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QAC1G,yFAAyF;QACzF,MAAM,OAAO,GAAG,IAAA,mCAAqB,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxD,GAAG,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACnD,GAAG,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,kCAAoB,EAAE,CAAC;YAC1C,GAAG,CAAC,KAAK,CAAC,iBAAiB,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAA,CAAC;AAtBW,QAAA,kBAAkB,sBAsB7B","sourcesContent":["// `qpq script:build <dir> [--out <dir>] [--source-map]`, bundle a user-script project\n// into one main.js that askUserScriptExecute can load from a drive. `--source-map`\n// embeds the map in main.js; no separate .map file is ever written.\nimport { buildUserScript, checkUserScriptOutput, UserScriptBuildError } from '@qpqjs/user-script';\n\nimport path from 'path';\n\nimport { getArgValue, getPositionalArgs, hasArgFlag } from '../lib/args';\nimport { createOutput } from '../lib/createOutput';\n\nconst out = createOutput('script:build');\n\nexport const scriptBuildCommand = async (argv: string[]): Promise<void> => {\n const [projectDir] = getPositionalArgs(argv, ['--out']);\n if (!projectDir) {\n out.error('Usage: qpq script:build <dir> [--out <dir>] [--source-map]');\n process.exit(1);\n }\n\n const outDir = getArgValue(argv, '--out') ?? path.join(projectDir, 'dist');\n\n try {\n const result = await buildUserScript({ projectDir, outDir, sourceMap: hasArgFlag(argv, '--source-map') });\n // A developer's own build is checked in this process; a platform build asks the sandbox.\n const exports = checkUserScriptOutput(result.entryPath);\n out.log(`script:build: wrote ${result.entryPath}`);\n out.log(` exports: ${exports.join(', ')}`);\n } catch (error) {\n if (error instanceof UserScriptBuildError) {\n out.error(`script:build: ${error.code}: ${error.message}`);\n process.exit(1);\n }\n throw error;\n }\n};\n"]}
@@ -19,9 +19,9 @@ exports.scriptBuilderLayerCommand = void 0;
19
19
  const core_1 = require("@qpqjs/core");
20
20
  const user_script_1 = require("@qpqjs/user-script");
21
21
  const args_1 = require("../lib/args");
22
- const out_1 = require("../lib/out");
22
+ const createOutput_1 = require("../lib/createOutput");
23
23
  const userScriptBuilderLayer_1 = require("../lib/userScriptBuilderLayer");
24
- const out = (0, out_1.createOutput)('script:builder-layer');
24
+ const out = (0, createOutput_1.createOutput)('script:builder-layer');
25
25
  const ARCH_FLAG = '--arch';
26
26
  const DEFAULT_ARCHITECTURE = core_1.JavascriptRuntimeArchitecture.Arm64;
27
27
  /* eslint-disable @typescript-eslint/no-require-imports */
@@ -1 +1 @@
1
- {"version":3,"file":"scriptBuilderLayer.js","sourceRoot":"","sources":["../../../src/commands/scriptBuilderLayer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wFAAwF;AACxF,wFAAwF;AACxF,yFAAyF;AACzF,wFAAwF;AACxF,yFAAyF;AACzF,uDAAuD;AACvD,sCAA4D;AAC5D,oDAAkE;AAElE,sCAA0C;AAC1C,oCAA0C;AAC1C,0EAA4E;AAE5E,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,sBAAsB,CAAC,CAAC;AAEjD,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,oBAAoB,GAAG,oCAA6B,CAAC,KAAK,CAAC;AAEjE,0DAA0D;AAC1D,sFAAsF;AACtF,yEAAyE;AACzE,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,OAAiB,CAAC;AAE9F,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAiC,EAAE;;IAC1E,MAAM,SAAS,GAAG,MAAA,IAAA,kBAAW,EAAC,IAAI,EAAE,SAAS,CAAC,mCAAI,oBAAoB,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,oCAA6B,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAA0C,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,KAAK,CAAC,iCAAiC,SAAS,KAAK,SAAS,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,SAA0C,CAAC;AACpD,CAAC,CAAC;AAEK,MAAM,yBAAyB,GAAG,CAAO,IAAc,EAAiB,EAAE;IAC/E,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAA,0CAA4B,GAAE,CAAC;IAE9C,GAAG,CAAC,GAAG,CAAC,iDAAiD,aAAa,cAAc,YAAY,SAAS,MAAM,EAAE,CAAC,CAAC;IACnH,MAAM,OAAO,GAAG,IAAA,oDAA2B,EAAC,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;IACrF,GAAG,CAAC,GAAG,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC,CAAA,CAAC;AARW,QAAA,yBAAyB,6BAQpC","sourcesContent":["// `qpq script:builder-layer [--arch arm64|x86_64]`, produce the lambda layer that gives\n// a service rspack, for services that registered defineUserScriptBuilder. The directory\n// is the one getUserScriptBuilderApiLayer points at, so nothing is told a path. Run from\n// the app's qpq:predeploy hook, which go:docker fires before the workspace is built, so\n// this command deliberately loads no service config (that would import unbuilt packages)\n// and takes the lambda architecture as a flag instead.\nimport { JavascriptRuntimeArchitecture } from '@qpqjs/core';\nimport { getUserScriptBuilderLayerDir } from '@qpqjs/user-script';\n\nimport { getArgValue } from '../lib/args';\nimport { createOutput } from '../lib/out';\nimport { buildUserScriptBuilderLayer } from '../lib/userScriptBuilderLayer';\n\nconst out = createOutput('script:builder-layer');\n\nconst ARCH_FLAG = '--arch';\nconst DEFAULT_ARCHITECTURE = JavascriptRuntimeArchitecture.Arm64;\n\n/* eslint-disable @typescript-eslint/no-require-imports */\n// The rspack the CLI itself resolves is the one the dev server builds with; the layer\n// pins the same version so a script builds identically on both runtimes.\nconst getRspackVersion = (): string => require('@rspack/core/package.json').version as string;\n\nconst parseArchitecture = (argv: string[]): JavascriptRuntimeArchitecture => {\n const requested = getArgValue(argv, ARCH_FLAG) ?? DEFAULT_ARCHITECTURE;\n const known = Object.values(JavascriptRuntimeArchitecture);\n if (!known.includes(requested as JavascriptRuntimeArchitecture)) {\n out.error(`script:builder-layer: unknown ${ARCH_FLAG} [${requested}]; expected one of ${known.join(', ')}`);\n process.exit(1);\n }\n return requested as JavascriptRuntimeArchitecture;\n};\n\nexport const scriptBuilderLayerCommand = async (argv: string[]): Promise<void> => {\n const architecture = parseArchitecture(argv);\n const rspackVersion = getRspackVersion();\n const outDir = getUserScriptBuilderLayerDir();\n\n out.log(`script:builder-layer: installing @rspack/core@${rspackVersion} for linux ${architecture} into ${outDir}`);\n const nodeDir = buildUserScriptBuilderLayer({ outDir, architecture, rspackVersion });\n out.log(`script:builder-layer: wrote ${nodeDir}`);\n};\n"]}
1
+ {"version":3,"file":"scriptBuilderLayer.js","sourceRoot":"","sources":["../../../src/commands/scriptBuilderLayer.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,wFAAwF;AACxF,wFAAwF;AACxF,yFAAyF;AACzF,wFAAwF;AACxF,yFAAyF;AACzF,uDAAuD;AACvD,sCAA4D;AAC5D,oDAAkE;AAElE,sCAA0C;AAC1C,sDAAmD;AACnD,0EAA4E;AAE5E,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,sBAAsB,CAAC,CAAC;AAEjD,MAAM,SAAS,GAAG,QAAQ,CAAC;AAC3B,MAAM,oBAAoB,GAAG,oCAA6B,CAAC,KAAK,CAAC;AAEjE,0DAA0D;AAC1D,sFAAsF;AACtF,yEAAyE;AACzE,MAAM,gBAAgB,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,OAAiB,CAAC;AAE9F,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAiC,EAAE;;IAC1E,MAAM,SAAS,GAAG,MAAA,IAAA,kBAAW,EAAC,IAAI,EAAE,SAAS,CAAC,mCAAI,oBAAoB,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,oCAA6B,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAA0C,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,KAAK,CAAC,iCAAiC,SAAS,KAAK,SAAS,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,SAA0C,CAAC;AACpD,CAAC,CAAC;AAEK,MAAM,yBAAyB,GAAG,CAAO,IAAc,EAAiB,EAAE;IAC/E,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,IAAA,0CAA4B,GAAE,CAAC;IAE9C,GAAG,CAAC,GAAG,CAAC,iDAAiD,aAAa,cAAc,YAAY,SAAS,MAAM,EAAE,CAAC,CAAC;IACnH,MAAM,OAAO,GAAG,IAAA,oDAA2B,EAAC,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;IACrF,GAAG,CAAC,GAAG,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC,CAAA,CAAC;AARW,QAAA,yBAAyB,6BAQpC","sourcesContent":["// `qpq script:builder-layer [--arch arm64|x86_64]`, produce the lambda layer that gives\n// a service rspack, for services that registered defineUserScriptBuilder. The directory\n// is the one getUserScriptBuilderApiLayer points at, so nothing is told a path. Run from\n// the app's qpq:predeploy hook, which go:docker fires before the workspace is built, so\n// this command deliberately loads no service config (that would import unbuilt packages)\n// and takes the lambda architecture as a flag instead.\nimport { JavascriptRuntimeArchitecture } from '@qpqjs/core';\nimport { getUserScriptBuilderLayerDir } from '@qpqjs/user-script';\n\nimport { getArgValue } from '../lib/args';\nimport { createOutput } from '../lib/createOutput';\nimport { buildUserScriptBuilderLayer } from '../lib/userScriptBuilderLayer';\n\nconst out = createOutput('script:builder-layer');\n\nconst ARCH_FLAG = '--arch';\nconst DEFAULT_ARCHITECTURE = JavascriptRuntimeArchitecture.Arm64;\n\n/* eslint-disable @typescript-eslint/no-require-imports */\n// The rspack the CLI itself resolves is the one the dev server builds with; the layer\n// pins the same version so a script builds identically on both runtimes.\nconst getRspackVersion = (): string => require('@rspack/core/package.json').version as string;\n\nconst parseArchitecture = (argv: string[]): JavascriptRuntimeArchitecture => {\n const requested = getArgValue(argv, ARCH_FLAG) ?? DEFAULT_ARCHITECTURE;\n const known = Object.values(JavascriptRuntimeArchitecture);\n if (!known.includes(requested as JavascriptRuntimeArchitecture)) {\n out.error(`script:builder-layer: unknown ${ARCH_FLAG} [${requested}]; expected one of ${known.join(', ')}`);\n process.exit(1);\n }\n return requested as JavascriptRuntimeArchitecture;\n};\n\nexport const scriptBuilderLayerCommand = async (argv: string[]): Promise<void> => {\n const architecture = parseArchitecture(argv);\n const rspackVersion = getRspackVersion();\n const outDir = getUserScriptBuilderLayerDir();\n\n out.log(`script:builder-layer: installing @rspack/core@${rspackVersion} for linux ${architecture} into ${outDir}`);\n const nodeDir = buildUserScriptBuilderLayer({ outDir, architecture, rspackVersion });\n out.log(`script:builder-layer: wrote ${nodeDir}`);\n};\n"]}
@@ -17,9 +17,9 @@ exports.scriptNewCommand = void 0;
17
17
  // directory. See templates/user-script/README.md for what a script is.
18
18
  const path_1 = __importDefault(require("path"));
19
19
  const args_1 = require("../lib/args");
20
- const out_1 = require("../lib/out");
20
+ const createOutput_1 = require("../lib/createOutput");
21
21
  const userScriptTemplate_1 = require("../lib/userScriptTemplate");
22
- const out = (0, out_1.createOutput)('script:new');
22
+ const out = (0, createOutput_1.createOutput)('script:new');
23
23
  const scriptNewCommand = (argv) => __awaiter(void 0, void 0, void 0, function* () {
24
24
  const [targetDir] = (0, args_1.getPositionalArgs)(argv, []);
25
25
  if (!targetDir) {
@@ -1 +1 @@
1
- {"version":3,"file":"scriptNew.js","sourceRoot":"","sources":["../../../src/commands/scriptNew.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4EAA4E;AAC5E,uEAAuE;AACvE,gDAAwB;AAExB,sCAAgD;AAChD,oCAA0C;AAC1C,kEAAoE;AAEpE,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,YAAY,CAAC,CAAC;AAEhC,MAAM,gBAAgB,GAAG,CAAO,IAAc,EAAiB,EAAE;IACtE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,wBAAiB,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,4CAAuB,EAAC,SAAS,CAAC,CAAC;IAEnD,GAAG,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,MAAM,aAAa,cAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,YAAY,SAAS,mBAAmB,CAAC,CAAC;AACpD,CAAC,CAAA,CAAC;AAdW,QAAA,gBAAgB,oBAc3B","sourcesContent":["// `qpq script:new <dir>`, write the user-script template project into a new\n// directory. See templates/user-script/README.md for what a script is.\nimport path from 'path';\n\nimport { getPositionalArgs } from '../lib/args';\nimport { createOutput } from '../lib/out';\nimport { createUserScriptProject } from '../lib/userScriptTemplate';\n\nconst out = createOutput('script:new');\n\nexport const scriptNewCommand = async (argv: string[]): Promise<void> => {\n const [targetDir] = getPositionalArgs(argv, []);\n if (!targetDir) {\n out.error('Usage: qpq script:new <dir>');\n process.exit(1);\n }\n\n const written = createUserScriptProject(targetDir);\n\n out.log(`script:new: wrote ${written.length} files to ${path.resolve(targetDir)}`);\n for (const file of written) {\n out.log(` ${file}`);\n }\n out.log(`Next: cd ${targetDir} && npm run build`);\n};\n"]}
1
+ {"version":3,"file":"scriptNew.js","sourceRoot":"","sources":["../../../src/commands/scriptNew.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4EAA4E;AAC5E,uEAAuE;AACvE,gDAAwB;AAExB,sCAAgD;AAChD,sDAAmD;AACnD,kEAAoE;AAEpE,MAAM,GAAG,GAAG,IAAA,2BAAY,EAAC,YAAY,CAAC,CAAC;AAEhC,MAAM,gBAAgB,GAAG,CAAO,IAAc,EAAiB,EAAE;IACtE,MAAM,CAAC,SAAS,CAAC,GAAG,IAAA,wBAAiB,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,GAAG,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,4CAAuB,EAAC,SAAS,CAAC,CAAC;IAEnD,GAAG,CAAC,GAAG,CAAC,qBAAqB,OAAO,CAAC,MAAM,aAAa,cAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACvB,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,YAAY,SAAS,mBAAmB,CAAC,CAAC;AACpD,CAAC,CAAA,CAAC;AAdW,QAAA,gBAAgB,oBAc3B","sourcesContent":["// `qpq script:new <dir>`, write the user-script template project into a new\n// directory. See templates/user-script/README.md for what a script is.\nimport path from 'path';\n\nimport { getPositionalArgs } from '../lib/args';\nimport { createOutput } from '../lib/createOutput';\nimport { createUserScriptProject } from '../lib/userScriptTemplate';\n\nconst out = createOutput('script:new');\n\nexport const scriptNewCommand = async (argv: string[]): Promise<void> => {\n const [targetDir] = getPositionalArgs(argv, []);\n if (!targetDir) {\n out.error('Usage: qpq script:new <dir>');\n process.exit(1);\n }\n\n const written = createUserScriptProject(targetDir);\n\n out.log(`script:new: wrote ${written.length} files to ${path.resolve(targetDir)}`);\n for (const file of written) {\n out.log(` ${file}`);\n }\n out.log(`Next: cd ${targetDir} && npm run build`);\n};\n"]}
@@ -11,10 +11,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.setupCommand = void 0;
13
13
  const args_1 = require("../lib/args");
14
- const out_1 = require("../lib/out");
14
+ const createOutput_1 = require("../lib/createOutput");
15
15
  const prompts_1 = require("../lib/prompts");
16
16
  const resolveCommandContext_1 = require("../lib/resolveCommandContext");
17
- const out = (0, out_1.createOutput)('setup');
17
+ const out = (0, createOutput_1.createOutput)('setup');
18
18
  const statusLabel = (result) => (result === null ? '?' : result.done ? 'done' : 'todo');
19
19
  const printChecklist = (checked) => {
20
20
  for (const { step, result } of checked) {