zudojs-cli 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -1
  3. package/dist/src/adapters/databases/postgres.adapter.d.ts +0 -14
  4. package/dist/src/adapters/databases/postgres.adapter.js +0 -30
  5. package/dist/src/adapters/frontend/angular.adapter.js +6 -0
  6. package/dist/src/adapters/frontend/astro.adapter.js +2 -2
  7. package/dist/src/adapters/frontend/react.adapter.js +26 -17
  8. package/dist/src/adapters/frontend/svelte.adapter.js +1 -0
  9. package/dist/src/adapters/frontend/sveltekit.adapter.js +7 -8
  10. package/dist/src/adapters/frontend/vanilla.adapter.js +1 -1
  11. package/dist/src/adapters/frontend/vue.adapter.js +1 -0
  12. package/dist/src/adapters/package-managers/bun.adapter.js +5 -5
  13. package/dist/src/adapters/package-managers/npm.adapter.js +5 -5
  14. package/dist/src/adapters/package-managers/pnpm.adapter.js +5 -5
  15. package/dist/src/adapters/package-managers/yarn.adapter.js +5 -5
  16. package/dist/src/bin/zudojs.js +42 -6
  17. package/dist/src/cliApplication/cliApplication.builtins.d.ts +11 -2
  18. package/dist/src/cliApplication/cliApplication.builtins.js +15 -4
  19. package/dist/src/cliApplication/cliApplication.core.js +20 -5
  20. package/dist/src/cliConstant/cliConstant.value.d.ts +1 -1
  21. package/dist/src/cliConstant/cliConstant.value.js +2 -1
  22. package/dist/src/cliConstant/cliVersion.d.ts +16 -0
  23. package/dist/src/cliConstant/cliVersion.js +57 -0
  24. package/dist/src/cliParser/cliParser.core.js +7 -0
  25. package/dist/src/cliParser/cliParser.shortOption.js +1 -1
  26. package/dist/src/commands/add.command.js +27 -24
  27. package/dist/src/commands/build.command.js +13 -7
  28. package/dist/src/commands/create.command.js +177 -84
  29. package/dist/src/commands/dev.command.js +62 -27
  30. package/dist/src/commands/doctor.command.js +45 -23
  31. package/dist/src/commands/generate.command.js +103 -34
  32. package/dist/src/constants/index.d.ts +3 -1
  33. package/dist/src/constants/index.js +3 -1
  34. package/dist/src/generators/command/command.generator.d.ts +1 -0
  35. package/dist/src/generators/command/command.generator.js +10 -4
  36. package/dist/src/generators/controller/controller.generator.d.ts +1 -0
  37. package/dist/src/generators/controller/controller.generator.js +12 -9
  38. package/dist/src/generators/dto/dto.generator.d.ts +1 -0
  39. package/dist/src/generators/dto/dto.generator.js +9 -3
  40. package/dist/src/generators/event/event.generator.d.ts +1 -0
  41. package/dist/src/generators/event/event.generator.js +10 -4
  42. package/dist/src/generators/frontend/frontendGenerator.core.js +4 -28
  43. package/dist/src/generators/frontend/frontendPipeline.d.ts +26 -0
  44. package/dist/src/generators/frontend/frontendPipeline.js +93 -0
  45. package/dist/src/generators/fullstack/fullstackComposer.core.d.ts +1 -2
  46. package/dist/src/generators/fullstack/fullstackComposer.core.js +68 -62
  47. package/dist/src/generators/infrastructure/infrastructure.generator.d.ts +11 -0
  48. package/dist/src/generators/infrastructure/infrastructure.generator.js +101 -61
  49. package/dist/src/generators/integration/integrationGenerator.core.d.ts +6 -0
  50. package/dist/src/generators/integration/integrationGenerator.core.js +35 -6
  51. package/dist/src/generators/job/job.generator.d.ts +1 -0
  52. package/dist/src/generators/job/job.generator.js +9 -3
  53. package/dist/src/generators/middleware/middleware.generator.d.ts +1 -0
  54. package/dist/src/generators/middleware/middleware.generator.js +10 -4
  55. package/dist/src/generators/model/model.generator.d.ts +1 -0
  56. package/dist/src/generators/model/model.generator.js +9 -3
  57. package/dist/src/generators/module/module.generator.d.ts +1 -0
  58. package/dist/src/generators/module/module.generator.js +11 -24
  59. package/dist/src/generators/project/project.generator.js +2 -23
  60. package/dist/src/generators/query/query.generator.d.ts +1 -0
  61. package/dist/src/generators/query/query.generator.js +10 -4
  62. package/dist/src/generators/repository/repository.generator.d.ts +1 -0
  63. package/dist/src/generators/repository/repository.generator.js +12 -9
  64. package/dist/src/generators/route/route.generator.d.ts +1 -0
  65. package/dist/src/generators/route/route.generator.js +11 -5
  66. package/dist/src/generators/service/service.generator.d.ts +1 -0
  67. package/dist/src/generators/service/service.generator.js +12 -9
  68. package/dist/src/generators/validator/validator.generator.d.ts +1 -0
  69. package/dist/src/generators/validator/validator.generator.js +9 -3
  70. package/dist/src/installers/dependency.installer.js +6 -2
  71. package/dist/src/manifest/manifestManager.core.d.ts +3 -0
  72. package/dist/src/prompts/backend/index.d.ts +1 -0
  73. package/dist/src/prompts/backend/index.js +1 -0
  74. package/dist/src/prompts/backend/services.prompt.d.ts +7 -0
  75. package/dist/src/prompts/backend/services.prompt.js +39 -0
  76. package/dist/src/prompts/index.d.ts +0 -1
  77. package/dist/src/prompts/index.js +0 -1
  78. package/dist/src/rollback/rollbackManager.core.js +0 -1
  79. package/dist/src/runners/process/processRunner.core.d.ts +4 -0
  80. package/dist/src/runners/process/processRunner.core.js +17 -3
  81. package/dist/src/scaffolders/framework.scaffolder.js +9 -6
  82. package/dist/src/scaffolders/scaffolder.helper.js +7 -2
  83. package/dist/src/scripts/postinstall.cjs +24 -3
  84. package/dist/src/templates/microservice/index.d.ts +1 -1
  85. package/dist/src/templates/microservice/index.js +1 -1
  86. package/dist/src/templates/microservice/microservice.template.d.ts +15 -1
  87. package/dist/src/templates/microservice/microservice.template.js +165 -183
  88. package/dist/src/templates/modular-monolith/modularMonolith.template.js +54 -106
  89. package/dist/src/templates/monolith/monolith.template.d.ts +1 -0
  90. package/dist/src/templates/monolith/monolith.template.js +50 -94
  91. package/dist/src/templates/shared/appRuntime.template.d.ts +71 -0
  92. package/dist/src/templates/shared/appRuntime.template.js +209 -0
  93. package/dist/src/templates/shared/index.d.ts +5 -0
  94. package/dist/src/templates/shared/index.js +5 -0
  95. package/dist/src/utils/index.d.ts +3 -3
  96. package/dist/src/utils/index.js +3 -3
  97. package/dist/src/utils/utils.exec.d.ts +19 -1
  98. package/dist/src/utils/utils.exec.js +37 -3
  99. package/dist/src/utils/utils.fileSystem.d.ts +6 -0
  100. package/dist/src/utils/utils.fileSystem.js +19 -0
  101. package/dist/src/utils/utils.name.d.ts +26 -0
  102. package/dist/src/utils/utils.name.js +51 -1
  103. package/package.json +29 -22
  104. package/src/scripts/postinstall.cjs +24 -3
  105. package/dist/.tsbuildinfo +0 -1
  106. package/dist/src/adapters/databases/index.d.ts.map +0 -1
  107. package/dist/src/adapters/databases/index.js.map +0 -1
  108. package/dist/src/adapters/databases/mysql.adapter.d.ts.map +0 -1
  109. package/dist/src/adapters/databases/mysql.adapter.js.map +0 -1
  110. package/dist/src/adapters/databases/postgres.adapter.d.ts.map +0 -1
  111. package/dist/src/adapters/databases/postgres.adapter.js.map +0 -1
  112. package/dist/src/adapters/databases/sqlite.adapter.d.ts.map +0 -1
  113. package/dist/src/adapters/databases/sqlite.adapter.js.map +0 -1
  114. package/dist/src/adapters/frontend/angular.adapter.d.ts.map +0 -1
  115. package/dist/src/adapters/frontend/angular.adapter.js.map +0 -1
  116. package/dist/src/adapters/frontend/astro.adapter.d.ts.map +0 -1
  117. package/dist/src/adapters/frontend/astro.adapter.js.map +0 -1
  118. package/dist/src/adapters/frontend/flutter.adapter.d.ts.map +0 -1
  119. package/dist/src/adapters/frontend/flutter.adapter.js.map +0 -1
  120. package/dist/src/adapters/frontend/frontendAdapter.type.d.ts.map +0 -1
  121. package/dist/src/adapters/frontend/frontendAdapter.type.js.map +0 -1
  122. package/dist/src/adapters/frontend/index.d.ts.map +0 -1
  123. package/dist/src/adapters/frontend/index.js.map +0 -1
  124. package/dist/src/adapters/frontend/next.adapter.d.ts.map +0 -1
  125. package/dist/src/adapters/frontend/next.adapter.js.map +0 -1
  126. package/dist/src/adapters/frontend/nuxt.adapter.d.ts.map +0 -1
  127. package/dist/src/adapters/frontend/nuxt.adapter.js.map +0 -1
  128. package/dist/src/adapters/frontend/react-native.adapter.d.ts.map +0 -1
  129. package/dist/src/adapters/frontend/react-native.adapter.js.map +0 -1
  130. package/dist/src/adapters/frontend/react.adapter.d.ts.map +0 -1
  131. package/dist/src/adapters/frontend/react.adapter.js.map +0 -1
  132. package/dist/src/adapters/frontend/svelte.adapter.d.ts.map +0 -1
  133. package/dist/src/adapters/frontend/svelte.adapter.js.map +0 -1
  134. package/dist/src/adapters/frontend/sveltekit.adapter.d.ts.map +0 -1
  135. package/dist/src/adapters/frontend/sveltekit.adapter.js.map +0 -1
  136. package/dist/src/adapters/frontend/vanilla.adapter.d.ts.map +0 -1
  137. package/dist/src/adapters/frontend/vanilla.adapter.js.map +0 -1
  138. package/dist/src/adapters/frontend/vue.adapter.d.ts.map +0 -1
  139. package/dist/src/adapters/frontend/vue.adapter.js.map +0 -1
  140. package/dist/src/adapters/package-managers/bun.adapter.d.ts.map +0 -1
  141. package/dist/src/adapters/package-managers/bun.adapter.js.map +0 -1
  142. package/dist/src/adapters/package-managers/index.d.ts.map +0 -1
  143. package/dist/src/adapters/package-managers/index.js.map +0 -1
  144. package/dist/src/adapters/package-managers/npm.adapter.d.ts.map +0 -1
  145. package/dist/src/adapters/package-managers/npm.adapter.js.map +0 -1
  146. package/dist/src/adapters/package-managers/packageManager.type.d.ts.map +0 -1
  147. package/dist/src/adapters/package-managers/packageManager.type.js.map +0 -1
  148. package/dist/src/adapters/package-managers/pnpm.adapter.d.ts.map +0 -1
  149. package/dist/src/adapters/package-managers/pnpm.adapter.js.map +0 -1
  150. package/dist/src/adapters/package-managers/yarn.adapter.d.ts.map +0 -1
  151. package/dist/src/adapters/package-managers/yarn.adapter.js.map +0 -1
  152. package/dist/src/bin/zudojs.d.ts.map +0 -1
  153. package/dist/src/bin/zudojs.js.map +0 -1
  154. package/dist/src/cliApplication/cliApplication.builtins.d.ts.map +0 -1
  155. package/dist/src/cliApplication/cliApplication.builtins.js.map +0 -1
  156. package/dist/src/cliApplication/cliApplication.core.d.ts.map +0 -1
  157. package/dist/src/cliApplication/cliApplication.core.js.map +0 -1
  158. package/dist/src/cliApplication/cliApplication.writer.d.ts.map +0 -1
  159. package/dist/src/cliApplication/cliApplication.writer.js.map +0 -1
  160. package/dist/src/cliApplication/index.d.ts.map +0 -1
  161. package/dist/src/cliApplication/index.js.map +0 -1
  162. package/dist/src/cliCommand/cliCommand.builder.d.ts.map +0 -1
  163. package/dist/src/cliCommand/cliCommand.builder.js.map +0 -1
  164. package/dist/src/cliCommand/cliCommand.factory.d.ts.map +0 -1
  165. package/dist/src/cliCommand/cliCommand.factory.js.map +0 -1
  166. package/dist/src/cliCommand/cliCommand.registry.d.ts.map +0 -1
  167. package/dist/src/cliCommand/cliCommand.registry.js.map +0 -1
  168. package/dist/src/cliCommand/cliCommand.validator.d.ts.map +0 -1
  169. package/dist/src/cliCommand/cliCommand.validator.js.map +0 -1
  170. package/dist/src/cliCommand/index.d.ts.map +0 -1
  171. package/dist/src/cliCommand/index.js.map +0 -1
  172. package/dist/src/cliConstant/cliConstant.value.d.ts.map +0 -1
  173. package/dist/src/cliConstant/cliConstant.value.js.map +0 -1
  174. package/dist/src/cliConstant/index.d.ts.map +0 -1
  175. package/dist/src/cliConstant/index.js.map +0 -1
  176. package/dist/src/cliError/cliError.argument.d.ts.map +0 -1
  177. package/dist/src/cliError/cliError.argument.js.map +0 -1
  178. package/dist/src/cliError/cliError.base.d.ts.map +0 -1
  179. package/dist/src/cliError/cliError.base.js.map +0 -1
  180. package/dist/src/cliError/cliError.command.d.ts.map +0 -1
  181. package/dist/src/cliError/cliError.command.js.map +0 -1
  182. package/dist/src/cliError/cliError.execution.d.ts.map +0 -1
  183. package/dist/src/cliError/cliError.execution.js.map +0 -1
  184. package/dist/src/cliError/cliError.option.d.ts.map +0 -1
  185. package/dist/src/cliError/cliError.option.js.map +0 -1
  186. package/dist/src/cliError/index.d.ts.map +0 -1
  187. package/dist/src/cliError/index.js.map +0 -1
  188. package/dist/src/cliParser/cliParser.core.d.ts.map +0 -1
  189. package/dist/src/cliParser/cliParser.core.js.map +0 -1
  190. package/dist/src/cliParser/cliParser.helper.d.ts.map +0 -1
  191. package/dist/src/cliParser/cliParser.helper.js.map +0 -1
  192. package/dist/src/cliParser/cliParser.longOption.d.ts.map +0 -1
  193. package/dist/src/cliParser/cliParser.longOption.js.map +0 -1
  194. package/dist/src/cliParser/cliParser.shortOption.d.ts.map +0 -1
  195. package/dist/src/cliParser/cliParser.shortOption.js.map +0 -1
  196. package/dist/src/cliParser/index.d.ts.map +0 -1
  197. package/dist/src/cliParser/index.js.map +0 -1
  198. package/dist/src/cliType/cliType.type.d.ts.map +0 -1
  199. package/dist/src/cliType/cliType.type.js.map +0 -1
  200. package/dist/src/cliType/index.d.ts.map +0 -1
  201. package/dist/src/cliType/index.js.map +0 -1
  202. package/dist/src/cliVersion/cliVersion.core.d.ts.map +0 -1
  203. package/dist/src/cliVersion/cliVersion.core.js.map +0 -1
  204. package/dist/src/cliVersion/index.d.ts.map +0 -1
  205. package/dist/src/cliVersion/index.js.map +0 -1
  206. package/dist/src/commands/add.command.d.ts.map +0 -1
  207. package/dist/src/commands/add.command.js.map +0 -1
  208. package/dist/src/commands/build.command.d.ts.map +0 -1
  209. package/dist/src/commands/build.command.js.map +0 -1
  210. package/dist/src/commands/create.command.d.ts.map +0 -1
  211. package/dist/src/commands/create.command.js.map +0 -1
  212. package/dist/src/commands/dev.command.d.ts.map +0 -1
  213. package/dist/src/commands/dev.command.js.map +0 -1
  214. package/dist/src/commands/doctor.command.d.ts.map +0 -1
  215. package/dist/src/commands/doctor.command.js.map +0 -1
  216. package/dist/src/commands/generate.command.d.ts.map +0 -1
  217. package/dist/src/commands/generate.command.js.map +0 -1
  218. package/dist/src/commands/index.d.ts.map +0 -1
  219. package/dist/src/commands/index.js.map +0 -1
  220. package/dist/src/commands/info.command.d.ts.map +0 -1
  221. package/dist/src/commands/info.command.js.map +0 -1
  222. package/dist/src/constants/index.d.ts.map +0 -1
  223. package/dist/src/constants/index.js.map +0 -1
  224. package/dist/src/errors/index.d.ts.map +0 -1
  225. package/dist/src/errors/index.js.map +0 -1
  226. package/dist/src/generators/backend/backend.generator.d.ts.map +0 -1
  227. package/dist/src/generators/backend/backend.generator.js.map +0 -1
  228. package/dist/src/generators/backend/index.d.ts.map +0 -1
  229. package/dist/src/generators/backend/index.js.map +0 -1
  230. package/dist/src/generators/command/command.generator.d.ts.map +0 -1
  231. package/dist/src/generators/command/command.generator.js.map +0 -1
  232. package/dist/src/generators/controller/controller.generator.d.ts.map +0 -1
  233. package/dist/src/generators/controller/controller.generator.js.map +0 -1
  234. package/dist/src/generators/dto/dto.generator.d.ts.map +0 -1
  235. package/dist/src/generators/dto/dto.generator.js.map +0 -1
  236. package/dist/src/generators/dto/index.d.ts.map +0 -1
  237. package/dist/src/generators/dto/index.js.map +0 -1
  238. package/dist/src/generators/event/event.generator.d.ts.map +0 -1
  239. package/dist/src/generators/event/event.generator.js.map +0 -1
  240. package/dist/src/generators/event/index.d.ts.map +0 -1
  241. package/dist/src/generators/event/index.js.map +0 -1
  242. package/dist/src/generators/frontend/frontendGenerator.core.d.ts.map +0 -1
  243. package/dist/src/generators/frontend/frontendGenerator.core.js.map +0 -1
  244. package/dist/src/generators/frontend/index.d.ts.map +0 -1
  245. package/dist/src/generators/frontend/index.js.map +0 -1
  246. package/dist/src/generators/fullstack/fullstackComposer.core.d.ts.map +0 -1
  247. package/dist/src/generators/fullstack/fullstackComposer.core.js.map +0 -1
  248. package/dist/src/generators/fullstack/index.d.ts.map +0 -1
  249. package/dist/src/generators/fullstack/index.js.map +0 -1
  250. package/dist/src/generators/index.d.ts.map +0 -1
  251. package/dist/src/generators/index.js.map +0 -1
  252. package/dist/src/generators/infrastructure/index.d.ts.map +0 -1
  253. package/dist/src/generators/infrastructure/index.js.map +0 -1
  254. package/dist/src/generators/infrastructure/infrastructure.generator.d.ts.map +0 -1
  255. package/dist/src/generators/infrastructure/infrastructure.generator.js.map +0 -1
  256. package/dist/src/generators/integration/index.d.ts.map +0 -1
  257. package/dist/src/generators/integration/index.js.map +0 -1
  258. package/dist/src/generators/integration/integrationGenerator.core.d.ts.map +0 -1
  259. package/dist/src/generators/integration/integrationGenerator.core.js.map +0 -1
  260. package/dist/src/generators/job/index.d.ts.map +0 -1
  261. package/dist/src/generators/job/index.js.map +0 -1
  262. package/dist/src/generators/job/job.generator.d.ts.map +0 -1
  263. package/dist/src/generators/job/job.generator.js.map +0 -1
  264. package/dist/src/generators/middleware/index.d.ts.map +0 -1
  265. package/dist/src/generators/middleware/index.js.map +0 -1
  266. package/dist/src/generators/middleware/middleware.generator.d.ts.map +0 -1
  267. package/dist/src/generators/middleware/middleware.generator.js.map +0 -1
  268. package/dist/src/generators/model/index.d.ts.map +0 -1
  269. package/dist/src/generators/model/index.js.map +0 -1
  270. package/dist/src/generators/model/model.generator.d.ts.map +0 -1
  271. package/dist/src/generators/model/model.generator.js.map +0 -1
  272. package/dist/src/generators/module/module.generator.d.ts.map +0 -1
  273. package/dist/src/generators/module/module.generator.js.map +0 -1
  274. package/dist/src/generators/project/project.generator.d.ts.map +0 -1
  275. package/dist/src/generators/project/project.generator.js.map +0 -1
  276. package/dist/src/generators/query/query.generator.d.ts.map +0 -1
  277. package/dist/src/generators/query/query.generator.js.map +0 -1
  278. package/dist/src/generators/repository/repository.generator.d.ts.map +0 -1
  279. package/dist/src/generators/repository/repository.generator.js.map +0 -1
  280. package/dist/src/generators/route/index.d.ts.map +0 -1
  281. package/dist/src/generators/route/index.js.map +0 -1
  282. package/dist/src/generators/route/route.generator.d.ts.map +0 -1
  283. package/dist/src/generators/route/route.generator.js.map +0 -1
  284. package/dist/src/generators/service/service.generator.d.ts.map +0 -1
  285. package/dist/src/generators/service/service.generator.js.map +0 -1
  286. package/dist/src/generators/validator/index.d.ts.map +0 -1
  287. package/dist/src/generators/validator/index.js.map +0 -1
  288. package/dist/src/generators/validator/validator.generator.d.ts.map +0 -1
  289. package/dist/src/generators/validator/validator.generator.js.map +0 -1
  290. package/dist/src/index.d.ts.map +0 -1
  291. package/dist/src/index.js.map +0 -1
  292. package/dist/src/installers/dependency.installer.d.ts.map +0 -1
  293. package/dist/src/installers/dependency.installer.js.map +0 -1
  294. package/dist/src/installers/index.d.ts.map +0 -1
  295. package/dist/src/installers/index.js.map +0 -1
  296. package/dist/src/manifest/index.d.ts.map +0 -1
  297. package/dist/src/manifest/index.js.map +0 -1
  298. package/dist/src/manifest/manifestManager.core.d.ts.map +0 -1
  299. package/dist/src/manifest/manifestManager.core.js.map +0 -1
  300. package/dist/src/prompts/backend/api-style.prompt.d.ts.map +0 -1
  301. package/dist/src/prompts/backend/api-style.prompt.js.map +0 -1
  302. package/dist/src/prompts/backend/backend-architecture.prompt.d.ts.map +0 -1
  303. package/dist/src/prompts/backend/backend-architecture.prompt.js.map +0 -1
  304. package/dist/src/prompts/backend/database.prompt.d.ts.map +0 -1
  305. package/dist/src/prompts/backend/database.prompt.js.map +0 -1
  306. package/dist/src/prompts/backend/index.d.ts.map +0 -1
  307. package/dist/src/prompts/backend/index.js.map +0 -1
  308. package/dist/src/prompts/capabilities/capabilities.prompt.d.ts.map +0 -1
  309. package/dist/src/prompts/capabilities/capabilities.prompt.js.map +0 -1
  310. package/dist/src/prompts/capabilities/index.d.ts.map +0 -1
  311. package/dist/src/prompts/capabilities/index.js.map +0 -1
  312. package/dist/src/prompts/frontend/framework.prompt.d.ts.map +0 -1
  313. package/dist/src/prompts/frontend/framework.prompt.js.map +0 -1
  314. package/dist/src/prompts/frontend/frontend-architecture.prompt.d.ts.map +0 -1
  315. package/dist/src/prompts/frontend/frontend-architecture.prompt.js.map +0 -1
  316. package/dist/src/prompts/frontend/index.d.ts.map +0 -1
  317. package/dist/src/prompts/frontend/index.js.map +0 -1
  318. package/dist/src/prompts/index.d.ts.map +0 -1
  319. package/dist/src/prompts/index.js.map +0 -1
  320. package/dist/src/prompts/project/confirmation.prompt.d.ts.map +0 -1
  321. package/dist/src/prompts/project/confirmation.prompt.js.map +0 -1
  322. package/dist/src/prompts/project/index.d.ts.map +0 -1
  323. package/dist/src/prompts/project/index.js.map +0 -1
  324. package/dist/src/prompts/project/project-name.prompt.d.ts.map +0 -1
  325. package/dist/src/prompts/project/project-name.prompt.js.map +0 -1
  326. package/dist/src/prompts/project/project-type.prompt.d.ts.map +0 -1
  327. package/dist/src/prompts/project/project-type.prompt.js.map +0 -1
  328. package/dist/src/prompts/prompts.createProject.d.ts +0 -33
  329. package/dist/src/prompts/prompts.createProject.d.ts.map +0 -1
  330. package/dist/src/prompts/prompts.createProject.js +0 -143
  331. package/dist/src/prompts/prompts.createProject.js.map +0 -1
  332. package/dist/src/prompts/workspace/index.d.ts.map +0 -1
  333. package/dist/src/prompts/workspace/index.js.map +0 -1
  334. package/dist/src/prompts/workspace/package-manager.prompt.d.ts.map +0 -1
  335. package/dist/src/prompts/workspace/package-manager.prompt.js.map +0 -1
  336. package/dist/src/registries/adapter/frontendAdapterRegistry.core.d.ts.map +0 -1
  337. package/dist/src/registries/adapter/frontendAdapterRegistry.core.js.map +0 -1
  338. package/dist/src/registries/adapter/packageManagerRegistry.core.d.ts.map +0 -1
  339. package/dist/src/registries/adapter/packageManagerRegistry.core.js.map +0 -1
  340. package/dist/src/registries/dependency/dependencyRegistry.core.d.ts.map +0 -1
  341. package/dist/src/registries/dependency/dependencyRegistry.core.js.map +0 -1
  342. package/dist/src/registries/dependency/index.d.ts.map +0 -1
  343. package/dist/src/registries/dependency/index.js.map +0 -1
  344. package/dist/src/registries/generator/generatorRegistry.core.d.ts.map +0 -1
  345. package/dist/src/registries/generator/generatorRegistry.core.js.map +0 -1
  346. package/dist/src/registries/generator/index.d.ts.map +0 -1
  347. package/dist/src/registries/generator/index.js.map +0 -1
  348. package/dist/src/registries/index.d.ts.map +0 -1
  349. package/dist/src/registries/index.js.map +0 -1
  350. package/dist/src/resolvers/architecture.resolver.d.ts.map +0 -1
  351. package/dist/src/resolvers/architecture.resolver.js.map +0 -1
  352. package/dist/src/resolvers/capability/capabilityResolver.core.d.ts.map +0 -1
  353. package/dist/src/resolvers/capability/capabilityResolver.core.js.map +0 -1
  354. package/dist/src/resolvers/capability/index.d.ts.map +0 -1
  355. package/dist/src/resolvers/capability/index.js.map +0 -1
  356. package/dist/src/resolvers/configuration/configurationResolver.core.d.ts.map +0 -1
  357. package/dist/src/resolvers/configuration/configurationResolver.core.js.map +0 -1
  358. package/dist/src/resolvers/configuration/index.d.ts.map +0 -1
  359. package/dist/src/resolvers/configuration/index.js.map +0 -1
  360. package/dist/src/resolvers/dependency/dependencyResolver.core.d.ts.map +0 -1
  361. package/dist/src/resolvers/dependency/dependencyResolver.core.js.map +0 -1
  362. package/dist/src/resolvers/dependency/index.d.ts.map +0 -1
  363. package/dist/src/resolvers/dependency/index.js.map +0 -1
  364. package/dist/src/resolvers/index.d.ts.map +0 -1
  365. package/dist/src/resolvers/index.js.map +0 -1
  366. package/dist/src/resolvers/project.resolver.d.ts.map +0 -1
  367. package/dist/src/resolvers/project.resolver.js.map +0 -1
  368. package/dist/src/rollback/index.d.ts.map +0 -1
  369. package/dist/src/rollback/index.js.map +0 -1
  370. package/dist/src/rollback/rollbackManager.core.d.ts.map +0 -1
  371. package/dist/src/rollback/rollbackManager.core.js.map +0 -1
  372. package/dist/src/runners/package-manager/index.d.ts.map +0 -1
  373. package/dist/src/runners/package-manager/index.js.map +0 -1
  374. package/dist/src/runners/package-manager/packageManagerRunner.core.d.ts.map +0 -1
  375. package/dist/src/runners/package-manager/packageManagerRunner.core.js.map +0 -1
  376. package/dist/src/runners/process/index.d.ts.map +0 -1
  377. package/dist/src/runners/process/index.js.map +0 -1
  378. package/dist/src/runners/process/processRunner.core.d.ts.map +0 -1
  379. package/dist/src/runners/process/processRunner.core.js.map +0 -1
  380. package/dist/src/runners/task/index.d.ts.map +0 -1
  381. package/dist/src/runners/task/index.js.map +0 -1
  382. package/dist/src/runners/task/taskRunner.core.d.ts.map +0 -1
  383. package/dist/src/runners/task/taskRunner.core.js.map +0 -1
  384. package/dist/src/scaffolders/framework.scaffolder.d.ts.map +0 -1
  385. package/dist/src/scaffolders/framework.scaffolder.js.map +0 -1
  386. package/dist/src/scaffolders/index.d.ts.map +0 -1
  387. package/dist/src/scaffolders/index.js.map +0 -1
  388. package/dist/src/scaffolders/scaffolder.helper.d.ts.map +0 -1
  389. package/dist/src/scaffolders/scaffolder.helper.js.map +0 -1
  390. package/dist/src/templates/microservice/index.d.ts.map +0 -1
  391. package/dist/src/templates/microservice/index.js.map +0 -1
  392. package/dist/src/templates/microservice/microservice.template.d.ts.map +0 -1
  393. package/dist/src/templates/microservice/microservice.template.js.map +0 -1
  394. package/dist/src/templates/modular-monolith/index.d.ts.map +0 -1
  395. package/dist/src/templates/modular-monolith/index.js.map +0 -1
  396. package/dist/src/templates/modular-monolith/modularMonolith.template.d.ts.map +0 -1
  397. package/dist/src/templates/modular-monolith/modularMonolith.template.js.map +0 -1
  398. package/dist/src/templates/monolith/index.d.ts.map +0 -1
  399. package/dist/src/templates/monolith/index.js.map +0 -1
  400. package/dist/src/templates/monolith/monolith.template.d.ts.map +0 -1
  401. package/dist/src/templates/monolith/monolith.template.js.map +0 -1
  402. package/dist/src/types/index.d.ts.map +0 -1
  403. package/dist/src/types/index.js.map +0 -1
  404. package/dist/src/types/projectConfiguration.type.d.ts.map +0 -1
  405. package/dist/src/types/projectConfiguration.type.js.map +0 -1
  406. package/dist/src/types/scaffold.type.d.ts.map +0 -1
  407. package/dist/src/types/scaffold.type.js.map +0 -1
  408. package/dist/src/utils/index.d.ts.map +0 -1
  409. package/dist/src/utils/index.js.map +0 -1
  410. package/dist/src/utils/utils.detect.d.ts.map +0 -1
  411. package/dist/src/utils/utils.detect.js.map +0 -1
  412. package/dist/src/utils/utils.exec.d.ts.map +0 -1
  413. package/dist/src/utils/utils.exec.js.map +0 -1
  414. package/dist/src/utils/utils.fileSystem.d.ts.map +0 -1
  415. package/dist/src/utils/utils.fileSystem.js.map +0 -1
  416. package/dist/src/utils/utils.name.d.ts.map +0 -1
  417. package/dist/src/utils/utils.name.js.map +0 -1
  418. package/dist/src/validators/compatibility/compatibilityValidator.core.d.ts.map +0 -1
  419. package/dist/src/validators/compatibility/compatibilityValidator.core.js.map +0 -1
  420. package/dist/src/validators/compatibility/index.d.ts.map +0 -1
  421. package/dist/src/validators/compatibility/index.js.map +0 -1
  422. package/dist/src/validators/environment/environmentValidator.core.d.ts.map +0 -1
  423. package/dist/src/validators/environment/environmentValidator.core.js.map +0 -1
  424. package/dist/src/validators/environment/index.d.ts.map +0 -1
  425. package/dist/src/validators/environment/index.js.map +0 -1
  426. package/dist/src/validators/index.d.ts.map +0 -1
  427. package/dist/src/validators/index.js.map +0 -1
  428. package/dist/src/validators/project/index.d.ts.map +0 -1
  429. package/dist/src/validators/project/index.js.map +0 -1
  430. package/dist/src/validators/project/projectValidator.core.d.ts.map +0 -1
  431. package/dist/src/validators/project/projectValidator.core.js.map +0 -1
@@ -1,17 +1,17 @@
1
1
  /**
2
2
  * zudojs-cli — Controller Generator
3
3
  */
4
- import { writeFileTree } from "../../utils/utils.fileSystem.js";
5
- import { CLIGenerationError, CLIValidationError } from "../../errors/index.js";
6
- import { normalizeName } from "../../utils/utils.name.js";
4
+ import { writeFileTree, mergeBarrelExport, } from "../../utils/utils.fileSystem.js";
5
+ import { CLIGenerationError } from "../../errors/index.js";
6
+ import { normalizeName, toPascalCase } from "../../utils/utils.name.js";
7
7
  export async function generateController(options, cwd) {
8
8
  const name = normalizeName(options.name);
9
- const nameCamel = name
10
- .replace(/-([a-z])/g, (_m, c) => c.toUpperCase())
11
- .replace(/^./, (c) => c.toUpperCase());
9
+ const nameCamel = toPascalCase(options.name);
12
10
  const basePath = options.basePath ?? "";
11
+ const prefix = basePath ? `${basePath}/` : "";
12
+ const indexPath = `${prefix}controllers/index.ts`;
13
13
  const files = {
14
- [`${basePath ? `${basePath}/` : ""}controllers/${name}.controller.ts`]: `import { createLogger } from "@zudojs/logger";
14
+ [`${prefix}controllers/${name}.controller.ts`]: `import { createLogger } from "@zudojs/logger";
15
15
 
16
16
  export class ${nameCamel}Controller {
17
17
  private readonly logger = createLogger({ name: "${name}-controller" });
@@ -30,9 +30,12 @@ export class ${nameCamel}Controller {
30
30
  }
31
31
  }
32
32
  `,
33
- [`${basePath ? `${basePath}/` : ""}controllers/index.ts`]: `export { ${nameCamel}Controller } from "./${name}.controller.js";
34
- `,
33
+ // Merge with any existing barrel content instead of overwriting it.
34
+ [indexPath]: mergeBarrelExport(cwd, indexPath, `export { ${nameCamel}Controller } from "./${name}.controller.js";`),
35
35
  };
36
+ if (options.dryRun) {
37
+ return Object.keys(files);
38
+ }
36
39
  try {
37
40
  await writeFileTree(cwd, files);
38
41
  return Object.keys(files);
@@ -6,6 +6,7 @@
6
6
  export interface GenerateDtoOptions {
7
7
  readonly name: string;
8
8
  readonly basePath: string;
9
+ readonly dryRun?: boolean;
9
10
  }
10
11
  export declare function generateDto(options: GenerateDtoOptions, cwd: string): Promise<string[]>;
11
12
  //# sourceMappingURL=dto.generator.d.ts.map
@@ -4,17 +4,23 @@
4
4
  * Generates DTO files.
5
5
  */
6
6
  import { writeFileTree } from "../../utils/utils.fileSystem.js";
7
+ import { normalizeName, toPascalCase } from "../../utils/utils.name.js";
7
8
  export async function generateDto(options, cwd) {
9
+ const name = normalizeName(options.name);
10
+ const namePascal = toPascalCase(options.name);
8
11
  const files = {
9
- [`${options.basePath}/dtos/${options.name}.dto.ts`]: `/**
10
- * ${options.name} DTO.
12
+ [`${options.basePath}/dtos/${name}.dto.ts`]: `/**
13
+ * ${name} DTO.
11
14
  */
12
15
 
13
- export interface Create${options.name}Dto {
16
+ export interface Create${namePascal}Dto {
14
17
  readonly name: string;
15
18
  }
16
19
  `,
17
20
  };
21
+ if (options.dryRun) {
22
+ return Object.keys(files);
23
+ }
18
24
  await writeFileTree(cwd, files);
19
25
  return Object.keys(files);
20
26
  }
@@ -6,6 +6,7 @@
6
6
  export interface GenerateEventOptions {
7
7
  readonly name: string;
8
8
  readonly basePath: string;
9
+ readonly dryRun?: boolean;
9
10
  }
10
11
  export declare function generateEvent(options: GenerateEventOptions, cwd: string): Promise<string[]>;
11
12
  //# sourceMappingURL=event.generator.d.ts.map
@@ -4,18 +4,24 @@
4
4
  * Generates event files.
5
5
  */
6
6
  import { writeFileTree } from "../../utils/utils.fileSystem.js";
7
+ import { normalizeName, toPascalCase } from "../../utils/utils.name.js";
7
8
  export async function generateEvent(options, cwd) {
9
+ const name = normalizeName(options.name);
10
+ const namePascal = toPascalCase(options.name);
8
11
  const files = {
9
- [`${options.basePath}/events/${options.name}.event.ts`]: `/**
10
- * ${options.name} event.
12
+ [`${options.basePath}/events/${name}.event.ts`]: `/**
13
+ * ${name} event.
11
14
  */
12
15
 
13
- export interface ${options.name}Event {
14
- readonly type: "${options.name}";
16
+ export interface ${namePascal}Event {
17
+ readonly type: "${name}";
15
18
  readonly timestamp: Date;
16
19
  }
17
20
  `,
18
21
  };
22
+ if (options.dryRun) {
23
+ return Object.keys(files);
24
+ }
19
25
  await writeFileTree(cwd, files);
20
26
  return Object.keys(files);
21
27
  }
@@ -7,6 +7,7 @@ import { FrontendAdapterRegistry } from "../../registries/adapter/frontendAdapte
7
7
  import { PackageManagerRegistry } from "../../registries/adapter/packageManagerRegistry.core.js";
8
8
  import { DependencyResolver } from "../../resolvers/dependency/dependencyResolver.core.js";
9
9
  import { CLIGenerationError } from "../../errors/index.js";
10
+ import { runFrontendPipeline } from "./frontendPipeline.js";
10
11
  /**
11
12
  * Generates frontend projects using framework adapters.
12
13
  */
@@ -43,34 +44,9 @@ export class FrontendGenerator {
43
44
  const files = [];
44
45
  const errors = [];
45
46
  try {
46
- // 1. Scaffold using official tool
47
- await adapter.scaffold(context);
48
- files.push("scaffold");
49
- // 2. Apply Zudojs structure
50
- await adapter.applyZudojsStructure(context);
51
- files.push("structure");
52
- // 3. Resolve and install dependencies
53
- const deps = adapter.getDependencies(context);
54
- const resolution = this.dependencyResolver.resolve(deps);
55
- if (resolution.conflicts.length > 0) {
56
- for (const conflict of resolution.conflicts) {
57
- errors.push(`Conflict: ${conflict.reason}`);
58
- }
59
- return { success: false, framework: options.framework, files, errors };
60
- }
61
- // 4. Install dependencies
62
- const pmName = options.packageManager ?? "pnpm";
63
- const packageManager = this.packageManagerRegistry.get(pmName);
64
- if (packageManager) {
65
- const devDeps = resolution.devDependencies.map((d) => d.name);
66
- await packageManager.addDev(options.projectPath, devDeps);
67
- files.push("dependencies");
68
- }
69
- // 5. Validate
70
- const validation = await adapter.validate(context);
71
- if (!validation.valid) {
72
- errors.push(...validation.errors);
73
- }
47
+ const outcome = await runFrontendPipeline(adapter, context, this.packageManagerRegistry, this.dependencyResolver);
48
+ files.push(...outcome.files);
49
+ errors.push(...outcome.errors);
74
50
  }
75
51
  catch (error) {
76
52
  errors.push(error instanceof Error ? error.message : String(error));
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared frontend generation pipeline.
3
+ *
4
+ * Both `FrontendGenerator` (frontend-only projects) and `FullstackComposer`
5
+ * (the `apps/web` half of a fullstack project) drive frontend adapters. They
6
+ * used to do it with two different sequences: the fullstack path skipped
7
+ * availability checks, dependency resolution, dependency installation and
8
+ * adapter validation entirely. This module is the single sequence both use so
9
+ * the two paths cannot drift again.
10
+ *
11
+ * @module generators/frontend/pipeline
12
+ */
13
+ import type { FrontendAdapter, FrontendGenerationContext } from "../../adapters/frontend/frontendAdapter.type.js";
14
+ import type { PackageManagerRegistry } from "../../registries/adapter/packageManagerRegistry.core.js";
15
+ import type { DependencyResolver } from "../../resolvers/dependency/dependencyResolver.core.js";
16
+ /** Outcome of running the frontend pipeline for a single adapter. */
17
+ export interface FrontendPipelineResult {
18
+ readonly files: readonly string[];
19
+ readonly errors: readonly string[];
20
+ }
21
+ /**
22
+ * Runs the full adapter sequence: availability check, scaffold, structure,
23
+ * integration, dependency resolution, dependency installation, validation.
24
+ */
25
+ export declare function runFrontendPipeline(adapter: FrontendAdapter, context: FrontendGenerationContext, packageManagerRegistry: PackageManagerRegistry, dependencyResolver: DependencyResolver): Promise<FrontendPipelineResult>;
26
+ //# sourceMappingURL=frontendPipeline.d.ts.map
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Shared frontend generation pipeline.
3
+ *
4
+ * Both `FrontendGenerator` (frontend-only projects) and `FullstackComposer`
5
+ * (the `apps/web` half of a fullstack project) drive frontend adapters. They
6
+ * used to do it with two different sequences: the fullstack path skipped
7
+ * availability checks, dependency resolution, dependency installation and
8
+ * adapter validation entirely. This module is the single sequence both use so
9
+ * the two paths cannot drift again.
10
+ *
11
+ * @module generators/frontend/pipeline
12
+ */
13
+ /**
14
+ * Rejects package names a package manager would read as a flag.
15
+ *
16
+ * Adapter dependency lists are static today, but they are part of the public
17
+ * `FrontendAdapter` contract and a third-party adapter could return
18
+ * `--registry=...`. Package names go into an argv array (never a shell), so
19
+ * this closes argument injection rather than command injection.
20
+ */
21
+ function assertSafePackageNames(names) {
22
+ for (const name of names) {
23
+ if (name.startsWith("-") || name.trim() === "" || /\s/.test(name)) {
24
+ throw new Error(`Refusing to install unsafe package name: "${name}"`);
25
+ }
26
+ }
27
+ }
28
+ /**
29
+ * Runs the full adapter sequence: availability check, scaffold, structure,
30
+ * integration, dependency resolution, dependency installation, validation.
31
+ */
32
+ export async function runFrontendPipeline(adapter, context, packageManagerRegistry, dependencyResolver) {
33
+ const files = [];
34
+ const errors = [];
35
+ // 0. Fail fast with a readable message when the framework's own toolchain
36
+ // is missing. Adapters such as Flutter shell out with no fallback, so
37
+ // without this the user sees a bare ENOENT after the project directory
38
+ // has already been created and rolled back.
39
+ const available = await adapter.isAvailable();
40
+ if (!available) {
41
+ return {
42
+ files,
43
+ errors: [
44
+ `The toolchain required by the "${adapter.name}" frontend is not available on this machine. Install it and re-run, or choose another frontend.`,
45
+ ],
46
+ };
47
+ }
48
+ // 1. Scaffold using the official tool (adapters fall back to built-in
49
+ // templates where one exists).
50
+ await adapter.scaffold(context);
51
+ files.push("scaffold");
52
+ // 2. Apply the Zudojs structure over the scaffolded project.
53
+ await adapter.applyZudojsStructure(context);
54
+ files.push("structure");
55
+ // 3. Generate the adapter's integration files (API client, env helpers).
56
+ await adapter.generateIntegration(context);
57
+ files.push("integration");
58
+ // 4. Resolve dependencies and stop on conflicts.
59
+ const resolution = dependencyResolver.resolve(adapter.getDependencies(context));
60
+ if (resolution.conflicts.length > 0) {
61
+ for (const conflict of resolution.conflicts) {
62
+ errors.push(`Conflict: ${conflict.reason}`);
63
+ }
64
+ return { files, errors };
65
+ }
66
+ // 5. Install BOTH runtime and dev dependencies. Only devDependencies used
67
+ // to be installed, so every runtime package an adapter declared was
68
+ // resolved and then dropped on the floor.
69
+ const packageManager = packageManagerRegistry.get(context.packageManager);
70
+ if (packageManager) {
71
+ const deps = resolution.dependencies.map((d) => d.name);
72
+ const devDeps = resolution.devDependencies.map((d) => d.name);
73
+ assertSafePackageNames(deps);
74
+ assertSafePackageNames(devDeps);
75
+ if (deps.length > 0) {
76
+ await packageManager.add(context.projectPath, deps);
77
+ }
78
+ if (devDeps.length > 0) {
79
+ await packageManager.addDev(context.projectPath, devDeps);
80
+ }
81
+ files.push("dependencies");
82
+ }
83
+ else {
84
+ errors.push(`Unknown package manager: ${context.packageManager}`);
85
+ }
86
+ // 6. Validate the generated project and surface the adapter's own findings.
87
+ const validation = await adapter.validate(context);
88
+ if (!validation.valid) {
89
+ errors.push(...validation.errors);
90
+ }
91
+ return { files, errors };
92
+ }
93
+ //# sourceMappingURL=frontendPipeline.js.map
@@ -28,15 +28,14 @@ export declare class FullstackComposer {
28
28
  private readonly frontendRegistry;
29
29
  private readonly packageManagerRegistry;
30
30
  private readonly dependencyResolver;
31
- private readonly integrationGenerator;
32
31
  constructor();
33
32
  /**
34
33
  * Generates a fullstack project.
35
34
  */
36
35
  generate(context: FullstackGenerationContext): Promise<FullstackGenerationResult>;
36
+ private getPackageManager;
37
37
  private createWorkspace;
38
38
  private generateSharedPackages;
39
39
  private generateFrontend;
40
- private installDependencies;
41
40
  }
42
41
  //# sourceMappingURL=fullstackComposer.core.d.ts.map
@@ -5,12 +5,13 @@
5
5
  *
6
6
  * @module generators/fullstack
7
7
  */
8
+ import { mkdir } from "node:fs/promises";
9
+ import { join } from "node:path";
8
10
  import { FrontendAdapterRegistry } from "../../registries/adapter/frontendAdapterRegistry.core.js";
9
11
  import { PackageManagerRegistry } from "../../registries/adapter/packageManagerRegistry.core.js";
10
12
  import { DependencyResolver } from "../../resolvers/dependency/dependencyResolver.core.js";
11
- import { IntegrationGenerator } from "../integration/integrationGenerator.core.js";
13
+ import { runFrontendPipeline } from "../frontend/frontendPipeline.js";
12
14
  import { writeFileTree } from "../../utils/utils.fileSystem.js";
13
- import { execCommand } from "../../utils/utils.exec.js";
14
15
  /**
15
16
  * Composes fullstack projects by orchestrating multiple generators.
16
17
  */
@@ -18,12 +19,10 @@ export class FullstackComposer {
18
19
  frontendRegistry;
19
20
  packageManagerRegistry;
20
21
  dependencyResolver;
21
- integrationGenerator;
22
22
  constructor() {
23
23
  this.frontendRegistry = new FrontendAdapterRegistry();
24
24
  this.packageManagerRegistry = new PackageManagerRegistry();
25
25
  this.dependencyResolver = new DependencyResolver();
26
- this.integrationGenerator = new IntegrationGenerator();
27
26
  }
28
27
  /**
29
28
  * Generates a fullstack project.
@@ -34,7 +33,10 @@ export class FullstackComposer {
34
33
  try {
35
34
  // 1. Create workspace structure
36
35
  await this.createWorkspace(context);
37
- files.push("package.json", "pnpm-workspace.yaml", "zudojs.config.ts");
36
+ files.push("package.json", "zudojs.config.ts");
37
+ if (this.getPackageManager(context) === "pnpm") {
38
+ files.push("pnpm-workspace.yaml");
39
+ }
38
40
  // 2. Generate shared packages
39
41
  await this.generateSharedPackages(context);
40
42
  files.push("packages/contracts/", "packages/shared-types/");
@@ -43,19 +45,8 @@ export class FullstackComposer {
43
45
  const frontendFiles = await this.generateFrontend(context);
44
46
  files.push(...frontendFiles);
45
47
  }
46
- // 4. Generate integration files
47
- await this.integrationGenerator.generate({
48
- project: context.project,
49
- projectPath: context.projectPath,
50
- backendPort: 3000,
51
- frontendPort: context.project.frontend?.framework === "next" ? 3000 : 5173,
52
- });
53
- files.push(".env.example", "config/cors.ts", ...(context.project.frontend?.framework === "react" ||
54
- context.project.frontend?.framework === "vue"
55
- ? ["vite.config.ts"]
56
- : []));
57
- // 5. Install dependencies
58
- await this.installDependencies(context);
48
+ // Note: integration files and dependency installation are orchestrated
49
+ // by the create command to avoid running them twice.
59
50
  }
60
51
  catch (error) {
61
52
  errors.push(error instanceof Error ? error.message : String(error));
@@ -66,52 +57,66 @@ export class FullstackComposer {
66
57
  errors,
67
58
  };
68
59
  }
60
+ getPackageManager(context) {
61
+ return context.project.workspace?.packageManager ?? "pnpm";
62
+ }
69
63
  async createWorkspace(context) {
64
+ const packageManager = this.getPackageManager(context);
65
+ const workspaceGlobs = ["apps/*", "packages/*"];
66
+ const scriptFor = (script) => {
67
+ switch (packageManager) {
68
+ case "npm":
69
+ return `npm run ${script} --workspaces --if-present`;
70
+ case "yarn":
71
+ return `yarn workspaces run ${script}`;
72
+ case "bun":
73
+ return `bun run --filter '*' ${script}`;
74
+ default:
75
+ return `pnpm -r --parallel run ${script}`;
76
+ }
77
+ };
70
78
  const rootPackageJson = {
71
79
  name: context.project.name,
72
80
  private: true,
81
+ ...(packageManager === "pnpm" ? {} : { workspaces: workspaceGlobs }),
73
82
  scripts: {
74
- dev: "pnpm --parallel dev",
75
- build: "pnpm --parallel build",
76
- test: "pnpm --parallel test",
77
- lint: "pnpm --parallel lint",
78
- typecheck: "pnpm --parallel typecheck",
83
+ dev: scriptFor("dev"),
84
+ build: scriptFor("build"),
85
+ test: scriptFor("test"),
86
+ lint: scriptFor("lint"),
87
+ typecheck: scriptFor("typecheck"),
79
88
  },
80
89
  devDependencies: {
81
90
  typescript: "^5.0.0",
82
91
  },
83
92
  };
84
- const workspaceYaml = `packages:
85
- - "apps/*"
86
- - "packages/*"
87
- `;
88
- const zudojsConfig = `export default {
89
- version: 1,
90
- project: {
91
- name: "${context.project.name}",
92
- type: "fullstack",
93
- },
94
- backend: {
95
- architecture: "${context.project.backend?.architecture ?? "monolith"}",
96
- api: "${context.project.backend?.api ?? "rest"}",
97
- },
93
+ // Project and framework names reach this template from user input. They
94
+ // are emitted as JSON string literals (valid JS) so a quote, backslash,
95
+ // newline or `";` sequence cannot break out of the literal and inject
96
+ // code into the generated zudojs.config.ts.
97
+ const literal = (value) => JSON.stringify(value);
98
+ const frontendBlock = context.project.frontend
99
+ ? `
98
100
  frontend: {
99
- framework: "${context.project.frontend?.framework ?? "react"}",
100
- architecture: "${context.project.frontend?.architecture ?? "zudojs-standard"}",
101
- },
102
- database: {
103
- provider: "${context.project.backend?.database ?? "postgresql"}",
104
- },
105
- workspace: {
106
- packageManager: "${context.project.workspace?.packageManager ?? "pnpm"}",
107
- },
101
+ framework: ${literal(context.project.frontend.framework)},
102
+ },`
103
+ : "";
104
+ const zudojsConfig = `export default {
105
+ name: ${literal(context.project.name)},
106
+ projectType: "fullstack",
107
+ architecture: ${literal(context.project.backend?.architecture ?? "monolith")},${frontendBlock}
108
108
  };
109
109
  `;
110
- await writeFileTree(context.projectPath, {
111
- "package.json": JSON.stringify(rootPackageJson, null, 2),
112
- "pnpm-workspace.yaml": workspaceYaml,
110
+ const files = {
111
+ "package.json": JSON.stringify(rootPackageJson, null, 2) + "\n",
113
112
  "zudojs.config.ts": zudojsConfig,
114
- });
113
+ };
114
+ if (packageManager === "pnpm") {
115
+ files["pnpm-workspace.yaml"] = `packages:
116
+ ${workspaceGlobs.map((g) => ` - "${g}"`).join("\n")}
117
+ `;
118
+ }
119
+ await writeFileTree(context.projectPath, files);
115
120
  }
116
121
  async generateSharedPackages(context) {
117
122
  const contractsIndex = `/**
@@ -150,14 +155,17 @@ export type Timestamp = string;
150
155
  if (!adapter) {
151
156
  throw new Error(`Unknown frontend framework: ${context.project.frontend.framework}`);
152
157
  }
153
- const frontendPath = `${context.projectPath}/apps/web`;
158
+ const frontendPath = join(context.projectPath, "apps", "web");
159
+ // Scaffolders spawn with cwd=frontendPath; the directory must exist
160
+ // before the child process starts or spawn fails with ENOENT.
161
+ await mkdir(frontendPath, { recursive: true });
154
162
  const frontendContext = {
155
163
  project: context.project,
156
164
  projectPath: frontendPath,
157
165
  framework: adapter.framework,
158
166
  language: context.project.frontend.language ?? "typescript",
159
167
  architecture: context.project.frontend.architecture,
160
- packageManager: context.project.workspace?.packageManager ?? "pnpm",
168
+ packageManager: this.getPackageManager(context),
161
169
  features: {
162
170
  testing: true,
163
171
  linting: true,
@@ -165,17 +173,15 @@ export type Timestamp = string;
165
173
  envValidation: true,
166
174
  },
167
175
  };
168
- await adapter.scaffold(frontendContext);
169
- await adapter.applyZudojsStructure(frontendContext);
170
- await adapter.generateIntegration(frontendContext);
171
- return ["apps/web/"];
172
- }
173
- async installDependencies(context) {
174
- const pmName = context.project.workspace?.packageManager ?? "pnpm";
175
- const packageManager = this.packageManagerRegistry.get(pmName);
176
- if (packageManager) {
177
- await packageManager.install(context.projectPath);
176
+ // The same pipeline the frontend-only path uses: availability check,
177
+ // scaffold, structure, integration, dependency resolution + install, and
178
+ // adapter validation. Skipping any of it here is what let fullstack
179
+ // projects ship an unvalidated, dependency-less apps/web.
180
+ const outcome = await runFrontendPipeline(adapter, frontendContext, this.packageManagerRegistry, this.dependencyResolver);
181
+ if (outcome.errors.length > 0) {
182
+ throw new Error(`Frontend generation failed: ${outcome.errors.join("; ")}`);
178
183
  }
184
+ return ["apps/web/"];
179
185
  }
180
186
  }
181
187
  //# sourceMappingURL=fullstackComposer.core.js.map
@@ -13,6 +13,17 @@ export interface InfrastructureOptions {
13
13
  export declare class InfrastructureGenerator {
14
14
  generate(options: InfrastructureOptions, basePath: string): Promise<void>;
15
15
  private getFiles;
16
+ /**
17
+ * Install and build commands for Dockerfiles.
18
+ *
19
+ * Generated projects have no lockfile yet, so never use `npm ci` or
20
+ * `--frozen-lockfile`. pnpm and yarn need `corepack enable` on the bare
21
+ * node:24-alpine image; bun is not available there so it falls back to npm.
22
+ */
23
+ private getDockerCommands;
24
+ private getDatabaseCompose;
25
+ private getDatabaseUrl;
26
+ private getDbServiceBlock;
16
27
  private getAppDockerfile;
17
28
  private getServiceDockerfile;
18
29
  private getSimpleDockerCompose;