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
@@ -1,14 +1,85 @@
1
1
  /**
2
2
  * zudojs-cli — Dev Command
3
3
  *
4
- * The `zudojs dev` command.
5
- * Starts development servers based on project configuration.
4
+ * The `zudojs dev` command. Starts the development servers of the project
5
+ * in the current directory.
6
+ *
7
+ * Servers are started through the project's package manager (`pnpm run
8
+ * dev`, `npm run dev`, …) rather than by spawning `tsx` or `ng` directly:
9
+ * those binaries are devDependencies of the generated project and are not
10
+ * on the user's PATH, so the direct spawn failed with ENOENT for everyone
11
+ * who had not installed them globally. Running the script also means the
12
+ * project's own `dev` script is what runs — `tsx watch src` used to be
13
+ * hard-coded here, which watched `src/index.ts`, a file that only exports
14
+ * `createApp` and never starts the server.
6
15
  */
7
- import { existsSync, readFileSync } from "node:fs";
8
- import { join } from "node:path";
9
- import { execCommand } from "../utils/utils.exec.js";
16
+ import { existsSync } from "node:fs";
17
+ import { basename, join, relative } from "node:path";
18
+ import { runStreaming } from "../utils/utils.exec.js";
10
19
  import { CLIValidationError, CLIGenerationError } from "../errors/index.js";
11
- import { ManifestManager } from "../manifest/manifestManager.core.js";
20
+ import { getRunScriptCommand } from "../installers/dependency.installer.js";
21
+ import { resolveProjectLayout, } from "../resolvers/layout/projectLayout.core.js";
22
+ /**
23
+ * Computes the servers `zudojs dev` starts for a project layout.
24
+ *
25
+ * Exported so the selection can be tested without spawning anything.
26
+ */
27
+ export function planDevServers(layout, options = {}) {
28
+ const servers = [];
29
+ const env = options.port !== undefined
30
+ ? { ...process.env, PORT: String(options.port) }
31
+ : undefined;
32
+ if (!options.frontendOnly) {
33
+ for (const dir of layout.backendDirs) {
34
+ if (!existsSync(join(dir, "package.json")))
35
+ continue;
36
+ const [file, ...args] = getRunScriptCommand(layout.packageManager, "dev");
37
+ servers.push({
38
+ label: labelFor(layout.root, dir, "backend"),
39
+ cwd: dir,
40
+ file,
41
+ args,
42
+ ...(env ? { env } : {}),
43
+ });
44
+ }
45
+ }
46
+ if (!options.backendOnly && layout.frontendDir !== undefined) {
47
+ const spec = frontendServer(layout, layout.frontendDir);
48
+ if (spec)
49
+ servers.push(spec);
50
+ }
51
+ return servers;
52
+ }
53
+ function labelFor(root, dir, fallback) {
54
+ const rel = relative(root, dir);
55
+ return rel === "" ? fallback : basename(dir);
56
+ }
57
+ function frontendServer(layout, dir) {
58
+ const framework = layout.frontendFramework ?? "react";
59
+ if (framework === "none")
60
+ return null;
61
+ if (framework === "flutter") {
62
+ if (!existsSync(join(dir, "pubspec.yaml")))
63
+ return null;
64
+ return {
65
+ label: "web",
66
+ cwd: dir,
67
+ file: "flutter",
68
+ args: ["run", "--debug"],
69
+ };
70
+ }
71
+ if (!existsSync(join(dir, "package.json")))
72
+ return null;
73
+ // Angular's package.json has `start: ng serve`; React Native's has `start`.
74
+ const script = framework === "angular" || framework === "react-native" ? "start" : "dev";
75
+ const [file, ...args] = getRunScriptCommand(layout.packageManager, script);
76
+ return {
77
+ label: labelFor(layout.root, dir, "frontend"),
78
+ cwd: dir,
79
+ file,
80
+ args,
81
+ };
82
+ }
12
83
  export async function runDevCommand(context) {
13
84
  const frontendOnly = context.values["frontend-only"] === true;
14
85
  const backendOnly = context.values["backend-only"] === true;
@@ -16,160 +87,45 @@ export async function runDevCommand(context) {
16
87
  if (frontendOnly && backendOnly) {
17
88
  throw new CLIValidationError("Cannot use --frontend-only and --backend-only together.");
18
89
  }
19
- const config = readProjectConfig(context.cwd);
20
- if (!config) {
21
- throw new CLIValidationError("No Zudojs project found. Run `zudojs create` first.");
90
+ const layout = resolveProjectLayout(context.cwd);
91
+ if (!layout) {
92
+ throw new CLIValidationError("No Zudojs project found in this directory. Run `zudojs create` first.");
22
93
  }
23
- context.logger.info(`Starting development server for: ${config.name}`);
24
- context.logger.info(`Type: ${config.type}`);
25
- if (config.backend) {
26
- context.logger.info(`Backend architecture: ${config.backend.architecture}`);
94
+ context.logger.info(`Project type: ${layout.projectType}`);
95
+ if (layout.backendDirs.length > 0) {
96
+ context.logger.info(`Backend architecture: ${layout.architecture}`);
27
97
  }
28
- if (config.frontend) {
29
- context.logger.info(`Frontend: ${config.frontend.framework}`);
98
+ if (layout.frontendFramework) {
99
+ context.logger.info(`Frontend: ${layout.frontendFramework}`);
30
100
  }
31
- const manifest = await new ManifestManager(context.cwd).read();
32
- const services = manifest?.capabilities ?? [];
33
- const processes = [];
34
- if ((!frontendOnly && config.type === "backend") ||
35
- config.type === "fullstack") {
36
- if (config.backend?.architecture === "microservice") {
37
- processes.push(...startMicroserviceDev(context.cwd, services));
38
- }
39
- else {
40
- processes.push(startBackendDev(context.cwd, config, port));
41
- }
42
- }
43
- if (!backendOnly &&
44
- (config.type === "frontend" || config.type === "fullstack")) {
45
- if (config.frontend && config.frontend.framework !== "none") {
46
- processes.push(startFrontendDev(context.cwd, config));
47
- }
48
- }
49
- if (processes.length === 0) {
101
+ const servers = planDevServers(layout, {
102
+ frontendOnly,
103
+ backendOnly,
104
+ ...(port !== undefined ? { port } : {}),
105
+ });
106
+ if (servers.length === 0) {
50
107
  context.logger.warn("No development servers to start.");
51
108
  return;
52
109
  }
53
- context.logger.info("Starting development servers...");
110
+ for (const server of servers) {
111
+ context.logger.info(`Starting ${server.label}: ${server.file} ${server.args.join(" ")}`);
112
+ }
113
+ // One controller for every server: when any of them exits with an error
114
+ // the others are stopped too, instead of being left running detached
115
+ // after the command has already reported failure.
116
+ const controller = new AbortController();
117
+ const runs = servers.map((server) => runStreaming(server.file, server.args, server.cwd, {
118
+ signal: controller.signal,
119
+ ...(server.env ? { env: server.env } : {}),
120
+ }).catch((error) => {
121
+ controller.abort();
122
+ throw error;
123
+ }));
54
124
  try {
55
- await Promise.all(processes);
125
+ await Promise.all(runs);
56
126
  }
57
127
  catch (error) {
58
128
  throw new CLIGenerationError("Development server failed to start.", error);
59
129
  }
60
130
  }
61
- function readProjectConfig(cwd) {
62
- const configPath = join(cwd, "zudojs.config.ts");
63
- const configPathJs = join(cwd, "zudojs.config.js");
64
- if (existsSync(configPath)) {
65
- const content = readFileSync(configPath, "utf-8");
66
- return parseConfigContent(content, cwd);
67
- }
68
- if (existsSync(configPathJs)) {
69
- const content = readFileSync(configPathJs, "utf-8");
70
- return parseConfigContent(content, cwd);
71
- }
72
- const pkgPath = join(cwd, "package.json");
73
- if (existsSync(pkgPath)) {
74
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
75
- if (pkg.zudojs) {
76
- return {
77
- name: pkg.name ?? "unknown",
78
- type: pkg.zudojs.projectType ?? "backend",
79
- backend: pkg.zudojs.architecture
80
- ? { architecture: pkg.zudojs.architecture }
81
- : undefined,
82
- frontend: pkg.zudojs.frontend
83
- ? { framework: pkg.zudojs.frontend }
84
- : undefined,
85
- };
86
- }
87
- }
88
- return null;
89
- }
90
- function parseConfigContent(content, cwd) {
91
- const nameMatch = content.match(/name:\s*["']([^"']+)["']/);
92
- const typeMatch = content.match(/projectType:\s*["'](\w+)["']/);
93
- const architectureMatch = content.match(/architecture:\s*["'](\w+)["']/);
94
- const frontendMatch = content.match(/frontend:\s*\{[\s\S]*?framework:\s*["']([^"']+)["']/);
95
- const pkgPath = join(cwd, "package.json");
96
- let name = "unknown";
97
- if (existsSync(pkgPath)) {
98
- try {
99
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
100
- name = pkg.name ?? name;
101
- }
102
- catch {
103
- // ignore
104
- }
105
- }
106
- return {
107
- name: nameMatch?.[1] ?? name,
108
- type: typeMatch?.[1] ?? "backend",
109
- backend: architectureMatch?.[1]
110
- ? { architecture: architectureMatch[1] }
111
- : undefined,
112
- frontend: frontendMatch?.[1] ? { framework: frontendMatch[1] } : undefined,
113
- };
114
- }
115
- async function startBackendDev(cwd, config, port) {
116
- const portFlag = port ? [`--port=${port}`] : [];
117
- if (config.backend?.architecture === "microservice") {
118
- await execCommand("tsx", ["watch", "apps/gateway/src", ...portFlag], cwd);
119
- }
120
- else {
121
- await execCommand("tsx", ["watch", "src", ...portFlag], cwd);
122
- }
123
- }
124
- function startMicroserviceDev(cwd, services) {
125
- const serviceDirs = services.map((service) => join(cwd, "apps", service));
126
- const promises = [];
127
- for (const dir of serviceDirs) {
128
- if (existsSync(join(dir, "src"))) {
129
- promises.push(execCommand("tsx", ["watch", "src"], dir).then(() => { }));
130
- }
131
- }
132
- return promises;
133
- }
134
- async function startFrontendDev(cwd, config) {
135
- const framework = config.frontend?.framework ?? "react";
136
- const frontendDir = join(cwd, "apps", "web");
137
- switch (framework) {
138
- case "react":
139
- await execCommand("npm", ["run", "dev"], frontendDir);
140
- break;
141
- case "next":
142
- await execCommand("npm", ["run", "dev"], frontendDir);
143
- break;
144
- case "vue":
145
- await execCommand("npm", ["run", "dev"], frontendDir);
146
- break;
147
- case "nuxt":
148
- await execCommand("npm", ["run", "dev"], frontendDir);
149
- break;
150
- case "angular":
151
- await execCommand("ng", ["serve"], frontendDir);
152
- break;
153
- case "svelte":
154
- await execCommand("npm", ["run", "dev"], frontendDir);
155
- break;
156
- case "sveltekit":
157
- await execCommand("npm", ["run", "dev"], frontendDir);
158
- break;
159
- case "astro":
160
- await execCommand("npm", ["run", "dev"], frontendDir);
161
- break;
162
- case "vanilla":
163
- await execCommand("npm", ["run", "dev"], frontendDir);
164
- break;
165
- case "flutter":
166
- await execCommand("flutter", ["run", "--debug"], frontendDir);
167
- break;
168
- case "react-native":
169
- await execCommand("npx", ["react-native", "start"], frontendDir);
170
- break;
171
- default:
172
- await execCommand("npm", ["run", "dev"], frontendDir);
173
- }
174
- }
175
131
  //# sourceMappingURL=dev.command.js.map
@@ -4,5 +4,23 @@
4
4
  * The `zudojs doctor` command for project diagnostics.
5
5
  */
6
6
  import type { CLIContext } from "../cliType/cliType.type.js";
7
+ export interface DoctorCheck {
8
+ readonly name: string;
9
+ readonly passed: boolean;
10
+ readonly message: string;
11
+ /**
12
+ * Whether a failed check is fatal. Advisory checks (a missing lock file in
13
+ * a project created with `--no-install`, for example) are reported as
14
+ * warnings and do not fail the command.
15
+ */
16
+ readonly severity: "error" | "warning";
17
+ }
18
+ /**
19
+ * Runs every diagnostic for the project at `cwd`.
20
+ *
21
+ * Exported so the checks can be run against a scaffolded directory in tests
22
+ * without going through the logger.
23
+ */
24
+ export declare function runDoctorChecks(cwd: string): DoctorCheck[];
7
25
  export declare function runDoctorCommand(context: CLIContext): Promise<void>;
8
26
  //# sourceMappingURL=doctor.command.d.ts.map
@@ -4,25 +4,41 @@
4
4
  * The `zudojs doctor` command for project diagnostics.
5
5
  */
6
6
  import { existsSync, readFileSync } from "node:fs";
7
- import { join } from "node:path";
8
- import { execFileSync } from "node:child_process";
7
+ import { join, relative } from "node:path";
8
+ import { CLIValidationError } from "../errors/index.js";
9
+ import { FEATURE_PACKAGES } from "../constants/index.js";
10
+ import { resolveProjectLayout, } from "../resolvers/layout/projectLayout.core.js";
11
+ /**
12
+ * Runs every diagnostic for the project at `cwd`.
13
+ *
14
+ * Exported so the checks can be run against a scaffolded directory in tests
15
+ * without going through the logger.
16
+ */
17
+ export function runDoctorChecks(cwd) {
18
+ const layout = resolveProjectLayout(cwd);
19
+ const checks = [checkNodeVersion(), checkProject(layout)];
20
+ if (!layout) {
21
+ return checks;
22
+ }
23
+ checks.push(checkPackageManager(layout), checkInstalled(layout), checkTypeScriptConfig(layout), checkDependencies(layout), checkFeatures(layout));
24
+ return checks;
25
+ }
9
26
  export async function runDoctorCommand(context) {
10
- const checks = [];
27
+ const checks = runDoctorChecks(context.cwd);
11
28
  const warnings = [];
12
29
  const errors = [];
13
- checks.push(checkNodeVersion());
14
- checks.push(checkPackageManager());
15
- checks.push(checkTypeScriptConfig());
16
- checks.push(checkZudojsConfig());
17
- checks.push(checkDependencies(context));
18
- checks.push(checkArchitectureViolations());
19
30
  context.logger.info("Zudojs Doctor - Project Diagnostics");
20
31
  context.logger.info("");
21
32
  for (const check of checks) {
22
- const symbol = check.passed ? "✔" : "✖";
33
+ const symbol = check.passed ? "✔" : check.severity === "error" ? "✖" : "⚠";
23
34
  context.logger.info(`${symbol} ${check.name}: ${check.message}`);
24
35
  if (!check.passed) {
25
- errors.push(`${check.name}: ${check.message}`);
36
+ if (check.severity === "warning") {
37
+ warnings.push(`${check.name}: ${check.message}`);
38
+ }
39
+ else {
40
+ errors.push(`${check.name}: ${check.message}`);
41
+ }
26
42
  }
27
43
  }
28
44
  if (warnings.length > 0) {
@@ -40,7 +56,9 @@ export async function runDoctorCommand(context) {
40
56
  }
41
57
  context.logger.info("");
42
58
  context.logger.info("Please fix the errors above before deploying.");
43
- return;
59
+ // Throwing is what gives `zudojs doctor` a non-zero exit code; returning
60
+ // here would report success to CI while diagnostics failed.
61
+ throw new CLIValidationError(`Zudojs doctor found ${errors.length} problem(s): ${errors.join("; ")}`);
44
62
  }
45
63
  context.logger.info("");
46
64
  context.logger.info("All checks passed!");
@@ -51,141 +69,173 @@ function checkNodeVersion() {
51
69
  const passed = major >= 24;
52
70
  return {
53
71
  name: "Node.js version",
72
+ severity: "error",
54
73
  passed,
55
74
  message: passed
56
- ? `Node.js ${version} (✓ meets minimum v24)`
57
- : `Node.js ${version} (✗ requires >= v24)`,
75
+ ? `Node.js ${version} (meets minimum v24)`
76
+ : `Node.js ${version} (requires >= v24)`,
77
+ };
78
+ }
79
+ function checkProject(layout) {
80
+ if (!layout) {
81
+ return {
82
+ name: "Zudojs project",
83
+ severity: "error",
84
+ passed: false,
85
+ message: "No Zudojs project found (no .zudojs/manifest.json, zudojs.config.ts or zudojs block in package.json)",
86
+ };
87
+ }
88
+ const source = layout.source === "manifest"
89
+ ? ".zudojs/manifest.json"
90
+ : layout.source === "config"
91
+ ? "zudojs.config.ts"
92
+ : "package.json#zudojs";
93
+ return {
94
+ name: "Zudojs project",
95
+ severity: "error",
96
+ passed: true,
97
+ message: `${layout.projectType} (${layout.architecture}) from ${source}`,
58
98
  };
59
99
  }
60
- function checkPackageManager() {
61
- const hasPnpm = existsSync("pnpm-lock.yaml");
62
- const hasNpm = existsSync("package-lock.json");
63
- const hasYarn = existsSync("yarn.lock");
64
- const passed = hasPnpm || hasNpm || hasYarn;
65
- const manager = hasPnpm ? "pnpm" : hasNpm ? "npm" : hasYarn ? "yarn" : "none";
100
+ function checkPackageManager(layout) {
101
+ const lockFiles = {
102
+ pnpm: ["pnpm-lock.yaml"],
103
+ npm: ["package-lock.json"],
104
+ yarn: ["yarn.lock"],
105
+ bun: ["bun.lock", "bun.lockb"],
106
+ };
107
+ const expected = lockFiles[layout.packageManager] ?? [];
108
+ const passed = expected.some((file) => existsSync(join(layout.root, file)));
66
109
  return {
67
110
  name: "Package manager",
111
+ severity: "warning",
68
112
  passed,
69
- message: passed ? `Detected: ${manager}` : "No lock file found",
113
+ message: passed
114
+ ? `${layout.packageManager} (lock file present)`
115
+ : `${layout.packageManager} configured but no lock file found; run "${layout.packageManager} install"`,
70
116
  };
71
117
  }
72
- function checkTypeScriptConfig() {
73
- const passed = existsSync("tsconfig.json") || existsSync("tsconfig.base.json");
118
+ function checkInstalled(layout) {
119
+ const passed = existsSync(join(layout.root, "node_modules"));
74
120
  return {
75
- name: "TypeScript configuration",
121
+ name: "Dependencies installed",
122
+ severity: "warning",
76
123
  passed,
77
- message: passed ? "tsconfig.json found" : "No tsconfig.json found",
124
+ message: passed
125
+ ? "node_modules present"
126
+ : `node_modules missing; run "${layout.packageManager} install"`,
78
127
  };
79
128
  }
80
- function checkZudojsConfig() {
81
- const hasPkgConfig = checkZudojsInPackageJson();
82
- const hasConfig = existsSync("zudojs.config.ts") || existsSync("zudojs.config.js");
83
- const passed = hasPkgConfig || hasConfig;
84
- let message = "No Zudojs configuration found.";
85
- if (passed) {
86
- message = hasPkgConfig
87
- ? "Zudojs config in package.json"
88
- : hasConfig
89
- ? "zudojs.config.ts found"
90
- : "Zudojs config in package.json";
129
+ /** Directories that must each carry a tsconfig.json. */
130
+ function appDirs(layout) {
131
+ const dirs = [...layout.backendDirs];
132
+ if (layout.frontendDir !== undefined &&
133
+ layout.frontendFramework !== "flutter" &&
134
+ existsSync(join(layout.frontendDir, "package.json"))) {
135
+ dirs.push(layout.frontendDir);
91
136
  }
92
- return { name: "Zudojs configuration", passed, message };
137
+ return dirs;
138
+ }
139
+ function describe(layout, dir) {
140
+ const rel = relative(layout.root, dir);
141
+ return rel === "" ? "." : rel;
142
+ }
143
+ /**
144
+ * A workspace root has no tsconfig.json of its own — the apps do. This
145
+ * check used to look only at the root, so every fullstack and microservice
146
+ * project failed the doctor the moment it was created.
147
+ */
148
+ function checkTypeScriptConfig(layout) {
149
+ const missing = appDirs(layout).filter((dir) => !existsSync(join(dir, "tsconfig.json")) &&
150
+ !existsSync(join(dir, "tsconfig.base.json")));
151
+ const passed = missing.length === 0;
152
+ return {
153
+ name: "TypeScript configuration",
154
+ severity: "error",
155
+ passed,
156
+ message: passed
157
+ ? "tsconfig.json found in every app"
158
+ : `No tsconfig.json in: ${missing.map((d) => describe(layout, d)).join(", ")}`,
159
+ };
93
160
  }
94
- function checkZudojsInPackageJson() {
161
+ function readPackageJson(dir) {
95
162
  try {
96
- const pkgPath = join(process.cwd(), "package.json");
97
- if (!existsSync(pkgPath))
98
- return false;
99
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
100
- return typeof pkg.zudojs === "object" && pkg.zudojs !== null;
163
+ return JSON.parse(readFileSync(join(dir, "package.json"), "utf-8"));
101
164
  }
102
165
  catch {
103
- return false;
166
+ return null;
104
167
  }
105
168
  }
106
- function checkDependencies(context) {
107
- const pkgPath = join(context.cwd, "package.json");
108
- if (!existsSync(pkgPath)) {
109
- return {
110
- name: "Dependencies",
111
- passed: false,
112
- message: "No package.json found",
113
- };
114
- }
115
- try {
116
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
117
- const zudojsDeps = Object.keys(pkg.dependencies ?? {}).filter((d) => d.startsWith("@zudojs/"));
118
- const passed = zudojsDeps.length > 0;
169
+ function checkDependencies(layout) {
170
+ if (layout.backendDirs.length === 0) {
119
171
  return {
120
172
  name: "Zudojs dependencies",
121
- passed,
122
- message: passed
123
- ? `${zudojsDeps.length} Zudojs packages installed`
124
- : "No Zudojs packages found",
173
+ severity: "warning",
174
+ passed: true,
175
+ message: "Frontend-only project; no framework packages expected",
125
176
  };
126
177
  }
127
- catch {
178
+ const found = new Set();
179
+ const unreadable = [];
180
+ for (const dir of layout.backendDirs) {
181
+ const pkg = readPackageJson(dir);
182
+ if (!pkg) {
183
+ unreadable.push(describe(layout, dir));
184
+ continue;
185
+ }
186
+ for (const name of Object.keys(pkg.dependencies ?? {})) {
187
+ if (name.startsWith("@zudojs/"))
188
+ found.add(name);
189
+ }
190
+ }
191
+ if (unreadable.length > 0) {
128
192
  return {
129
- name: "Dependencies",
193
+ name: "Zudojs dependencies",
194
+ severity: "error",
130
195
  passed: false,
131
- message: "Failed to read package.json",
196
+ message: `Failed to read package.json in: ${unreadable.join(", ")}`,
132
197
  };
133
198
  }
199
+ const passed = found.size > 0;
200
+ return {
201
+ name: "Zudojs dependencies",
202
+ severity: "warning",
203
+ passed,
204
+ message: passed
205
+ ? `${found.size} Zudojs package(s) declared`
206
+ : "No @zudojs/* packages declared",
207
+ };
134
208
  }
135
- function checkArchitectureViolations() {
136
- const srcDir = join(process.cwd(), "src");
209
+ /**
210
+ * Every feature recorded in a backend package.json must be backed by the
211
+ * package `zudojs add` installs for it.
212
+ */
213
+ function checkFeatures(layout) {
137
214
  const violations = [];
138
- if (!existsSync(srcDir)) {
139
- return {
140
- name: "Architecture",
141
- passed: true,
142
- message: "No src/ directory (not a Zudojs project?)",
143
- };
144
- }
145
- const configPath = join(process.cwd(), "zudojs.config.ts");
146
- let architecture = "monolith";
147
- if (existsSync(configPath)) {
148
- const configContent = readFileSync(configPath, "utf-8");
149
- const archMatch = configContent.match(/architecture:\s*["'](\w[\w-]*)["']/);
150
- if (archMatch?.[1]) {
151
- architecture = archMatch[1];
152
- }
153
- }
154
- if (architecture === "modular-monolith" || architecture === "microservice") {
155
- const servicesDir = join(srcDir, "services");
156
- if (existsSync(servicesDir)) {
157
- violations.push("src/services/ should be split into modules/ (modular-monolith) or apps/services/ (microservice)");
158
- }
159
- }
160
- if (architecture === "monolith") {
161
- const modulesDir = join(srcDir, "modules");
162
- if (existsSync(modulesDir)) {
163
- violations.push("src/modules/ found in monolith architecture — consider modular-monolith or microservice architecture");
164
- }
165
- }
166
- const pkgPath = join(process.cwd(), "package.json");
167
- if (existsSync(pkgPath)) {
168
- try {
169
- const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
170
- const features = pkg.zudojs?.features ?? [];
171
- const deps = Object.keys(pkg.dependencies ?? {});
172
- for (const feature of features) {
173
- const pkgName = `@zudojs/${feature}`;
174
- if (!deps.includes(pkgName)) {
175
- violations.push(`Feature "${feature}" declared in package.json#zudojs.features but ${pkgName} not in dependencies`);
215
+ for (const dir of layout.backendDirs) {
216
+ const pkg = readPackageJson(dir);
217
+ if (!pkg)
218
+ continue;
219
+ const features = Array.isArray(pkg.zudojs?.features)
220
+ ? pkg.zudojs.features.filter((f) => typeof f === "string")
221
+ : [];
222
+ const deps = Object.keys(pkg.dependencies ?? {});
223
+ for (const feature of features) {
224
+ const required = FEATURE_PACKAGES[feature] ?? [`@zudojs/${feature}`];
225
+ for (const name of required) {
226
+ if (!deps.includes(name)) {
227
+ violations.push(`${describe(layout, dir)}: feature "${feature}" declared but ${name} is not a dependency`);
176
228
  }
177
229
  }
178
230
  }
179
- catch {
180
- // ignore parse errors
181
- }
182
231
  }
183
232
  return {
184
- name: "Architecture",
233
+ name: "Features",
234
+ severity: "warning",
185
235
  passed: violations.length === 0,
186
236
  message: violations.length === 0
187
- ? "No violations detected"
188
- : `${violations.length} potential violation(s): ${violations.join("; ")}`,
237
+ ? "Every declared feature has its package"
238
+ : violations.join("; "),
189
239
  };
190
240
  }
191
241
  //# sourceMappingURL=doctor.command.js.map
@@ -2,7 +2,8 @@
2
2
  * zudojs-cli — Generate Command
3
3
  *
4
4
  * The `zudojs generate` (alias: `g`) command.
5
- * Reads zudojs.config.ts to determine project architecture.
5
+ * Reads the project manifest to determine the architecture and where the
6
+ * backend lives, then places the schematic accordingly.
6
7
  */
7
8
  import type { CLIContext } from "../cliType/cliType.type.js";
8
9
  export declare function runGenerateCommand(context: CLIContext): Promise<void>;