@geekmidas/cli 0.3.0 → 0.5.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 (309) hide show
  1. package/README.md +488 -71
  2. package/dist/CronGenerator-BPTqNYOR.d.cts +14 -0
  3. package/dist/{CronGenerator-Bh26MaNA.mjs → CronGenerator-CCRYptuT.mjs} +2 -2
  4. package/dist/{CronGenerator-Bh26MaNA.mjs.map → CronGenerator-CCRYptuT.mjs.map} +1 -1
  5. package/dist/{CronGenerator-C6MF8rlG.cjs → CronGenerator-D4TWXQbh.cjs} +2 -2
  6. package/dist/{CronGenerator-C6MF8rlG.cjs.map → CronGenerator-D4TWXQbh.cjs.map} +1 -1
  7. package/dist/CronGenerator-YAj59JUd.d.mts +14 -0
  8. package/dist/EndpointGenerator-ChAD1INz.d.cts +19 -0
  9. package/dist/EndpointGenerator-Cj3O1U8-.d.mts +19 -0
  10. package/dist/{EndpointGenerator-CWh18d92.mjs → EndpointGenerator-DGivkPLT.mjs} +77 -7
  11. package/dist/EndpointGenerator-DGivkPLT.mjs.map +1 -0
  12. package/dist/{EndpointGenerator-C73wNoih.cjs → EndpointGenerator-npWEDoK2.cjs} +77 -7
  13. package/dist/EndpointGenerator-npWEDoK2.cjs.map +1 -0
  14. package/dist/FunctionGenerator-429-9NER.d.cts +14 -0
  15. package/dist/FunctionGenerator-BQ4ehoID.d.mts +14 -0
  16. package/dist/{FunctionGenerator-BNE_GC7N.mjs → FunctionGenerator-CVk0h8tO.mjs} +2 -2
  17. package/dist/{FunctionGenerator-BNE_GC7N.mjs.map → FunctionGenerator-CVk0h8tO.mjs.map} +1 -1
  18. package/dist/{FunctionGenerator-FgZUTd8L.cjs → FunctionGenerator-DYTnyr4c.cjs} +2 -2
  19. package/dist/{FunctionGenerator-FgZUTd8L.cjs.map → FunctionGenerator-DYTnyr4c.cjs.map} +1 -1
  20. package/dist/Generator-BjHK_qce.d.mts +27 -0
  21. package/dist/{Generator-UanJW0_V.mjs → Generator-CDt4pB3W.mjs} +1 -1
  22. package/dist/{Generator-UanJW0_V.mjs.map → Generator-CDt4pB3W.mjs.map} +1 -1
  23. package/dist/{Generator-CDoEXCDg.cjs → Generator-CLVplqm2.cjs} +1 -1
  24. package/dist/{Generator-CDoEXCDg.cjs.map → Generator-CLVplqm2.cjs.map} +1 -1
  25. package/dist/Generator-DxQMCQp7.d.cts +27 -0
  26. package/dist/OpenApiTsGenerator-Be-sKGTT.cjs +501 -0
  27. package/dist/OpenApiTsGenerator-Be-sKGTT.cjs.map +1 -0
  28. package/dist/OpenApiTsGenerator-C4mHHaku.mjs +495 -0
  29. package/dist/OpenApiTsGenerator-C4mHHaku.mjs.map +1 -0
  30. package/dist/SubscriberGenerator-7uX42xyG.d.mts +15 -0
  31. package/dist/{SubscriberGenerator-Dnlj_1FK.mjs → SubscriberGenerator-DABaJXML.mjs} +2 -2
  32. package/dist/{SubscriberGenerator-Dnlj_1FK.mjs.map → SubscriberGenerator-DABaJXML.mjs.map} +1 -1
  33. package/dist/{SubscriberGenerator-Bd-a7aiw.cjs → SubscriberGenerator-D_zpNGFr.cjs} +2 -2
  34. package/dist/{SubscriberGenerator-Bd-a7aiw.cjs.map → SubscriberGenerator-D_zpNGFr.cjs.map} +1 -1
  35. package/dist/SubscriberGenerator-Dtb3HS4i.d.cts +15 -0
  36. package/dist/api-B3SCEHPf.cjs +190 -0
  37. package/dist/api-B3SCEHPf.cjs.map +1 -0
  38. package/dist/api-BKIN0s0S.mjs +184 -0
  39. package/dist/api-BKIN0s0S.mjs.map +1 -0
  40. package/dist/build/index.cjs +11 -10
  41. package/dist/build/index.d.cts +7 -0
  42. package/dist/build/index.d.mts +7 -0
  43. package/dist/build/index.mjs +11 -10
  44. package/dist/build/manifests.cjs +1 -1
  45. package/dist/build/manifests.d.cts +13 -0
  46. package/dist/build/manifests.d.mts +13 -0
  47. package/dist/build/manifests.mjs +1 -1
  48. package/dist/build/providerResolver.cjs +1 -1
  49. package/dist/build/providerResolver.d.cts +23 -0
  50. package/dist/build/providerResolver.d.mts +23 -0
  51. package/dist/build/providerResolver.mjs +1 -1
  52. package/dist/build/types.d.cts +3 -0
  53. package/dist/build/types.d.mts +3 -0
  54. package/dist/{build-C6uEGRj8.mjs → build-B8C_qHir.mjs} +15 -13
  55. package/dist/build-B8C_qHir.mjs.map +1 -0
  56. package/dist/{build-CBYBPZpC.cjs → build-D0Wr49bf.cjs} +15 -13
  57. package/dist/build-D0Wr49bf.cjs.map +1 -0
  58. package/dist/config-Ba-Gbpbc.d.cts +11 -0
  59. package/dist/config-Bq72aj8e.mjs +75 -0
  60. package/dist/config-Bq72aj8e.mjs.map +1 -0
  61. package/dist/config-CFls09Ey.cjs +93 -0
  62. package/dist/config-CFls09Ey.cjs.map +1 -0
  63. package/dist/config-CLEDqKO3.cjs +157 -0
  64. package/dist/config-CLEDqKO3.cjs.map +1 -0
  65. package/dist/config-DBsmMDhf.d.mts +11 -0
  66. package/dist/config-Dp8RonV_.mjs +151 -0
  67. package/dist/config-Dp8RonV_.mjs.map +1 -0
  68. package/dist/config.cjs +4 -2
  69. package/dist/config.d.cts +48 -0
  70. package/dist/config.d.mts +48 -0
  71. package/dist/config.mjs +2 -2
  72. package/dist/dev/index.cjs +12 -10
  73. package/dist/dev/index.d.cts +36 -0
  74. package/dist/dev/index.d.mts +36 -0
  75. package/dist/dev/index.mjs +10 -10
  76. package/dist/dev-B734w3L1.mjs +343 -0
  77. package/dist/dev-B734w3L1.mjs.map +1 -0
  78. package/dist/{dev-DbtyToc7.cjs → dev-DHqYn8k4.cjs} +161 -47
  79. package/dist/dev-DHqYn8k4.cjs.map +1 -0
  80. package/dist/docker-5d8Yh5_X.cjs +119 -0
  81. package/dist/docker-5d8Yh5_X.cjs.map +1 -0
  82. package/dist/docker-DlUqdFle.mjs +113 -0
  83. package/dist/docker-DlUqdFle.mjs.map +1 -0
  84. package/dist/env-B-OKjgI4.cjs +144 -0
  85. package/dist/env-B-OKjgI4.cjs.map +1 -0
  86. package/dist/env-HfuJRlg5.d.cts +11 -0
  87. package/dist/env-nd-iQPYM.d.mts +11 -0
  88. package/dist/env-tv1HlZlw.mjs +138 -0
  89. package/dist/env-tv1HlZlw.mjs.map +1 -0
  90. package/dist/generators/CronGenerator.cjs +2 -2
  91. package/dist/generators/CronGenerator.d.cts +5 -0
  92. package/dist/generators/CronGenerator.d.mts +5 -0
  93. package/dist/generators/CronGenerator.mjs +2 -2
  94. package/dist/generators/EndpointGenerator.cjs +2 -2
  95. package/dist/generators/EndpointGenerator.d.cts +5 -0
  96. package/dist/generators/EndpointGenerator.d.mts +5 -0
  97. package/dist/generators/EndpointGenerator.mjs +2 -2
  98. package/dist/generators/FunctionGenerator.cjs +2 -2
  99. package/dist/generators/FunctionGenerator.d.cts +5 -0
  100. package/dist/generators/FunctionGenerator.d.mts +5 -0
  101. package/dist/generators/FunctionGenerator.mjs +2 -2
  102. package/dist/generators/Generator.cjs +1 -1
  103. package/dist/generators/Generator.d.cts +4 -0
  104. package/dist/generators/Generator.d.mts +4 -0
  105. package/dist/generators/Generator.mjs +1 -1
  106. package/dist/generators/OpenApiTsGenerator.cjs +3 -0
  107. package/dist/generators/OpenApiTsGenerator.d.cts +44 -0
  108. package/dist/generators/OpenApiTsGenerator.d.mts +44 -0
  109. package/dist/generators/OpenApiTsGenerator.mjs +3 -0
  110. package/dist/generators/SubscriberGenerator.cjs +2 -2
  111. package/dist/generators/SubscriberGenerator.d.cts +5 -0
  112. package/dist/generators/SubscriberGenerator.d.mts +5 -0
  113. package/dist/generators/SubscriberGenerator.mjs +2 -2
  114. package/dist/generators/index.cjs +6 -6
  115. package/dist/generators/index.d.cts +8 -0
  116. package/dist/generators/index.d.mts +8 -0
  117. package/dist/generators/index.mjs +6 -6
  118. package/dist/index-C523No_B.d.mts +64 -0
  119. package/dist/index-DrzN4xkQ.d.cts +64 -0
  120. package/dist/index.cjs +56 -18
  121. package/dist/index.cjs.map +1 -1
  122. package/dist/index.d.cts +1 -0
  123. package/dist/index.d.mts +1 -0
  124. package/dist/index.mjs +56 -18
  125. package/dist/index.mjs.map +1 -1
  126. package/dist/init/generators/config.cjs +3 -0
  127. package/dist/init/generators/config.d.cts +3 -0
  128. package/dist/init/generators/config.d.mts +3 -0
  129. package/dist/init/generators/config.mjs +3 -0
  130. package/dist/init/generators/docker.cjs +3 -0
  131. package/dist/init/generators/docker.d.cts +11 -0
  132. package/dist/init/generators/docker.d.mts +11 -0
  133. package/dist/init/generators/docker.mjs +3 -0
  134. package/dist/init/generators/env.cjs +3 -0
  135. package/dist/init/generators/env.d.cts +3 -0
  136. package/dist/init/generators/env.d.mts +3 -0
  137. package/dist/init/generators/env.mjs +3 -0
  138. package/dist/init/generators/index.cjs +9 -0
  139. package/dist/init/generators/index.d.cts +6 -0
  140. package/dist/init/generators/index.d.mts +6 -0
  141. package/dist/init/generators/index.mjs +6 -0
  142. package/dist/init/generators/models.cjs +3 -0
  143. package/dist/init/generators/models.d.cts +11 -0
  144. package/dist/init/generators/models.d.mts +11 -0
  145. package/dist/init/generators/models.mjs +3 -0
  146. package/dist/init/generators/monorepo.cjs +3 -0
  147. package/dist/init/generators/monorepo.d.cts +11 -0
  148. package/dist/init/generators/monorepo.d.mts +11 -0
  149. package/dist/init/generators/monorepo.mjs +3 -0
  150. package/dist/init/generators/package.cjs +3 -0
  151. package/dist/init/generators/package.d.cts +3 -0
  152. package/dist/init/generators/package.d.mts +3 -0
  153. package/dist/init/generators/package.mjs +3 -0
  154. package/dist/init/generators/source.cjs +3 -0
  155. package/dist/init/generators/source.d.cts +3 -0
  156. package/dist/init/generators/source.d.mts +3 -0
  157. package/dist/init/generators/source.mjs +3 -0
  158. package/dist/init/index.cjs +16 -0
  159. package/dist/init/index.d.cts +17 -0
  160. package/dist/init/index.d.mts +17 -0
  161. package/dist/init/index.mjs +16 -0
  162. package/dist/init/templates/api.cjs +3 -0
  163. package/dist/init/templates/api.d.cts +7 -0
  164. package/dist/init/templates/api.d.mts +7 -0
  165. package/dist/init/templates/api.mjs +3 -0
  166. package/dist/init/templates/index.cjs +10 -0
  167. package/dist/init/templates/index.d.cts +2 -0
  168. package/dist/init/templates/index.d.mts +2 -0
  169. package/dist/init/templates/index.mjs +7 -0
  170. package/dist/init/templates/minimal.cjs +3 -0
  171. package/dist/init/templates/minimal.d.cts +7 -0
  172. package/dist/init/templates/minimal.d.mts +7 -0
  173. package/dist/init/templates/minimal.mjs +3 -0
  174. package/dist/init/templates/serverless.cjs +3 -0
  175. package/dist/init/templates/serverless.d.cts +7 -0
  176. package/dist/init/templates/serverless.d.mts +7 -0
  177. package/dist/init/templates/serverless.mjs +3 -0
  178. package/dist/init/templates/worker.cjs +3 -0
  179. package/dist/init/templates/worker.d.cts +7 -0
  180. package/dist/init/templates/worker.d.mts +7 -0
  181. package/dist/init/templates/worker.mjs +3 -0
  182. package/dist/init/utils.cjs +7 -0
  183. package/dist/init/utils.d.cts +25 -0
  184. package/dist/init/utils.d.mts +25 -0
  185. package/dist/init/utils.mjs +3 -0
  186. package/dist/init-CtOnZn3G.mjs +145 -0
  187. package/dist/init-CtOnZn3G.mjs.map +1 -0
  188. package/dist/init-qLFsWR-R.cjs +151 -0
  189. package/dist/init-qLFsWR-R.cjs.map +1 -0
  190. package/dist/{manifests-C2eMoMUm.mjs → manifests-DIA_2QYd.mjs} +1 -1
  191. package/dist/{manifests-C2eMoMUm.mjs.map → manifests-DIA_2QYd.mjs.map} +1 -1
  192. package/dist/{manifests-CK1VV_pM.cjs → manifests-VJ9-2JpW.cjs} +1 -1
  193. package/dist/{manifests-CK1VV_pM.cjs.map → manifests-VJ9-2JpW.cjs.map} +1 -1
  194. package/dist/minimal-Bdhhpp7v.cjs +93 -0
  195. package/dist/minimal-Bdhhpp7v.cjs.map +1 -0
  196. package/dist/minimal-C4GsE45s.mjs +87 -0
  197. package/dist/minimal-C4GsE45s.mjs.map +1 -0
  198. package/dist/models-DyNwdOcz.cjs +121 -0
  199. package/dist/models-DyNwdOcz.cjs.map +1 -0
  200. package/dist/models-cvNg6Oea.mjs +115 -0
  201. package/dist/models-cvNg6Oea.mjs.map +1 -0
  202. package/dist/monorepo-Cknwzj5C.mjs +184 -0
  203. package/dist/monorepo-Cknwzj5C.mjs.map +1 -0
  204. package/dist/monorepo-sEK8gW59.cjs +190 -0
  205. package/dist/monorepo-sEK8gW59.cjs.map +1 -0
  206. package/dist/openapi-BQWPWyNB.cjs +56 -0
  207. package/dist/openapi-BQWPWyNB.cjs.map +1 -0
  208. package/dist/openapi-DBX8cJJ8.mjs +50 -0
  209. package/dist/openapi-DBX8cJJ8.mjs.map +1 -0
  210. package/dist/{openapi-react-query-D9Z7lh0p.cjs → openapi-react-query-DxHjXQvg.cjs} +1 -1
  211. package/dist/{openapi-react-query-D9Z7lh0p.cjs.map → openapi-react-query-DxHjXQvg.cjs.map} +1 -1
  212. package/dist/{openapi-react-query-MEBlYIM1.mjs → openapi-react-query-o7Mp1Jd5.mjs} +1 -1
  213. package/dist/{openapi-react-query-MEBlYIM1.mjs.map → openapi-react-query-o7Mp1Jd5.mjs.map} +1 -1
  214. package/dist/openapi-react-query.cjs +1 -1
  215. package/dist/openapi-react-query.d.cts +11 -0
  216. package/dist/openapi-react-query.d.mts +11 -0
  217. package/dist/openapi-react-query.mjs +1 -1
  218. package/dist/openapi.cjs +5 -4
  219. package/dist/openapi.d.cts +11 -0
  220. package/dist/openapi.d.mts +11 -0
  221. package/dist/openapi.mjs +5 -4
  222. package/dist/package-C7WhWU8m.d.mts +11 -0
  223. package/dist/package-CIfmeuSW.mjs +51 -0
  224. package/dist/package-CIfmeuSW.mjs.map +1 -0
  225. package/dist/package-DvWEMz6z.d.cts +11 -0
  226. package/dist/package-PP-o1nvq.cjs +57 -0
  227. package/dist/package-PP-o1nvq.cjs.map +1 -0
  228. package/dist/{providerResolver-B_TjNF0_.mjs → providerResolver-DEVKngbC.mjs} +1 -1
  229. package/dist/{providerResolver-B_TjNF0_.mjs.map → providerResolver-DEVKngbC.mjs.map} +1 -1
  230. package/dist/{providerResolver-DgvzNfP4.cjs → providerResolver-DOTbN9jo.cjs} +1 -1
  231. package/dist/{providerResolver-DgvzNfP4.cjs.map → providerResolver-DOTbN9jo.cjs.map} +1 -1
  232. package/dist/serverless-DkHBF2vC.mjs +108 -0
  233. package/dist/serverless-DkHBF2vC.mjs.map +1 -0
  234. package/dist/serverless-Yav3GRVz.cjs +114 -0
  235. package/dist/serverless-Yav3GRVz.cjs.map +1 -0
  236. package/dist/source-D6v2BnKT.d.mts +11 -0
  237. package/dist/source-D8fK9qRo.d.cts +11 -0
  238. package/dist/source-DT5Xhiob.cjs +17 -0
  239. package/dist/source-DT5Xhiob.cjs.map +1 -0
  240. package/dist/source-DnaH_MLA.mjs +11 -0
  241. package/dist/source-DnaH_MLA.mjs.map +1 -0
  242. package/dist/templates-CBFUwpBy.mjs +64 -0
  243. package/dist/templates-CBFUwpBy.mjs.map +1 -0
  244. package/dist/templates-DM_rtYYW.cjs +87 -0
  245. package/dist/templates-DM_rtYYW.cjs.map +1 -0
  246. package/dist/types-C4KITv-y.d.mts +51 -0
  247. package/dist/types-Cxl8-uwV.d.mts +129 -0
  248. package/dist/types-DB99_qIy.d.cts +129 -0
  249. package/dist/types-DLFN49M3.d.cts +51 -0
  250. package/dist/types.d.cts +2 -0
  251. package/dist/types.d.mts +2 -0
  252. package/dist/utils-BX3F4fT8.cjs +99 -0
  253. package/dist/utils-BX3F4fT8.cjs.map +1 -0
  254. package/dist/utils-C31-SWHP.mjs +69 -0
  255. package/dist/utils-C31-SWHP.mjs.map +1 -0
  256. package/dist/worker--8O5a3Hv.cjs +150 -0
  257. package/dist/worker--8O5a3Hv.cjs.map +1 -0
  258. package/dist/worker-Jme7uOOJ.mjs +144 -0
  259. package/dist/worker-Jme7uOOJ.mjs.map +1 -0
  260. package/docs/OPENAPI_TYPESCRIPT_DESIGN.md +408 -0
  261. package/package.json +19 -4
  262. package/src/__tests__/loadEnvFiles.spec.ts +131 -0
  263. package/src/__tests__/openapi.spec.ts +78 -63
  264. package/src/build/index.ts +14 -16
  265. package/src/build/types.ts +18 -2
  266. package/src/config.ts +61 -2
  267. package/src/dev/__tests__/index.spec.ts +98 -1
  268. package/src/dev/index.ts +229 -42
  269. package/src/generators/EndpointGenerator.ts +98 -5
  270. package/src/generators/OpenApiTsGenerator.ts +798 -0
  271. package/src/index.ts +32 -3
  272. package/src/init/__tests__/generators.spec.ts +366 -0
  273. package/src/init/__tests__/init.spec.ts +341 -0
  274. package/src/init/__tests__/utils.spec.ts +104 -0
  275. package/src/init/generators/config.ts +192 -0
  276. package/src/init/generators/docker.ts +134 -0
  277. package/src/init/generators/env.ts +182 -0
  278. package/src/init/generators/index.ts +4 -0
  279. package/src/init/generators/models.ts +129 -0
  280. package/src/init/generators/monorepo.ts +211 -0
  281. package/src/init/generators/package.ts +81 -0
  282. package/src/init/generators/source.ts +15 -0
  283. package/src/init/index.ts +206 -0
  284. package/src/init/templates/api.ts +218 -0
  285. package/src/init/templates/index.ts +108 -0
  286. package/src/init/templates/minimal.ts +102 -0
  287. package/src/init/templates/serverless.ts +129 -0
  288. package/src/init/templates/worker.ts +169 -0
  289. package/src/init/utils.ts +98 -0
  290. package/src/openapi.ts +36 -15
  291. package/src/types.ts +43 -0
  292. package/tsdown.config.ts +1 -1
  293. package/dist/EndpointGenerator-C73wNoih.cjs.map +0 -1
  294. package/dist/EndpointGenerator-CWh18d92.mjs.map +0 -1
  295. package/dist/build-C6uEGRj8.mjs.map +0 -1
  296. package/dist/build-CBYBPZpC.cjs.map +0 -1
  297. package/dist/config-D1EpSGk6.cjs +0 -36
  298. package/dist/config-D1EpSGk6.cjs.map +0 -1
  299. package/dist/config-U-mdW-7Y.mjs +0 -30
  300. package/dist/config-U-mdW-7Y.mjs.map +0 -1
  301. package/dist/dev-DbtyToc7.cjs.map +0 -1
  302. package/dist/dev-DnGYXuMn.mjs +0 -241
  303. package/dist/dev-DnGYXuMn.mjs.map +0 -1
  304. package/dist/openapi-BTHbPrxS.mjs +0 -36
  305. package/dist/openapi-BTHbPrxS.mjs.map +0 -1
  306. package/dist/openapi-CewcfoRH.cjs +0 -42
  307. package/dist/openapi-CewcfoRH.cjs.map +0 -1
  308. /package/dist/{generators-CEKtVh81.cjs → generators-3IemvCLk.cjs} +0 -0
  309. /package/dist/{generators-CsLujGXs.mjs → generators-FNpdfN6J.mjs} +0 -0
@@ -0,0 +1,134 @@
1
+ import type {
2
+ GeneratedFile,
3
+ TemplateConfig,
4
+ TemplateOptions,
5
+ } from '../templates/index.js';
6
+
7
+ /**
8
+ * Generate docker-compose.yml based on template and options
9
+ */
10
+ export function generateDockerFiles(
11
+ options: TemplateOptions,
12
+ template: TemplateConfig,
13
+ ): GeneratedFile[] {
14
+ const { database } = options;
15
+ const isServerless = template.name === 'serverless';
16
+ const hasWorker = template.name === 'worker';
17
+
18
+ const services: string[] = [];
19
+ const volumes: string[] = [];
20
+
21
+ // PostgreSQL database
22
+ if (database) {
23
+ services.push(` postgres:
24
+ image: postgres:16-alpine
25
+ container_name: ${options.name}-postgres
26
+ restart: unless-stopped
27
+ environment:
28
+ POSTGRES_USER: postgres
29
+ POSTGRES_PASSWORD: postgres
30
+ POSTGRES_DB: ${options.name.replace(/-/g, '_')}_dev
31
+ ports:
32
+ - '5432:5432'
33
+ volumes:
34
+ - postgres_data:/var/lib/postgresql/data
35
+ healthcheck:
36
+ test: ['CMD-SHELL', 'pg_isready -U postgres']
37
+ interval: 5s
38
+ timeout: 5s
39
+ retries: 5`);
40
+ volumes.push(' postgres_data:');
41
+ }
42
+
43
+ // Redis - different setup for serverless vs standard
44
+ if (isServerless) {
45
+ // Use serverless-redis-http for Lambda compatibility
46
+ services.push(` redis:
47
+ image: redis:7-alpine
48
+ container_name: ${options.name}-redis
49
+ restart: unless-stopped
50
+ ports:
51
+ - '6379:6379'
52
+ volumes:
53
+ - redis_data:/data
54
+ healthcheck:
55
+ test: ['CMD', 'redis-cli', 'ping']
56
+ interval: 5s
57
+ timeout: 5s
58
+ retries: 5
59
+
60
+ serverless-redis:
61
+ image: hiett/serverless-redis-http:latest
62
+ container_name: ${options.name}-serverless-redis
63
+ restart: unless-stopped
64
+ ports:
65
+ - '8079:80'
66
+ environment:
67
+ SRH_MODE: env
68
+ SRH_TOKEN: local_dev_token
69
+ SRH_CONNECTION_STRING: redis://redis:6379
70
+ depends_on:
71
+ redis:
72
+ condition: service_healthy`);
73
+ volumes.push(' redis_data:');
74
+ } else {
75
+ // Standard Redis for non-serverless templates
76
+ services.push(` redis:
77
+ image: redis:7-alpine
78
+ container_name: ${options.name}-redis
79
+ restart: unless-stopped
80
+ ports:
81
+ - '6379:6379'
82
+ volumes:
83
+ - redis_data:/data
84
+ healthcheck:
85
+ test: ['CMD', 'redis-cli', 'ping']
86
+ interval: 5s
87
+ timeout: 5s
88
+ retries: 5`);
89
+ volumes.push(' redis_data:');
90
+ }
91
+
92
+ // RabbitMQ for worker template
93
+ if (hasWorker) {
94
+ services.push(` rabbitmq:
95
+ image: rabbitmq:3-management-alpine
96
+ container_name: ${options.name}-rabbitmq
97
+ restart: unless-stopped
98
+ ports:
99
+ - '5672:5672'
100
+ - '15672:15672'
101
+ environment:
102
+ RABBITMQ_DEFAULT_USER: guest
103
+ RABBITMQ_DEFAULT_PASS: guest
104
+ volumes:
105
+ - rabbitmq_data:/var/lib/rabbitmq
106
+ healthcheck:
107
+ test: ['CMD', 'rabbitmq-diagnostics', 'check_running']
108
+ interval: 10s
109
+ timeout: 5s
110
+ retries: 5`);
111
+ volumes.push(' rabbitmq_data:');
112
+ }
113
+
114
+ // Build docker-compose.yml
115
+ let dockerCompose = `version: '3.8'
116
+
117
+ services:
118
+ ${services.join('\n\n')}
119
+ `;
120
+
121
+ if (volumes.length > 0) {
122
+ dockerCompose += `
123
+ volumes:
124
+ ${volumes.join('\n')}
125
+ `;
126
+ }
127
+
128
+ return [
129
+ {
130
+ path: 'docker-compose.yml',
131
+ content: dockerCompose,
132
+ },
133
+ ];
134
+ }
@@ -0,0 +1,182 @@
1
+ import type {
2
+ GeneratedFile,
3
+ TemplateConfig,
4
+ TemplateOptions,
5
+ } from '../templates/index.js';
6
+
7
+ /**
8
+ * Generate environment files (.env, .env.example, .env.development, .env.test, .gitignore)
9
+ */
10
+ export function generateEnvFiles(
11
+ options: TemplateOptions,
12
+ template: TemplateConfig,
13
+ ): GeneratedFile[] {
14
+ const { database } = options;
15
+ const isServerless = template.name === 'serverless';
16
+ const hasWorker = template.name === 'worker';
17
+
18
+ // Build base env content
19
+ let baseEnv = `# Application
20
+ NODE_ENV=development
21
+ PORT=3000
22
+ LOG_LEVEL=info
23
+ `;
24
+
25
+ if (isServerless) {
26
+ baseEnv = `# AWS
27
+ STAGE=dev
28
+ AWS_REGION=us-east-1
29
+ LOG_LEVEL=info
30
+ `;
31
+ }
32
+
33
+ if (database) {
34
+ baseEnv += `
35
+ # Database
36
+ DATABASE_URL=postgresql://user:password@localhost:5432/mydb
37
+ `;
38
+ }
39
+
40
+ if (hasWorker) {
41
+ baseEnv += `
42
+ # Message Queue
43
+ RABBITMQ_URL=amqp://localhost:5672
44
+ `;
45
+ }
46
+
47
+ baseEnv += `
48
+ # Authentication
49
+ JWT_SECRET=your-secret-key-change-in-production
50
+ `;
51
+
52
+ // Development env
53
+ let devEnv = `# Development Environment
54
+ NODE_ENV=development
55
+ PORT=3000
56
+ LOG_LEVEL=debug
57
+ `;
58
+
59
+ if (isServerless) {
60
+ devEnv = `# Development Environment
61
+ STAGE=dev
62
+ AWS_REGION=us-east-1
63
+ LOG_LEVEL=debug
64
+ `;
65
+ }
66
+
67
+ if (database) {
68
+ devEnv += `
69
+ # Database
70
+ DATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_dev
71
+ `;
72
+ }
73
+
74
+ if (hasWorker) {
75
+ devEnv += `
76
+ # Message Queue
77
+ RABBITMQ_URL=amqp://localhost:5672
78
+ `;
79
+ }
80
+
81
+ devEnv += `
82
+ # Authentication
83
+ JWT_SECRET=dev-secret-not-for-production
84
+ `;
85
+
86
+ // Test env
87
+ let testEnv = `# Test Environment
88
+ NODE_ENV=test
89
+ PORT=3001
90
+ LOG_LEVEL=error
91
+ `;
92
+
93
+ if (isServerless) {
94
+ testEnv = `# Test Environment
95
+ STAGE=test
96
+ AWS_REGION=us-east-1
97
+ LOG_LEVEL=error
98
+ `;
99
+ }
100
+
101
+ if (database) {
102
+ testEnv += `
103
+ # Database
104
+ DATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_test
105
+ `;
106
+ }
107
+
108
+ if (hasWorker) {
109
+ testEnv += `
110
+ # Message Queue
111
+ RABBITMQ_URL=amqp://localhost:5672
112
+ `;
113
+ }
114
+
115
+ testEnv += `
116
+ # Authentication
117
+ JWT_SECRET=test-secret-not-for-production
118
+ `;
119
+
120
+ const files: GeneratedFile[] = [
121
+ {
122
+ path: '.env.example',
123
+ content: baseEnv,
124
+ },
125
+ {
126
+ path: '.env',
127
+ content: baseEnv,
128
+ },
129
+ {
130
+ path: '.env.development',
131
+ content: devEnv,
132
+ },
133
+ {
134
+ path: '.env.test',
135
+ content: testEnv,
136
+ },
137
+ ];
138
+
139
+ // Only add .gitignore for non-monorepo (monorepo has it at root)
140
+ if (!options.monorepo) {
141
+ const gitignore = `# Dependencies
142
+ node_modules/
143
+
144
+ # Build output
145
+ dist/
146
+ .gkm/
147
+
148
+ # Environment
149
+ .env
150
+ .env.local
151
+ .env.*.local
152
+
153
+ # IDE
154
+ .idea/
155
+ .vscode/
156
+ *.swp
157
+ *.swo
158
+
159
+ # OS
160
+ .DS_Store
161
+ Thumbs.db
162
+
163
+ # Logs
164
+ *.log
165
+ npm-debug.log*
166
+ yarn-debug.log*
167
+ pnpm-debug.log*
168
+
169
+ # Test coverage
170
+ coverage/
171
+
172
+ # TypeScript cache
173
+ *.tsbuildinfo
174
+ `;
175
+ files.push({
176
+ path: '.gitignore',
177
+ content: gitignore,
178
+ });
179
+ }
180
+
181
+ return files;
182
+ }
@@ -0,0 +1,4 @@
1
+ export { generatePackageJson } from './package.js';
2
+ export { generateConfigFiles } from './config.js';
3
+ export { generateEnvFiles } from './env.js';
4
+ export { generateSourceFiles } from './source.js';
@@ -0,0 +1,129 @@
1
+ import type { GeneratedFile, TemplateOptions } from '../templates/index.js';
2
+
3
+ /**
4
+ * Generate packages/models for shared Zod schemas (monorepo only)
5
+ */
6
+ export function generateModelsPackage(
7
+ options: TemplateOptions,
8
+ ): GeneratedFile[] {
9
+ if (!options.monorepo) {
10
+ return [];
11
+ }
12
+
13
+ // Package name based on project name
14
+ const packageName = `@${options.name}/models`;
15
+
16
+ // package.json for models
17
+ const packageJson = {
18
+ name: packageName,
19
+ version: '0.0.1',
20
+ private: true,
21
+ type: 'module',
22
+ exports: {
23
+ '.': {
24
+ types: './dist/index.d.ts',
25
+ import: './dist/index.js',
26
+ },
27
+ './*': {
28
+ types: './dist/*.d.ts',
29
+ import: './dist/*.js',
30
+ },
31
+ },
32
+ scripts: {
33
+ build: 'tsc',
34
+ 'build:watch': 'tsc --watch',
35
+ typecheck: 'tsc --noEmit',
36
+ },
37
+ dependencies: {
38
+ zod: '~4.1.0',
39
+ },
40
+ devDependencies: {
41
+ typescript: '~5.8.2',
42
+ },
43
+ };
44
+
45
+ // tsconfig.json for models - extends root
46
+ const tsConfig = {
47
+ extends: '../../tsconfig.json',
48
+ compilerOptions: {
49
+ outDir: './dist',
50
+ rootDir: './src',
51
+ },
52
+ include: ['src/**/*.ts'],
53
+ exclude: ['node_modules', 'dist'],
54
+ };
55
+
56
+ // Main index.ts with example schemas
57
+ const indexTs = `import { z } from 'zod';
58
+
59
+ // ============================================
60
+ // Common Schemas
61
+ // ============================================
62
+
63
+ export const idSchema = z.string().uuid();
64
+
65
+ export const timestampsSchema = z.object({
66
+ createdAt: z.coerce.date(),
67
+ updatedAt: z.coerce.date(),
68
+ });
69
+
70
+ export const paginationSchema = z.object({
71
+ page: z.coerce.number().int().positive().default(1),
72
+ limit: z.coerce.number().int().positive().max(100).default(20),
73
+ });
74
+
75
+ export const paginatedResponseSchema = <T extends z.ZodTypeAny>(itemSchema: T) =>
76
+ z.object({
77
+ items: z.array(itemSchema),
78
+ total: z.number(),
79
+ page: z.number(),
80
+ limit: z.number(),
81
+ totalPages: z.number(),
82
+ });
83
+
84
+ // ============================================
85
+ // User Schemas
86
+ // ============================================
87
+
88
+ export const userSchema = z.object({
89
+ id: idSchema,
90
+ email: z.string().email(),
91
+ name: z.string().min(1).max(100),
92
+ ...timestampsSchema.shape,
93
+ });
94
+
95
+ export const createUserSchema = userSchema.omit({
96
+ id: true,
97
+ createdAt: true,
98
+ updatedAt: true,
99
+ });
100
+
101
+ export const updateUserSchema = createUserSchema.partial();
102
+
103
+ // ============================================
104
+ // Type Exports
105
+ // ============================================
106
+
107
+ export type Id = z.infer<typeof idSchema>;
108
+ export type Timestamps = z.infer<typeof timestampsSchema>;
109
+ export type Pagination = z.infer<typeof paginationSchema>;
110
+ export type User = z.infer<typeof userSchema>;
111
+ export type CreateUser = z.infer<typeof createUserSchema>;
112
+ export type UpdateUser = z.infer<typeof updateUserSchema>;
113
+ `;
114
+
115
+ return [
116
+ {
117
+ path: 'packages/models/package.json',
118
+ content: JSON.stringify(packageJson, null, 2) + '\n',
119
+ },
120
+ {
121
+ path: 'packages/models/tsconfig.json',
122
+ content: JSON.stringify(tsConfig, null, 2) + '\n',
123
+ },
124
+ {
125
+ path: 'packages/models/src/index.ts',
126
+ content: indexTs,
127
+ },
128
+ ];
129
+ }
@@ -0,0 +1,211 @@
1
+ import type {
2
+ GeneratedFile,
3
+ TemplateConfig,
4
+ TemplateOptions,
5
+ } from '../templates/index.js';
6
+
7
+ /**
8
+ * Generate monorepo root files (pnpm-workspace.yaml, root package.json, etc.)
9
+ */
10
+ export function generateMonorepoFiles(
11
+ options: TemplateOptions,
12
+ _template: TemplateConfig,
13
+ ): GeneratedFile[] {
14
+ if (!options.monorepo) {
15
+ return [];
16
+ }
17
+
18
+ // Root package.json for monorepo
19
+ const rootPackageJson = {
20
+ name: options.name,
21
+ version: '0.0.1',
22
+ private: true,
23
+ type: 'module',
24
+ scripts: {
25
+ dev: 'turbo dev',
26
+ build: 'turbo build',
27
+ test: 'turbo test',
28
+ 'test:once': 'turbo test:once',
29
+ typecheck: 'turbo typecheck',
30
+ lint: 'biome lint .',
31
+ fmt: 'biome format . --write',
32
+ 'fmt:check': 'biome format .',
33
+ },
34
+ devDependencies: {
35
+ '@biomejs/biome': '~1.9.4',
36
+ turbo: '~2.3.0',
37
+ typescript: '~5.8.2',
38
+ vitest: '~4.0.0',
39
+ },
40
+ };
41
+
42
+ // pnpm-workspace.yaml - detect folder structure from apiPath
43
+ const apiPathParts = options.apiPath.split('/');
44
+ const appsFolder = apiPathParts[0] || 'apps';
45
+
46
+ const pnpmWorkspace = `packages:
47
+ - '${appsFolder}/*'
48
+ - 'packages/*'
49
+ `;
50
+
51
+ // Root biome.json
52
+ const biomeConfig = {
53
+ $schema: 'https://biomejs.dev/schemas/1.9.4/schema.json',
54
+ vcs: {
55
+ enabled: true,
56
+ clientKind: 'git',
57
+ useIgnoreFile: true,
58
+ },
59
+ organizeImports: {
60
+ enabled: true,
61
+ },
62
+ formatter: {
63
+ enabled: true,
64
+ indentStyle: 'space',
65
+ indentWidth: 2,
66
+ lineWidth: 80,
67
+ },
68
+ javascript: {
69
+ formatter: {
70
+ quoteStyle: 'single',
71
+ trailingCommas: 'all',
72
+ semicolons: 'always',
73
+ arrowParentheses: 'always',
74
+ },
75
+ },
76
+ linter: {
77
+ enabled: true,
78
+ rules: {
79
+ recommended: true,
80
+ correctness: {
81
+ noUnusedImports: 'error',
82
+ noUnusedVariables: 'error',
83
+ },
84
+ style: {
85
+ noNonNullAssertion: 'off',
86
+ },
87
+ },
88
+ },
89
+ files: {
90
+ ignore: ['node_modules', 'dist', '.gkm', 'coverage'],
91
+ },
92
+ };
93
+
94
+ // Root turbo.json
95
+ const turboConfig = {
96
+ $schema: 'https://turbo.build/schema.json',
97
+ tasks: {
98
+ build: {
99
+ dependsOn: ['^build'],
100
+ outputs: ['dist/**'],
101
+ },
102
+ dev: {
103
+ cache: false,
104
+ persistent: true,
105
+ },
106
+ test: {
107
+ dependsOn: ['^build'],
108
+ cache: false,
109
+ },
110
+ 'test:once': {
111
+ dependsOn: ['^build'],
112
+ outputs: ['coverage/**'],
113
+ },
114
+ typecheck: {
115
+ dependsOn: ['^build'],
116
+ outputs: [],
117
+ },
118
+ lint: {
119
+ outputs: [],
120
+ },
121
+ fmt: {
122
+ outputs: [],
123
+ },
124
+ },
125
+ };
126
+
127
+ // Root .gitignore
128
+ const gitignore = `# Dependencies
129
+ node_modules/
130
+
131
+ # Build output
132
+ dist/
133
+ .gkm/
134
+
135
+ # Environment
136
+ .env
137
+ .env.local
138
+ .env.*.local
139
+
140
+ # IDE
141
+ .idea/
142
+ .vscode/
143
+ *.swp
144
+ *.swo
145
+
146
+ # OS
147
+ .DS_Store
148
+ Thumbs.db
149
+
150
+ # Logs
151
+ *.log
152
+ npm-debug.log*
153
+ yarn-debug.log*
154
+ pnpm-debug.log*
155
+
156
+ # Test coverage
157
+ coverage/
158
+
159
+ # TypeScript cache
160
+ *.tsbuildinfo
161
+
162
+ # Turbo
163
+ .turbo/
164
+ `;
165
+
166
+ // Root tsconfig.json - base config for all packages
167
+ const tsConfig = {
168
+ compilerOptions: {
169
+ target: 'ES2022',
170
+ module: 'NodeNext',
171
+ moduleResolution: 'NodeNext',
172
+ lib: ['ES2022'],
173
+ strict: true,
174
+ esModuleInterop: true,
175
+ skipLibCheck: true,
176
+ forceConsistentCasingInFileNames: true,
177
+ resolveJsonModule: true,
178
+ declaration: true,
179
+ declarationMap: true,
180
+ composite: true,
181
+ },
182
+ exclude: ['node_modules', 'dist'],
183
+ };
184
+
185
+ return [
186
+ {
187
+ path: 'package.json',
188
+ content: JSON.stringify(rootPackageJson, null, 2) + '\n',
189
+ },
190
+ {
191
+ path: 'pnpm-workspace.yaml',
192
+ content: pnpmWorkspace,
193
+ },
194
+ {
195
+ path: 'tsconfig.json',
196
+ content: JSON.stringify(tsConfig, null, 2) + '\n',
197
+ },
198
+ {
199
+ path: 'biome.json',
200
+ content: JSON.stringify(biomeConfig, null, 2) + '\n',
201
+ },
202
+ {
203
+ path: 'turbo.json',
204
+ content: JSON.stringify(turboConfig, null, 2) + '\n',
205
+ },
206
+ {
207
+ path: '.gitignore',
208
+ content: gitignore,
209
+ },
210
+ ];
211
+ }