zudojs-cli 0.1.2 → 1.1.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 (469) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +26 -3
  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/frontendAdapter.type.d.ts +6 -0
  8. package/dist/src/adapters/frontend/react.adapter.js +26 -17
  9. package/dist/src/adapters/frontend/svelte.adapter.js +1 -0
  10. package/dist/src/adapters/frontend/sveltekit.adapter.js +7 -8
  11. package/dist/src/adapters/frontend/vanilla.adapter.js +1 -1
  12. package/dist/src/adapters/frontend/vue.adapter.js +1 -0
  13. package/dist/src/adapters/package-managers/bun.adapter.js +5 -5
  14. package/dist/src/adapters/package-managers/npm.adapter.js +5 -5
  15. package/dist/src/adapters/package-managers/pnpm.adapter.js +5 -5
  16. package/dist/src/adapters/package-managers/yarn.adapter.js +5 -5
  17. package/dist/src/bin/zudojs.js +23 -11
  18. package/dist/src/cliApplication/cliApplication.builtins.d.ts +11 -2
  19. package/dist/src/cliApplication/cliApplication.builtins.js +15 -4
  20. package/dist/src/cliApplication/cliApplication.core.js +22 -7
  21. package/dist/src/cliApplication/cliApplication.logger.d.ts +28 -0
  22. package/dist/src/cliApplication/cliApplication.logger.js +68 -0
  23. package/dist/src/cliApplication/index.d.ts +1 -3
  24. package/dist/src/cliApplication/index.js +1 -3
  25. package/dist/src/cliConstant/cliConstant.value.d.ts +1 -1
  26. package/dist/src/cliConstant/cliConstant.value.js +2 -1
  27. package/dist/src/cliConstant/cliVersion.d.ts +16 -0
  28. package/dist/src/cliConstant/cliVersion.js +57 -0
  29. package/dist/src/cliParser/cliParser.core.js +7 -0
  30. package/dist/src/cliParser/cliParser.shortOption.js +1 -1
  31. package/dist/src/cliVersion/cliVersion.update.d.ts +38 -0
  32. package/dist/src/cliVersion/cliVersion.update.js +63 -0
  33. package/dist/src/cliVersion/index.d.ts +2 -1
  34. package/dist/src/cliVersion/index.js +2 -1
  35. package/dist/src/commands/add.command.d.ts +29 -0
  36. package/dist/src/commands/add.command.js +95 -107
  37. package/dist/src/commands/build.command.d.ts +8 -0
  38. package/dist/src/commands/build.command.js +24 -24
  39. package/dist/src/commands/create.command.js +176 -55
  40. package/dist/src/commands/dev.command.d.ts +30 -2
  41. package/dist/src/commands/dev.command.js +106 -150
  42. package/dist/src/commands/doctor.command.d.ts +18 -0
  43. package/dist/src/commands/doctor.command.js +160 -110
  44. package/dist/src/commands/generate.command.d.ts +2 -1
  45. package/dist/src/commands/generate.command.js +91 -41
  46. package/dist/src/commands/info.command.js +61 -30
  47. package/dist/src/constants/index.d.ts +19 -1
  48. package/dist/src/constants/index.js +32 -1
  49. package/dist/src/generators/command/command.generator.d.ts +1 -0
  50. package/dist/src/generators/command/command.generator.js +10 -4
  51. package/dist/src/generators/controller/controller.generator.d.ts +1 -0
  52. package/dist/src/generators/controller/controller.generator.js +12 -9
  53. package/dist/src/generators/dto/dto.generator.d.ts +1 -0
  54. package/dist/src/generators/dto/dto.generator.js +9 -3
  55. package/dist/src/generators/event/event.generator.d.ts +1 -0
  56. package/dist/src/generators/event/event.generator.js +10 -4
  57. package/dist/src/generators/frontend/frontendGenerator.core.d.ts +2 -0
  58. package/dist/src/generators/frontend/frontendGenerator.core.js +14 -27
  59. package/dist/src/generators/frontend/frontendPipeline.d.ts +26 -0
  60. package/dist/src/generators/frontend/frontendPipeline.js +136 -0
  61. package/dist/src/generators/fullstack/fullstackComposer.core.d.ts +3 -2
  62. package/dist/src/generators/fullstack/fullstackComposer.core.js +58 -43
  63. package/dist/src/generators/infrastructure/infrastructure.generator.d.ts +11 -0
  64. package/dist/src/generators/infrastructure/infrastructure.generator.js +101 -61
  65. package/dist/src/generators/integration/integrationGenerator.core.d.ts +6 -0
  66. package/dist/src/generators/integration/integrationGenerator.core.js +35 -6
  67. package/dist/src/generators/job/job.generator.d.ts +1 -0
  68. package/dist/src/generators/job/job.generator.js +9 -3
  69. package/dist/src/generators/middleware/middleware.generator.d.ts +1 -0
  70. package/dist/src/generators/middleware/middleware.generator.js +10 -4
  71. package/dist/src/generators/model/model.generator.d.ts +1 -0
  72. package/dist/src/generators/model/model.generator.js +9 -3
  73. package/dist/src/generators/module/module.generator.d.ts +1 -0
  74. package/dist/src/generators/module/module.generator.js +11 -24
  75. package/dist/src/generators/project/project.generator.js +2 -23
  76. package/dist/src/generators/query/query.generator.d.ts +1 -0
  77. package/dist/src/generators/query/query.generator.js +10 -4
  78. package/dist/src/generators/repository/repository.generator.d.ts +1 -0
  79. package/dist/src/generators/repository/repository.generator.js +12 -9
  80. package/dist/src/generators/route/route.generator.d.ts +1 -0
  81. package/dist/src/generators/route/route.generator.js +11 -5
  82. package/dist/src/generators/service/service.generator.d.ts +1 -0
  83. package/dist/src/generators/service/service.generator.js +12 -9
  84. package/dist/src/generators/validator/validator.generator.d.ts +1 -0
  85. package/dist/src/generators/validator/validator.generator.js +9 -3
  86. package/dist/src/index.d.ts +3 -2
  87. package/dist/src/index.js +3 -2
  88. package/dist/src/installers/dependency.installer.d.ts +9 -0
  89. package/dist/src/installers/dependency.installer.js +27 -2
  90. package/dist/src/installers/index.d.ts +1 -3
  91. package/dist/src/installers/index.js +1 -3
  92. package/dist/src/manifest/manifestManager.core.d.ts +3 -0
  93. package/dist/src/prompts/backend/index.d.ts +1 -0
  94. package/dist/src/prompts/backend/index.js +1 -0
  95. package/dist/src/prompts/backend/services.prompt.d.ts +7 -0
  96. package/dist/src/prompts/backend/services.prompt.js +39 -0
  97. package/dist/src/prompts/index.d.ts +0 -1
  98. package/dist/src/prompts/index.js +0 -1
  99. package/dist/src/resolvers/architecture.resolver.d.ts +11 -1
  100. package/dist/src/resolvers/architecture.resolver.js +12 -13
  101. package/dist/src/resolvers/configuration/configurationResolver.core.d.ts +10 -1
  102. package/dist/src/resolvers/configuration/configurationResolver.core.js +68 -29
  103. package/dist/src/resolvers/index.d.ts +1 -0
  104. package/dist/src/resolvers/index.js +1 -0
  105. package/dist/src/resolvers/layout/index.d.ts +5 -0
  106. package/dist/src/resolvers/layout/index.js +5 -0
  107. package/dist/src/resolvers/layout/projectLayout.core.d.ts +60 -0
  108. package/dist/src/resolvers/layout/projectLayout.core.js +236 -0
  109. package/dist/src/resolvers/project.resolver.d.ts +5 -0
  110. package/dist/src/resolvers/project.resolver.js +10 -6
  111. package/dist/src/rollback/rollbackManager.core.js +0 -1
  112. package/dist/src/runners/process/processRunner.core.d.ts +4 -0
  113. package/dist/src/runners/process/processRunner.core.js +17 -3
  114. package/dist/src/scaffolders/framework.scaffolder.js +9 -6
  115. package/dist/src/scaffolders/scaffolder.helper.js +7 -2
  116. package/dist/src/templates/microservice/index.d.ts +1 -1
  117. package/dist/src/templates/microservice/index.js +1 -1
  118. package/dist/src/templates/microservice/microservice.template.d.ts +14 -0
  119. package/dist/src/templates/microservice/microservice.template.js +140 -162
  120. package/dist/src/templates/modular-monolith/modularMonolith.template.d.ts +0 -1
  121. package/dist/src/templates/modular-monolith/modularMonolith.template.js +43 -77
  122. package/dist/src/templates/monolith/monolith.template.d.ts +1 -1
  123. package/dist/src/templates/monolith/monolith.template.js +46 -69
  124. package/dist/src/templates/shared/appRuntime.template.d.ts +60 -0
  125. package/dist/src/templates/shared/appRuntime.template.js +189 -0
  126. package/dist/src/templates/shared/index.d.ts +6 -0
  127. package/dist/src/templates/shared/index.js +6 -0
  128. package/dist/src/templates/shared/pnpm.template.d.ts +27 -0
  129. package/dist/src/templates/shared/pnpm.template.js +57 -0
  130. package/dist/src/utils/index.d.ts +3 -3
  131. package/dist/src/utils/index.js +3 -3
  132. package/dist/src/utils/utils.detect.d.ts +9 -0
  133. package/dist/src/utils/utils.detect.js +11 -11
  134. package/dist/src/utils/utils.exec.d.ts +35 -1
  135. package/dist/src/utils/utils.exec.js +99 -4
  136. package/dist/src/utils/utils.fileSystem.d.ts +6 -0
  137. package/dist/src/utils/utils.fileSystem.js +19 -0
  138. package/dist/src/utils/utils.name.d.ts +26 -0
  139. package/dist/src/utils/utils.name.js +51 -1
  140. package/package.json +32 -23
  141. package/dist/.tsbuildinfo +0 -1
  142. package/dist/src/adapters/databases/index.d.ts.map +0 -1
  143. package/dist/src/adapters/databases/index.js.map +0 -1
  144. package/dist/src/adapters/databases/mysql.adapter.d.ts.map +0 -1
  145. package/dist/src/adapters/databases/mysql.adapter.js.map +0 -1
  146. package/dist/src/adapters/databases/postgres.adapter.d.ts.map +0 -1
  147. package/dist/src/adapters/databases/postgres.adapter.js.map +0 -1
  148. package/dist/src/adapters/databases/sqlite.adapter.d.ts.map +0 -1
  149. package/dist/src/adapters/databases/sqlite.adapter.js.map +0 -1
  150. package/dist/src/adapters/frontend/angular.adapter.d.ts.map +0 -1
  151. package/dist/src/adapters/frontend/angular.adapter.js.map +0 -1
  152. package/dist/src/adapters/frontend/astro.adapter.d.ts.map +0 -1
  153. package/dist/src/adapters/frontend/astro.adapter.js.map +0 -1
  154. package/dist/src/adapters/frontend/flutter.adapter.d.ts.map +0 -1
  155. package/dist/src/adapters/frontend/flutter.adapter.js.map +0 -1
  156. package/dist/src/adapters/frontend/frontendAdapter.type.d.ts.map +0 -1
  157. package/dist/src/adapters/frontend/frontendAdapter.type.js.map +0 -1
  158. package/dist/src/adapters/frontend/index.d.ts.map +0 -1
  159. package/dist/src/adapters/frontend/index.js.map +0 -1
  160. package/dist/src/adapters/frontend/next.adapter.d.ts.map +0 -1
  161. package/dist/src/adapters/frontend/next.adapter.js.map +0 -1
  162. package/dist/src/adapters/frontend/nuxt.adapter.d.ts.map +0 -1
  163. package/dist/src/adapters/frontend/nuxt.adapter.js.map +0 -1
  164. package/dist/src/adapters/frontend/react-native.adapter.d.ts.map +0 -1
  165. package/dist/src/adapters/frontend/react-native.adapter.js.map +0 -1
  166. package/dist/src/adapters/frontend/react.adapter.d.ts.map +0 -1
  167. package/dist/src/adapters/frontend/react.adapter.js.map +0 -1
  168. package/dist/src/adapters/frontend/svelte.adapter.d.ts.map +0 -1
  169. package/dist/src/adapters/frontend/svelte.adapter.js.map +0 -1
  170. package/dist/src/adapters/frontend/sveltekit.adapter.d.ts.map +0 -1
  171. package/dist/src/adapters/frontend/sveltekit.adapter.js.map +0 -1
  172. package/dist/src/adapters/frontend/vanilla.adapter.d.ts.map +0 -1
  173. package/dist/src/adapters/frontend/vanilla.adapter.js.map +0 -1
  174. package/dist/src/adapters/frontend/vue.adapter.d.ts.map +0 -1
  175. package/dist/src/adapters/frontend/vue.adapter.js.map +0 -1
  176. package/dist/src/adapters/package-managers/bun.adapter.d.ts.map +0 -1
  177. package/dist/src/adapters/package-managers/bun.adapter.js.map +0 -1
  178. package/dist/src/adapters/package-managers/index.d.ts.map +0 -1
  179. package/dist/src/adapters/package-managers/index.js.map +0 -1
  180. package/dist/src/adapters/package-managers/npm.adapter.d.ts.map +0 -1
  181. package/dist/src/adapters/package-managers/npm.adapter.js.map +0 -1
  182. package/dist/src/adapters/package-managers/packageManager.type.d.ts.map +0 -1
  183. package/dist/src/adapters/package-managers/packageManager.type.js.map +0 -1
  184. package/dist/src/adapters/package-managers/pnpm.adapter.d.ts.map +0 -1
  185. package/dist/src/adapters/package-managers/pnpm.adapter.js.map +0 -1
  186. package/dist/src/adapters/package-managers/yarn.adapter.d.ts.map +0 -1
  187. package/dist/src/adapters/package-managers/yarn.adapter.js.map +0 -1
  188. package/dist/src/bin/zudojs.d.ts.map +0 -1
  189. package/dist/src/bin/zudojs.js.map +0 -1
  190. package/dist/src/cliApplication/cliApplication.builtins.d.ts.map +0 -1
  191. package/dist/src/cliApplication/cliApplication.builtins.js.map +0 -1
  192. package/dist/src/cliApplication/cliApplication.core.d.ts.map +0 -1
  193. package/dist/src/cliApplication/cliApplication.core.js.map +0 -1
  194. package/dist/src/cliApplication/cliApplication.writer.d.ts.map +0 -1
  195. package/dist/src/cliApplication/cliApplication.writer.js.map +0 -1
  196. package/dist/src/cliApplication/index.d.ts.map +0 -1
  197. package/dist/src/cliApplication/index.js.map +0 -1
  198. package/dist/src/cliCommand/cliCommand.builder.d.ts.map +0 -1
  199. package/dist/src/cliCommand/cliCommand.builder.js.map +0 -1
  200. package/dist/src/cliCommand/cliCommand.factory.d.ts.map +0 -1
  201. package/dist/src/cliCommand/cliCommand.factory.js.map +0 -1
  202. package/dist/src/cliCommand/cliCommand.registry.d.ts.map +0 -1
  203. package/dist/src/cliCommand/cliCommand.registry.js.map +0 -1
  204. package/dist/src/cliCommand/cliCommand.validator.d.ts.map +0 -1
  205. package/dist/src/cliCommand/cliCommand.validator.js.map +0 -1
  206. package/dist/src/cliCommand/index.d.ts.map +0 -1
  207. package/dist/src/cliCommand/index.js.map +0 -1
  208. package/dist/src/cliConstant/cliConstant.value.d.ts.map +0 -1
  209. package/dist/src/cliConstant/cliConstant.value.js.map +0 -1
  210. package/dist/src/cliConstant/index.d.ts.map +0 -1
  211. package/dist/src/cliConstant/index.js.map +0 -1
  212. package/dist/src/cliError/cliError.argument.d.ts.map +0 -1
  213. package/dist/src/cliError/cliError.argument.js.map +0 -1
  214. package/dist/src/cliError/cliError.base.d.ts.map +0 -1
  215. package/dist/src/cliError/cliError.base.js.map +0 -1
  216. package/dist/src/cliError/cliError.command.d.ts.map +0 -1
  217. package/dist/src/cliError/cliError.command.js.map +0 -1
  218. package/dist/src/cliError/cliError.execution.d.ts.map +0 -1
  219. package/dist/src/cliError/cliError.execution.js.map +0 -1
  220. package/dist/src/cliError/cliError.option.d.ts.map +0 -1
  221. package/dist/src/cliError/cliError.option.js.map +0 -1
  222. package/dist/src/cliError/index.d.ts.map +0 -1
  223. package/dist/src/cliError/index.js.map +0 -1
  224. package/dist/src/cliParser/cliParser.core.d.ts.map +0 -1
  225. package/dist/src/cliParser/cliParser.core.js.map +0 -1
  226. package/dist/src/cliParser/cliParser.helper.d.ts.map +0 -1
  227. package/dist/src/cliParser/cliParser.helper.js.map +0 -1
  228. package/dist/src/cliParser/cliParser.longOption.d.ts.map +0 -1
  229. package/dist/src/cliParser/cliParser.longOption.js.map +0 -1
  230. package/dist/src/cliParser/cliParser.shortOption.d.ts.map +0 -1
  231. package/dist/src/cliParser/cliParser.shortOption.js.map +0 -1
  232. package/dist/src/cliParser/index.d.ts.map +0 -1
  233. package/dist/src/cliParser/index.js.map +0 -1
  234. package/dist/src/cliType/cliType.type.d.ts.map +0 -1
  235. package/dist/src/cliType/cliType.type.js.map +0 -1
  236. package/dist/src/cliType/index.d.ts.map +0 -1
  237. package/dist/src/cliType/index.js.map +0 -1
  238. package/dist/src/cliVersion/cliVersion.core.d.ts.map +0 -1
  239. package/dist/src/cliVersion/cliVersion.core.js.map +0 -1
  240. package/dist/src/cliVersion/index.d.ts.map +0 -1
  241. package/dist/src/cliVersion/index.js.map +0 -1
  242. package/dist/src/commands/add.command.d.ts.map +0 -1
  243. package/dist/src/commands/add.command.js.map +0 -1
  244. package/dist/src/commands/build.command.d.ts.map +0 -1
  245. package/dist/src/commands/build.command.js.map +0 -1
  246. package/dist/src/commands/create.command.d.ts.map +0 -1
  247. package/dist/src/commands/create.command.js.map +0 -1
  248. package/dist/src/commands/dev.command.d.ts.map +0 -1
  249. package/dist/src/commands/dev.command.js.map +0 -1
  250. package/dist/src/commands/doctor.command.d.ts.map +0 -1
  251. package/dist/src/commands/doctor.command.js.map +0 -1
  252. package/dist/src/commands/generate.command.d.ts.map +0 -1
  253. package/dist/src/commands/generate.command.js.map +0 -1
  254. package/dist/src/commands/index.d.ts.map +0 -1
  255. package/dist/src/commands/index.js.map +0 -1
  256. package/dist/src/commands/info.command.d.ts.map +0 -1
  257. package/dist/src/commands/info.command.js.map +0 -1
  258. package/dist/src/constants/index.d.ts.map +0 -1
  259. package/dist/src/constants/index.js.map +0 -1
  260. package/dist/src/errors/index.d.ts.map +0 -1
  261. package/dist/src/errors/index.js.map +0 -1
  262. package/dist/src/generators/backend/backend.generator.d.ts.map +0 -1
  263. package/dist/src/generators/backend/backend.generator.js.map +0 -1
  264. package/dist/src/generators/backend/index.d.ts.map +0 -1
  265. package/dist/src/generators/backend/index.js.map +0 -1
  266. package/dist/src/generators/command/command.generator.d.ts.map +0 -1
  267. package/dist/src/generators/command/command.generator.js.map +0 -1
  268. package/dist/src/generators/controller/controller.generator.d.ts.map +0 -1
  269. package/dist/src/generators/controller/controller.generator.js.map +0 -1
  270. package/dist/src/generators/dto/dto.generator.d.ts.map +0 -1
  271. package/dist/src/generators/dto/dto.generator.js.map +0 -1
  272. package/dist/src/generators/dto/index.d.ts.map +0 -1
  273. package/dist/src/generators/dto/index.js.map +0 -1
  274. package/dist/src/generators/event/event.generator.d.ts.map +0 -1
  275. package/dist/src/generators/event/event.generator.js.map +0 -1
  276. package/dist/src/generators/event/index.d.ts.map +0 -1
  277. package/dist/src/generators/event/index.js.map +0 -1
  278. package/dist/src/generators/frontend/frontendGenerator.core.d.ts.map +0 -1
  279. package/dist/src/generators/frontend/frontendGenerator.core.js.map +0 -1
  280. package/dist/src/generators/frontend/index.d.ts.map +0 -1
  281. package/dist/src/generators/frontend/index.js.map +0 -1
  282. package/dist/src/generators/fullstack/fullstackComposer.core.d.ts.map +0 -1
  283. package/dist/src/generators/fullstack/fullstackComposer.core.js.map +0 -1
  284. package/dist/src/generators/fullstack/index.d.ts.map +0 -1
  285. package/dist/src/generators/fullstack/index.js.map +0 -1
  286. package/dist/src/generators/index.d.ts.map +0 -1
  287. package/dist/src/generators/index.js.map +0 -1
  288. package/dist/src/generators/infrastructure/index.d.ts.map +0 -1
  289. package/dist/src/generators/infrastructure/index.js.map +0 -1
  290. package/dist/src/generators/infrastructure/infrastructure.generator.d.ts.map +0 -1
  291. package/dist/src/generators/infrastructure/infrastructure.generator.js.map +0 -1
  292. package/dist/src/generators/integration/index.d.ts.map +0 -1
  293. package/dist/src/generators/integration/index.js.map +0 -1
  294. package/dist/src/generators/integration/integrationGenerator.core.d.ts.map +0 -1
  295. package/dist/src/generators/integration/integrationGenerator.core.js.map +0 -1
  296. package/dist/src/generators/job/index.d.ts.map +0 -1
  297. package/dist/src/generators/job/index.js.map +0 -1
  298. package/dist/src/generators/job/job.generator.d.ts.map +0 -1
  299. package/dist/src/generators/job/job.generator.js.map +0 -1
  300. package/dist/src/generators/middleware/index.d.ts.map +0 -1
  301. package/dist/src/generators/middleware/index.js.map +0 -1
  302. package/dist/src/generators/middleware/middleware.generator.d.ts.map +0 -1
  303. package/dist/src/generators/middleware/middleware.generator.js.map +0 -1
  304. package/dist/src/generators/model/index.d.ts.map +0 -1
  305. package/dist/src/generators/model/index.js.map +0 -1
  306. package/dist/src/generators/model/model.generator.d.ts.map +0 -1
  307. package/dist/src/generators/model/model.generator.js.map +0 -1
  308. package/dist/src/generators/module/module.generator.d.ts.map +0 -1
  309. package/dist/src/generators/module/module.generator.js.map +0 -1
  310. package/dist/src/generators/project/project.generator.d.ts.map +0 -1
  311. package/dist/src/generators/project/project.generator.js.map +0 -1
  312. package/dist/src/generators/query/query.generator.d.ts.map +0 -1
  313. package/dist/src/generators/query/query.generator.js.map +0 -1
  314. package/dist/src/generators/repository/repository.generator.d.ts.map +0 -1
  315. package/dist/src/generators/repository/repository.generator.js.map +0 -1
  316. package/dist/src/generators/route/index.d.ts.map +0 -1
  317. package/dist/src/generators/route/index.js.map +0 -1
  318. package/dist/src/generators/route/route.generator.d.ts.map +0 -1
  319. package/dist/src/generators/route/route.generator.js.map +0 -1
  320. package/dist/src/generators/service/service.generator.d.ts.map +0 -1
  321. package/dist/src/generators/service/service.generator.js.map +0 -1
  322. package/dist/src/generators/validator/index.d.ts.map +0 -1
  323. package/dist/src/generators/validator/index.js.map +0 -1
  324. package/dist/src/generators/validator/validator.generator.d.ts.map +0 -1
  325. package/dist/src/generators/validator/validator.generator.js.map +0 -1
  326. package/dist/src/index.d.ts.map +0 -1
  327. package/dist/src/index.js.map +0 -1
  328. package/dist/src/installers/dependency.installer.d.ts.map +0 -1
  329. package/dist/src/installers/dependency.installer.js.map +0 -1
  330. package/dist/src/installers/index.d.ts.map +0 -1
  331. package/dist/src/installers/index.js.map +0 -1
  332. package/dist/src/manifest/index.d.ts.map +0 -1
  333. package/dist/src/manifest/index.js.map +0 -1
  334. package/dist/src/manifest/manifestManager.core.d.ts.map +0 -1
  335. package/dist/src/manifest/manifestManager.core.js.map +0 -1
  336. package/dist/src/prompts/backend/api-style.prompt.d.ts.map +0 -1
  337. package/dist/src/prompts/backend/api-style.prompt.js.map +0 -1
  338. package/dist/src/prompts/backend/backend-architecture.prompt.d.ts.map +0 -1
  339. package/dist/src/prompts/backend/backend-architecture.prompt.js.map +0 -1
  340. package/dist/src/prompts/backend/database.prompt.d.ts.map +0 -1
  341. package/dist/src/prompts/backend/database.prompt.js.map +0 -1
  342. package/dist/src/prompts/backend/index.d.ts.map +0 -1
  343. package/dist/src/prompts/backend/index.js.map +0 -1
  344. package/dist/src/prompts/capabilities/capabilities.prompt.d.ts.map +0 -1
  345. package/dist/src/prompts/capabilities/capabilities.prompt.js.map +0 -1
  346. package/dist/src/prompts/capabilities/index.d.ts.map +0 -1
  347. package/dist/src/prompts/capabilities/index.js.map +0 -1
  348. package/dist/src/prompts/frontend/framework.prompt.d.ts.map +0 -1
  349. package/dist/src/prompts/frontend/framework.prompt.js.map +0 -1
  350. package/dist/src/prompts/frontend/frontend-architecture.prompt.d.ts.map +0 -1
  351. package/dist/src/prompts/frontend/frontend-architecture.prompt.js.map +0 -1
  352. package/dist/src/prompts/frontend/index.d.ts.map +0 -1
  353. package/dist/src/prompts/frontend/index.js.map +0 -1
  354. package/dist/src/prompts/index.d.ts.map +0 -1
  355. package/dist/src/prompts/index.js.map +0 -1
  356. package/dist/src/prompts/project/confirmation.prompt.d.ts.map +0 -1
  357. package/dist/src/prompts/project/confirmation.prompt.js.map +0 -1
  358. package/dist/src/prompts/project/index.d.ts.map +0 -1
  359. package/dist/src/prompts/project/index.js.map +0 -1
  360. package/dist/src/prompts/project/project-name.prompt.d.ts.map +0 -1
  361. package/dist/src/prompts/project/project-name.prompt.js.map +0 -1
  362. package/dist/src/prompts/project/project-type.prompt.d.ts.map +0 -1
  363. package/dist/src/prompts/project/project-type.prompt.js.map +0 -1
  364. package/dist/src/prompts/prompts.createProject.d.ts +0 -33
  365. package/dist/src/prompts/prompts.createProject.d.ts.map +0 -1
  366. package/dist/src/prompts/prompts.createProject.js +0 -150
  367. package/dist/src/prompts/prompts.createProject.js.map +0 -1
  368. package/dist/src/prompts/workspace/index.d.ts.map +0 -1
  369. package/dist/src/prompts/workspace/index.js.map +0 -1
  370. package/dist/src/prompts/workspace/package-manager.prompt.d.ts.map +0 -1
  371. package/dist/src/prompts/workspace/package-manager.prompt.js.map +0 -1
  372. package/dist/src/registries/adapter/frontendAdapterRegistry.core.d.ts.map +0 -1
  373. package/dist/src/registries/adapter/frontendAdapterRegistry.core.js.map +0 -1
  374. package/dist/src/registries/adapter/packageManagerRegistry.core.d.ts.map +0 -1
  375. package/dist/src/registries/adapter/packageManagerRegistry.core.js.map +0 -1
  376. package/dist/src/registries/dependency/dependencyRegistry.core.d.ts.map +0 -1
  377. package/dist/src/registries/dependency/dependencyRegistry.core.js.map +0 -1
  378. package/dist/src/registries/dependency/index.d.ts.map +0 -1
  379. package/dist/src/registries/dependency/index.js.map +0 -1
  380. package/dist/src/registries/generator/generatorRegistry.core.d.ts.map +0 -1
  381. package/dist/src/registries/generator/generatorRegistry.core.js.map +0 -1
  382. package/dist/src/registries/generator/index.d.ts.map +0 -1
  383. package/dist/src/registries/generator/index.js.map +0 -1
  384. package/dist/src/registries/index.d.ts.map +0 -1
  385. package/dist/src/registries/index.js.map +0 -1
  386. package/dist/src/resolvers/architecture.resolver.d.ts.map +0 -1
  387. package/dist/src/resolvers/architecture.resolver.js.map +0 -1
  388. package/dist/src/resolvers/capability/capabilityResolver.core.d.ts.map +0 -1
  389. package/dist/src/resolvers/capability/capabilityResolver.core.js.map +0 -1
  390. package/dist/src/resolvers/capability/index.d.ts.map +0 -1
  391. package/dist/src/resolvers/capability/index.js.map +0 -1
  392. package/dist/src/resolvers/configuration/configurationResolver.core.d.ts.map +0 -1
  393. package/dist/src/resolvers/configuration/configurationResolver.core.js.map +0 -1
  394. package/dist/src/resolvers/configuration/index.d.ts.map +0 -1
  395. package/dist/src/resolvers/configuration/index.js.map +0 -1
  396. package/dist/src/resolvers/dependency/dependencyResolver.core.d.ts.map +0 -1
  397. package/dist/src/resolvers/dependency/dependencyResolver.core.js.map +0 -1
  398. package/dist/src/resolvers/dependency/index.d.ts.map +0 -1
  399. package/dist/src/resolvers/dependency/index.js.map +0 -1
  400. package/dist/src/resolvers/index.d.ts.map +0 -1
  401. package/dist/src/resolvers/index.js.map +0 -1
  402. package/dist/src/resolvers/project.resolver.d.ts.map +0 -1
  403. package/dist/src/resolvers/project.resolver.js.map +0 -1
  404. package/dist/src/rollback/index.d.ts.map +0 -1
  405. package/dist/src/rollback/index.js.map +0 -1
  406. package/dist/src/rollback/rollbackManager.core.d.ts.map +0 -1
  407. package/dist/src/rollback/rollbackManager.core.js.map +0 -1
  408. package/dist/src/runners/package-manager/index.d.ts.map +0 -1
  409. package/dist/src/runners/package-manager/index.js.map +0 -1
  410. package/dist/src/runners/package-manager/packageManagerRunner.core.d.ts.map +0 -1
  411. package/dist/src/runners/package-manager/packageManagerRunner.core.js.map +0 -1
  412. package/dist/src/runners/process/index.d.ts.map +0 -1
  413. package/dist/src/runners/process/index.js.map +0 -1
  414. package/dist/src/runners/process/processRunner.core.d.ts.map +0 -1
  415. package/dist/src/runners/process/processRunner.core.js.map +0 -1
  416. package/dist/src/runners/task/index.d.ts.map +0 -1
  417. package/dist/src/runners/task/index.js.map +0 -1
  418. package/dist/src/runners/task/taskRunner.core.d.ts.map +0 -1
  419. package/dist/src/runners/task/taskRunner.core.js.map +0 -1
  420. package/dist/src/scaffolders/framework.scaffolder.d.ts.map +0 -1
  421. package/dist/src/scaffolders/framework.scaffolder.js.map +0 -1
  422. package/dist/src/scaffolders/index.d.ts.map +0 -1
  423. package/dist/src/scaffolders/index.js.map +0 -1
  424. package/dist/src/scaffolders/scaffolder.helper.d.ts.map +0 -1
  425. package/dist/src/scaffolders/scaffolder.helper.js.map +0 -1
  426. package/dist/src/scripts/postinstall.cjs +0 -56
  427. package/dist/src/templates/microservice/index.d.ts.map +0 -1
  428. package/dist/src/templates/microservice/index.js.map +0 -1
  429. package/dist/src/templates/microservice/microservice.template.d.ts.map +0 -1
  430. package/dist/src/templates/microservice/microservice.template.js.map +0 -1
  431. package/dist/src/templates/modular-monolith/index.d.ts.map +0 -1
  432. package/dist/src/templates/modular-monolith/index.js.map +0 -1
  433. package/dist/src/templates/modular-monolith/modularMonolith.template.d.ts.map +0 -1
  434. package/dist/src/templates/modular-monolith/modularMonolith.template.js.map +0 -1
  435. package/dist/src/templates/monolith/index.d.ts.map +0 -1
  436. package/dist/src/templates/monolith/index.js.map +0 -1
  437. package/dist/src/templates/monolith/monolith.template.d.ts.map +0 -1
  438. package/dist/src/templates/monolith/monolith.template.js.map +0 -1
  439. package/dist/src/types/index.d.ts.map +0 -1
  440. package/dist/src/types/index.js.map +0 -1
  441. package/dist/src/types/projectConfiguration.type.d.ts.map +0 -1
  442. package/dist/src/types/projectConfiguration.type.js.map +0 -1
  443. package/dist/src/types/scaffold.type.d.ts.map +0 -1
  444. package/dist/src/types/scaffold.type.js.map +0 -1
  445. package/dist/src/utils/index.d.ts.map +0 -1
  446. package/dist/src/utils/index.js.map +0 -1
  447. package/dist/src/utils/utils.detect.d.ts.map +0 -1
  448. package/dist/src/utils/utils.detect.js.map +0 -1
  449. package/dist/src/utils/utils.exec.d.ts.map +0 -1
  450. package/dist/src/utils/utils.exec.js.map +0 -1
  451. package/dist/src/utils/utils.fileSystem.d.ts.map +0 -1
  452. package/dist/src/utils/utils.fileSystem.js.map +0 -1
  453. package/dist/src/utils/utils.name.d.ts.map +0 -1
  454. package/dist/src/utils/utils.name.js.map +0 -1
  455. package/dist/src/validators/compatibility/compatibilityValidator.core.d.ts.map +0 -1
  456. package/dist/src/validators/compatibility/compatibilityValidator.core.js.map +0 -1
  457. package/dist/src/validators/compatibility/index.d.ts.map +0 -1
  458. package/dist/src/validators/compatibility/index.js.map +0 -1
  459. package/dist/src/validators/environment/environmentValidator.core.d.ts.map +0 -1
  460. package/dist/src/validators/environment/environmentValidator.core.js.map +0 -1
  461. package/dist/src/validators/environment/index.d.ts.map +0 -1
  462. package/dist/src/validators/environment/index.js.map +0 -1
  463. package/dist/src/validators/index.d.ts.map +0 -1
  464. package/dist/src/validators/index.js.map +0 -1
  465. package/dist/src/validators/project/index.d.ts.map +0 -1
  466. package/dist/src/validators/project/index.js.map +0 -1
  467. package/dist/src/validators/project/projectValidator.core.d.ts.map +0 -1
  468. package/dist/src/validators/project/projectValidator.core.js.map +0 -1
  469. package/src/scripts/postinstall.cjs +0 -56
@@ -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,136 @@
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 { existsSync, readFileSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { writeFileTree } from "../../utils/utils.fileSystem.js";
16
+ /**
17
+ * Rejects package names a package manager would read as a flag.
18
+ *
19
+ * Adapter dependency lists are static today, but they are part of the public
20
+ * `FrontendAdapter` contract and a third-party adapter could return
21
+ * `--registry=...`. Package names go into an argv array (never a shell), so
22
+ * this closes argument injection rather than command injection.
23
+ */
24
+ function assertSafePackageNames(names) {
25
+ for (const name of names) {
26
+ if (name.startsWith("-") || name.trim() === "" || /\s/.test(name)) {
27
+ throw new Error(`Refusing to install unsafe package name: "${name}"`);
28
+ }
29
+ }
30
+ }
31
+ /**
32
+ * Runs the full adapter sequence: availability check, scaffold, structure,
33
+ * integration, dependency resolution, dependency installation, validation.
34
+ */
35
+ export async function runFrontendPipeline(adapter, context, packageManagerRegistry, dependencyResolver) {
36
+ const files = [];
37
+ const errors = [];
38
+ // 0. Fail fast with a readable message when the framework's own toolchain
39
+ // is missing. Adapters such as Flutter shell out with no fallback, so
40
+ // without this the user sees a bare ENOENT after the project directory
41
+ // has already been created and rolled back.
42
+ const available = await adapter.isAvailable();
43
+ if (!available) {
44
+ return {
45
+ files,
46
+ errors: [
47
+ `The toolchain required by the "${adapter.name}" frontend is not available on this machine. Install it and re-run, or choose another frontend.`,
48
+ ],
49
+ };
50
+ }
51
+ // 1. Scaffold using the official tool (adapters fall back to built-in
52
+ // templates where one exists).
53
+ await adapter.scaffold(context);
54
+ files.push("scaffold");
55
+ // 2. Apply the Zudojs structure over the scaffolded project.
56
+ await adapter.applyZudojsStructure(context);
57
+ files.push("structure");
58
+ // 3. Generate the adapter's integration files (API client, env helpers).
59
+ await adapter.generateIntegration(context);
60
+ files.push("integration");
61
+ // 4. Resolve dependencies and stop on conflicts.
62
+ const resolution = dependencyResolver.resolve(adapter.getDependencies(context));
63
+ if (resolution.conflicts.length > 0) {
64
+ for (const conflict of resolution.conflicts) {
65
+ errors.push(`Conflict: ${conflict.reason}`);
66
+ }
67
+ return { files, errors };
68
+ }
69
+ // 5. Install BOTH runtime and dev dependencies. Only devDependencies used
70
+ // to be installed, so every runtime package an adapter declared was
71
+ // resolved and then dropped on the floor. With `--no-install` the
72
+ // dependencies are written to package.json for a later install.
73
+ const packageManager = packageManagerRegistry.get(context.packageManager);
74
+ if (context.skipInstall === true) {
75
+ await recordDependencies(context.projectPath, resolution.dependencies, resolution.devDependencies);
76
+ files.push("dependencies");
77
+ }
78
+ else if (packageManager) {
79
+ const deps = resolution.dependencies.map((d) => d.name);
80
+ const devDeps = resolution.devDependencies.map((d) => d.name);
81
+ assertSafePackageNames(deps);
82
+ assertSafePackageNames(devDeps);
83
+ if (deps.length > 0) {
84
+ await packageManager.add(context.projectPath, deps);
85
+ }
86
+ if (devDeps.length > 0) {
87
+ await packageManager.addDev(context.projectPath, devDeps);
88
+ }
89
+ files.push("dependencies");
90
+ }
91
+ else {
92
+ errors.push(`Unknown package manager: ${context.packageManager}`);
93
+ }
94
+ // 6. Validate the generated project and surface the adapter's own findings.
95
+ const validation = await adapter.validate(context);
96
+ if (!validation.valid) {
97
+ errors.push(...validation.errors);
98
+ }
99
+ return { files, errors };
100
+ }
101
+ /**
102
+ * Adds the resolved dependencies to the project's package.json without
103
+ * running a package manager. Existing entries win: the adapter's own
104
+ * template may already pin a version.
105
+ */
106
+ async function recordDependencies(projectPath, dependencies, devDependencies) {
107
+ const pkgPath = join(projectPath, "package.json");
108
+ let pkg = {};
109
+ if (existsSync(pkgPath)) {
110
+ try {
111
+ pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
112
+ }
113
+ catch {
114
+ pkg = {};
115
+ }
116
+ }
117
+ const merge = (target, entries) => {
118
+ const merged = { ...(target ?? {}) };
119
+ for (const entry of entries) {
120
+ if (!(entry.name in merged)) {
121
+ merged[entry.name] = entry.version || "latest";
122
+ }
123
+ }
124
+ return merged;
125
+ };
126
+ if (dependencies.length > 0) {
127
+ pkg.dependencies = merge(pkg.dependencies, dependencies);
128
+ }
129
+ if (devDependencies.length > 0) {
130
+ pkg.devDependencies = merge(pkg.devDependencies, devDependencies);
131
+ }
132
+ await writeFileTree(projectPath, {
133
+ "package.json": JSON.stringify(pkg, null, 2) + "\n",
134
+ });
135
+ }
136
+ //# sourceMappingURL=frontendPipeline.js.map
@@ -12,6 +12,8 @@ import type { ProjectConfiguration } from "../../types/projectConfiguration.type
12
12
  export interface FullstackGenerationContext {
13
13
  readonly project: ProjectConfiguration;
14
14
  readonly projectPath: string;
15
+ /** `false` records frontend dependencies instead of installing them. */
16
+ readonly installDeps?: boolean;
15
17
  }
16
18
  /**
17
19
  * Fullstack generation result.
@@ -28,15 +30,14 @@ export declare class FullstackComposer {
28
30
  private readonly frontendRegistry;
29
31
  private readonly packageManagerRegistry;
30
32
  private readonly dependencyResolver;
31
- private readonly integrationGenerator;
32
33
  constructor();
33
34
  /**
34
35
  * Generates a fullstack project.
35
36
  */
36
37
  generate(context: FullstackGenerationContext): Promise<FullstackGenerationResult>;
38
+ private getPackageManager;
37
39
  private createWorkspace;
38
40
  private generateSharedPackages;
39
41
  private generateFrontend;
40
- private installDependencies;
41
42
  }
42
43
  //# sourceMappingURL=fullstackComposer.core.d.ts.map
@@ -5,12 +5,14 @@
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";
15
+ import { renderPnpmWorkspaceFile } from "../../templates/shared/pnpm.template.js";
14
16
  /**
15
17
  * Composes fullstack projects by orchestrating multiple generators.
16
18
  */
@@ -18,12 +20,10 @@ export class FullstackComposer {
18
20
  frontendRegistry;
19
21
  packageManagerRegistry;
20
22
  dependencyResolver;
21
- integrationGenerator;
22
23
  constructor() {
23
24
  this.frontendRegistry = new FrontendAdapterRegistry();
24
25
  this.packageManagerRegistry = new PackageManagerRegistry();
25
26
  this.dependencyResolver = new DependencyResolver();
26
- this.integrationGenerator = new IntegrationGenerator();
27
27
  }
28
28
  /**
29
29
  * Generates a fullstack project.
@@ -34,7 +34,10 @@ export class FullstackComposer {
34
34
  try {
35
35
  // 1. Create workspace structure
36
36
  await this.createWorkspace(context);
37
- files.push("package.json", "pnpm-workspace.yaml");
37
+ files.push("package.json");
38
+ if (this.getPackageManager(context) === "pnpm") {
39
+ files.push("pnpm-workspace.yaml");
40
+ }
38
41
  // 2. Generate shared packages
39
42
  await this.generateSharedPackages(context);
40
43
  files.push("packages/contracts/", "packages/shared-types/");
@@ -43,19 +46,8 @@ export class FullstackComposer {
43
46
  const frontendFiles = await this.generateFrontend(context);
44
47
  files.push(...frontendFiles);
45
48
  }
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);
49
+ // Note: integration files and dependency installation are orchestrated
50
+ // by the create command to avoid running them twice.
59
51
  }
60
52
  catch (error) {
61
53
  errors.push(error instanceof Error ? error.message : String(error));
@@ -66,29 +58,50 @@ export class FullstackComposer {
66
58
  errors,
67
59
  };
68
60
  }
61
+ getPackageManager(context) {
62
+ return context.project.workspace?.packageManager ?? "pnpm";
63
+ }
69
64
  async createWorkspace(context) {
65
+ const packageManager = this.getPackageManager(context);
66
+ const workspaceGlobs = ["apps/*", "packages/*"];
67
+ const scriptFor = (script) => {
68
+ switch (packageManager) {
69
+ case "npm":
70
+ return `npm run ${script} --workspaces --if-present`;
71
+ case "yarn":
72
+ return `yarn workspaces run ${script}`;
73
+ case "bun":
74
+ return `bun run --filter '*' ${script}`;
75
+ default:
76
+ return `pnpm -r --parallel run ${script}`;
77
+ }
78
+ };
70
79
  const rootPackageJson = {
71
80
  name: context.project.name,
72
81
  private: true,
82
+ ...(packageManager === "pnpm" ? {} : { workspaces: workspaceGlobs }),
73
83
  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",
84
+ dev: scriptFor("dev"),
85
+ build: scriptFor("build"),
86
+ test: scriptFor("test"),
87
+ lint: scriptFor("lint"),
88
+ typecheck: scriptFor("typecheck"),
79
89
  },
80
90
  devDependencies: {
81
91
  typescript: "^5.0.0",
82
92
  },
83
93
  };
84
- const workspaceYaml = `packages:
85
- - "apps/*"
86
- - "packages/*"
87
- `;
88
- await writeFileTree(context.projectPath, {
89
- "package.json": JSON.stringify(rootPackageJson, null, 2),
90
- "pnpm-workspace.yaml": workspaceYaml,
91
- });
94
+ // The project's type, architecture and frontend are recorded in
95
+ // .zudojs/manifest.json by the create command; no zudojs.config.ts is
96
+ // written. The name reaches package.json through JSON.stringify, so a
97
+ // quote or newline in it stays data.
98
+ const files = {
99
+ "package.json": JSON.stringify(rootPackageJson, null, 2) + "\n",
100
+ };
101
+ if (packageManager === "pnpm") {
102
+ files["pnpm-workspace.yaml"] = renderPnpmWorkspaceFile(workspaceGlobs);
103
+ }
104
+ await writeFileTree(context.projectPath, files);
92
105
  }
93
106
  async generateSharedPackages(context) {
94
107
  const contractsIndex = `/**
@@ -127,32 +140,34 @@ export type Timestamp = string;
127
140
  if (!adapter) {
128
141
  throw new Error(`Unknown frontend framework: ${context.project.frontend.framework}`);
129
142
  }
130
- const frontendPath = `${context.projectPath}/apps/web`;
143
+ const frontendPath = join(context.projectPath, "apps", "web");
144
+ // Scaffolders spawn with cwd=frontendPath; the directory must exist
145
+ // before the child process starts or spawn fails with ENOENT.
146
+ await mkdir(frontendPath, { recursive: true });
131
147
  const frontendContext = {
132
148
  project: context.project,
133
149
  projectPath: frontendPath,
134
150
  framework: adapter.framework,
135
151
  language: context.project.frontend.language ?? "typescript",
136
152
  architecture: context.project.frontend.architecture,
137
- packageManager: context.project.workspace?.packageManager ?? "pnpm",
153
+ packageManager: this.getPackageManager(context),
138
154
  features: {
139
155
  testing: true,
140
156
  linting: true,
141
157
  formatting: true,
142
158
  envValidation: true,
143
159
  },
160
+ ...(context.installDeps === false ? { skipInstall: true } : {}),
144
161
  };
145
- await adapter.scaffold(frontendContext);
146
- await adapter.applyZudojsStructure(frontendContext);
147
- await adapter.generateIntegration(frontendContext);
148
- return ["apps/web/"];
149
- }
150
- async installDependencies(context) {
151
- const pmName = context.project.workspace?.packageManager ?? "pnpm";
152
- const packageManager = this.packageManagerRegistry.get(pmName);
153
- if (packageManager) {
154
- await packageManager.install(context.projectPath);
162
+ // The same pipeline the frontend-only path uses: availability check,
163
+ // scaffold, structure, integration, dependency resolution + install, and
164
+ // adapter validation. Skipping any of it here is what let fullstack
165
+ // projects ship an unvalidated, dependency-less apps/web.
166
+ const outcome = await runFrontendPipeline(adapter, frontendContext, this.packageManagerRegistry, this.dependencyResolver);
167
+ if (outcome.errors.length > 0) {
168
+ throw new Error(`Frontend generation failed: ${outcome.errors.join("; ")}`);
155
169
  }
170
+ return ["apps/web/"];
156
171
  }
157
172
  }
158
173
  //# 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;
@@ -4,8 +4,15 @@
4
4
  * Generates Docker, docker-compose, and database infrastructure files.
5
5
  */
6
6
  import { writeFileTree } from "../../utils/utils.fileSystem.js";
7
+ import { CLIValidationError } from "../../errors/index.js";
8
+ const SERVICE_NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;
7
9
  export class InfrastructureGenerator {
8
10
  async generate(options, basePath) {
11
+ for (const service of options.services ?? []) {
12
+ if (!SERVICE_NAME_PATTERN.test(service)) {
13
+ throw new CLIValidationError(`Invalid service name: "${service}". Service names must match ${SERVICE_NAME_PATTERN}.`);
14
+ }
15
+ }
9
16
  const files = this.getFiles(options);
10
17
  await writeFileTree(basePath, files);
11
18
  }
@@ -16,7 +23,7 @@ export class InfrastructureGenerator {
16
23
  files[".dockerignore"] = "node_modules\ndist\n.git\n.env\n";
17
24
  const services = options.services ?? ["gateway"];
18
25
  for (const service of services) {
19
- files[`apps/${service}/Dockerfile`] =
26
+ files[`apps/services/${service}/Dockerfile`] =
20
27
  this.getServiceDockerfile(options);
21
28
  }
22
29
  }
@@ -28,13 +35,83 @@ export class InfrastructureGenerator {
28
35
  files["migrations/.gitkeep"] = "";
29
36
  return files;
30
37
  }
38
+ /**
39
+ * Install and build commands for Dockerfiles.
40
+ *
41
+ * Generated projects have no lockfile yet, so never use `npm ci` or
42
+ * `--frozen-lockfile`. pnpm and yarn need `corepack enable` on the bare
43
+ * node:24-alpine image; bun is not available there so it falls back to npm.
44
+ */
45
+ getDockerCommands(options) {
46
+ switch (options.packageManager) {
47
+ case "pnpm":
48
+ return {
49
+ install: "corepack enable && pnpm install",
50
+ build: "pnpm run build",
51
+ };
52
+ case "yarn":
53
+ return {
54
+ install: "corepack enable && yarn install",
55
+ build: "yarn run build",
56
+ };
57
+ default:
58
+ return { install: "npm install", build: "npm run build" };
59
+ }
60
+ }
61
+ getDatabaseCompose(options) {
62
+ if (options.database === "mysql") {
63
+ return {
64
+ image: "mysql:8",
65
+ port: 3306,
66
+ environment: [
67
+ "MYSQL_ROOT_PASSWORD=mysql",
68
+ `MYSQL_DATABASE=${options.projectName}`,
69
+ ],
70
+ url: `mysql://root:mysql@db:3306/${options.projectName}`,
71
+ dataPath: "/var/lib/mysql",
72
+ };
73
+ }
74
+ if (options.database === "sqlite") {
75
+ // SQLite is file-based: no database service at all.
76
+ return null;
77
+ }
78
+ return {
79
+ image: "postgres:16-alpine",
80
+ port: 5432,
81
+ environment: [
82
+ "POSTGRES_USER=postgres",
83
+ "POSTGRES_PASSWORD=postgres",
84
+ `POSTGRES_DB=${options.projectName}`,
85
+ ],
86
+ url: `postgresql://postgres:postgres@db:5432/${options.projectName}`,
87
+ dataPath: "/var/lib/postgresql/data",
88
+ };
89
+ }
90
+ getDatabaseUrl(options) {
91
+ const db = this.getDatabaseCompose(options);
92
+ return db ? db.url : "sqlite:./.data/app.db";
93
+ }
94
+ getDbServiceBlock(db) {
95
+ return ` db:
96
+ image: ${db.image}
97
+ ports:
98
+ - "${db.port}:${db.port}"
99
+ environment:
100
+ ${db.environment.map((e) => ` - ${e}`).join("\n")}
101
+ volumes:
102
+ - db-data:${db.dataPath}
103
+
104
+ volumes:
105
+ db-data:
106
+ `;
107
+ }
31
108
  getAppDockerfile(options) {
109
+ const { install, build } = this.getDockerCommands(options);
32
110
  return `FROM node:24-alpine AS builder
33
111
  WORKDIR /app
34
- COPY package.json pnpm-lock.yaml ./
35
- RUN ${options.packageManager === "pnpm" ? "pnpm" : options.packageManager === "yarn" ? "yarn" : "npm"} install --frozen-lockfile
36
112
  COPY . .
37
- RUN ${options.packageManager === "pnpm" ? "pnpm" : options.packageManager === "yarn" ? "yarn" : "npm"} run build
113
+ RUN ${install}
114
+ RUN ${build}
38
115
 
39
116
  FROM node:24-alpine
40
117
  WORKDIR /app
@@ -46,12 +123,12 @@ CMD ["node", "dist/server.js"]
46
123
  `;
47
124
  }
48
125
  getServiceDockerfile(options) {
126
+ const { install, build } = this.getDockerCommands(options);
49
127
  return `FROM node:24-alpine AS builder
50
128
  WORKDIR /app
51
- COPY package.json pnpm-lock.yaml ./
52
- RUN ${options.packageManager === "pnpm" ? "pnpm" : options.packageManager === "yarn" ? "yarn" : "npm"} install --frozen-lockfile
53
129
  COPY . .
54
- RUN ${options.packageManager === "pnpm" ? "pnpm" : options.packageManager === "yarn" ? "yarn" : "npm"} run build
130
+ RUN ${install}
131
+ RUN ${build}
55
132
 
56
133
  FROM node:24-alpine
57
134
  WORKDIR /app
@@ -63,79 +140,42 @@ CMD ["node", "dist/server.js"]
63
140
  `;
64
141
  }
65
142
  getSimpleDockerCompose(options) {
66
- const dbImage = options.database === "postgresql"
67
- ? "postgres:16-alpine"
68
- : options.database === "mysql"
69
- ? "mysql:8"
70
- : "alpine:latest";
71
- return `version: "3.8"
72
- services:
143
+ const db = this.getDatabaseCompose(options);
144
+ const databaseUrl = this.getDatabaseUrl(options);
145
+ return `services:
73
146
  app:
74
147
  build: .
75
148
  ports:
76
149
  - "3000:3000"
77
150
  environment:
78
- - DATABASE_URL=postgresql://postgres:postgres@db:5432/${options.projectName}
79
- depends_on:
80
- - db
81
- develop:
151
+ - DATABASE_URL=${databaseUrl}
152
+ ${db ? " depends_on:\n - db\n" : ""} develop:
82
153
  watch:
83
154
  - path: src/
84
155
  action: sync
85
156
  target: /app/src
86
-
87
- db:
88
- image: ${dbImage}
89
- ports:
90
- - "5432:5432"
91
- environment:
92
- - POSTGRES_USER=postgres
93
- - POSTGRES_PASSWORD=postgres
94
- - POSTGRES_DB=${options.projectName}
95
- volumes:
96
- - db-data:/var/lib/postgresql/data
97
-
98
- volumes:
99
- db-data:
100
- `;
157
+ ${db ? `\n${this.getDbServiceBlock(db)}` : ""}`;
101
158
  }
102
159
  getDockerCompose(options) {
103
160
  const services = options.services ?? ["gateway"];
104
- const dbImage = options.database === "postgresql"
105
- ? "postgres:16-alpine"
106
- : options.database === "mysql"
107
- ? "mysql:8"
108
- : "alpine:latest";
161
+ const db = this.getDatabaseCompose(options);
162
+ const databaseUrl = this.getDatabaseUrl(options);
109
163
  let serviceDefs = "";
110
- for (const service of services) {
164
+ for (let i = 0; i < services.length; i++) {
165
+ const service = services[i];
166
+ const port = 3001 + i;
111
167
  serviceDefs += `
112
168
  ${service}:
113
169
  build:
114
- context: apps/${service}
170
+ context: apps/services/${service}
115
171
  ports:
116
- - "3000:3000"
172
+ - "${port}:${port}"
117
173
  environment:
118
- - DATABASE_URL=postgresql://postgres:postgres@db:5432/${options.projectName}
119
- depends_on:
120
- - db
121
- `;
174
+ - PORT=${port}
175
+ - DATABASE_URL=${databaseUrl}
176
+ ${db ? " depends_on:\n - db\n" : ""}`;
122
177
  }
123
- return `version: "3.8"
124
- services:${serviceDefs}
125
- db:
126
- image: ${dbImage}
127
- ports:
128
- - "5432:5432"
129
- environment:
130
- - POSTGRES_USER=postgres
131
- - POSTGRES_PASSWORD=postgres
132
- - POSTGRES_DB=${options.projectName}
133
- volumes:
134
- - db-data:/var/lib/postgresql/data
135
-
136
- volumes:
137
- db-data:
138
- `;
178
+ return `services:${serviceDefs}${db ? `\n${this.getDbServiceBlock(db)}` : ""}`;
139
179
  }
140
180
  }
141
181
  //# sourceMappingURL=infrastructure.generator.js.map
@@ -22,6 +22,12 @@ export declare class IntegrationGenerator {
22
22
  */
23
23
  generate(context: IntegrationContext): Promise<void>;
24
24
  private generateEnvFile;
25
+ /**
26
+ * Path prefix (relative to projectPath) of the backend application.
27
+ *
28
+ * Ends with a "/" when non-empty so it can be prefixed directly.
29
+ */
30
+ private getBackendPath;
25
31
  private generateApiClient;
26
32
  private getApiClientPath;
27
33
  private generateCorsConfig;