create-qpq-app 0.1.26 → 0.1.28

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 (379) hide show
  1. package/README.md +4 -0
  2. package/lib/commonjs/cli/runCreateQpqApp.js +15 -1
  3. package/lib/commonjs/cli/runCreateQpqApp.js.map +1 -1
  4. package/lib/commonjs/lib/index.d.ts +1 -1
  5. package/lib/commonjs/lib/index.js +1 -1
  6. package/lib/commonjs/lib/index.js.map +1 -1
  7. package/lib/commonjs/lib/promptText.d.ts +1 -0
  8. package/lib/commonjs/lib/promptText.js +53 -0
  9. package/lib/commonjs/lib/promptText.js.map +1 -0
  10. package/lib/commonjs/steps/005_applyAppIdentity.js +6 -5
  11. package/lib/commonjs/steps/005_applyAppIdentity.js.map +1 -1
  12. package/lib/commonjs/steps/006_applyDomain.js +11 -6
  13. package/lib/commonjs/steps/006_applyDomain.js.map +1 -1
  14. package/lib/commonjs/steps/007_applyDockerHost.d.ts +2 -0
  15. package/lib/commonjs/steps/007_applyDockerHost.js +40 -0
  16. package/lib/commonjs/steps/007_applyDockerHost.js.map +1 -0
  17. package/lib/commonjs/steps/{007_pinRegistryVersions.js → 008_pinRegistryVersions.js} +1 -1
  18. package/lib/commonjs/steps/{007_pinRegistryVersions.js.map → 008_pinRegistryVersions.js.map} +1 -1
  19. package/lib/commonjs/steps/{008_transpileToJavaScript.js → 009_transpileToJavaScript.js} +1 -1
  20. package/lib/commonjs/steps/{008_transpileToJavaScript.js.map → 009_transpileToJavaScript.js.map} +1 -1
  21. package/lib/commonjs/steps/{009_restoreGitignore.js → 010_restoreGitignore.js} +1 -1
  22. package/lib/commonjs/steps/{009_restoreGitignore.js.map → 010_restoreGitignore.js.map} +1 -1
  23. package/lib/commonjs/steps/{010_gitInit.js → 011_gitInit.js} +1 -1
  24. package/lib/commonjs/steps/{010_gitInit.js.map → 011_gitInit.js.map} +1 -1
  25. package/lib/commonjs/steps/{011_npmInstall.js → 012_npmInstall.js} +1 -1
  26. package/lib/commonjs/steps/{011_npmInstall.js.map → 012_npmInstall.js.map} +1 -1
  27. package/lib/commonjs/steps/{012_buildWorkspaces.js → 013_buildWorkspaces.js} +1 -1
  28. package/lib/commonjs/steps/{012_buildWorkspaces.js.map → 013_buildWorkspaces.js.map} +1 -1
  29. package/lib/commonjs/steps/{013_printNextSteps.js → 014_printNextSteps.js} +6 -3
  30. package/lib/commonjs/steps/014_printNextSteps.js.map +1 -0
  31. package/lib/commonjs/steps/index.d.ts +9 -8
  32. package/lib/commonjs/steps/index.js +25 -22
  33. package/lib/commonjs/steps/index.js.map +1 -1
  34. package/lib/commonjs/types/CreateQpqAppAnswers.d.ts +2 -0
  35. package/lib/commonjs/types/CreateQpqAppAnswers.js.map +1 -1
  36. package/lib/esm/cli/runCreateQpqApp.js +15 -1
  37. package/lib/esm/cli/runCreateQpqApp.js.map +1 -1
  38. package/lib/esm/lib/index.d.ts +1 -1
  39. package/lib/esm/lib/index.js +1 -1
  40. package/lib/esm/lib/index.js.map +1 -1
  41. package/lib/esm/lib/promptText.d.ts +1 -0
  42. package/lib/esm/lib/promptText.js +7 -0
  43. package/lib/esm/lib/promptText.js.map +1 -0
  44. package/lib/esm/steps/005_applyAppIdentity.js +6 -5
  45. package/lib/esm/steps/005_applyAppIdentity.js.map +1 -1
  46. package/lib/esm/steps/006_applyDomain.js +11 -6
  47. package/lib/esm/steps/006_applyDomain.js.map +1 -1
  48. package/lib/esm/steps/007_applyDockerHost.d.ts +2 -0
  49. package/lib/esm/steps/007_applyDockerHost.js +30 -0
  50. package/lib/esm/steps/007_applyDockerHost.js.map +1 -0
  51. package/lib/esm/steps/{007_pinRegistryVersions.js → 008_pinRegistryVersions.js} +1 -1
  52. package/lib/esm/steps/{007_pinRegistryVersions.js.map → 008_pinRegistryVersions.js.map} +1 -1
  53. package/lib/esm/steps/{008_transpileToJavaScript.js → 009_transpileToJavaScript.js} +1 -1
  54. package/lib/esm/steps/{008_transpileToJavaScript.js.map → 009_transpileToJavaScript.js.map} +1 -1
  55. package/lib/esm/steps/{009_restoreGitignore.js → 010_restoreGitignore.js} +1 -1
  56. package/lib/esm/steps/{009_restoreGitignore.js.map → 010_restoreGitignore.js.map} +1 -1
  57. package/lib/esm/steps/{010_gitInit.js → 011_gitInit.js} +1 -1
  58. package/lib/esm/steps/{010_gitInit.js.map → 011_gitInit.js.map} +1 -1
  59. package/lib/esm/steps/{011_npmInstall.js → 012_npmInstall.js} +1 -1
  60. package/lib/esm/steps/{011_npmInstall.js.map → 012_npmInstall.js.map} +1 -1
  61. package/lib/esm/steps/{012_buildWorkspaces.js → 013_buildWorkspaces.js} +1 -1
  62. package/lib/esm/steps/{012_buildWorkspaces.js.map → 013_buildWorkspaces.js.map} +1 -1
  63. package/lib/esm/steps/014_printNextSteps.js +24 -0
  64. package/lib/esm/steps/014_printNextSteps.js.map +1 -0
  65. package/lib/esm/steps/index.d.ts +9 -8
  66. package/lib/esm/steps/index.js +10 -8
  67. package/lib/esm/steps/index.js.map +1 -1
  68. package/lib/esm/types/CreateQpqAppAnswers.d.ts +2 -0
  69. package/lib/esm/types/CreateQpqAppAnswers.js.map +1 -1
  70. package/package.json +2 -2
  71. package/template/README.md +4 -3
  72. package/template/apps/qpqjs/bootstrap.qpq.ts +3 -2
  73. package/template/apps/qpqjs/deploy.config.json +42 -9
  74. package/template/apps/qpqjs/devServer.config.ts +13 -0
  75. package/template/apps/qpqjs/packages/constants/src/index.ts +0 -1
  76. package/template/apps/qpqjs/packages/service-utils/src/defineQpqjsService.ts +12 -29
  77. package/template/apps/qpqjs/services/admin/service/src/infrastructure.ts +1 -1
  78. package/template/apps/qpqjs/services/admin/views/src/app/app.tsx +9 -19
  79. package/template/apps/qpqjs/services/design/service/src/infrastructure.ts +1 -1
  80. package/template/apps/qpqjs/services/design/views/src/components/LandingPage/components/NavBar.tsx +2 -10
  81. package/template/apps/qpqjs/services/design/views/src/components/WelcomeScreen/WelcomeScreen.tsx +3 -11
  82. package/template/apps/qpqjs/services/shell/service/src/infrastructure.ts +5 -1
  83. package/template/apps/qpqjs/services/test/models/src/SmokeProbeRecord.ts +3 -0
  84. package/template/apps/qpqjs/services/test/service/src/infrastructure.ts +1 -7
  85. package/template/apps/qpqjs/services/test/service/src/smoke/config/defineSmoke.ts +8 -264
  86. package/template/apps/qpqjs/services/test/service/src/smoke/harness/assert/index.ts +2 -0
  87. package/template/apps/qpqjs/services/test/service/src/smoke/harness/config/defineSmokeHarness.ts +115 -0
  88. package/template/apps/qpqjs/services/test/service/src/smoke/harness/config/index.ts +1 -0
  89. package/template/apps/qpqjs/services/test/service/src/smoke/{constants → harness/constants}/index.ts +0 -2
  90. package/template/apps/qpqjs/services/test/service/src/smoke/harness/index.ts +10 -0
  91. package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/smokeRun/askExecuteSmokeTest.ts +3 -3
  92. package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/smokeRun/askStartSmokeRun.ts +5 -4
  93. package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/smokeRun/index.ts +1 -0
  94. package/template/apps/qpqjs/services/test/service/src/smoke/harness/logic/smokeRun/listSmokeTests.ts +6 -0
  95. package/template/apps/qpqjs/services/test/service/src/smoke/{models → harness/models}/SmokeTestRequestedQueueEvent.ts +1 -1
  96. package/template/apps/qpqjs/services/test/service/src/smoke/harness/models/index.ts +2 -0
  97. package/template/apps/qpqjs/services/test/service/src/smoke/harness/queue/index.ts +1 -0
  98. package/template/apps/qpqjs/services/test/service/src/smoke/harness/types/SmokeSuite.ts +13 -0
  99. package/template/apps/qpqjs/services/test/service/src/smoke/harness/types/index.ts +2 -0
  100. package/template/apps/qpqjs/services/test/service/src/smoke/index.ts +2 -12
  101. package/template/apps/qpqjs/services/test/service/src/smoke/suites/emailReceive/config/defineEmailReceiveSmoke.ts +20 -0
  102. package/template/apps/qpqjs/services/test/service/src/smoke/suites/emailReceive/config/index.ts +1 -0
  103. package/template/apps/qpqjs/services/test/service/src/smoke/suites/emailReceive/constants/SMOKE_EMAIL_RECEIVER.ts +2 -0
  104. package/template/apps/qpqjs/services/test/service/src/smoke/suites/emailReceive/constants/index.ts +1 -0
  105. package/template/apps/qpqjs/services/test/service/src/smoke/suites/emailReceive/emailReceiveSmokeSuite.ts +15 -0
  106. package/template/apps/qpqjs/services/test/service/src/smoke/{email → suites/emailReceive/entry/email}/index.ts +0 -1
  107. package/template/apps/qpqjs/services/test/service/src/smoke/{email → suites/emailReceive/entry/email}/onSmokeEmailReceived.ts +1 -1
  108. package/template/apps/qpqjs/services/test/service/src/smoke/suites/emailReceive/entry/index.ts +1 -0
  109. package/template/apps/qpqjs/services/test/service/src/smoke/suites/emailReceive/index.ts +5 -0
  110. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/emailReceive → suites/emailReceive/logic}/askRunEmailReceiveTest.ts +3 -3
  111. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/emailReceive → suites/emailReceive/logic}/index.ts +1 -0
  112. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/config/defineEncryptedResourcesSmoke.ts +29 -0
  113. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/config/index.ts +1 -0
  114. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/constants/SMOKE_CRYPTO_KEY.ts +5 -0
  115. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/constants/SMOKE_ENCRYPTED_PROBE_DRIVE.ts +2 -0
  116. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/constants/SMOKE_ENCRYPTED_PROBE_STORE.ts +2 -0
  117. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/constants/index.ts +3 -0
  118. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/encryptedResourcesSmokeSuite.ts +9 -0
  119. package/template/apps/qpqjs/services/test/service/src/smoke/suites/encryptedResources/index.ts +4 -0
  120. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/encryptedResources → suites/encryptedResources/logic}/askRunEncryptedResourcesTest.ts +3 -5
  121. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/config/defineEventBusSmoke.ts +21 -0
  122. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/config/index.ts +1 -0
  123. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/constants/SMOKE_PROBE_EVENT_BUS.ts +2 -0
  124. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/constants/SMOKE_PROBE_EVENT_QUEUE.ts +2 -0
  125. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/constants/SMOKE_PROBE_EVENT_TYPE.ts +2 -0
  126. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/constants/index.ts +3 -0
  127. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/entry/index.ts +1 -0
  128. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/entry/queue/index.ts +1 -0
  129. package/template/apps/qpqjs/services/test/service/src/smoke/{queue → suites/eventBus/entry/queue}/onSmokeProbeEvent.ts +1 -1
  130. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/eventBusSmokeSuite.ts +9 -0
  131. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/index.ts +6 -0
  132. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventBus → suites/eventBus/logic}/askRunEventBusTest.ts +4 -6
  133. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventBus/models/index.ts +1 -0
  134. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/config/defineEventDocSmoke.ts +44 -0
  135. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/config/index.ts +1 -0
  136. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/constants/index.ts +1 -0
  137. package/template/apps/qpqjs/services/test/service/src/smoke/{constants → suites/eventDoc/constants}/smokeEventDoc.ts +1 -1
  138. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/entry/index.ts +1 -0
  139. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/entry/queue/index.ts +1 -0
  140. package/template/apps/qpqjs/services/test/service/src/smoke/{queue → suites/eventDoc/entry/queue}/onSmokeEventDocAppend.ts +3 -3
  141. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/eventDocSmokeSuite.ts +19 -0
  142. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/index.ts +7 -0
  143. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventDoc → suites/eventDoc/logic}/askAssertContiguousEventIds.ts +1 -1
  144. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventDoc → suites/eventDoc/logic}/askAssertSmokeProbeDocState.ts +2 -2
  145. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventDoc → suites/eventDoc/logic}/askAwaitSmokeEventDocLog.ts +1 -1
  146. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventDoc → suites/eventDoc/logic}/askRunEventDocConcurrentAppendTest.ts +5 -5
  147. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventDoc → suites/eventDoc/logic}/askRunEventDocInterleavedBatchAppendTest.ts +4 -4
  148. package/template/apps/qpqjs/services/test/service/src/smoke/suites/eventDoc/models/index.ts +2 -0
  149. package/template/apps/qpqjs/services/test/service/src/smoke/{tests → suites}/index.ts +4 -5
  150. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStore/index.ts +2 -0
  151. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStore/keyValueStoreSmokeSuite.ts +14 -0
  152. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/crossService → suites/keyValueStore/logic}/askRunCrossServiceKeyValueStoreTest.ts +1 -1
  153. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/keyValueStore → suites/keyValueStore/logic}/askRunKeyValueStoreTest.ts +1 -1
  154. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStore/logic/index.ts +2 -0
  155. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStoreStream/config/defineKeyValueStoreStreamSmoke.ts +30 -0
  156. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStoreStream/config/index.ts +1 -0
  157. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStoreStream/constants/SMOKE_STREAM_PROBE_STORE.ts +2 -0
  158. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStoreStream/constants/index.ts +1 -0
  159. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStoreStream/entry/index.ts +1 -0
  160. package/template/apps/qpqjs/services/test/service/src/smoke/{kvsStream → suites/keyValueStoreStream/entry/kvsStream}/index.ts +0 -1
  161. package/template/apps/qpqjs/services/test/service/src/smoke/{kvsStream → suites/keyValueStoreStream/entry/kvsStream}/onSmokeStreamRecord.ts +6 -4
  162. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStoreStream/index.ts +5 -0
  163. package/template/apps/qpqjs/services/test/service/src/smoke/suites/keyValueStoreStream/keyValueStoreStreamSmokeSuite.ts +11 -0
  164. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/keyValueStoreStream → suites/keyValueStoreStream/logic}/askRunKeyValueStoreStreamTest.ts +15 -6
  165. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/keyValueStoreStream → suites/keyValueStoreStream/logic}/index.ts +1 -0
  166. package/template/apps/qpqjs/services/test/service/src/smoke/suites/noop/index.ts +2 -0
  167. package/template/apps/qpqjs/services/test/service/src/smoke/suites/noop/noopSmokeSuite.ts +7 -0
  168. package/template/apps/qpqjs/services/test/service/src/smoke/suites/openApi/config/defineOpenApiSmoke.ts +13 -0
  169. package/template/apps/qpqjs/services/test/service/src/smoke/suites/openApi/config/index.ts +1 -0
  170. package/template/apps/qpqjs/services/test/service/src/smoke/suites/openApi/index.ts +4 -0
  171. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/openApi → suites/openApi/logic}/askRunEchoRoundTripTest.ts +1 -1
  172. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/openApi → suites/openApi/logic}/askRunOpenApiDocumentTest.ts +1 -1
  173. package/template/apps/qpqjs/services/test/service/src/smoke/suites/openApi/openApiSmokeSuite.ts +13 -0
  174. package/template/apps/qpqjs/services/test/service/src/smoke/suites/parameter/config/defineParameterSmoke.ts +11 -0
  175. package/template/apps/qpqjs/services/test/service/src/smoke/suites/parameter/config/index.ts +1 -0
  176. package/template/apps/qpqjs/services/test/service/src/smoke/suites/parameter/constants/SMOKE_PROBE_PARAMETER.ts +2 -0
  177. package/template/apps/qpqjs/services/test/service/src/smoke/suites/parameter/constants/SMOKE_PROBE_PARAMETER_VALUE.ts +2 -0
  178. package/template/apps/qpqjs/services/test/service/src/smoke/suites/parameter/constants/index.ts +2 -0
  179. package/template/apps/qpqjs/services/test/service/src/smoke/suites/parameter/index.ts +4 -0
  180. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/parameter → suites/parameter/logic}/askRunParameterTest.ts +3 -5
  181. package/template/apps/qpqjs/services/test/service/src/smoke/suites/parameter/parameterSmokeSuite.ts +9 -0
  182. package/template/apps/qpqjs/services/test/service/src/{tick/config/defineTick.ts → smoke/suites/schedule/config/defineScheduleSmoke.ts} +1 -1
  183. package/template/apps/qpqjs/services/test/service/src/smoke/suites/schedule/config/index.ts +1 -0
  184. package/template/apps/qpqjs/services/test/service/src/smoke/suites/schedule/entry/index.ts +2 -0
  185. package/template/apps/qpqjs/services/test/service/src/smoke/suites/schedule/index.ts +6 -0
  186. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/schedule → suites/schedule/logic}/askRunScheduleTest.ts +4 -4
  187. package/template/apps/qpqjs/services/test/service/src/smoke/suites/schedule/scheduleSmokeSuite.ts +9 -0
  188. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedKeyValueStore/config/defineScopedKeyValueStoreSmoke.ts +19 -0
  189. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedKeyValueStore/config/index.ts +1 -0
  190. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedKeyValueStore/constants/SMOKE_SCOPED_PROBE_STORE.ts +2 -0
  191. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedKeyValueStore/constants/index.ts +1 -0
  192. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedKeyValueStore/index.ts +4 -0
  193. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedKeyValueStore/logic/askRunScopedKeyValueStoreTest.ts +256 -0
  194. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedKeyValueStore/scopedKeyValueStoreSmokeSuite.ts +11 -0
  195. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedStorageDrive/config/defineScopedStorageDriveSmoke.ts +12 -0
  196. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedStorageDrive/config/index.ts +1 -0
  197. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedStorageDrive/constants/SMOKE_SCOPED_PROBE_DRIVE.ts +2 -0
  198. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedStorageDrive/constants/index.ts +1 -0
  199. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedStorageDrive/index.ts +4 -0
  200. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/scopedStorageDrive → suites/scopedStorageDrive/logic}/askRunScopedStorageDriveTest.ts +2 -2
  201. package/template/apps/qpqjs/services/test/service/src/smoke/suites/scopedStorageDrive/scopedStorageDriveSmokeSuite.ts +9 -0
  202. package/template/apps/qpqjs/services/test/service/src/smoke/suites/secret/config/defineSecretSmoke.ts +8 -0
  203. package/template/apps/qpqjs/services/test/service/src/smoke/suites/secret/config/index.ts +1 -0
  204. package/template/apps/qpqjs/services/test/service/src/smoke/suites/secret/constants/SMOKE_PROBE_SECRET.ts +2 -0
  205. package/template/apps/qpqjs/services/test/service/src/smoke/suites/secret/constants/index.ts +1 -0
  206. package/template/apps/qpqjs/services/test/service/src/smoke/suites/secret/index.ts +4 -0
  207. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/secret → suites/secret/logic}/askRunSecretTest.ts +2 -2
  208. package/template/apps/qpqjs/services/test/service/src/smoke/suites/secret/secretSmokeSuite.ts +9 -0
  209. package/template/apps/qpqjs/services/test/service/src/smoke/suites/signingKey/config/defineSigningKeySmoke.ts +12 -0
  210. package/template/apps/qpqjs/services/test/service/src/smoke/suites/signingKey/config/index.ts +1 -0
  211. package/template/apps/qpqjs/services/test/service/src/smoke/suites/signingKey/index.ts +3 -0
  212. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/crossService → suites/signingKey/logic}/askRunCrossServiceSigningKeyTest.ts +1 -1
  213. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/signingKey → suites/signingKey/logic}/askRunSigningKeyTest.ts +1 -1
  214. package/template/apps/qpqjs/services/test/service/src/smoke/suites/signingKey/logic/index.ts +2 -0
  215. package/template/apps/qpqjs/services/test/service/src/smoke/suites/signingKey/signingKeySmokeSuite.ts +16 -0
  216. package/template/apps/qpqjs/services/test/service/src/smoke/suites/smokeSuites.ts +46 -0
  217. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDrive/index.ts +2 -0
  218. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/crossService → suites/storageDrive/logic}/askRunCrossServiceStorageDriveTest.ts +1 -1
  219. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/storageDrive → suites/storageDrive/logic}/askRunStorageDriveTest.ts +1 -1
  220. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDrive/logic/index.ts +2 -0
  221. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDrive/storageDriveSmokeSuite.ts +14 -0
  222. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/config/defineStorageDriveEventSmoke.ts +27 -0
  223. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/config/index.ts +1 -0
  224. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/constants/SMOKE_FILE_EVENT_DRIVE.ts +2 -0
  225. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/constants/SMOKE_SCOPED_FILE_EVENT_DRIVE.ts +2 -0
  226. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/constants/index.ts +2 -0
  227. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/entry/index.ts +1 -0
  228. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/entry/storageDrive/index.ts +1 -0
  229. package/template/apps/qpqjs/services/test/service/src/smoke/{storageDrive → suites/storageDriveEvent/entry/storageDrive}/onSmokeFileEvent.ts +1 -1
  230. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/index.ts +5 -0
  231. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/storageDriveEvent → suites/storageDriveEvent/logic}/askRunStorageDriveEventTest.ts +7 -9
  232. package/template/apps/qpqjs/services/test/service/src/smoke/{tests/storageDriveEvent → suites/storageDriveEvent/logic}/index.ts +1 -0
  233. package/template/apps/qpqjs/services/test/service/src/smoke/suites/storageDriveEvent/storageDriveEventSmokeSuite.ts +9 -0
  234. package/template/apps/qpqjs/services/testa/models/src/CrossServiceProbePayload.ts +1 -1
  235. package/template/apps/qpqjs/services/testa/service/src/infrastructure.ts +3 -3
  236. package/template/apps/qpqjs/services/testa/service/src/smoke/config/defineSmokeProbes.ts +16 -0
  237. package/template/apps/qpqjs/services/testa/service/src/smoke/config/index.ts +1 -0
  238. package/template/apps/qpqjs/services/{test/service/src/tick → testa/service/src/smoke}/index.ts +1 -0
  239. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/index.ts +3 -0
  240. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/keyValueStore/config/defineKeyValueStoreSmokeProbe.ts +33 -0
  241. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/keyValueStore/config/index.ts +1 -0
  242. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/keyValueStore/entry/serviceFunction/index.ts +1 -0
  243. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/keyValueStore/logic/index.ts +1 -0
  244. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/signingKey/config/defineSigningKeySmokeProbe.ts +28 -0
  245. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/signingKey/config/index.ts +1 -0
  246. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/signingKey/entry/index.ts +1 -0
  247. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/signingKey/entry/serviceFunction/index.ts +1 -0
  248. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/signingKey/index.ts +3 -0
  249. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/signingKey/logic/index.ts +1 -0
  250. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/storageDrive/config/defineStorageDriveSmokeProbe.ts +31 -0
  251. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/storageDrive/config/index.ts +1 -0
  252. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/storageDrive/entry/index.ts +1 -0
  253. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/storageDrive/entry/serviceFunction/index.ts +1 -0
  254. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/storageDrive/index.ts +3 -0
  255. package/template/apps/qpqjs/services/testa/service/src/smoke/suites/storageDrive/logic/index.ts +1 -0
  256. package/template/apps/todo/deploy.config.json +13 -4
  257. package/template/apps/todo/packages/constants/src/index.ts +0 -1
  258. package/template/apps/todo/packages/service-utils/src/defineTodoService.ts +9 -7
  259. package/template/apps/todo/services/admin/service/src/infrastructure.ts +1 -1
  260. package/template/apps/todo/services/admin/views/src/app/app.tsx +9 -19
  261. package/template/apps/todo/services/auth/service/src/infrastructure.ts +1 -1
  262. package/template/apps/todo/services/design/service/src/infrastructure.ts +1 -1
  263. package/template/apps/todo/services/shell/service/src/infrastructure.ts +1 -1
  264. package/template/apps/todo/services/todo/service/src/infrastructure.ts +1 -1
  265. package/template/docusaurus/docs/actions/core/key-value-store/ask-key-value-store-delete.md +1 -1
  266. package/template/docusaurus/docs/actions/core/key-value-store/ask-key-value-store-get-all.md +1 -1
  267. package/template/docusaurus/docs/actions/core/key-value-store/ask-key-value-store-get.md +1 -1
  268. package/template/docusaurus/docs/actions/core/key-value-store/ask-key-value-store-query.md +3 -1
  269. package/template/docusaurus/docs/actions/core/key-value-store/ask-key-value-store-scan.md +1 -1
  270. package/template/docusaurus/docs/actions/core/key-value-store/ask-key-value-store-update.md +1 -1
  271. package/template/docusaurus/docs/actions/core/key-value-store/ask-key-value-store-upsert.md +1 -1
  272. package/template/docusaurus/docs/config/core/key-value-store.md +12 -2
  273. package/template/docusaurus/docs/config/features/event-doc.md +22 -1
  274. package/template/docusaurus/docs/getting-started.md +5 -5
  275. package/template/scripts/deployedSmoke.mjs +27 -22
  276. package/template/scripts/localSmoke.mjs +7 -7
  277. package/lib/commonjs/lib/replaceInFileExact.d.ts +0 -1
  278. package/lib/commonjs/lib/replaceInFileExact.js +0 -18
  279. package/lib/commonjs/lib/replaceInFileExact.js.map +0 -1
  280. package/lib/commonjs/steps/013_printNextSteps.js.map +0 -1
  281. package/lib/esm/lib/replaceInFileExact.d.ts +0 -1
  282. package/lib/esm/lib/replaceInFileExact.js +0 -11
  283. package/lib/esm/lib/replaceInFileExact.js.map +0 -1
  284. package/lib/esm/steps/013_printNextSteps.js +0 -21
  285. package/lib/esm/steps/013_printNextSteps.js.map +0 -1
  286. package/template/apps/qpqjs/packages/constants/src/domain.ts +0 -3
  287. package/template/apps/qpqjs/services/test/service/src/echo/config/defineEcho.ts +0 -9
  288. package/template/apps/qpqjs/services/test/service/src/smoke/constants/smokeProbe.ts +0 -39
  289. package/template/apps/qpqjs/services/test/service/src/smoke/models/index.ts +0 -5
  290. package/template/apps/qpqjs/services/test/service/src/smoke/queue/index.ts +0 -3
  291. package/template/apps/qpqjs/services/test/service/src/smoke/storageDrive/index.ts +0 -4
  292. package/template/apps/qpqjs/services/test/service/src/smoke/tests/crossService/index.ts +0 -3
  293. package/template/apps/qpqjs/services/test/service/src/smoke/tests/keyValueStore/index.ts +0 -1
  294. package/template/apps/qpqjs/services/test/service/src/smoke/tests/scopedKeyValueStore/askRunScopedKeyValueStoreTest.ts +0 -102
  295. package/template/apps/qpqjs/services/test/service/src/smoke/tests/signingKey/index.ts +0 -1
  296. package/template/apps/qpqjs/services/test/service/src/smoke/tests/smokeTestRegistry.ts +0 -66
  297. package/template/apps/qpqjs/services/test/service/src/smoke/tests/storageDrive/index.ts +0 -1
  298. package/template/apps/qpqjs/services/test/service/src/tick/config/index.ts +0 -1
  299. package/template/apps/qpqjs/services/testa/service/src/crossServiceProbe/config/defineCrossServiceProbe.ts +0 -68
  300. package/template/apps/qpqjs/services/testa/service/src/crossServiceProbe/config/index.ts +0 -1
  301. package/template/apps/qpqjs/services/testa/service/src/crossServiceProbe/entry/serviceFunction/index.ts +0 -3
  302. package/template/apps/qpqjs/services/testa/service/src/crossServiceProbe/logic/index.ts +0 -3
  303. package/template/apps/todo/packages/constants/src/domain.ts +0 -2
  304. /package/lib/commonjs/steps/{007_pinRegistryVersions.d.ts → 008_pinRegistryVersions.d.ts} +0 -0
  305. /package/lib/commonjs/steps/{008_transpileToJavaScript.d.ts → 009_transpileToJavaScript.d.ts} +0 -0
  306. /package/lib/commonjs/steps/{009_restoreGitignore.d.ts → 010_restoreGitignore.d.ts} +0 -0
  307. /package/lib/commonjs/steps/{010_gitInit.d.ts → 011_gitInit.d.ts} +0 -0
  308. /package/lib/commonjs/steps/{011_npmInstall.d.ts → 012_npmInstall.d.ts} +0 -0
  309. /package/lib/commonjs/steps/{012_buildWorkspaces.d.ts → 013_buildWorkspaces.d.ts} +0 -0
  310. /package/lib/commonjs/steps/{013_printNextSteps.d.ts → 014_printNextSteps.d.ts} +0 -0
  311. /package/lib/esm/steps/{007_pinRegistryVersions.d.ts → 008_pinRegistryVersions.d.ts} +0 -0
  312. /package/lib/esm/steps/{008_transpileToJavaScript.d.ts → 009_transpileToJavaScript.d.ts} +0 -0
  313. /package/lib/esm/steps/{009_restoreGitignore.d.ts → 010_restoreGitignore.d.ts} +0 -0
  314. /package/lib/esm/steps/{010_gitInit.d.ts → 011_gitInit.d.ts} +0 -0
  315. /package/lib/esm/steps/{011_npmInstall.d.ts → 012_npmInstall.d.ts} +0 -0
  316. /package/lib/esm/steps/{012_buildWorkspaces.d.ts → 013_buildWorkspaces.d.ts} +0 -0
  317. /package/lib/esm/steps/{013_printNextSteps.d.ts → 014_printNextSteps.d.ts} +0 -0
  318. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests → harness/assert}/askSmokeAssert.ts +0 -0
  319. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests → harness/assert}/askSmokePollForMarker.ts +0 -0
  320. /package/template/apps/qpqjs/services/test/service/src/smoke/{constants → harness/constants}/SMOKE_RUNS_STORE.ts +0 -0
  321. /package/template/apps/qpqjs/services/test/service/src/smoke/{constants → harness/constants}/githubOidc.ts +0 -0
  322. /package/template/apps/qpqjs/services/test/service/src/smoke/{constants → harness/constants}/smokeRunQueue.ts +0 -0
  323. /package/template/apps/qpqjs/services/test/service/src/smoke/{controller → harness/controller}/askGetSmokeRun.ts +0 -0
  324. /package/template/apps/qpqjs/services/test/service/src/smoke/{controller → harness/controller}/askRunSmokeTests.ts +0 -0
  325. /package/template/apps/qpqjs/services/test/service/src/smoke/{controller → harness/controller}/index.ts +0 -0
  326. /package/template/apps/qpqjs/services/test/service/src/smoke/{data → harness/data}/askGetSmokeRunById.ts +0 -0
  327. /package/template/apps/qpqjs/services/test/service/src/smoke/{data → harness/data}/askRecordSmokeTestResult.ts +0 -0
  328. /package/template/apps/qpqjs/services/test/service/src/smoke/{data → harness/data}/askSaveSmokeRun.ts +0 -0
  329. /package/template/apps/qpqjs/services/test/service/src/smoke/{data → harness/data}/askSetSmokeRunOutcome.ts +0 -0
  330. /package/template/apps/qpqjs/services/test/service/src/smoke/{data → harness/data}/index.ts +0 -0
  331. /package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/github/index.ts +0 -0
  332. /package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/github/verifyGithubOidcToken.ts +0 -0
  333. /package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/index.ts +0 -0
  334. /package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/smokeRun/askFindSmokeRun.ts +0 -0
  335. /package/template/apps/qpqjs/services/test/service/src/smoke/{logic → harness/logic}/smokeRun/summarizeSmokeRun.ts +0 -0
  336. /package/template/apps/qpqjs/services/test/service/src/smoke/{models → harness/models}/GithubOidcClaims.ts +0 -0
  337. /package/template/apps/qpqjs/services/test/service/src/smoke/{processors → harness/processors}/github/getGithubOidcAuthProcessors.ts +0 -0
  338. /package/template/apps/qpqjs/services/test/service/src/smoke/{processors → harness/processors}/github/index.ts +0 -0
  339. /package/template/apps/qpqjs/services/test/service/src/smoke/{processors → harness/processors}/index.ts +0 -0
  340. /package/template/apps/qpqjs/services/test/service/src/smoke/{queue → harness/queue}/onSmokeTestRequested.ts +0 -0
  341. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests → harness/types}/SmokeTestDefinition.ts +0 -0
  342. /package/template/apps/qpqjs/services/test/service/src/smoke/{email → suites/emailReceive/logic}/smokeEmailMarkerId.ts +0 -0
  343. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/encryptedResources → suites/encryptedResources/logic}/index.ts +0 -0
  344. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventBus → suites/eventBus/logic}/index.ts +0 -0
  345. /package/template/apps/qpqjs/services/test/service/src/smoke/{models → suites/eventBus/models}/SmokeProbeEventQueueEvent.ts +0 -0
  346. /package/template/apps/qpqjs/services/test/service/src/smoke/{eventDoc → suites/eventDoc/definition}/index.ts +0 -0
  347. /package/template/apps/qpqjs/services/test/service/src/smoke/{eventDoc → suites/eventDoc/definition}/smokeProbeDocDefinition.ts +0 -0
  348. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/eventDoc → suites/eventDoc/logic}/index.ts +0 -0
  349. /package/template/apps/qpqjs/services/test/service/src/smoke/{models → suites/eventDoc/models}/SmokeEventDocAppendQueueEvent.ts +0 -0
  350. /package/template/apps/qpqjs/services/test/service/src/smoke/{models → suites/eventDoc/models}/SmokeEventDocMark.ts +0 -0
  351. /package/template/apps/qpqjs/services/test/service/src/smoke/{kvsStream → suites/keyValueStoreStream/logic}/smokeStreamMarkerId.ts +0 -0
  352. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/noop → suites/noop/logic}/askRunNoopTest.ts +0 -0
  353. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/noop → suites/noop/logic}/index.ts +0 -0
  354. /package/template/apps/qpqjs/services/test/service/src/{echo → smoke/suites/openApi}/controller/echo.ts +0 -0
  355. /package/template/apps/qpqjs/services/test/service/src/{echo → smoke/suites/openApi}/controller/index.ts +0 -0
  356. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/openApi → suites/openApi/logic}/index.ts +0 -0
  357. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/parameter → suites/parameter/logic}/index.ts +0 -0
  358. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/constants/index.ts +0 -0
  359. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/constants/scheduleTickName.ts +0 -0
  360. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/constants/scheduleTickStore.ts +0 -0
  361. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/entry/kvsStream/index.ts +0 -0
  362. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/entry/kvsStream/onScheduleTickStream.ts +0 -0
  363. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/entry/schedule/index.ts +0 -0
  364. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/entry/schedule/onTick.ts +0 -0
  365. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/schedule → suites/schedule/logic}/index.ts +0 -0
  366. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/models/ScheduleTickRecord.ts +0 -0
  367. /package/template/apps/qpqjs/services/test/service/src/{tick → smoke/suites/schedule}/models/index.ts +0 -0
  368. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/scopedKeyValueStore → suites/scopedKeyValueStore/logic}/index.ts +0 -0
  369. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/scopedStorageDrive → suites/scopedStorageDrive/logic}/index.ts +0 -0
  370. /package/template/apps/qpqjs/services/test/service/src/smoke/{tests/secret → suites/secret/logic}/index.ts +0 -0
  371. /package/template/apps/qpqjs/services/test/service/src/smoke/{storageDrive → suites/storageDriveEvent/logic}/smokeFileEventMarkerId.ts +0 -0
  372. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/keyValueStore}/entry/index.ts +0 -0
  373. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/keyValueStore}/entry/serviceFunction/smokeCrossServiceKeyValueStoreProbe.ts +0 -0
  374. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/keyValueStore}/index.ts +0 -0
  375. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/keyValueStore}/logic/askProbeForeignKeyValueStore.ts +0 -0
  376. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/signingKey}/entry/serviceFunction/smokeCrossServiceSigningKeyProbe.ts +0 -0
  377. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/signingKey}/logic/askProbeForeignSigningKey.ts +0 -0
  378. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/storageDrive}/entry/serviceFunction/smokeCrossServiceStorageDriveProbe.ts +0 -0
  379. /package/template/apps/qpqjs/services/testa/service/src/{crossServiceProbe → smoke/suites/storageDrive}/logic/askProbeForeignStorageDrive.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.transpileToJavaScript = exports.restoreGitignore = exports.printNextSteps = exports.preflight = exports.pinRegistryVersions = exports.npmInstall = exports.gitInit = exports.deleteQpqjsApp = exports.deleteDocusaurus = exports.copyTemplate = exports.buildWorkspaces = exports.applyDomain = exports.applyAppIdentity = exports.createQpqAppSteps = void 0;
3
+ exports.transpileToJavaScript = exports.restoreGitignore = exports.printNextSteps = exports.preflight = exports.pinRegistryVersions = exports.npmInstall = exports.gitInit = exports.deleteQpqjsApp = exports.deleteDocusaurus = exports.copyTemplate = exports.buildWorkspaces = exports.applyDomain = exports.applyDockerHost = exports.applyAppIdentity = exports.createQpqAppSteps = void 0;
4
4
  const _001_preflight_1 = require("./001_preflight");
5
5
  Object.defineProperty(exports, "preflight", { enumerable: true, get: function () { return _001_preflight_1.preflight; } });
6
6
  const _002_copyTemplate_1 = require("./002_copyTemplate");
@@ -13,20 +13,22 @@ const _005_applyAppIdentity_1 = require("./005_applyAppIdentity");
13
13
  Object.defineProperty(exports, "applyAppIdentity", { enumerable: true, get: function () { return _005_applyAppIdentity_1.applyAppIdentity; } });
14
14
  const _006_applyDomain_1 = require("./006_applyDomain");
15
15
  Object.defineProperty(exports, "applyDomain", { enumerable: true, get: function () { return _006_applyDomain_1.applyDomain; } });
16
- const _007_pinRegistryVersions_1 = require("./007_pinRegistryVersions");
17
- Object.defineProperty(exports, "pinRegistryVersions", { enumerable: true, get: function () { return _007_pinRegistryVersions_1.pinRegistryVersions; } });
18
- const _008_transpileToJavaScript_1 = require("./008_transpileToJavaScript");
19
- Object.defineProperty(exports, "transpileToJavaScript", { enumerable: true, get: function () { return _008_transpileToJavaScript_1.transpileToJavaScript; } });
20
- const _009_restoreGitignore_1 = require("./009_restoreGitignore");
21
- Object.defineProperty(exports, "restoreGitignore", { enumerable: true, get: function () { return _009_restoreGitignore_1.restoreGitignore; } });
22
- const _010_gitInit_1 = require("./010_gitInit");
23
- Object.defineProperty(exports, "gitInit", { enumerable: true, get: function () { return _010_gitInit_1.gitInit; } });
24
- const _011_npmInstall_1 = require("./011_npmInstall");
25
- Object.defineProperty(exports, "npmInstall", { enumerable: true, get: function () { return _011_npmInstall_1.npmInstall; } });
26
- const _012_buildWorkspaces_1 = require("./012_buildWorkspaces");
27
- Object.defineProperty(exports, "buildWorkspaces", { enumerable: true, get: function () { return _012_buildWorkspaces_1.buildWorkspaces; } });
28
- const _013_printNextSteps_1 = require("./013_printNextSteps");
29
- Object.defineProperty(exports, "printNextSteps", { enumerable: true, get: function () { return _013_printNextSteps_1.printNextSteps; } });
16
+ const _007_applyDockerHost_1 = require("./007_applyDockerHost");
17
+ Object.defineProperty(exports, "applyDockerHost", { enumerable: true, get: function () { return _007_applyDockerHost_1.applyDockerHost; } });
18
+ const _008_pinRegistryVersions_1 = require("./008_pinRegistryVersions");
19
+ Object.defineProperty(exports, "pinRegistryVersions", { enumerable: true, get: function () { return _008_pinRegistryVersions_1.pinRegistryVersions; } });
20
+ const _009_transpileToJavaScript_1 = require("./009_transpileToJavaScript");
21
+ Object.defineProperty(exports, "transpileToJavaScript", { enumerable: true, get: function () { return _009_transpileToJavaScript_1.transpileToJavaScript; } });
22
+ const _010_restoreGitignore_1 = require("./010_restoreGitignore");
23
+ Object.defineProperty(exports, "restoreGitignore", { enumerable: true, get: function () { return _010_restoreGitignore_1.restoreGitignore; } });
24
+ const _011_gitInit_1 = require("./011_gitInit");
25
+ Object.defineProperty(exports, "gitInit", { enumerable: true, get: function () { return _011_gitInit_1.gitInit; } });
26
+ const _012_npmInstall_1 = require("./012_npmInstall");
27
+ Object.defineProperty(exports, "npmInstall", { enumerable: true, get: function () { return _012_npmInstall_1.npmInstall; } });
28
+ const _013_buildWorkspaces_1 = require("./013_buildWorkspaces");
29
+ Object.defineProperty(exports, "buildWorkspaces", { enumerable: true, get: function () { return _013_buildWorkspaces_1.buildWorkspaces; } });
30
+ const _014_printNextSteps_1 = require("./014_printNextSteps");
31
+ Object.defineProperty(exports, "printNextSteps", { enumerable: true, get: function () { return _014_printNextSteps_1.printNextSteps; } });
30
32
  // The pipeline: always this list, always this order; the numeric file
31
33
  // prefixes match, so the steps directory reads top to bottom. Steps decide
32
34
  // for themselves (shouldRun) whether the collected answers apply to them.
@@ -37,12 +39,13 @@ exports.createQpqAppSteps = [
37
39
  _004_deleteQpqjsApp_1.deleteQpqjsApp,
38
40
  _005_applyAppIdentity_1.applyAppIdentity,
39
41
  _006_applyDomain_1.applyDomain,
40
- _007_pinRegistryVersions_1.pinRegistryVersions,
41
- _008_transpileToJavaScript_1.transpileToJavaScript,
42
- _009_restoreGitignore_1.restoreGitignore,
43
- _010_gitInit_1.gitInit,
44
- _011_npmInstall_1.npmInstall,
45
- _012_buildWorkspaces_1.buildWorkspaces,
46
- _013_printNextSteps_1.printNextSteps,
42
+ _007_applyDockerHost_1.applyDockerHost,
43
+ _008_pinRegistryVersions_1.pinRegistryVersions,
44
+ _009_transpileToJavaScript_1.transpileToJavaScript,
45
+ _010_restoreGitignore_1.restoreGitignore,
46
+ _011_gitInit_1.gitInit,
47
+ _012_npmInstall_1.npmInstall,
48
+ _013_buildWorkspaces_1.buildWorkspaces,
49
+ _014_printNextSteps_1.printNextSteps,
47
50
  ];
48
51
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;AACA,oDAA4C;AA2C1C,0FA3CO,0BAAS,OA2CP;AA1CX,0DAAkD;AAoChD,6FApCO,gCAAY,OAoCP;AAnCd,kEAA0D;AAoCxD,iGApCO,wCAAgB,OAoCP;AAnClB,8DAAsD;AAoCpD,+FApCO,oCAAc,OAoCP;AAnChB,kEAA0D;AA8BxD,iGA9BO,wCAAgB,OA8BP;AA7BlB,wDAAgD;AA8B9C,4FA9BO,8BAAW,OA8BP;AA7Bb,wEAAgE;AAoC9D,oGApCO,8CAAmB,OAoCP;AAnCrB,4EAAoE;AAuClE,sGAvCO,kDAAqB,OAuCP;AAtCvB,kEAA0D;AAqCxD,iGArCO,wCAAgB,OAqCP;AApClB,gDAAwC;AA+BtC,wFA/BO,sBAAO,OA+BP;AA9BT,sDAA8C;AA+B5C,2FA/BO,4BAAU,OA+BP;AA9BZ,gEAAwD;AAyBtD,gGAzBO,sCAAe,OAyBP;AAxBjB,8DAAsD;AAgCpD,+FAhCO,oCAAc,OAgCP;AA9BhB,sEAAsE;AACtE,2EAA2E;AAC3E,0EAA0E;AAC7D,QAAA,iBAAiB,GAAuB;IACnD,0BAAS;IACT,gCAAY;IACZ,wCAAgB;IAChB,oCAAc;IACd,wCAAgB;IAChB,8BAAW;IACX,8CAAmB;IACnB,kDAAqB;IACrB,wCAAgB;IAChB,sBAAO;IACP,4BAAU;IACV,sCAAe;IACf,oCAAc;CACf,CAAC","sourcesContent":["import { CreateQpqAppStep } from '../types';\nimport { preflight } from './001_preflight';\nimport { copyTemplate } from './002_copyTemplate';\nimport { deleteDocusaurus } from './003_deleteDocusaurus';\nimport { deleteQpqjsApp } from './004_deleteQpqjsApp';\nimport { applyAppIdentity } from './005_applyAppIdentity';\nimport { applyDomain } from './006_applyDomain';\nimport { pinRegistryVersions } from './007_pinRegistryVersions';\nimport { transpileToJavaScript } from './008_transpileToJavaScript';\nimport { restoreGitignore } from './009_restoreGitignore';\nimport { gitInit } from './010_gitInit';\nimport { npmInstall } from './011_npmInstall';\nimport { buildWorkspaces } from './012_buildWorkspaces';\nimport { printNextSteps } from './013_printNextSteps';\n\n// The pipeline: always this list, always this order; the numeric file\n// prefixes match, so the steps directory reads top to bottom. Steps decide\n// for themselves (shouldRun) whether the collected answers apply to them.\nexport const createQpqAppSteps: CreateQpqAppStep[] = [\n preflight,\n copyTemplate,\n deleteDocusaurus,\n deleteQpqjsApp,\n applyAppIdentity,\n applyDomain,\n pinRegistryVersions,\n transpileToJavaScript,\n restoreGitignore,\n gitInit,\n npmInstall,\n buildWorkspaces,\n printNextSteps,\n];\n\nexport {\n applyAppIdentity,\n applyDomain,\n buildWorkspaces,\n copyTemplate,\n deleteDocusaurus,\n deleteQpqjsApp,\n gitInit,\n npmInstall,\n pinRegistryVersions,\n preflight,\n printNextSteps,\n restoreGitignore,\n transpileToJavaScript,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/index.ts"],"names":[],"mappings":";;;AACA,oDAA4C;AA8C1C,0FA9CO,0BAAS,OA8CP;AA7CX,0DAAkD;AAuChD,6FAvCO,gCAAY,OAuCP;AAtCd,kEAA0D;AAuCxD,iGAvCO,wCAAgB,OAuCP;AAtClB,8DAAsD;AAuCpD,+FAvCO,oCAAc,OAuCP;AAtChB,kEAA0D;AAgCxD,iGAhCO,wCAAgB,OAgCP;AA/BlB,wDAAgD;AAiC9C,4FAjCO,8BAAW,OAiCP;AAhCb,gEAAwD;AA+BtD,gGA/BO,sCAAe,OA+BP;AA9BjB,wEAAgE;AAsC9D,oGAtCO,8CAAmB,OAsCP;AArCrB,4EAAoE;AAyClE,sGAzCO,kDAAqB,OAyCP;AAxCvB,kEAA0D;AAuCxD,iGAvCO,wCAAgB,OAuCP;AAtClB,gDAAwC;AAiCtC,wFAjCO,sBAAO,OAiCP;AAhCT,sDAA8C;AAiC5C,2FAjCO,4BAAU,OAiCP;AAhCZ,gEAAwD;AA2BtD,gGA3BO,sCAAe,OA2BP;AA1BjB,8DAAsD;AAkCpD,+FAlCO,oCAAc,OAkCP;AAhChB,sEAAsE;AACtE,2EAA2E;AAC3E,0EAA0E;AAC7D,QAAA,iBAAiB,GAAuB;IACnD,0BAAS;IACT,gCAAY;IACZ,wCAAgB;IAChB,oCAAc;IACd,wCAAgB;IAChB,8BAAW;IACX,sCAAe;IACf,8CAAmB;IACnB,kDAAqB;IACrB,wCAAgB;IAChB,sBAAO;IACP,4BAAU;IACV,sCAAe;IACf,oCAAc;CACf,CAAC","sourcesContent":["import { CreateQpqAppStep } from '../types';\nimport { preflight } from './001_preflight';\nimport { copyTemplate } from './002_copyTemplate';\nimport { deleteDocusaurus } from './003_deleteDocusaurus';\nimport { deleteQpqjsApp } from './004_deleteQpqjsApp';\nimport { applyAppIdentity } from './005_applyAppIdentity';\nimport { applyDomain } from './006_applyDomain';\nimport { applyDockerHost } from './007_applyDockerHost';\nimport { pinRegistryVersions } from './008_pinRegistryVersions';\nimport { transpileToJavaScript } from './009_transpileToJavaScript';\nimport { restoreGitignore } from './010_restoreGitignore';\nimport { gitInit } from './011_gitInit';\nimport { npmInstall } from './012_npmInstall';\nimport { buildWorkspaces } from './013_buildWorkspaces';\nimport { printNextSteps } from './014_printNextSteps';\n\n// The pipeline: always this list, always this order; the numeric file\n// prefixes match, so the steps directory reads top to bottom. Steps decide\n// for themselves (shouldRun) whether the collected answers apply to them.\nexport const createQpqAppSteps: CreateQpqAppStep[] = [\n preflight,\n copyTemplate,\n deleteDocusaurus,\n deleteQpqjsApp,\n applyAppIdentity,\n applyDomain,\n applyDockerHost,\n pinRegistryVersions,\n transpileToJavaScript,\n restoreGitignore,\n gitInit,\n npmInstall,\n buildWorkspaces,\n printNextSteps,\n];\n\nexport {\n applyAppIdentity,\n applyDockerHost,\n applyDomain,\n buildWorkspaces,\n copyTemplate,\n deleteDocusaurus,\n deleteQpqjsApp,\n gitInit,\n npmInstall,\n pinRegistryVersions,\n preflight,\n printNextSteps,\n restoreGitignore,\n transpileToJavaScript,\n};\n"]}
@@ -3,6 +3,8 @@ export type CreateQpqAppAnswers = {
3
3
  appName: string;
4
4
  language: AppLanguage;
5
5
  domain: string;
6
+ dockerRegistry: string;
7
+ dockerHost: string;
6
8
  initialiseGit: boolean;
7
9
  installDependencies: boolean;
8
10
  };
@@ -1 +1 @@
1
- {"version":3,"file":"CreateQpqAppAnswers.js","sourceRoot":"","sources":["../../../src/types/CreateQpqAppAnswers.ts"],"names":[],"mappings":"","sourcesContent":["import { AppLanguage } from './AppLanguage';\n\n// Everything the pipeline needs to know, collected ONCE (flags first, prompts\n// for whatever is still missing) before any step runs: steps never prompt.\nexport type CreateQpqAppAnswers = {\n appName: string;\n language: AppLanguage;\n domain: string;\n initialiseGit: boolean;\n installDependencies: boolean;\n};\n"]}
1
+ {"version":3,"file":"CreateQpqAppAnswers.js","sourceRoot":"","sources":["../../../src/types/CreateQpqAppAnswers.ts"],"names":[],"mappings":"","sourcesContent":["import { AppLanguage } from './AppLanguage';\n\n// Everything the pipeline needs to know, collected ONCE (flags first, prompts\n// for whatever is still missing) before any step runs: steps never prompt.\nexport type CreateQpqAppAnswers = {\n appName: string;\n language: AppLanguage;\n domain: string;\n // Docker registry the image is pushed to ('' = local docker store only).\n dockerRegistry: string;\n // Address browsers use for the docker host ('' = localhost).\n dockerHost: string;\n initialiseGit: boolean;\n installDependencies: boolean;\n};\n"]}
@@ -4,6 +4,7 @@ import { getOwnPackageRoot } from '../lib/getOwnPackageRoot';
4
4
  import { getOwnVersion } from '../lib/getOwnVersion';
5
5
  import { getPositionalArgs } from '../lib/getPositionalArgs';
6
6
  import { promptSelect } from '../lib/promptSelect';
7
+ import { promptText } from '../lib/promptText';
7
8
  import { createQpqAppSteps } from '../steps';
8
9
  import { AppLanguage } from '../types';
9
10
  const USAGE = `Usage: npx create-qpq-app <app-name> [options]
@@ -11,6 +12,8 @@ const USAGE = `Usage: npx create-qpq-app <app-name> [options]
11
12
  Options:
12
13
  --language <typescript|javascript> skip the language prompt
13
14
  --domain <domain> app domain (default: <app-name>.example.com)
15
+ --docker-registry <host[:port]> registry qpq go pushes the image to (e.g. 192.168.8.88:5000)
16
+ --docker-host <address> address browsers use for the docker host (e.g. 192.168.8.88)
14
17
  --no-git skip git init
15
18
  --no-install skip npm install
16
19
  `;
@@ -27,8 +30,17 @@ const resolveLanguage = async (argv) => {
27
30
  const selected = await promptSelect('Which language would you like?', ['TypeScript', 'JavaScript'], 'TypeScript');
28
31
  return selected === 'JavaScript' ? AppLanguage.javascript : AppLanguage.typescript;
29
32
  };
33
+ // Where the app will be self-hosted. A flag wins; an interactive terminal is asked, with blank
34
+ // meaning "not yet"; a script or CI run without the flag gets blank without a prompt.
35
+ const resolveDockerSetting = async (argv, flag, question) => {
36
+ const flagValue = getArgValue(argv, flag);
37
+ if (flagValue !== undefined) {
38
+ return flagValue.trim();
39
+ }
40
+ return process.stdin.isTTY ? promptText(question) : '';
41
+ };
30
42
  export const runCreateQpqApp = async (argv) => {
31
- const [appName] = getPositionalArgs(argv, ['--language', '--domain']);
43
+ const [appName] = getPositionalArgs(argv, ['--language', '--domain', '--docker-registry', '--docker-host']);
32
44
  if (!appName || argv.includes('--help')) {
33
45
  console.log(USAGE);
34
46
  process.exit(appName ? 0 : 1);
@@ -39,6 +51,8 @@ export const runCreateQpqApp = async (argv) => {
39
51
  appName,
40
52
  language: await resolveLanguage(argv),
41
53
  domain: getArgValue(argv, '--domain') ?? `${appName}.example.com`,
54
+ dockerRegistry: await resolveDockerSetting(argv, '--docker-registry', 'Docker registry to push images to (blank for none, e.g. 192.168.8.88:5000)'),
55
+ dockerHost: await resolveDockerSetting(argv, '--docker-host', 'Address browsers will use for the docker host (blank for localhost, e.g. 192.168.8.88)'),
42
56
  initialiseGit: !argv.includes('--no-git'),
43
57
  installDependencies: !argv.includes('--no-install'),
44
58
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runCreateQpqApp.js","sourceRoot":"","sources":["../../../src/cli/runCreateQpqApp.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAoC,MAAM,UAAU,CAAC;AAEzE,MAAM,KAAK,GAAG;;;;;;;CAOb,CAAC;AAEF,4EAA4E;AAC5E,gCAAgC;AAChC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAc,EAAwB,EAAE;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IACjE,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,uBAAuB,SAAS,kCAAkC,CAAC,CAAC;QACtF,CAAC;QACD,OAAO,WAAW,CAAC,SAAqC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,gCAAgC,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;IAClH,OAAO,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACrE,MAAM,CAAC,OAAO,CAAC,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAEtE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,wEAAwE;IACxE,kEAAkE;IAClE,MAAM,OAAO,GAAwB;QACnC,OAAO;QACP,QAAQ,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC;QACrC,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,GAAG,OAAO,cAAc;QACjE,aAAa,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QACzC,mBAAmB,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;KACpD,CAAC;IAEF,MAAM,OAAO,GAAgB;QAC3B,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC;QACrD,iBAAiB,EAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,UAAU,CAAC;QAC7D,UAAU,EAAE,aAAa,EAAE;QAC3B,OAAO;KACR,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC","sourcesContent":["import path from 'path';\n\nimport { getArgValue } from '../lib/getArgValue';\nimport { getOwnPackageRoot } from '../lib/getOwnPackageRoot';\nimport { getOwnVersion } from '../lib/getOwnVersion';\nimport { getPositionalArgs } from '../lib/getPositionalArgs';\nimport { promptSelect } from '../lib/promptSelect';\nimport { createQpqAppSteps } from '../steps';\nimport { AppLanguage, CreateQpqAppAnswers, StepContext } from '../types';\n\nconst USAGE = `Usage: npx create-qpq-app <app-name> [options]\n\nOptions:\n --language <typescript|javascript> skip the language prompt\n --domain <domain> app domain (default: <app-name>.example.com)\n --no-git skip git init\n --no-install skip npm install\n`;\n\n// Resolve the language from a flag when given, otherwise prompt. Flags keep\n// CI and tests non-interactive.\nconst resolveLanguage = async (argv: string[]): Promise<AppLanguage> => {\n const flagValue = getArgValue(argv, '--language')?.toLowerCase();\n if (flagValue) {\n if (!(flagValue in AppLanguage)) {\n throw new Error(`Unknown --language \"${flagValue}\", use typescript or javascript.`);\n }\n return AppLanguage[flagValue as keyof typeof AppLanguage];\n }\n\n const selected = await promptSelect('Which language would you like?', ['TypeScript', 'JavaScript'], 'TypeScript');\n return selected === 'JavaScript' ? AppLanguage.javascript : AppLanguage.typescript;\n};\n\nexport const runCreateQpqApp = async (argv: string[]): Promise<void> => {\n const [appName] = getPositionalArgs(argv, ['--language', '--domain']);\n\n if (!appName || argv.includes('--help')) {\n console.log(USAGE);\n process.exit(appName ? 0 : 1);\n }\n\n // All answers are locked in before the first step runs, no mid-pipeline\n // prompting, so every step sees the same complete answers object.\n const answers: CreateQpqAppAnswers = {\n appName,\n language: await resolveLanguage(argv),\n domain: getArgValue(argv, '--domain') ?? `${appName}.example.com`,\n initialiseGit: !argv.includes('--no-git'),\n installDependencies: !argv.includes('--no-install'),\n };\n\n const context: StepContext = {\n targetDirectory: path.resolve(process.cwd(), appName),\n templateDirectory: path.join(getOwnPackageRoot(), 'template'),\n ownVersion: getOwnVersion(),\n answers,\n };\n\n for (const step of createQpqAppSteps) {\n if (step.shouldRun && !step.shouldRun(answers)) {\n continue;\n }\n\n console.log(`\\n▸ ${step.name}`);\n await step.run(context);\n }\n};\n"]}
1
+ {"version":3,"file":"runCreateQpqApp.js","sourceRoot":"","sources":["../../../src/cli/runCreateQpqApp.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path';\n\nimport { getArgValue } from '../lib/getArgValue';\nimport { getOwnPackageRoot } from '../lib/getOwnPackageRoot';\nimport { getOwnVersion } from '../lib/getOwnVersion';\nimport { getPositionalArgs } from '../lib/getPositionalArgs';\nimport { promptSelect } from '../lib/promptSelect';\nimport { promptText } from '../lib/promptText';\nimport { createQpqAppSteps } from '../steps';\nimport { AppLanguage, CreateQpqAppAnswers, StepContext } from '../types';\n\nconst USAGE = `Usage: npx create-qpq-app <app-name> [options]\n\nOptions:\n --language <typescript|javascript> skip the language prompt\n --domain <domain> app domain (default: <app-name>.example.com)\n --docker-registry <host[:port]> registry qpq go pushes the image to (e.g. 192.168.8.88:5000)\n --docker-host <address> address browsers use for the docker host (e.g. 192.168.8.88)\n --no-git skip git init\n --no-install skip npm install\n`;\n\n// Resolve the language from a flag when given, otherwise prompt. Flags keep\n// CI and tests non-interactive.\nconst resolveLanguage = async (argv: string[]): Promise<AppLanguage> => {\n const flagValue = getArgValue(argv, '--language')?.toLowerCase();\n if (flagValue) {\n if (!(flagValue in AppLanguage)) {\n throw new Error(`Unknown --language \"${flagValue}\", use typescript or javascript.`);\n }\n return AppLanguage[flagValue as keyof typeof AppLanguage];\n }\n\n const selected = await promptSelect('Which language would you like?', ['TypeScript', 'JavaScript'], 'TypeScript');\n return selected === 'JavaScript' ? AppLanguage.javascript : AppLanguage.typescript;\n};\n\n// Where the app will be self-hosted. A flag wins; an interactive terminal is asked, with blank\n// meaning \"not yet\"; a script or CI run without the flag gets blank without a prompt.\nconst resolveDockerSetting = async (argv: string[], flag: string, question: string): Promise<string> => {\n const flagValue = getArgValue(argv, flag);\n if (flagValue !== undefined) {\n return flagValue.trim();\n }\n return process.stdin.isTTY ? promptText(question) : '';\n};\n\nexport const runCreateQpqApp = async (argv: string[]): Promise<void> => {\n const [appName] = getPositionalArgs(argv, ['--language', '--domain', '--docker-registry', '--docker-host']);\n\n if (!appName || argv.includes('--help')) {\n console.log(USAGE);\n process.exit(appName ? 0 : 1);\n }\n\n // All answers are locked in before the first step runs, no mid-pipeline\n // prompting, so every step sees the same complete answers object.\n const answers: CreateQpqAppAnswers = {\n appName,\n language: await resolveLanguage(argv),\n domain: getArgValue(argv, '--domain') ?? `${appName}.example.com`,\n dockerRegistry: await resolveDockerSetting(\n argv,\n '--docker-registry',\n 'Docker registry to push images to (blank for none, e.g. 192.168.8.88:5000)',\n ),\n dockerHost: await resolveDockerSetting(\n argv,\n '--docker-host',\n 'Address browsers will use for the docker host (blank for localhost, e.g. 192.168.8.88)',\n ),\n initialiseGit: !argv.includes('--no-git'),\n installDependencies: !argv.includes('--no-install'),\n };\n\n const context: StepContext = {\n targetDirectory: path.resolve(process.cwd(), appName),\n templateDirectory: path.join(getOwnPackageRoot(), 'template'),\n ownVersion: getOwnVersion(),\n answers,\n };\n\n for (const step of createQpqAppSteps) {\n if (step.shouldRun && !step.shouldRun(answers)) {\n continue;\n }\n\n console.log(`\\n▸ ${step.name}`);\n await step.run(context);\n }\n};\n"]}
@@ -4,8 +4,8 @@ export * from './getOwnVersion';
4
4
  export * from './getPositionalArgs';
5
5
  export * from './listFilesRecursive';
6
6
  export * from './promptSelect';
7
+ export * from './promptText';
7
8
  export * from './readJsonFile';
8
- export * from './replaceInFileExact';
9
9
  export * from './replaceInFiles';
10
10
  export * from './runCommand';
11
11
  export * from './writeJsonFile';
@@ -4,8 +4,8 @@ export * from './getOwnVersion';
4
4
  export * from './getPositionalArgs';
5
5
  export * from './listFilesRecursive';
6
6
  export * from './promptSelect';
7
+ export * from './promptText';
7
8
  export * from './readJsonFile';
8
- export * from './replaceInFileExact';
9
9
  export * from './replaceInFiles';
10
10
  export * from './runCommand';
11
11
  export * from './writeJsonFile';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC","sourcesContent":["export * from './getArgValue';\nexport * from './getOwnPackageRoot';\nexport * from './getOwnVersion';\nexport * from './getPositionalArgs';\nexport * from './listFilesRecursive';\nexport * from './promptSelect';\nexport * from './readJsonFile';\nexport * from './replaceInFileExact';\nexport * from './replaceInFiles';\nexport * from './runCommand';\nexport * from './writeJsonFile';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC","sourcesContent":["export * from './getArgValue';\nexport * from './getOwnPackageRoot';\nexport * from './getOwnVersion';\nexport * from './getPositionalArgs';\nexport * from './listFilesRecursive';\nexport * from './promptSelect';\nexport * from './promptText';\nexport * from './readJsonFile';\nexport * from './replaceInFiles';\nexport * from './runCommand';\nexport * from './writeJsonFile';\n"]}
@@ -0,0 +1 @@
1
+ export declare const promptText: (message: string, defaultValue?: string) => Promise<string>;
@@ -0,0 +1,7 @@
1
+ // Present a free-text prompt and return the trimmed answer ('' when left blank).
2
+ // @inquirer/prompts is imported lazily so fully-flagged runs never pay for it.
3
+ export const promptText = async (message, defaultValue = '') => {
4
+ const { input } = await import('@inquirer/prompts');
5
+ return (await input({ message, default: defaultValue })).trim();
6
+ };
7
+ //# sourceMappingURL=promptText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptText.js","sourceRoot":"","sources":["../../../src/lib/promptText.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,OAAe,EAAE,YAAY,GAAG,EAAE,EAAmB,EAAE;IACtF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAClE,CAAC,CAAC","sourcesContent":["// Present a free-text prompt and return the trimmed answer ('' when left blank).\n// @inquirer/prompts is imported lazily so fully-flagged runs never pay for it.\nexport const promptText = async (message: string, defaultValue = ''): Promise<string> => {\n const { input } = await import('@inquirer/prompts');\n return (await input({ message, default: defaultValue })).trim();\n};\n"]}
@@ -1,11 +1,10 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { readJsonFile } from '../lib/readJsonFile';
4
- import { replaceInFileExact } from '../lib/replaceInFileExact';
5
4
  import { replaceInFiles } from '../lib/replaceInFiles';
6
5
  import { writeJsonFile } from '../lib/writeJsonFile';
7
6
  // Give the app its identity. Only targeted, collision-free tokens are
8
- // rewritten: the app FOLDER, the package SCOPE and the deploy PREFIX take
7
+ // rewritten: the app FOLDER, the package SCOPE and each deployment's NAME take
9
8
  // the app name, while template vocabulary (TodoServiceEnum, services/todo,
10
9
  // TodoList, TODO comments) is deliberately left alone so every generated app
11
10
  // shares the same internal layout.
@@ -24,12 +23,14 @@ export const applyAppIdentity = {
24
23
  // Build/dist and federated-alias paths: dist/apps/todo/... -> dist/apps/myapp/...
25
24
  ['apps/todo/', `apps/${appName}/`],
26
25
  ]);
27
- // The deploy prefix names every stack/resource; this is the app name.
26
+ // A deployment's name prefixes every stack/resource; service configs read it
27
+ // from the primed APPLICATION_NAME, so the JSON is the only place it's set.
28
28
  const deployConfigPath = path.join(targetDirectory, 'apps', appName, 'deploy.config.json');
29
29
  const deployConfig = readJsonFile(deployConfigPath);
30
- deployConfig.prefix = appName;
30
+ for (const deployment of Object.values(deployConfig.deployments)) {
31
+ deployment.name = appName;
32
+ }
31
33
  writeJsonFile(deployConfigPath, deployConfig);
32
- replaceInFileExact(path.join(appDirectory, 'packages', 'service-utils', 'src', 'defineTodoService.ts'), "const modulePrefix = 'todo';", `const modulePrefix = '${appName}';`);
33
34
  const rootPackageJsonPath = path.join(targetDirectory, 'package.json');
34
35
  const rootPackageJson = readJsonFile(rootPackageJsonPath);
35
36
  rootPackageJson.name = appName;
@@ -1 +1 @@
1
- {"version":3,"file":"005_applyAppIdentity.js","sourceRoot":"","sources":["../../../src/steps/005_applyAppIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,sEAAsE;AACtE,0EAA0E;AAC1E,2EAA2E;AAC3E,6EAA6E;AAC7E,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,IAAI,EAAE,uBAAuB;IAE7B,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAE5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,cAAc,CAAC,eAAe,EAAE;YAC9B,+DAA+D;YAC/D,CAAC,QAAQ,EAAE,IAAI,OAAO,GAAG,CAAC;YAC1B,kFAAkF;YAClF,CAAC,YAAY,EAAE,QAAQ,OAAO,GAAG,CAAC;SACnC,CAAC,CAAC;QAEH,sEAAsE;QACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACpD,YAAY,CAAC,MAAM,GAAG,OAAO,CAAC;QAC9B,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAE9C,kBAAkB,CAChB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,sBAAsB,CAAC,EACnF,8BAA8B,EAC9B,yBAAyB,OAAO,IAAI,CACrC,CAAC;QAEF,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAC1D,eAAe,CAAC,IAAI,GAAG,OAAO,CAAC;QAC/B,aAAa,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IACtD,CAAC;CACF,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { replaceInFileExact } from '../lib/replaceInFileExact';\nimport { replaceInFiles } from '../lib/replaceInFiles';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { CreateQpqAppStep } from '../types';\n\n// Give the app its identity. Only targeted, collision-free tokens are\n// rewritten: the app FOLDER, the package SCOPE and the deploy PREFIX take\n// the app name, while template vocabulary (TodoServiceEnum, services/todo,\n// TodoList, TODO comments) is deliberately left alone so every generated app\n// shares the same internal layout.\nexport const applyAppIdentity: CreateQpqAppStep = {\n name: 'Applying app identity',\n\n run: async ({ targetDirectory, answers }) => {\n const { appName } = answers;\n\n const todoAppDirectory = path.join(targetDirectory, 'apps', 'todo');\n const appDirectory = path.join(targetDirectory, 'apps', appName);\n if (appName !== 'todo') {\n fs.renameSync(todoAppDirectory, appDirectory);\n }\n\n replaceInFiles(targetDirectory, [\n // Workspace package scope: @todo/constants -> @myapp/constants\n ['@todo/', `@${appName}/`],\n // Build/dist and federated-alias paths: dist/apps/todo/... -> dist/apps/myapp/...\n ['apps/todo/', `apps/${appName}/`],\n ]);\n\n // The deploy prefix names every stack/resource; this is the app name.\n const deployConfigPath = path.join(targetDirectory, 'apps', appName, 'deploy.config.json');\n const deployConfig = readJsonFile(deployConfigPath);\n deployConfig.prefix = appName;\n writeJsonFile(deployConfigPath, deployConfig);\n\n replaceInFileExact(\n path.join(appDirectory, 'packages', 'service-utils', 'src', 'defineTodoService.ts'),\n \"const modulePrefix = 'todo';\",\n `const modulePrefix = '${appName}';`,\n );\n\n const rootPackageJsonPath = path.join(targetDirectory, 'package.json');\n const rootPackageJson = readJsonFile(rootPackageJsonPath);\n rootPackageJson.name = appName;\n writeJsonFile(rootPackageJsonPath, rootPackageJson);\n },\n};\n"]}
1
+ {"version":3,"file":"005_applyAppIdentity.js","sourceRoot":"","sources":["../../../src/steps/005_applyAppIdentity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,sEAAsE;AACtE,+EAA+E;AAC/E,2EAA2E;AAC3E,6EAA6E;AAC7E,mCAAmC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,IAAI,EAAE,uBAAuB;IAE7B,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAE5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;YACvB,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,cAAc,CAAC,eAAe,EAAE;YAC9B,+DAA+D;YAC/D,CAAC,QAAQ,EAAE,IAAI,OAAO,GAAG,CAAC;YAC1B,kFAAkF;YAClF,CAAC,YAAY,EAAE,QAAQ,OAAO,GAAG,CAAC;SACnC,CAAC,CAAC;QAEH,6EAA6E;QAC7E,4EAA4E;QAC5E,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;QAC3F,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACpD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAuB,EAAE,CAAC;YACvF,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;QAC5B,CAAC;QACD,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAE9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAC1D,eAAe,CAAC,IAAI,GAAG,OAAO,CAAC;QAC/B,aAAa,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IACtD,CAAC;CACF,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { replaceInFiles } from '../lib/replaceInFiles';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { CreateQpqAppStep } from '../types';\n\n// Give the app its identity. Only targeted, collision-free tokens are\n// rewritten: the app FOLDER, the package SCOPE and each deployment's NAME take\n// the app name, while template vocabulary (TodoServiceEnum, services/todo,\n// TodoList, TODO comments) is deliberately left alone so every generated app\n// shares the same internal layout.\nexport const applyAppIdentity: CreateQpqAppStep = {\n name: 'Applying app identity',\n\n run: async ({ targetDirectory, answers }) => {\n const { appName } = answers;\n\n const todoAppDirectory = path.join(targetDirectory, 'apps', 'todo');\n const appDirectory = path.join(targetDirectory, 'apps', appName);\n if (appName !== 'todo') {\n fs.renameSync(todoAppDirectory, appDirectory);\n }\n\n replaceInFiles(targetDirectory, [\n // Workspace package scope: @todo/constants -> @myapp/constants\n ['@todo/', `@${appName}/`],\n // Build/dist and federated-alias paths: dist/apps/todo/... -> dist/apps/myapp/...\n ['apps/todo/', `apps/${appName}/`],\n ]);\n\n // A deployment's name prefixes every stack/resource; service configs read it\n // from the primed APPLICATION_NAME, so the JSON is the only place it's set.\n const deployConfigPath = path.join(targetDirectory, 'apps', appName, 'deploy.config.json');\n const deployConfig = readJsonFile(deployConfigPath);\n for (const deployment of Object.values(deployConfig.deployments) as { name: string }[]) {\n deployment.name = appName;\n }\n writeJsonFile(deployConfigPath, deployConfig);\n\n const rootPackageJsonPath = path.join(targetDirectory, 'package.json');\n const rootPackageJson = readJsonFile(rootPackageJsonPath);\n rootPackageJson.name = appName;\n writeJsonFile(rootPackageJsonPath, rootPackageJson);\n },\n};\n"]}
@@ -1,13 +1,18 @@
1
1
  import path from 'path';
2
- import { replaceInFileExact } from '../lib/replaceInFileExact';
3
- // The template's domain, replaced where it's authoritative: the app's domain
4
- // constant (everything else derives from it). One root at scaffold time; more
5
- // can be appended later.
6
- const TEMPLATE_DOMAIN = 'todo.quidproquojs.com';
2
+ import { readJsonFile } from '../lib/readJsonFile';
3
+ import { writeJsonFile } from '../lib/writeJsonFile';
4
+ // The domain is a deployment setting (ROOT_DOMAINS, read by every defineDns), so
5
+ // it is set on each generated deployment. One root at scaffold time; more can
6
+ // be appended later, comma separated, primary first.
7
7
  export const applyDomain = {
8
8
  name: 'Applying domain',
9
9
  run: async ({ targetDirectory, answers }) => {
10
- replaceInFileExact(path.join(targetDirectory, 'apps', answers.appName, 'packages', 'constants', 'src', 'domain.ts'), TEMPLATE_DOMAIN, answers.domain);
10
+ const deployConfigPath = path.join(targetDirectory, 'apps', answers.appName, 'deploy.config.json');
11
+ const deployConfig = readJsonFile(deployConfigPath);
12
+ for (const deployment of Object.values(deployConfig.deployments)) {
13
+ deployment.settings = { ...deployment.settings, ROOT_DOMAINS: answers.domain };
14
+ }
15
+ writeJsonFile(deployConfigPath, deployConfig);
11
16
  },
12
17
  };
13
18
  //# sourceMappingURL=006_applyDomain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"006_applyDomain.js","sourceRoot":"","sources":["../../../src/steps/006_applyDomain.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,6EAA6E;AAC7E,8EAA8E;AAC9E,yBAAyB;AACzB,MAAM,eAAe,GAAG,uBAAuB,CAAC;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,iBAAiB;IAEvB,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,kBAAkB,CAChB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,EAChG,eAAe,EACf,OAAO,CAAC,MAAM,CACf,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["import path from 'path';\n\nimport { replaceInFileExact } from '../lib/replaceInFileExact';\nimport { CreateQpqAppStep } from '../types';\n\n// The template's domain, replaced where it's authoritative: the app's domain\n// constant (everything else derives from it). One root at scaffold time; more\n// can be appended later.\nconst TEMPLATE_DOMAIN = 'todo.quidproquojs.com';\n\nexport const applyDomain: CreateQpqAppStep = {\n name: 'Applying domain',\n\n run: async ({ targetDirectory, answers }) => {\n replaceInFileExact(\n path.join(targetDirectory, 'apps', answers.appName, 'packages', 'constants', 'src', 'domain.ts'),\n TEMPLATE_DOMAIN,\n answers.domain,\n );\n },\n};\n"]}
1
+ {"version":3,"file":"006_applyDomain.js","sourceRoot":"","sources":["../../../src/steps/006_applyDomain.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,iFAAiF;AACjF,8EAA8E;AAC9E,qDAAqD;AACrD,MAAM,CAAC,MAAM,WAAW,GAAqB;IAC3C,IAAI,EAAE,iBAAiB;IAEvB,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACnG,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACpD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAA4C,EAAE,CAAC;YAC5G,UAAU,CAAC,QAAQ,GAAG,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;QACjF,CAAC;QACD,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;CACF,CAAC","sourcesContent":["import path from 'path';\n\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { CreateQpqAppStep } from '../types';\n\n// The domain is a deployment setting (ROOT_DOMAINS, read by every defineDns), so\n// it is set on each generated deployment. One root at scaffold time; more can\n// be appended later, comma separated, primary first.\nexport const applyDomain: CreateQpqAppStep = {\n name: 'Applying domain',\n\n run: async ({ targetDirectory, answers }) => {\n const deployConfigPath = path.join(targetDirectory, 'apps', answers.appName, 'deploy.config.json');\n const deployConfig = readJsonFile(deployConfigPath);\n for (const deployment of Object.values(deployConfig.deployments) as { settings?: Record<string, string> }[]) {\n deployment.settings = { ...deployment.settings, ROOT_DOMAINS: answers.domain };\n }\n writeJsonFile(deployConfigPath, deployConfig);\n },\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import { CreateQpqAppStep } from '../types';
2
+ export declare const applyDockerHost: CreateQpqAppStep;
@@ -0,0 +1,30 @@
1
+ import path from 'path';
2
+ import { readJsonFile } from '../lib/readJsonFile';
3
+ import { writeJsonFile } from '../lib/writeJsonFile';
4
+ // A self-hosting box like Unraid is the expected target: x86, an appdata folder per
5
+ // deployment (so development and production never share state), images pulled from
6
+ // a registry on the LAN.
7
+ const DOCKER_ARCH = 'linux/amd64';
8
+ const getDataPath = (appName, environment) => `/mnt/user/appdata/qpq-${appName}-${environment}`;
9
+ // Fills each docker deployment's platformSettings from the answers so the first
10
+ // `qpq go` builds, pushes and writes a compose file that runs on the host as is.
11
+ export const applyDockerHost = {
12
+ name: 'Applying docker host settings',
13
+ run: async ({ targetDirectory, answers }) => {
14
+ const deployConfigPath = path.join(targetDirectory, 'apps', answers.appName, 'deploy.config.json');
15
+ const deployConfig = readJsonFile(deployConfigPath);
16
+ for (const deployment of Object.values(deployConfig.deployments)) {
17
+ if (deployment.platform !== 'docker') {
18
+ continue;
19
+ }
20
+ deployment.platformSettings = {
21
+ ...deployment.platformSettings,
22
+ ...(answers.dockerRegistry ? { registry: answers.dockerRegistry, arch: DOCKER_ARCH } : {}),
23
+ ...(answers.dockerHost ? { publicHost: answers.dockerHost } : {}),
24
+ dataPath: getDataPath(answers.appName, deployment.environment),
25
+ };
26
+ }
27
+ writeJsonFile(deployConfigPath, deployConfig);
28
+ },
29
+ };
30
+ //# sourceMappingURL=007_applyDockerHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"007_applyDockerHost.js","sourceRoot":"","sources":["../../../src/steps/007_applyDockerHost.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AASrD,oFAAoF;AACpF,mFAAmF;AACnF,yBAAyB;AACzB,MAAM,WAAW,GAAG,aAAa,CAAC;AAClC,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAU,EAAE,CAAC,yBAAyB,OAAO,IAAI,WAAW,EAAE,CAAC;AAExH,gFAAgF;AAChF,iFAAiF;AACjF,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,IAAI,EAAE,+BAA+B;IAErC,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1C,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;QACnG,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QAEpD,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAuB,EAAE,CAAC;YACvF,IAAI,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACrC,SAAS;YACX,CAAC;YAED,UAAU,CAAC,gBAAgB,GAAG;gBAC5B,GAAG,UAAU,CAAC,gBAAgB;gBAC9B,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1F,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC;aAC/D,CAAC;QACJ,CAAC;QAED,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;CACF,CAAC","sourcesContent":["import path from 'path';\n\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { CreateQpqAppStep } from '../types';\n\ntype DockerDeployment = {\n platform: string;\n environment: string;\n platformSettings?: Record<string, string>;\n};\n\n// A self-hosting box like Unraid is the expected target: x86, an appdata folder per\n// deployment (so development and production never share state), images pulled from\n// a registry on the LAN.\nconst DOCKER_ARCH = 'linux/amd64';\nconst getDataPath = (appName: string, environment: string): string => `/mnt/user/appdata/qpq-${appName}-${environment}`;\n\n// Fills each docker deployment's platformSettings from the answers so the first\n// `qpq go` builds, pushes and writes a compose file that runs on the host as is.\nexport const applyDockerHost: CreateQpqAppStep = {\n name: 'Applying docker host settings',\n\n run: async ({ targetDirectory, answers }) => {\n const deployConfigPath = path.join(targetDirectory, 'apps', answers.appName, 'deploy.config.json');\n const deployConfig = readJsonFile(deployConfigPath);\n\n for (const deployment of Object.values(deployConfig.deployments) as DockerDeployment[]) {\n if (deployment.platform !== 'docker') {\n continue;\n }\n\n deployment.platformSettings = {\n ...deployment.platformSettings,\n ...(answers.dockerRegistry ? { registry: answers.dockerRegistry, arch: DOCKER_ARCH } : {}),\n ...(answers.dockerHost ? { publicHost: answers.dockerHost } : {}),\n dataPath: getDataPath(answers.appName, deployment.environment),\n };\n }\n\n writeJsonFile(deployConfigPath, deployConfig);\n },\n};\n"]}
@@ -20,4 +20,4 @@ export const pinRegistryVersions = {
20
20
  writeJsonFile(packageJsonPath, packageJson);
21
21
  },
22
22
  };
23
- //# sourceMappingURL=007_pinRegistryVersions.js.map
23
+ //# sourceMappingURL=008_pinRegistryVersions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"007_pinRegistryVersions.js","sourceRoot":"","sources":["../../../src/steps/007_pinRegistryVersions.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,4EAA4E;AAC5E,0EAA0E;AAC1E,uEAAuE;AACvE,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAqB;IACnD,IAAI,EAAE,6BAA6B;IAEnC,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;QAElD,KAAK,MAAM,eAAe,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;YACtF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;gBACpE,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzE,eAAe,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,aAAa,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC","sourcesContent":["import path from 'path';\n\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { CreateQpqAppStep } from '../types';\n\n// quidproquojs.com lives beside the quidproquo monorepo and consumes it via\n// file:../ refs; a generated app lives anywhere, so those become registry\n// versions pinned to create-qpq-app's own version; the whole family is\n// published in lockstep, so the versions always exist together.\nexport const pinRegistryVersions: CreateQpqAppStep = {\n name: 'Pinning quidproquo versions',\n\n run: async ({ targetDirectory, ownVersion }) => {\n const packageJsonPath = path.join(targetDirectory, 'package.json');\n const packageJson = readJsonFile(packageJsonPath);\n\n for (const dependencyBlock of [packageJson.dependencies, packageJson.devDependencies]) {\n for (const [name, version] of Object.entries(dependencyBlock ?? {})) {\n if (name.startsWith('quidproquo') && String(version).startsWith('file:')) {\n dependencyBlock[name] = ownVersion;\n }\n }\n }\n\n writeJsonFile(packageJsonPath, packageJson);\n },\n};\n"]}
1
+ {"version":3,"file":"008_pinRegistryVersions.js","sourceRoot":"","sources":["../../../src/steps/008_pinRegistryVersions.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,4EAA4E;AAC5E,0EAA0E;AAC1E,uEAAuE;AACvE,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAqB;IACnD,IAAI,EAAE,6BAA6B;IAEnC,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,EAAE,EAAE;QAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACnE,MAAM,WAAW,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;QAElD,KAAK,MAAM,eAAe,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;YACtF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC,EAAE,CAAC;gBACpE,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;oBACzE,eAAe,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;QAED,aAAa,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IAC9C,CAAC;CACF,CAAC","sourcesContent":["import path from 'path';\n\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { CreateQpqAppStep } from '../types';\n\n// quidproquojs.com lives beside the quidproquo monorepo and consumes it via\n// file:../ refs; a generated app lives anywhere, so those become registry\n// versions pinned to create-qpq-app's own version; the whole family is\n// published in lockstep, so the versions always exist together.\nexport const pinRegistryVersions: CreateQpqAppStep = {\n name: 'Pinning quidproquo versions',\n\n run: async ({ targetDirectory, ownVersion }) => {\n const packageJsonPath = path.join(targetDirectory, 'package.json');\n const packageJson = readJsonFile(packageJsonPath);\n\n for (const dependencyBlock of [packageJson.dependencies, packageJson.devDependencies]) {\n for (const [name, version] of Object.entries(dependencyBlock ?? {})) {\n if (name.startsWith('quidproquo') && String(version).startsWith('file:')) {\n dependencyBlock[name] = ownVersion;\n }\n }\n }\n\n writeJsonFile(packageJsonPath, packageJson);\n },\n};\n"]}
@@ -110,4 +110,4 @@ export const transpileToJavaScript = {
110
110
  console.log(` Converted ${converted} files to JavaScript.`);
111
111
  },
112
112
  };
113
- //# sourceMappingURL=008_transpileToJavaScript.js.map
113
+ //# sourceMappingURL=009_transpileToJavaScript.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"008_transpileToJavaScript.js","sourceRoot":"","sources":["../../../src/steps/008_transpileToJavaScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAoB,MAAM,UAAU,CAAC;AAEzD,qEAAqE;AACrE,uEAAuE;AACvE,0CAA0C;AAC1C,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,oCAAoC;AACpC,MAAM,CAAC,MAAM,qBAAqB,GAAqB;IACrD,IAAI,EAAE,0BAA0B;IAEhC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,KAAK,WAAW,CAAC,UAAU;IAEnE,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,wDAAwD;QACxD,0DAA0D;QAC1D,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAgC,CAAC;QAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAA8B,CAAC;QAClE,yDAAyD;QAEzD,0EAA0E;QAC1E,sEAAsE;QACtE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QACjE,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE1F,MAAM,eAAe,GAAyC;YAC5D,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM;YAC9B,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,2CAA2C;YACzE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ;YACxB,cAAc,EAAE,KAAK;SACtB,CAAC;QAEF,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,QAAQ,IAAI,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3D,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpB,SAAS;YACX,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxC,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;YAE3F,uEAAuE;YACvE,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAExD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;YAE9F,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACrC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACpB,SAAS,IAAI,CAAC,CAAC;QACjB,CAAC;QAED,wEAAwE;QACxE,sEAAsE;QACtE,4CAA4C;QAC5C,IAAI,aAAa,GAAG,CAAC,CAAC;QACtB,KAAK,MAAM,QAAQ,IAAI,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEzC,IAAI,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EAAE,CAAC;gBAC9H,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACpB,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,KAAK,cAAc,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,EAAE,CAAC;gBAC3F,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,OAAO,GAAG,KAAK,CAAC;gBAEpB,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;oBACzC,OAAO,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;oBAC1C,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;gBAED,+DAA+D;gBAC/D,mEAAmE;gBACnE,oEAAoE;gBACpE,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC5C,IAAI,WAAW,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;wBAC/C,MAAM,IAAI,KAAK,CACb,GAAG,QAAQ,iCAAiC,WAAW,CAAC,IAAI,mGAAmG,CAChK,CAAC;oBACJ,CAAC;oBAED,WAAW,CAAC,IAAI,GAAG,gBAAgB,CAAC;oBACpC,OAAO,WAAW,CAAC,OAAO,CAAC;oBAC3B,OAAO,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjC,WAAW,CAAC,OAAO,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE,CAAC;oBAC7D,WAAW,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC5B,OAAO,GAAG,IAAI,CAAC;oBACf,aAAa,IAAI,CAAC,CAAC;gBACrB,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,SAAS,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,sBAAsB,aAAa,0DAA0D,CAC7I,CAAC;QACJ,CAAC;QAED,yEAAyE;QACzE,mEAAmE;QACnE,0DAA0D;QAC1D,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACpD,YAAY,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QACvD,uEAAuE;QACvE,8DAA8D;QAC9D,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;QACrC,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC;QACvC,aAAa,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAE9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;QACvE,MAAM,eAAe,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;QAC1D,OAAO,eAAe,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,CAAC;QAChD,aAAa,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;QAEpD,OAAO,CAAC,GAAG,CAAC,eAAe,SAAS,uBAAuB,CAAC,CAAC;IAC/D,CAAC;CACF,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { listFilesRecursive } from '../lib/listFilesRecursive';\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { AppLanguage, CreateQpqAppStep } from '../types';\n\n// Convert the scaffolded TypeScript app to JavaScript: per-file type\n// stripping (JSX preserved, comments kept), then remove the TypeScript\n// build plumbing the app no longer needs.\n//\n// The qpq toolchain runs the result as-is: the CLI's ts-node require hook\n// compiles the app's ESM-syntax .js at load time (allowJs, added below), and\n// rspack bundles .js/.jsx natively.\nexport const transpileToJavaScript: CreateQpqAppStep = {\n name: 'Converting to JavaScript',\n\n shouldRun: (answers) => answers.language === AppLanguage.javascript,\n\n run: async ({ targetDirectory }) => {\n // Lazy so TypeScript scaffolds never load the compiler.\n /* eslint-disable @typescript-eslint/no-require-imports */\n const ts = require('typescript') as typeof import('typescript');\n const prettier = require('prettier') as typeof import('prettier');\n /* eslint-enable @typescript-eslint/no-require-imports */\n\n // The transpiler re-prints files in its own style; format the output with\n // the app's own prettier settings so generated code matches the repo.\n const prettierRcPath = path.join(targetDirectory, '.prettierrc');\n const prettierOptions = fs.existsSync(prettierRcPath) ? readJsonFile(prettierRcPath) : {};\n\n const compilerOptions: import('typescript').CompilerOptions = {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext, // keep import/export statements as written\n jsx: ts.JsxEmit.Preserve,\n removeComments: false,\n };\n\n let converted = 0;\n for (const filePath of listFilesRecursive(targetDirectory)) {\n if (filePath.endsWith('.d.ts')) {\n fs.rmSync(filePath);\n continue;\n }\n\n const isTsx = filePath.endsWith('.tsx');\n if (!isTsx && !filePath.endsWith('.ts')) {\n continue;\n }\n\n const source = fs.readFileSync(filePath, 'utf8');\n const { outputText } = ts.transpileModule(source, { compilerOptions, fileName: filePath });\n\n // Type-only statements leave blank gaps behind; collapse runs of them.\n const collapsed = outputText.replace(/\\n{3,}/g, '\\n\\n');\n\n const outputPath = filePath.replace(/\\.tsx?$/, isTsx ? '.jsx' : '.js');\n const output = await prettier.format(collapsed, { ...prettierOptions, filepath: outputPath });\n\n fs.writeFileSync(outputPath, output);\n fs.rmSync(filePath);\n converted += 1;\n }\n\n // TypeScript build plumbing: tsconfigs, the ambient types/ dir, and the\n // per-package tsc scripts all go. Lib packages no longer build; their\n // package.json main points straight at src.\n let libsRepointed = 0;\n for (const filePath of listFilesRecursive(targetDirectory)) {\n const baseName = path.basename(filePath);\n\n if (baseName.startsWith('tsconfig') && baseName.endsWith('.json') && filePath !== path.join(targetDirectory, 'tsconfig.json')) {\n fs.rmSync(filePath);\n continue;\n }\n\n if (baseName === 'package.json' && filePath !== path.join(targetDirectory, 'package.json')) {\n const packageJson = readJsonFile(filePath);\n let changed = false;\n\n if (packageJson.scripts?.['validate-ts']) {\n delete packageJson.scripts['validate-ts'];\n changed = true;\n }\n\n // Lib packages (identified by their tsc build) get served from\n // source. A tsc build with an unexpected main means the template's\n // conventions moved: fail loudly rather than scaffold a broken app.\n if (packageJson.scripts?.build === 'tsc -b') {\n if (packageJson.main !== './dist/src/index.js') {\n throw new Error(\n `${filePath} has a tsc build but main is \"${packageJson.main}\" (expected \"./dist/src/index.js\"). Update transpileToJavaScript for the new template convention.`,\n );\n }\n\n packageJson.main = './src/index.js';\n delete packageJson.typings;\n delete packageJson.scripts.build;\n packageJson.exports = { '.': { default: './src/index.js' } };\n packageJson.files = ['src'];\n changed = true;\n libsRepointed += 1;\n }\n\n if (changed) {\n writeJsonFile(filePath, packageJson);\n }\n }\n }\n\n if (converted === 0 || libsRepointed === 0) {\n throw new Error(\n `JavaScript conversion looks wrong: ${converted} files transpiled, ${libsRepointed} lib packages repointed. Has the template changed shape?`,\n );\n }\n\n // The ROOT tsconfig.json stays: the qpq CLI's ts-node require hook reads\n // its ts-node block, and allowJs makes that hook compile the app's\n // ESM-syntax .js files (imports, __dirname) at load time.\n fs.rmSync(path.join(targetDirectory, 'types'), { recursive: true, force: true });\n fs.rmSync(path.join(targetDirectory, 'tsconfig.base.json'), { force: true });\n\n const rootTsconfigPath = path.join(targetDirectory, 'tsconfig.json');\n const rootTsconfig = readJsonFile(rootTsconfigPath);\n rootTsconfig['ts-node'].compilerOptions.allowJs = true;\n // Scope the hook to this repo: allowJs must never recompile quidproquo\n // libs living outside node_modules (file:-linked dev setups).\n rootTsconfig['ts-node'].scope = true;\n rootTsconfig['ts-node'].scopeDir = '.';\n writeJsonFile(rootTsconfigPath, rootTsconfig);\n\n const rootPackageJsonPath = path.join(targetDirectory, 'package.json');\n const rootPackageJson = readJsonFile(rootPackageJsonPath);\n delete rootPackageJson.scripts?.['validate-ts'];\n writeJsonFile(rootPackageJsonPath, rootPackageJson);\n\n console.log(` Converted ${converted} files to JavaScript.`);\n },\n};\n"]}
1
+ {"version":3,"file":"009_transpileToJavaScript.js","sourceRoot":"","sources":["../../../src/steps/009_transpileToJavaScript.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { listFilesRecursive } from '../lib/listFilesRecursive';\nimport { readJsonFile } from '../lib/readJsonFile';\nimport { writeJsonFile } from '../lib/writeJsonFile';\nimport { AppLanguage, CreateQpqAppStep } from '../types';\n\n// Convert the scaffolded TypeScript app to JavaScript: per-file type\n// stripping (JSX preserved, comments kept), then remove the TypeScript\n// build plumbing the app no longer needs.\n//\n// The qpq toolchain runs the result as-is: the CLI's ts-node require hook\n// compiles the app's ESM-syntax .js at load time (allowJs, added below), and\n// rspack bundles .js/.jsx natively.\nexport const transpileToJavaScript: CreateQpqAppStep = {\n name: 'Converting to JavaScript',\n\n shouldRun: (answers) => answers.language === AppLanguage.javascript,\n\n run: async ({ targetDirectory }) => {\n // Lazy so TypeScript scaffolds never load the compiler.\n /* eslint-disable @typescript-eslint/no-require-imports */\n const ts = require('typescript') as typeof import('typescript');\n const prettier = require('prettier') as typeof import('prettier');\n /* eslint-enable @typescript-eslint/no-require-imports */\n\n // The transpiler re-prints files in its own style; format the output with\n // the app's own prettier settings so generated code matches the repo.\n const prettierRcPath = path.join(targetDirectory, '.prettierrc');\n const prettierOptions = fs.existsSync(prettierRcPath) ? readJsonFile(prettierRcPath) : {};\n\n const compilerOptions: import('typescript').CompilerOptions = {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext, // keep import/export statements as written\n jsx: ts.JsxEmit.Preserve,\n removeComments: false,\n };\n\n let converted = 0;\n for (const filePath of listFilesRecursive(targetDirectory)) {\n if (filePath.endsWith('.d.ts')) {\n fs.rmSync(filePath);\n continue;\n }\n\n const isTsx = filePath.endsWith('.tsx');\n if (!isTsx && !filePath.endsWith('.ts')) {\n continue;\n }\n\n const source = fs.readFileSync(filePath, 'utf8');\n const { outputText } = ts.transpileModule(source, { compilerOptions, fileName: filePath });\n\n // Type-only statements leave blank gaps behind; collapse runs of them.\n const collapsed = outputText.replace(/\\n{3,}/g, '\\n\\n');\n\n const outputPath = filePath.replace(/\\.tsx?$/, isTsx ? '.jsx' : '.js');\n const output = await prettier.format(collapsed, { ...prettierOptions, filepath: outputPath });\n\n fs.writeFileSync(outputPath, output);\n fs.rmSync(filePath);\n converted += 1;\n }\n\n // TypeScript build plumbing: tsconfigs, the ambient types/ dir, and the\n // per-package tsc scripts all go. Lib packages no longer build; their\n // package.json main points straight at src.\n let libsRepointed = 0;\n for (const filePath of listFilesRecursive(targetDirectory)) {\n const baseName = path.basename(filePath);\n\n if (baseName.startsWith('tsconfig') && baseName.endsWith('.json') && filePath !== path.join(targetDirectory, 'tsconfig.json')) {\n fs.rmSync(filePath);\n continue;\n }\n\n if (baseName === 'package.json' && filePath !== path.join(targetDirectory, 'package.json')) {\n const packageJson = readJsonFile(filePath);\n let changed = false;\n\n if (packageJson.scripts?.['validate-ts']) {\n delete packageJson.scripts['validate-ts'];\n changed = true;\n }\n\n // Lib packages (identified by their tsc build) get served from\n // source. A tsc build with an unexpected main means the template's\n // conventions moved: fail loudly rather than scaffold a broken app.\n if (packageJson.scripts?.build === 'tsc -b') {\n if (packageJson.main !== './dist/src/index.js') {\n throw new Error(\n `${filePath} has a tsc build but main is \"${packageJson.main}\" (expected \"./dist/src/index.js\"). Update transpileToJavaScript for the new template convention.`,\n );\n }\n\n packageJson.main = './src/index.js';\n delete packageJson.typings;\n delete packageJson.scripts.build;\n packageJson.exports = { '.': { default: './src/index.js' } };\n packageJson.files = ['src'];\n changed = true;\n libsRepointed += 1;\n }\n\n if (changed) {\n writeJsonFile(filePath, packageJson);\n }\n }\n }\n\n if (converted === 0 || libsRepointed === 0) {\n throw new Error(\n `JavaScript conversion looks wrong: ${converted} files transpiled, ${libsRepointed} lib packages repointed. Has the template changed shape?`,\n );\n }\n\n // The ROOT tsconfig.json stays: the qpq CLI's ts-node require hook reads\n // its ts-node block, and allowJs makes that hook compile the app's\n // ESM-syntax .js files (imports, __dirname) at load time.\n fs.rmSync(path.join(targetDirectory, 'types'), { recursive: true, force: true });\n fs.rmSync(path.join(targetDirectory, 'tsconfig.base.json'), { force: true });\n\n const rootTsconfigPath = path.join(targetDirectory, 'tsconfig.json');\n const rootTsconfig = readJsonFile(rootTsconfigPath);\n rootTsconfig['ts-node'].compilerOptions.allowJs = true;\n // Scope the hook to this repo: allowJs must never recompile quidproquo\n // libs living outside node_modules (file:-linked dev setups).\n rootTsconfig['ts-node'].scope = true;\n rootTsconfig['ts-node'].scopeDir = '.';\n writeJsonFile(rootTsconfigPath, rootTsconfig);\n\n const rootPackageJsonPath = path.join(targetDirectory, 'package.json');\n const rootPackageJson = readJsonFile(rootPackageJsonPath);\n delete rootPackageJson.scripts?.['validate-ts'];\n writeJsonFile(rootPackageJsonPath, rootPackageJson);\n\n console.log(` Converted ${converted} files to JavaScript.`);\n },\n};\n"]}
@@ -13,4 +13,4 @@ export const restoreGitignore = {
13
13
  }
14
14
  },
15
15
  };
16
- //# sourceMappingURL=009_restoreGitignore.js.map
16
+ //# sourceMappingURL=010_restoreGitignore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"009_restoreGitignore.js","sourceRoot":"","sources":["../../../src/steps/009_restoreGitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,8EAA8E;AAC9E,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,IAAI,EAAE,4BAA4B;IAElC,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,KAAK,MAAM,QAAQ,IAAI,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;gBAC5C,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { listFilesRecursive } from '../lib/listFilesRecursive';\nimport { CreateQpqAppStep } from '../types';\n\n// npm strips .gitignore files from published tarballs, so the snapshot stores\n// them dotless (the create-react-app trick); restore the dots here.\nexport const restoreGitignore: CreateQpqAppStep = {\n name: 'Restoring .gitignore files',\n\n run: async ({ targetDirectory }) => {\n for (const filePath of listFilesRecursive(targetDirectory)) {\n if (path.basename(filePath) === 'gitignore') {\n fs.renameSync(filePath, path.join(path.dirname(filePath), '.gitignore'));\n }\n }\n },\n};\n"]}
1
+ {"version":3,"file":"010_restoreGitignore.js","sourceRoot":"","sources":["../../../src/steps/010_restoreGitignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,8EAA8E;AAC9E,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD,IAAI,EAAE,4BAA4B;IAElC,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,KAAK,MAAM,QAAQ,IAAI,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC;YAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;gBAC5C,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { listFilesRecursive } from '../lib/listFilesRecursive';\nimport { CreateQpqAppStep } from '../types';\n\n// npm strips .gitignore files from published tarballs, so the snapshot stores\n// them dotless (the create-react-app trick); restore the dots here.\nexport const restoreGitignore: CreateQpqAppStep = {\n name: 'Restoring .gitignore files',\n\n run: async ({ targetDirectory }) => {\n for (const filePath of listFilesRecursive(targetDirectory)) {\n if (path.basename(filePath) === 'gitignore') {\n fs.renameSync(filePath, path.join(path.dirname(filePath), '.gitignore'));\n }\n }\n },\n};\n"]}
@@ -15,4 +15,4 @@ export const gitInit = {
15
15
  }
16
16
  },
17
17
  };
18
- //# sourceMappingURL=010_gitInit.js.map
18
+ //# sourceMappingURL=011_gitInit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"010_gitInit.js","sourceRoot":"","sources":["../../../src/steps/010_gitInit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,0EAA0E;AAC1E,iEAAiE;AACjE,MAAM,CAAC,MAAM,OAAO,GAAqB;IACvC,IAAI,EAAE,6BAA6B;IAEnC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa;IAE7C,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;YAC5D,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;YACjE,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,sCAAsC,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;QAC9G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,wBAAyB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { runCommand } from '../lib/runCommand';\nimport { CreateQpqAppStep } from '../types';\n\n// A fresh repo with one clean commit. Failure here (no git installed, odd\n// global config) shouldn't lose the scaffold: warn and carry on.\nexport const gitInit: CreateQpqAppStep = {\n name: 'Initialising git repository',\n\n shouldRun: (answers) => answers.initialiseGit,\n\n run: async ({ targetDirectory }) => {\n try {\n await runCommand('git', ['init'], { cwd: targetDirectory });\n await runCommand('git', ['add', '-A'], { cwd: targetDirectory });\n await runCommand('git', ['commit', '-m', '\"Initial commit from create-qpq-app\"'], { cwd: targetDirectory });\n } catch (error) {\n console.warn(` Skipping git init: ${(error as Error).message}`);\n }\n },\n};\n"]}
1
+ {"version":3,"file":"011_gitInit.js","sourceRoot":"","sources":["../../../src/steps/011_gitInit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,0EAA0E;AAC1E,iEAAiE;AACjE,MAAM,CAAC,MAAM,OAAO,GAAqB;IACvC,IAAI,EAAE,6BAA6B;IAEnC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa;IAE7C,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;YAC5D,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;YACjE,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,sCAAsC,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;QAC9G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,wBAAyB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;CACF,CAAC","sourcesContent":["import { runCommand } from '../lib/runCommand';\nimport { CreateQpqAppStep } from '../types';\n\n// A fresh repo with one clean commit. Failure here (no git installed, odd\n// global config) shouldn't lose the scaffold: warn and carry on.\nexport const gitInit: CreateQpqAppStep = {\n name: 'Initialising git repository',\n\n shouldRun: (answers) => answers.initialiseGit,\n\n run: async ({ targetDirectory }) => {\n try {\n await runCommand('git', ['init'], { cwd: targetDirectory });\n await runCommand('git', ['add', '-A'], { cwd: targetDirectory });\n await runCommand('git', ['commit', '-m', '\"Initial commit from create-qpq-app\"'], { cwd: targetDirectory });\n } catch (error) {\n console.warn(` Skipping git init: ${(error as Error).message}`);\n }\n },\n};\n"]}
@@ -6,4 +6,4 @@ export const npmInstall = {
6
6
  await runCommand('npm', ['install'], { cwd: targetDirectory });
7
7
  },
8
8
  };
9
- //# sourceMappingURL=011_npmInstall.js.map
9
+ //# sourceMappingURL=012_npmInstall.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"011_npmInstall.js","sourceRoot":"","sources":["../../../src/steps/011_npmInstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C,IAAI,EAAE,yBAAyB;IAE/B,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB;IAEnD,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;IACjE,CAAC;CACF,CAAC","sourcesContent":["import { runCommand } from '../lib/runCommand';\nimport { CreateQpqAppStep } from '../types';\n\nexport const npmInstall: CreateQpqAppStep = {\n name: 'Installing dependencies',\n\n shouldRun: (answers) => answers.installDependencies,\n\n run: async ({ targetDirectory }) => {\n await runCommand('npm', ['install'], { cwd: targetDirectory });\n },\n};\n"]}
1
+ {"version":3,"file":"012_npmInstall.js","sourceRoot":"","sources":["../../../src/steps/012_npmInstall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,CAAC,MAAM,UAAU,GAAqB;IAC1C,IAAI,EAAE,yBAAyB;IAE/B,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB;IAEnD,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;IACjE,CAAC;CACF,CAAC","sourcesContent":["import { runCommand } from '../lib/runCommand';\nimport { CreateQpqAppStep } from '../types';\n\nexport const npmInstall: CreateQpqAppStep = {\n name: 'Installing dependencies',\n\n shouldRun: (answers) => answers.installDependencies,\n\n run: async ({ targetDirectory }) => {\n await runCommand('npm', ['install'], { cwd: targetDirectory });\n },\n};\n"]}
@@ -9,4 +9,4 @@ export const buildWorkspaces = {
9
9
  await runCommand('npm', ['run', 'build'], { cwd: targetDirectory });
10
10
  },
11
11
  };
12
- //# sourceMappingURL=012_buildWorkspaces.js.map
12
+ //# sourceMappingURL=013_buildWorkspaces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"012_buildWorkspaces.js","sourceRoot":"","sources":["../../../src/steps/012_buildWorkspaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,6EAA6E;AAC7E,2EAA2E;AAC3E,6CAA6C;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,IAAI,EAAE,6BAA6B;IAEnC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB;IAEnD,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;IACtE,CAAC;CACF,CAAC","sourcesContent":["import { runCommand } from '../lib/runCommand';\nimport { CreateQpqAppStep } from '../types';\n\n// The workspace lib packages resolve through their built dist/ (package.json\n// main), so a fresh scaffold can't `go:dev` until they're tsc'd once. Only\n// possible when dependencies were installed.\nexport const buildWorkspaces: CreateQpqAppStep = {\n name: 'Building workspace packages',\n\n shouldRun: (answers) => answers.installDependencies,\n\n run: async ({ targetDirectory }) => {\n await runCommand('npm', ['run', 'build'], { cwd: targetDirectory });\n },\n};\n"]}
1
+ {"version":3,"file":"013_buildWorkspaces.js","sourceRoot":"","sources":["../../../src/steps/013_buildWorkspaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,6EAA6E;AAC7E,2EAA2E;AAC3E,6CAA6C;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAqB;IAC/C,IAAI,EAAE,6BAA6B;IAEnC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,mBAAmB;IAEnD,GAAG,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;QACjC,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;IACtE,CAAC;CACF,CAAC","sourcesContent":["import { runCommand } from '../lib/runCommand';\nimport { CreateQpqAppStep } from '../types';\n\n// The workspace lib packages resolve through their built dist/ (package.json\n// main), so a fresh scaffold can't `go:dev` until they're tsc'd once. Only\n// possible when dependencies were installed.\nexport const buildWorkspaces: CreateQpqAppStep = {\n name: 'Building workspace packages',\n\n shouldRun: (answers) => answers.installDependencies,\n\n run: async ({ targetDirectory }) => {\n await runCommand('npm', ['run', 'build'], { cwd: targetDirectory });\n },\n};\n"]}
@@ -0,0 +1,24 @@
1
+ export const printNextSteps = {
2
+ name: 'Done',
3
+ run: async ({ answers }) => {
4
+ const install = answers.installDependencies ? '' : ' npm install\n npm run build\n';
5
+ const deployNote = answers.dockerRegistry
6
+ ? `builds the image for ${answers.dockerRegistry} and writes a docker-compose.yml to run it on the host`
7
+ : 'builds the docker image and writes a docker-compose.yml to run it (add a registry in deploy.config.json to push it to another host)';
8
+ console.log(`
9
+ Created ${answers.appName}!
10
+
11
+ Your app has five services (admin, auth, design, shell and todo) and
12
+ deploys as a single docker image.
13
+
14
+ Next steps:
15
+
16
+ cd ${answers.appName}
17
+ ${install} npm run dev # api on http://localhost:8080, web on http://localhost:3080
18
+ npm run deploy # ${deployNote}
19
+
20
+ Deployments live in apps/${answers.appName}/deploy.config.json (pick one when prompted, or pass --deployment <name>); the domain (${answers.domain}) is each deployment's ROOT_DOMAINS setting there, and the docker host details (registry, publicHost, dataPath) are its platformSettings.
21
+ `);
22
+ },
23
+ };
24
+ //# sourceMappingURL=014_printNextSteps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"014_printNextSteps.js","sourceRoot":"","sources":["../../../src/steps/014_printNextSteps.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAqB;IAC9C,IAAI,EAAE,MAAM;IAEZ,GAAG,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,kCAAkC,CAAC;QACtF,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc;YACvC,CAAC,CAAC,wBAAwB,OAAO,CAAC,cAAc,wDAAwD;YACxG,CAAC,CAAC,qIAAqI,CAAC;QAE1I,OAAO,CAAC,GAAG,CAAC;UACN,OAAO,CAAC,OAAO;;;;;;;OAOlB,OAAO,CAAC,OAAO;EACpB,OAAO;yBACgB,UAAU;;2BAER,OAAO,CAAC,OAAO,0FAA0F,OAAO,CAAC,MAAM;CACjJ,CAAC,CAAC;IACD,CAAC;CACF,CAAC","sourcesContent":["import { CreateQpqAppStep } from '../types';\n\nexport const printNextSteps: CreateQpqAppStep = {\n name: 'Done',\n\n run: async ({ answers }) => {\n const install = answers.installDependencies ? '' : ' npm install\\n npm run build\\n';\n const deployNote = answers.dockerRegistry\n ? `builds the image for ${answers.dockerRegistry} and writes a docker-compose.yml to run it on the host`\n : 'builds the docker image and writes a docker-compose.yml to run it (add a registry in deploy.config.json to push it to another host)';\n\n console.log(`\nCreated ${answers.appName}!\n\nYour app has five services (admin, auth, design, shell and todo) and\ndeploys as a single docker image.\n\nNext steps:\n\n cd ${answers.appName}\n${install} npm run dev # api on http://localhost:8080, web on http://localhost:3080\n npm run deploy # ${deployNote}\n\nDeployments live in apps/${answers.appName}/deploy.config.json (pick one when prompted, or pass --deployment <name>); the domain (${answers.domain}) is each deployment's ROOT_DOMAINS setting there, and the docker host details (registry, publicHost, dataPath) are its platformSettings.\n`);\n },\n};\n"]}
@@ -5,12 +5,13 @@ import { deleteDocusaurus } from './003_deleteDocusaurus';
5
5
  import { deleteQpqjsApp } from './004_deleteQpqjsApp';
6
6
  import { applyAppIdentity } from './005_applyAppIdentity';
7
7
  import { applyDomain } from './006_applyDomain';
8
- import { pinRegistryVersions } from './007_pinRegistryVersions';
9
- import { transpileToJavaScript } from './008_transpileToJavaScript';
10
- import { restoreGitignore } from './009_restoreGitignore';
11
- import { gitInit } from './010_gitInit';
12
- import { npmInstall } from './011_npmInstall';
13
- import { buildWorkspaces } from './012_buildWorkspaces';
14
- import { printNextSteps } from './013_printNextSteps';
8
+ import { applyDockerHost } from './007_applyDockerHost';
9
+ import { pinRegistryVersions } from './008_pinRegistryVersions';
10
+ import { transpileToJavaScript } from './009_transpileToJavaScript';
11
+ import { restoreGitignore } from './010_restoreGitignore';
12
+ import { gitInit } from './011_gitInit';
13
+ import { npmInstall } from './012_npmInstall';
14
+ import { buildWorkspaces } from './013_buildWorkspaces';
15
+ import { printNextSteps } from './014_printNextSteps';
15
16
  export declare const createQpqAppSteps: CreateQpqAppStep[];
16
- export { applyAppIdentity, applyDomain, buildWorkspaces, copyTemplate, deleteDocusaurus, deleteQpqjsApp, gitInit, npmInstall, pinRegistryVersions, preflight, printNextSteps, restoreGitignore, transpileToJavaScript, };
17
+ export { applyAppIdentity, applyDockerHost, applyDomain, buildWorkspaces, copyTemplate, deleteDocusaurus, deleteQpqjsApp, gitInit, npmInstall, pinRegistryVersions, preflight, printNextSteps, restoreGitignore, transpileToJavaScript, };