@geekmidas/cli 0.5.0 → 0.6.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 (246) hide show
  1. package/README.md +7 -7
  2. package/dist/{CronGenerator-BPTqNYOR.d.cts → CronGenerator-DWS3CCZt.d.cts} +4 -4
  3. package/dist/{CronGenerator-YAj59JUd.d.mts → CronGenerator-DZjdkEjI.d.mts} +4 -4
  4. package/dist/{EndpointGenerator-ChAD1INz.d.cts → EndpointGenerator-Dh7kMtuL.d.mts} +4 -4
  5. package/dist/{EndpointGenerator-Cj3O1U8-.d.mts → EndpointGenerator-zBsie_7s.d.cts} +4 -4
  6. package/dist/{FunctionGenerator-429-9NER.d.cts → FunctionGenerator-BmDHo27U.d.mts} +4 -4
  7. package/dist/{FunctionGenerator-BQ4ehoID.d.mts → FunctionGenerator-DXjXBxUd.d.cts} +4 -4
  8. package/dist/{Generator-BjHK_qce.d.mts → Generator-BGY-2dgI.d.cts} +3 -3
  9. package/dist/{Generator-DxQMCQp7.d.cts → Generator-yi9DH5TN.d.mts} +3 -3
  10. package/dist/{OpenApiTsGenerator-C4mHHaku.mjs → OpenApiTsGenerator-0ZDYWro5.mjs} +1 -1
  11. package/dist/{OpenApiTsGenerator-C4mHHaku.mjs.map → OpenApiTsGenerator-0ZDYWro5.mjs.map} +1 -1
  12. package/dist/{OpenApiTsGenerator-Be-sKGTT.cjs → OpenApiTsGenerator-wLwpaq_I.cjs} +1 -1
  13. package/dist/{OpenApiTsGenerator-Be-sKGTT.cjs.map → OpenApiTsGenerator-wLwpaq_I.cjs.map} +1 -1
  14. package/dist/{SubscriberGenerator-7uX42xyG.d.mts → SubscriberGenerator-Bb-z3Kvx.d.cts} +4 -4
  15. package/dist/{SubscriberGenerator-Dtb3HS4i.d.cts → SubscriberGenerator-CwsXqCpS.d.mts} +4 -4
  16. package/dist/{api-BKIN0s0S.mjs → api-Bp5TIl1R.mjs} +29 -46
  17. package/dist/api-Bp5TIl1R.mjs.map +1 -0
  18. package/dist/{api-B3SCEHPf.cjs → api-D4W9-tdZ.cjs} +29 -46
  19. package/dist/api-D4W9-tdZ.cjs.map +1 -0
  20. package/dist/build/index.cjs +5 -3
  21. package/dist/build/index.d.cts +1 -1
  22. package/dist/build/index.d.mts +1 -1
  23. package/dist/build/index.mjs +5 -3
  24. package/dist/build/manifests.cjs +1 -1
  25. package/dist/build/manifests.d.cts +1 -1
  26. package/dist/build/manifests.d.mts +1 -1
  27. package/dist/build/manifests.mjs +1 -1
  28. package/dist/build/providerResolver.d.cts +1 -1
  29. package/dist/build/providerResolver.d.mts +1 -1
  30. package/dist/build/types.d.cts +2 -2
  31. package/dist/build/types.d.mts +2 -2
  32. package/dist/{build-B8C_qHir.mjs → build-BLriHKgm.mjs} +3 -3
  33. package/dist/{build-B8C_qHir.mjs.map → build-BLriHKgm.mjs.map} +1 -1
  34. package/dist/{build-D0Wr49bf.cjs → build-Z3yGHcy2.cjs} +3 -3
  35. package/dist/{build-D0Wr49bf.cjs.map → build-Z3yGHcy2.cjs.map} +1 -1
  36. package/dist/{config-CLEDqKO3.cjs → config-BP1IZynR.cjs} +17 -6
  37. package/dist/config-BP1IZynR.cjs.map +1 -0
  38. package/dist/{config-Ba-Gbpbc.d.cts → config-CIzRhm_D.d.mts} +2 -2
  39. package/dist/{config-DBsmMDhf.d.mts → config-CvehIYsb.d.cts} +2 -2
  40. package/dist/{config-Dp8RonV_.mjs → config-UCK12Lrr.mjs} +17 -6
  41. package/dist/config-UCK12Lrr.mjs.map +1 -0
  42. package/dist/config.d.cts +1 -1
  43. package/dist/config.d.mts +1 -1
  44. package/dist/dev/index.cjs +3 -1
  45. package/dist/dev/index.d.cts +2 -2
  46. package/dist/dev/index.d.mts +2 -2
  47. package/dist/dev/index.mjs +3 -1
  48. package/dist/{dev-B734w3L1.mjs → dev-BimlVcuk.mjs} +6 -1
  49. package/dist/dev-BimlVcuk.mjs.map +1 -0
  50. package/dist/{dev-DHqYn8k4.cjs → dev-Dcrb_ZSL.cjs} +6 -1
  51. package/dist/dev-Dcrb_ZSL.cjs.map +1 -0
  52. package/dist/{docker-5d8Yh5_X.cjs → docker-2-ipZDOJ.cjs} +1 -1
  53. package/dist/{docker-5d8Yh5_X.cjs.map → docker-2-ipZDOJ.cjs.map} +1 -1
  54. package/dist/{docker-DlUqdFle.mjs → docker-31GNwU3F.mjs} +1 -1
  55. package/dist/{docker-DlUqdFle.mjs.map → docker-31GNwU3F.mjs.map} +1 -1
  56. package/dist/{env-HfuJRlg5.d.cts → env-CQ3hXAAW.d.mts} +2 -2
  57. package/dist/{env-B-OKjgI4.cjs → env-CS0jvg7k.cjs} +1 -1
  58. package/dist/{env-B-OKjgI4.cjs.map → env-CS0jvg7k.cjs.map} +1 -1
  59. package/dist/{env-nd-iQPYM.d.mts → env-D4YFgMqo.d.cts} +2 -2
  60. package/dist/{env-tv1HlZlw.mjs → env-DEeVOvVu.mjs} +1 -1
  61. package/dist/{env-tv1HlZlw.mjs.map → env-DEeVOvVu.mjs.map} +1 -1
  62. package/dist/generators/CronGenerator.d.cts +4 -4
  63. package/dist/generators/CronGenerator.d.mts +4 -4
  64. package/dist/generators/EndpointGenerator.d.cts +4 -4
  65. package/dist/generators/EndpointGenerator.d.mts +4 -4
  66. package/dist/generators/FunctionGenerator.d.cts +4 -4
  67. package/dist/generators/FunctionGenerator.d.mts +4 -4
  68. package/dist/generators/Generator.d.cts +3 -3
  69. package/dist/generators/Generator.d.mts +3 -3
  70. package/dist/generators/OpenApiTsGenerator.cjs +1 -1
  71. package/dist/generators/OpenApiTsGenerator.mjs +1 -1
  72. package/dist/generators/SubscriberGenerator.d.cts +4 -4
  73. package/dist/generators/SubscriberGenerator.d.mts +4 -4
  74. package/dist/generators/index.d.cts +7 -7
  75. package/dist/generators/index.d.mts +7 -7
  76. package/dist/{index-C523No_B.d.mts → index-DG6xNQMH.d.cts} +25 -8
  77. package/dist/{index-DrzN4xkQ.d.cts → index-DZgrOOOW.d.mts} +25 -8
  78. package/dist/index.cjs +21 -21
  79. package/dist/index.cjs.map +1 -1
  80. package/dist/index.mjs +21 -21
  81. package/dist/index.mjs.map +1 -1
  82. package/dist/init/generators/config.cjs +1 -1
  83. package/dist/init/generators/config.d.cts +2 -2
  84. package/dist/init/generators/config.d.mts +2 -2
  85. package/dist/init/generators/config.mjs +1 -1
  86. package/dist/init/generators/docker.cjs +1 -1
  87. package/dist/init/generators/docker.d.cts +1 -1
  88. package/dist/init/generators/docker.d.mts +1 -1
  89. package/dist/init/generators/docker.mjs +1 -1
  90. package/dist/init/generators/env.cjs +1 -1
  91. package/dist/init/generators/env.d.cts +2 -2
  92. package/dist/init/generators/env.d.mts +2 -2
  93. package/dist/init/generators/env.mjs +1 -1
  94. package/dist/init/generators/index.cjs +9 -4
  95. package/dist/init/generators/index.d.cts +5 -5
  96. package/dist/init/generators/index.d.mts +5 -5
  97. package/dist/init/generators/index.mjs +9 -4
  98. package/dist/init/generators/models.cjs +1 -1
  99. package/dist/init/generators/models.d.cts +1 -1
  100. package/dist/init/generators/models.d.mts +1 -1
  101. package/dist/init/generators/models.mjs +1 -1
  102. package/dist/init/generators/monorepo.cjs +1 -1
  103. package/dist/init/generators/monorepo.d.cts +1 -1
  104. package/dist/init/generators/monorepo.d.mts +1 -1
  105. package/dist/init/generators/monorepo.mjs +1 -1
  106. package/dist/init/generators/package.cjs +6 -1
  107. package/dist/init/generators/package.d.cts +2 -2
  108. package/dist/init/generators/package.d.mts +2 -2
  109. package/dist/init/generators/package.mjs +6 -1
  110. package/dist/init/generators/source.cjs +1 -1
  111. package/dist/init/generators/source.d.cts +2 -2
  112. package/dist/init/generators/source.d.mts +2 -2
  113. package/dist/init/generators/source.mjs +1 -1
  114. package/dist/init/index.cjs +14 -14
  115. package/dist/init/index.d.cts +1 -1
  116. package/dist/init/index.d.mts +1 -1
  117. package/dist/init/index.mjs +14 -14
  118. package/dist/init/templates/api.cjs +1 -1
  119. package/dist/init/templates/api.d.cts +1 -1
  120. package/dist/init/templates/api.d.mts +1 -1
  121. package/dist/init/templates/api.mjs +1 -1
  122. package/dist/init/templates/index.cjs +8 -6
  123. package/dist/init/templates/index.d.cts +2 -2
  124. package/dist/init/templates/index.d.mts +2 -2
  125. package/dist/init/templates/index.mjs +6 -6
  126. package/dist/init/templates/minimal.cjs +1 -1
  127. package/dist/init/templates/minimal.d.cts +1 -1
  128. package/dist/init/templates/minimal.d.mts +1 -1
  129. package/dist/init/templates/minimal.mjs +1 -1
  130. package/dist/init/templates/serverless.cjs +1 -1
  131. package/dist/init/templates/serverless.d.cts +1 -1
  132. package/dist/init/templates/serverless.d.mts +1 -1
  133. package/dist/init/templates/serverless.mjs +1 -1
  134. package/dist/init/templates/worker.cjs +1 -1
  135. package/dist/init/templates/worker.d.cts +1 -1
  136. package/dist/init/templates/worker.d.mts +1 -1
  137. package/dist/init/templates/worker.mjs +1 -1
  138. package/dist/init/utils.cjs +1 -1
  139. package/dist/init/utils.mjs +1 -1
  140. package/dist/{init-CtOnZn3G.mjs → init-BMA7xi8r.mjs} +37 -21
  141. package/dist/init-BMA7xi8r.mjs.map +1 -0
  142. package/dist/{init-qLFsWR-R.cjs → init-D-7WEk-b.cjs} +37 -21
  143. package/dist/init-D-7WEk-b.cjs.map +1 -0
  144. package/dist/{manifests-DIA_2QYd.mjs → manifests-BNKG6AXf.mjs} +1 -1
  145. package/dist/{manifests-DIA_2QYd.mjs.map → manifests-BNKG6AXf.mjs.map} +1 -1
  146. package/dist/{manifests-VJ9-2JpW.cjs → manifests-D13Ej8AE.cjs} +1 -1
  147. package/dist/{manifests-VJ9-2JpW.cjs.map → manifests-D13Ej8AE.cjs.map} +1 -1
  148. package/dist/{minimal-C4GsE45s.mjs → minimal-BkyASH_C.mjs} +15 -9
  149. package/dist/minimal-BkyASH_C.mjs.map +1 -0
  150. package/dist/{minimal-Bdhhpp7v.cjs → minimal-CSFggzdH.cjs} +15 -9
  151. package/dist/minimal-CSFggzdH.cjs.map +1 -0
  152. package/dist/{models-cvNg6Oea.mjs → models-BWlDfviw.mjs} +1 -1
  153. package/dist/{models-cvNg6Oea.mjs.map → models-BWlDfviw.mjs.map} +1 -1
  154. package/dist/{models-DyNwdOcz.cjs → models-BapGSoHC.cjs} +1 -1
  155. package/dist/{models-DyNwdOcz.cjs.map → models-BapGSoHC.cjs.map} +1 -1
  156. package/dist/{monorepo-Cknwzj5C.mjs → monorepo-BBOWhkcd.mjs} +1 -1
  157. package/dist/{monorepo-Cknwzj5C.mjs.map → monorepo-BBOWhkcd.mjs.map} +1 -1
  158. package/dist/{monorepo-sEK8gW59.cjs → monorepo-CFtxHeDh.cjs} +1 -1
  159. package/dist/{monorepo-sEK8gW59.cjs.map → monorepo-CFtxHeDh.cjs.map} +1 -1
  160. package/dist/openapi-CTae4ybf.cjs +98 -0
  161. package/dist/openapi-CTae4ybf.cjs.map +1 -0
  162. package/dist/openapi-Dn9MeKg3.mjs +74 -0
  163. package/dist/openapi-Dn9MeKg3.mjs.map +1 -0
  164. package/dist/{openapi-react-query-DxHjXQvg.cjs → openapi-react-query-Cp-w8_05.cjs} +1 -1
  165. package/dist/{openapi-react-query-DxHjXQvg.cjs.map → openapi-react-query-Cp-w8_05.cjs.map} +1 -1
  166. package/dist/{openapi-react-query-o7Mp1Jd5.mjs → openapi-react-query-_-B3s8v_.mjs} +1 -1
  167. package/dist/{openapi-react-query-o7Mp1Jd5.mjs.map → openapi-react-query-_-B3s8v_.mjs.map} +1 -1
  168. package/dist/openapi-react-query.cjs +1 -1
  169. package/dist/openapi-react-query.mjs +1 -1
  170. package/dist/openapi.cjs +6 -3
  171. package/dist/openapi.d.cts +23 -3
  172. package/dist/openapi.d.mts +23 -3
  173. package/dist/openapi.mjs +3 -3
  174. package/dist/{package-C7WhWU8m.d.mts → package-6h-7QfJZ.d.cts} +2 -2
  175. package/dist/{package-DvWEMz6z.d.cts → package-BCe_KvGv.d.mts} +2 -2
  176. package/dist/{package-CIfmeuSW.mjs → package-C3If80n1.mjs} +7 -1
  177. package/dist/package-C3If80n1.mjs.map +1 -0
  178. package/dist/{package-PP-o1nvq.cjs → package-Dk8IMBOB.cjs} +6 -1
  179. package/dist/package-Dk8IMBOB.cjs.map +1 -0
  180. package/dist/{serverless-Yav3GRVz.cjs → serverless-AGOS-l3G.cjs} +15 -10
  181. package/dist/serverless-AGOS-l3G.cjs.map +1 -0
  182. package/dist/{serverless-DkHBF2vC.mjs → serverless-D5HjJByU.mjs} +15 -10
  183. package/dist/serverless-D5HjJByU.mjs.map +1 -0
  184. package/dist/{source-DT5Xhiob.cjs → source-C1cyfHcF.cjs} +1 -1
  185. package/dist/{source-DT5Xhiob.cjs.map → source-C1cyfHcF.cjs.map} +1 -1
  186. package/dist/{source-D6v2BnKT.d.mts → source-C3LiNUV9.d.mts} +2 -2
  187. package/dist/{source-DnaH_MLA.mjs → source-CkQHBpwu.mjs} +1 -1
  188. package/dist/{source-DnaH_MLA.mjs.map → source-CkQHBpwu.mjs.map} +1 -1
  189. package/dist/{source-D8fK9qRo.d.cts → source-Dtcjbokc.d.cts} +2 -2
  190. package/dist/templates-C0EMmhwb.mjs +88 -0
  191. package/dist/templates-C0EMmhwb.mjs.map +1 -0
  192. package/dist/templates-CbgQ9dw0.cjs +123 -0
  193. package/dist/templates-CbgQ9dw0.cjs.map +1 -0
  194. package/dist/{types-Cxl8-uwV.d.mts → types-Bi7VzDUZ.d.mts} +31 -2
  195. package/dist/{types-C4KITv-y.d.mts → types-D2xYkOal.d.mts} +2 -2
  196. package/dist/{types-DLFN49M3.d.cts → types-DA-r8HWZ.d.cts} +2 -2
  197. package/dist/{types-DB99_qIy.d.cts → types-KmjzMgu8.d.cts} +31 -2
  198. package/dist/types.d.cts +2 -2
  199. package/dist/types.d.mts +2 -2
  200. package/dist/{utils-C31-SWHP.mjs → utils-CKEzCxc1.mjs} +1 -1
  201. package/dist/{utils-C31-SWHP.mjs.map → utils-CKEzCxc1.mjs.map} +1 -1
  202. package/dist/{utils-BX3F4fT8.cjs → utils-DSdN2MTt.cjs} +1 -1
  203. package/dist/{utils-BX3F4fT8.cjs.map → utils-DSdN2MTt.cjs.map} +1 -1
  204. package/dist/{worker--8O5a3Hv.cjs → worker-CGhlqNH-.cjs} +15 -9
  205. package/dist/worker-CGhlqNH-.cjs.map +1 -0
  206. package/dist/{worker-Jme7uOOJ.mjs → worker-CiP420As.mjs} +15 -9
  207. package/dist/worker-CiP420As.mjs.map +1 -0
  208. package/examples/gkm.config.ts +3 -5
  209. package/package.json +4 -4
  210. package/src/__tests__/openapi.spec.ts +395 -302
  211. package/src/dev/__tests__/index.spec.ts +114 -119
  212. package/src/dev/index.ts +18 -0
  213. package/src/init/generators/config.ts +23 -5
  214. package/src/init/generators/package.ts +11 -4
  215. package/src/init/index.ts +26 -7
  216. package/src/init/templates/api.ts +38 -56
  217. package/src/init/templates/index.ts +46 -11
  218. package/src/init/templates/minimal.ts +23 -10
  219. package/src/init/templates/serverless.ts +23 -11
  220. package/src/init/templates/worker.ts +23 -10
  221. package/src/openapi.ts +83 -45
  222. package/src/types.ts +30 -0
  223. package/dist/api-B3SCEHPf.cjs.map +0 -1
  224. package/dist/api-BKIN0s0S.mjs.map +0 -1
  225. package/dist/config-CLEDqKO3.cjs.map +0 -1
  226. package/dist/config-Dp8RonV_.mjs.map +0 -1
  227. package/dist/dev-B734w3L1.mjs.map +0 -1
  228. package/dist/dev-DHqYn8k4.cjs.map +0 -1
  229. package/dist/init-CtOnZn3G.mjs.map +0 -1
  230. package/dist/init-qLFsWR-R.cjs.map +0 -1
  231. package/dist/minimal-Bdhhpp7v.cjs.map +0 -1
  232. package/dist/minimal-C4GsE45s.mjs.map +0 -1
  233. package/dist/openapi-BQWPWyNB.cjs +0 -56
  234. package/dist/openapi-BQWPWyNB.cjs.map +0 -1
  235. package/dist/openapi-DBX8cJJ8.mjs +0 -50
  236. package/dist/openapi-DBX8cJJ8.mjs.map +0 -1
  237. package/dist/package-CIfmeuSW.mjs.map +0 -1
  238. package/dist/package-PP-o1nvq.cjs.map +0 -1
  239. package/dist/serverless-DkHBF2vC.mjs.map +0 -1
  240. package/dist/serverless-Yav3GRVz.cjs.map +0 -1
  241. package/dist/templates-CBFUwpBy.mjs +0 -64
  242. package/dist/templates-CBFUwpBy.mjs.map +0 -1
  243. package/dist/templates-DM_rtYYW.cjs +0 -87
  244. package/dist/templates-DM_rtYYW.cjs.map +0 -1
  245. package/dist/worker--8O5a3Hv.cjs.map +0 -1
  246. package/dist/worker-Jme7uOOJ.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-CtOnZn3G.mjs","names":["projectName?: string","options: InitOptions","value: string","templateOptions: TemplateOptions"],"sources":["../src/init/index.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport prompts from 'prompts';\nimport { generateConfigFiles } from './generators/config.js';\nimport { generateDockerFiles } from './generators/docker.js';\nimport { generateEnvFiles } from './generators/env.js';\nimport { generateModelsPackage } from './generators/models.js';\nimport { generateMonorepoFiles } from './generators/monorepo.js';\nimport { generatePackageJson } from './generators/package.js';\nimport { generateSourceFiles } from './generators/source.js';\nimport {\n type TemplateName,\n type TemplateOptions,\n getTemplate,\n routeStyleChoices,\n templateChoices,\n} from './templates/index.js';\nimport {\n checkDirectoryExists,\n detectPackageManager,\n getInstallCommand,\n getRunCommand,\n validateProjectName,\n} from './utils.js';\n\nexport interface InitOptions {\n template?: TemplateName;\n skipInstall?: boolean;\n yes?: boolean;\n monorepo?: boolean;\n apiPath?: string;\n}\n\n/**\n * Main init command - scaffolds a new project\n */\nexport async function initCommand(\n projectName?: string,\n options: InitOptions = {},\n): Promise<void> {\n const cwd = process.cwd();\n const pkgManager = detectPackageManager(cwd);\n\n // Handle Ctrl+C gracefully\n prompts.override({});\n const onCancel = () => {\n process.exit(0);\n };\n\n // Gather answers via prompts\n const answers = await prompts(\n [\n {\n type: projectName ? null : 'text',\n name: 'name',\n message: 'Project name:',\n initial: 'my-api',\n validate: (value: string) => {\n const nameValid = validateProjectName(value);\n if (nameValid !== true) return nameValid;\n const dirValid = checkDirectoryExists(value, cwd);\n if (dirValid !== true) return dirValid;\n return true;\n },\n },\n {\n type: options.template || options.yes ? null : 'select',\n name: 'template',\n message: 'Template:',\n choices: templateChoices,\n initial: 0,\n },\n {\n type: options.yes ? null : 'confirm',\n name: 'telescope',\n message: 'Include Telescope (debugging dashboard)?',\n initial: true,\n },\n {\n type: options.yes ? null : 'confirm',\n name: 'database',\n message: 'Include database support (Kysely)?',\n initial: true,\n },\n {\n type: options.yes ? null : 'select',\n name: 'routeStyle',\n message: 'Route organization:',\n choices: routeStyleChoices,\n initial: 0,\n },\n {\n type: options.yes || options.monorepo !== undefined ? null : 'confirm',\n name: 'monorepo',\n message: 'Setup as monorepo?',\n initial: false,\n },\n {\n type: (prev) =>\n (prev === true || options.monorepo) && !options.apiPath\n ? 'text'\n : null,\n name: 'apiPath',\n message: 'API app path:',\n initial: 'apps/api',\n },\n ],\n { onCancel },\n );\n\n // Build final options\n const name = projectName || answers.name;\n if (!name) {\n console.error(' Error: Project name is required\\n');\n process.exit(1);\n }\n\n // Validate name if provided via argument\n if (projectName) {\n const nameValid = validateProjectName(projectName);\n if (nameValid !== true) {\n console.error(` Error: ${nameValid}\\n`);\n process.exit(1);\n }\n const dirValid = checkDirectoryExists(projectName, cwd);\n if (dirValid !== true) {\n console.error(` Error: ${dirValid}\\n`);\n process.exit(1);\n }\n }\n\n const monorepo =\n options.monorepo ?? (options.yes ? false : (answers.monorepo ?? false));\n const templateOptions: TemplateOptions = {\n name,\n template: options.template || answers.template || 'minimal',\n telescope: options.yes ? true : (answers.telescope ?? true),\n database: options.yes ? true : (answers.database ?? true),\n routeStyle: options.yes\n ? 'file-based'\n : (answers.routeStyle ?? 'file-based'),\n monorepo,\n apiPath: monorepo ? (options.apiPath ?? answers.apiPath ?? 'apps/api') : '',\n };\n\n const targetDir = join(cwd, name);\n const template = getTemplate(templateOptions.template);\n\n const isMonorepo = templateOptions.monorepo;\n const apiPath = templateOptions.apiPath;\n\n // Create project directory\n await mkdir(targetDir, { recursive: true });\n\n // For monorepo, app files go in the specified apiPath (e.g., apps/api)\n const appDir = isMonorepo ? join(targetDir, apiPath) : targetDir;\n if (isMonorepo) {\n await mkdir(appDir, { recursive: true });\n }\n\n // Collect app files\n const appFiles = [\n ...generatePackageJson(templateOptions, template),\n ...generateConfigFiles(templateOptions, template),\n ...generateEnvFiles(templateOptions, template),\n ...generateSourceFiles(templateOptions, template),\n ...generateDockerFiles(templateOptions, template),\n ];\n\n // Collect root monorepo files (includes packages/models)\n const rootFiles = [\n ...generateMonorepoFiles(templateOptions, template),\n ...generateModelsPackage(templateOptions),\n ];\n\n // Write root files (for monorepo)\n for (const { path, content } of rootFiles) {\n const fullPath = join(targetDir, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content);\n }\n\n // Write app files\n for (const { path, content } of appFiles) {\n const fullPath = join(appDir, path);\n const displayPath = isMonorepo ? `${apiPath}/${path}` : path;\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content);\n }\n\n // Install dependencies\n if (!options.skipInstall) {\n try {\n execSync(getInstallCommand(pkgManager), {\n cwd: targetDir,\n stdio: 'inherit',\n });\n } catch {\n console.error('\\n Warning: Failed to install dependencies.');\n }\n }\n\n // Print next steps\n const devCommand = getRunCommand(pkgManager, 'dev');\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-qLFsWR-R.cjs","names":["projectName?: string","options: InitOptions","value: string","templateChoices","routeStyleChoices","templateOptions: TemplateOptions"],"sources":["../src/init/index.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport prompts from 'prompts';\nimport { generateConfigFiles } from './generators/config.js';\nimport { generateDockerFiles } from './generators/docker.js';\nimport { generateEnvFiles } from './generators/env.js';\nimport { generateModelsPackage } from './generators/models.js';\nimport { generateMonorepoFiles } from './generators/monorepo.js';\nimport { generatePackageJson } from './generators/package.js';\nimport { generateSourceFiles } from './generators/source.js';\nimport {\n type TemplateName,\n type TemplateOptions,\n getTemplate,\n routeStyleChoices,\n templateChoices,\n} from './templates/index.js';\nimport {\n checkDirectoryExists,\n detectPackageManager,\n getInstallCommand,\n getRunCommand,\n validateProjectName,\n} from './utils.js';\n\nexport interface InitOptions {\n template?: TemplateName;\n skipInstall?: boolean;\n yes?: boolean;\n monorepo?: boolean;\n apiPath?: string;\n}\n\n/**\n * Main init command - scaffolds a new project\n */\nexport async function initCommand(\n projectName?: string,\n options: InitOptions = {},\n): Promise<void> {\n const cwd = process.cwd();\n const pkgManager = detectPackageManager(cwd);\n\n // Handle Ctrl+C gracefully\n prompts.override({});\n const onCancel = () => {\n process.exit(0);\n };\n\n // Gather answers via prompts\n const answers = await prompts(\n [\n {\n type: projectName ? null : 'text',\n name: 'name',\n message: 'Project name:',\n initial: 'my-api',\n validate: (value: string) => {\n const nameValid = validateProjectName(value);\n if (nameValid !== true) return nameValid;\n const dirValid = checkDirectoryExists(value, cwd);\n if (dirValid !== true) return dirValid;\n return true;\n },\n },\n {\n type: options.template || options.yes ? null : 'select',\n name: 'template',\n message: 'Template:',\n choices: templateChoices,\n initial: 0,\n },\n {\n type: options.yes ? null : 'confirm',\n name: 'telescope',\n message: 'Include Telescope (debugging dashboard)?',\n initial: true,\n },\n {\n type: options.yes ? null : 'confirm',\n name: 'database',\n message: 'Include database support (Kysely)?',\n initial: true,\n },\n {\n type: options.yes ? null : 'select',\n name: 'routeStyle',\n message: 'Route organization:',\n choices: routeStyleChoices,\n initial: 0,\n },\n {\n type: options.yes || options.monorepo !== undefined ? null : 'confirm',\n name: 'monorepo',\n message: 'Setup as monorepo?',\n initial: false,\n },\n {\n type: (prev) =>\n (prev === true || options.monorepo) && !options.apiPath\n ? 'text'\n : null,\n name: 'apiPath',\n message: 'API app path:',\n initial: 'apps/api',\n },\n ],\n { onCancel },\n );\n\n // Build final options\n const name = projectName || answers.name;\n if (!name) {\n console.error(' Error: Project name is required\\n');\n process.exit(1);\n }\n\n // Validate name if provided via argument\n if (projectName) {\n const nameValid = validateProjectName(projectName);\n if (nameValid !== true) {\n console.error(` Error: ${nameValid}\\n`);\n process.exit(1);\n }\n const dirValid = checkDirectoryExists(projectName, cwd);\n if (dirValid !== true) {\n console.error(` Error: ${dirValid}\\n`);\n process.exit(1);\n }\n }\n\n const monorepo =\n options.monorepo ?? (options.yes ? false : (answers.monorepo ?? false));\n const templateOptions: TemplateOptions = {\n name,\n template: options.template || answers.template || 'minimal',\n telescope: options.yes ? true : (answers.telescope ?? true),\n database: options.yes ? true : (answers.database ?? true),\n routeStyle: options.yes\n ? 'file-based'\n : (answers.routeStyle ?? 'file-based'),\n monorepo,\n apiPath: monorepo ? (options.apiPath ?? answers.apiPath ?? 'apps/api') : '',\n };\n\n const targetDir = join(cwd, name);\n const template = getTemplate(templateOptions.template);\n\n const isMonorepo = templateOptions.monorepo;\n const apiPath = templateOptions.apiPath;\n\n // Create project directory\n await mkdir(targetDir, { recursive: true });\n\n // For monorepo, app files go in the specified apiPath (e.g., apps/api)\n const appDir = isMonorepo ? join(targetDir, apiPath) : targetDir;\n if (isMonorepo) {\n await mkdir(appDir, { recursive: true });\n }\n\n // Collect app files\n const appFiles = [\n ...generatePackageJson(templateOptions, template),\n ...generateConfigFiles(templateOptions, template),\n ...generateEnvFiles(templateOptions, template),\n ...generateSourceFiles(templateOptions, template),\n ...generateDockerFiles(templateOptions, template),\n ];\n\n // Collect root monorepo files (includes packages/models)\n const rootFiles = [\n ...generateMonorepoFiles(templateOptions, template),\n ...generateModelsPackage(templateOptions),\n ];\n\n // Write root files (for monorepo)\n for (const { path, content } of rootFiles) {\n const fullPath = join(targetDir, path);\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content);\n }\n\n // Write app files\n for (const { path, content } of appFiles) {\n const fullPath = join(appDir, path);\n const displayPath = isMonorepo ? `${apiPath}/${path}` : path;\n await mkdir(dirname(fullPath), { recursive: true });\n await writeFile(fullPath, content);\n }\n\n // Install dependencies\n if (!options.skipInstall) {\n try {\n execSync(getInstallCommand(pkgManager), {\n cwd: targetDir,\n stdio: 'inherit',\n });\n } catch {\n console.error('\\n Warning: Failed to install dependencies.');\n }\n }\n\n // Print next steps\n const devCommand = getRunCommand(pkgManager, 'dev');\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"minimal-Bdhhpp7v.cjs","names":["minimalTemplate: TemplateConfig","options: TemplateOptions","files: GeneratedFile[]"],"sources":["../src/init/templates/minimal.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from './index.js';\n\nexport const minimalTemplate: TemplateConfig = {\n name: 'minimal',\n description: 'Basic health endpoint',\n\n dependencies: {\n '@geekmidas/constructs': 'workspace:*',\n '@geekmidas/envkit': 'workspace:*',\n '@geekmidas/logger': 'workspace:*',\n hono: '~4.8.2',\n pino: '~9.6.0',\n },\n\n devDependencies: {\n '@biomejs/biome': '~1.9.4',\n '@geekmidas/cli': 'workspace:*',\n '@types/node': '~22.0.0',\n tsx: '~4.20.0',\n turbo: '~2.3.0',\n typescript: '~5.8.2',\n vitest: '~4.0.0',\n },\n\n scripts: {\n dev: 'gkm dev',\n build: 'gkm build',\n test: 'vitest',\n 'test:once': 'vitest run',\n typecheck: 'tsc --noEmit',\n lint: 'biome lint .',\n fmt: 'biome format . --write',\n 'fmt:check': 'biome format .',\n },\n\n files: (options: TemplateOptions): GeneratedFile[] => {\n const files: GeneratedFile[] = [\n // src/config/env.ts\n {\n path: 'src/config/env.ts',\n content: `import { EnvironmentParser } from '@geekmidas/envkit';\n\nexport const envParser = new EnvironmentParser(process.env);\n\nexport const config = envParser\n .create((get) => ({\n port: get('PORT').string().transform(Number).default(3000),\n nodeEnv: get('NODE_ENV').string().default('development'),\n }))\n .parse();\n`,\n },\n\n // src/config/logger.ts - using pino\n {\n path: 'src/config/logger.ts',\n content: `import { PinoLogger } from '@geekmidas/logger/pino';\n\nexport const logger = new PinoLogger({\n app: '${options.name}',\n level: process.env.LOG_LEVEL || 'info',\n});\n`,\n },\n\n // src/endpoints/health.ts\n {\n path: 'src/endpoints/health.ts',\n content: `import { e } from '@geekmidas/constructs/endpoints';\n\nexport default e\n .get('/health')\n .handle(async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n }));\n`,\n },\n ];\n\n // Add Telescope config if enabled\n if (options.telescope) {\n files.push({\n path: 'src/config/telescope.ts',\n content: `import { Telescope } from '@geekmidas/telescope';\nimport { InMemoryStorage } from '@geekmidas/telescope/storage/memory';\n\nexport const telescope = new Telescope({\n storage: new InMemoryStorage({ maxEntries: 100 }),\n enabled: process.env.NODE_ENV === 'development',\n});\n`,\n });\n }\n\n return files;\n },\n};\n"],"mappings":";;AAMA,MAAaA,kBAAkC;CAC7C,MAAM;CACN,aAAa;CAEb,cAAc;EACZ,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,MAAM;EACN,MAAM;CACP;CAED,iBAAiB;EACf,kBAAkB;EAClB,kBAAkB;EAClB,eAAe;EACf,KAAK;EACL,OAAO;EACP,YAAY;EACZ,QAAQ;CACT;CAED,SAAS;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,aAAa;EACb,WAAW;EACX,MAAM;EACN,KAAK;EACL,aAAa;CACd;CAED,OAAO,CAACC,YAA8C;EACpD,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;;;;;GAWX;GAGD;IACE,MAAM;IACN,UAAU;;;UAGR,QAAQ,KAAK;;;;GAIhB;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;GASX;EACF;AAGD,MAAI,QAAQ,UACV,OAAM,KAAK;GACT,MAAM;GACN,UAAU;;;;;;;;EAQX,EAAC;AAGJ,SAAO;CACR;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"minimal-C4GsE45s.mjs","names":["minimalTemplate: TemplateConfig","options: TemplateOptions","files: GeneratedFile[]"],"sources":["../src/init/templates/minimal.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from './index.js';\n\nexport const minimalTemplate: TemplateConfig = {\n name: 'minimal',\n description: 'Basic health endpoint',\n\n dependencies: {\n '@geekmidas/constructs': 'workspace:*',\n '@geekmidas/envkit': 'workspace:*',\n '@geekmidas/logger': 'workspace:*',\n hono: '~4.8.2',\n pino: '~9.6.0',\n },\n\n devDependencies: {\n '@biomejs/biome': '~1.9.4',\n '@geekmidas/cli': 'workspace:*',\n '@types/node': '~22.0.0',\n tsx: '~4.20.0',\n turbo: '~2.3.0',\n typescript: '~5.8.2',\n vitest: '~4.0.0',\n },\n\n scripts: {\n dev: 'gkm dev',\n build: 'gkm build',\n test: 'vitest',\n 'test:once': 'vitest run',\n typecheck: 'tsc --noEmit',\n lint: 'biome lint .',\n fmt: 'biome format . --write',\n 'fmt:check': 'biome format .',\n },\n\n files: (options: TemplateOptions): GeneratedFile[] => {\n const files: GeneratedFile[] = [\n // src/config/env.ts\n {\n path: 'src/config/env.ts',\n content: `import { EnvironmentParser } from '@geekmidas/envkit';\n\nexport const envParser = new EnvironmentParser(process.env);\n\nexport const config = envParser\n .create((get) => ({\n port: get('PORT').string().transform(Number).default(3000),\n nodeEnv: get('NODE_ENV').string().default('development'),\n }))\n .parse();\n`,\n },\n\n // src/config/logger.ts - using pino\n {\n path: 'src/config/logger.ts',\n content: `import { PinoLogger } from '@geekmidas/logger/pino';\n\nexport const logger = new PinoLogger({\n app: '${options.name}',\n level: process.env.LOG_LEVEL || 'info',\n});\n`,\n },\n\n // src/endpoints/health.ts\n {\n path: 'src/endpoints/health.ts',\n content: `import { e } from '@geekmidas/constructs/endpoints';\n\nexport default e\n .get('/health')\n .handle(async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n }));\n`,\n },\n ];\n\n // Add Telescope config if enabled\n if (options.telescope) {\n files.push({\n path: 'src/config/telescope.ts',\n content: `import { Telescope } from '@geekmidas/telescope';\nimport { InMemoryStorage } from '@geekmidas/telescope/storage/memory';\n\nexport const telescope = new Telescope({\n storage: new InMemoryStorage({ maxEntries: 100 }),\n enabled: process.env.NODE_ENV === 'development',\n});\n`,\n });\n }\n\n return files;\n },\n};\n"],"mappings":";AAMA,MAAaA,kBAAkC;CAC7C,MAAM;CACN,aAAa;CAEb,cAAc;EACZ,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,MAAM;EACN,MAAM;CACP;CAED,iBAAiB;EACf,kBAAkB;EAClB,kBAAkB;EAClB,eAAe;EACf,KAAK;EACL,OAAO;EACP,YAAY;EACZ,QAAQ;CACT;CAED,SAAS;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,aAAa;EACb,WAAW;EACX,MAAM;EACN,KAAK;EACL,aAAa;CACd;CAED,OAAO,CAACC,YAA8C;EACpD,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;;;;;GAWX;GAGD;IACE,MAAM;IACN,UAAU;;;UAGR,QAAQ,KAAK;;;;GAIhB;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;GASX;EACF;AAGD,MAAI,QAAQ,UACV,OAAM,KAAK;GACT,MAAM;GACN,UAAU;;;;;;;;EAQX,EAAC;AAGJ,SAAO;CACR;AACF"}
@@ -1,56 +0,0 @@
1
- const require_chunk = require('./chunk-CUT6urMc.cjs');
2
- const require_config = require('./config-CFls09Ey.cjs');
3
- const require_EndpointGenerator = require('./EndpointGenerator-npWEDoK2.cjs');
4
- const require_OpenApiTsGenerator = require('./OpenApiTsGenerator-Be-sKGTT.cjs');
5
- const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
6
- const node_path = require_chunk.__toESM(require("node:path"));
7
- const __geekmidas_constructs_endpoints = require_chunk.__toESM(require("@geekmidas/constructs/endpoints"));
8
-
9
- //#region src/openapi.ts
10
- async function openapiCommand(options = {}) {
11
- const logger = console;
12
- try {
13
- const config = await require_config.loadConfig(options.cwd);
14
- const endpointGenerator = new require_EndpointGenerator.EndpointGenerator();
15
- const loadedEndpoints = await endpointGenerator.load(config.routes);
16
- if (loadedEndpoints.length === 0) {
17
- logger.log("No valid endpoints found");
18
- return;
19
- }
20
- const endpoints = loadedEndpoints.map(({ construct }) => construct);
21
- const isJson = options.json === true;
22
- const defaultOutput = isJson ? "openapi.json" : "openapi.ts";
23
- const outputPath = options.output || (0, node_path.join)(process.cwd(), defaultOutput);
24
- await (0, node_fs_promises.mkdir)((0, node_path.dirname)(outputPath), { recursive: true });
25
- if (isJson) {
26
- const spec = await __geekmidas_constructs_endpoints.Endpoint.buildOpenApiSchema(endpoints, {
27
- title: "API Documentation",
28
- version: "1.0.0",
29
- description: "Auto-generated API documentation from endpoints"
30
- });
31
- await (0, node_fs_promises.writeFile)(outputPath, JSON.stringify(spec, null, 2));
32
- logger.log(`OpenAPI JSON spec generated: ${outputPath}`);
33
- } else {
34
- const tsGenerator = new require_OpenApiTsGenerator.OpenApiTsGenerator();
35
- const tsContent = await tsGenerator.generate(endpoints, {
36
- title: "API Documentation",
37
- version: "1.0.0",
38
- description: "Auto-generated API documentation from endpoints"
39
- });
40
- await (0, node_fs_promises.writeFile)(outputPath, tsContent);
41
- logger.log(`OpenAPI TypeScript module generated: ${outputPath}`);
42
- }
43
- logger.log(`Found ${endpoints.length} endpoints`);
44
- } catch (error) {
45
- throw new Error(`OpenAPI generation failed: ${error.message}`);
46
- }
47
- }
48
-
49
- //#endregion
50
- Object.defineProperty(exports, 'openapiCommand', {
51
- enumerable: true,
52
- get: function () {
53
- return openapiCommand;
54
- }
55
- });
56
- //# sourceMappingURL=openapi-BQWPWyNB.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openapi-BQWPWyNB.cjs","names":["options: OpenAPIOptions","EndpointGenerator","OpenApiTsGenerator"],"sources":["../src/openapi.ts"],"sourcesContent":["#!/usr/bin/env -S npx tsx\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { Endpoint } from '@geekmidas/constructs/endpoints';\nimport { loadConfig } from './config.js';\nimport { EndpointGenerator } from './generators/EndpointGenerator.js';\nimport { OpenApiTsGenerator } from './generators/OpenApiTsGenerator.js';\n\ninterface OpenAPIOptions {\n output?: string;\n json?: boolean;\n cwd?: string;\n}\n\nexport async function openapiCommand(\n options: OpenAPIOptions = {},\n): Promise<void> {\n const logger = console;\n\n try {\n // Load config using existing function\n const config = await loadConfig(options.cwd);\n const endpointGenerator = new EndpointGenerator();\n\n // Load all endpoints using the refactored function\n const loadedEndpoints = await endpointGenerator.load(config.routes);\n\n if (loadedEndpoints.length === 0) {\n logger.log('No valid endpoints found');\n return;\n }\n\n // Extract just the endpoint instances for OpenAPI generation\n const endpoints = loadedEndpoints.map(({ construct }) => construct);\n\n // Determine output format (TypeScript is default)\n const isJson = options.json === true;\n const defaultOutput = isJson ? 'openapi.json' : 'openapi.ts';\n const outputPath = options.output || join(process.cwd(), defaultOutput);\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n if (isJson) {\n // Generate JSON OpenAPI spec (legacy)\n const spec = await Endpoint.buildOpenApiSchema(endpoints, {\n title: 'API Documentation',\n version: '1.0.0',\n description: 'Auto-generated API documentation from endpoints',\n });\n\n await writeFile(outputPath, JSON.stringify(spec, null, 2));\n logger.log(`OpenAPI JSON spec generated: ${outputPath}`);\n } else {\n // Generate TypeScript OpenAPI module (default)\n const tsGenerator = new OpenApiTsGenerator();\n const tsContent = await tsGenerator.generate(endpoints, {\n title: 'API Documentation',\n version: '1.0.0',\n description: 'Auto-generated API documentation from endpoints',\n });\n\n await writeFile(outputPath, tsContent);\n logger.log(`OpenAPI TypeScript module generated: ${outputPath}`);\n }\n\n logger.log(`Found ${endpoints.length} endpoints`);\n } catch (error) {\n throw new Error(`OpenAPI generation failed: ${(error as Error).message}`);\n }\n}\n"],"mappings":";;;;;;;;;AAeA,eAAsB,eACpBA,UAA0B,CAAE,GACb;CACf,MAAM,SAAS;AAEf,KAAI;EAEF,MAAM,SAAS,MAAM,0BAAW,QAAQ,IAAI;EAC5C,MAAM,oBAAoB,IAAIC;EAG9B,MAAM,kBAAkB,MAAM,kBAAkB,KAAK,OAAO,OAAO;AAEnE,MAAI,gBAAgB,WAAW,GAAG;AAChC,UAAO,IAAI,2BAA2B;AACtC;EACD;EAGD,MAAM,YAAY,gBAAgB,IAAI,CAAC,EAAE,WAAW,KAAK,UAAU;EAGnE,MAAM,SAAS,QAAQ,SAAS;EAChC,MAAM,gBAAgB,SAAS,iBAAiB;EAChD,MAAM,aAAa,QAAQ,UAAU,oBAAK,QAAQ,KAAK,EAAE,cAAc;AAGvE,QAAM,4BAAM,uBAAQ,WAAW,EAAE,EAAE,WAAW,KAAM,EAAC;AAErD,MAAI,QAAQ;GAEV,MAAM,OAAO,MAAM,0CAAS,mBAAmB,WAAW;IACxD,OAAO;IACP,SAAS;IACT,aAAa;GACd,EAAC;AAEF,SAAM,gCAAU,YAAY,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;AAC1D,UAAO,KAAK,+BAA+B,WAAW,EAAE;EACzD,OAAM;GAEL,MAAM,cAAc,IAAIC;GACxB,MAAM,YAAY,MAAM,YAAY,SAAS,WAAW;IACtD,OAAO;IACP,SAAS;IACT,aAAa;GACd,EAAC;AAEF,SAAM,gCAAU,YAAY,UAAU;AACtC,UAAO,KAAK,uCAAuC,WAAW,EAAE;EACjE;AAED,SAAO,KAAK,QAAQ,UAAU,OAAO,YAAY;CAClD,SAAQ,OAAO;AACd,QAAM,IAAI,OAAO,6BAA8B,MAAgB,QAAQ;CACxE;AACF"}
@@ -1,50 +0,0 @@
1
- import { loadConfig } from "./config-Bq72aj8e.mjs";
2
- import { EndpointGenerator } from "./EndpointGenerator-DGivkPLT.mjs";
3
- import { OpenApiTsGenerator } from "./OpenApiTsGenerator-C4mHHaku.mjs";
4
- import { mkdir, writeFile } from "node:fs/promises";
5
- import { dirname, join } from "node:path";
6
- import { Endpoint } from "@geekmidas/constructs/endpoints";
7
-
8
- //#region src/openapi.ts
9
- async function openapiCommand(options = {}) {
10
- const logger = console;
11
- try {
12
- const config = await loadConfig(options.cwd);
13
- const endpointGenerator = new EndpointGenerator();
14
- const loadedEndpoints = await endpointGenerator.load(config.routes);
15
- if (loadedEndpoints.length === 0) {
16
- logger.log("No valid endpoints found");
17
- return;
18
- }
19
- const endpoints = loadedEndpoints.map(({ construct }) => construct);
20
- const isJson = options.json === true;
21
- const defaultOutput = isJson ? "openapi.json" : "openapi.ts";
22
- const outputPath = options.output || join(process.cwd(), defaultOutput);
23
- await mkdir(dirname(outputPath), { recursive: true });
24
- if (isJson) {
25
- const spec = await Endpoint.buildOpenApiSchema(endpoints, {
26
- title: "API Documentation",
27
- version: "1.0.0",
28
- description: "Auto-generated API documentation from endpoints"
29
- });
30
- await writeFile(outputPath, JSON.stringify(spec, null, 2));
31
- logger.log(`OpenAPI JSON spec generated: ${outputPath}`);
32
- } else {
33
- const tsGenerator = new OpenApiTsGenerator();
34
- const tsContent = await tsGenerator.generate(endpoints, {
35
- title: "API Documentation",
36
- version: "1.0.0",
37
- description: "Auto-generated API documentation from endpoints"
38
- });
39
- await writeFile(outputPath, tsContent);
40
- logger.log(`OpenAPI TypeScript module generated: ${outputPath}`);
41
- }
42
- logger.log(`Found ${endpoints.length} endpoints`);
43
- } catch (error) {
44
- throw new Error(`OpenAPI generation failed: ${error.message}`);
45
- }
46
- }
47
-
48
- //#endregion
49
- export { openapiCommand };
50
- //# sourceMappingURL=openapi-DBX8cJJ8.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openapi-DBX8cJJ8.mjs","names":["options: OpenAPIOptions"],"sources":["../src/openapi.ts"],"sourcesContent":["#!/usr/bin/env -S npx tsx\n\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { Endpoint } from '@geekmidas/constructs/endpoints';\nimport { loadConfig } from './config.js';\nimport { EndpointGenerator } from './generators/EndpointGenerator.js';\nimport { OpenApiTsGenerator } from './generators/OpenApiTsGenerator.js';\n\ninterface OpenAPIOptions {\n output?: string;\n json?: boolean;\n cwd?: string;\n}\n\nexport async function openapiCommand(\n options: OpenAPIOptions = {},\n): Promise<void> {\n const logger = console;\n\n try {\n // Load config using existing function\n const config = await loadConfig(options.cwd);\n const endpointGenerator = new EndpointGenerator();\n\n // Load all endpoints using the refactored function\n const loadedEndpoints = await endpointGenerator.load(config.routes);\n\n if (loadedEndpoints.length === 0) {\n logger.log('No valid endpoints found');\n return;\n }\n\n // Extract just the endpoint instances for OpenAPI generation\n const endpoints = loadedEndpoints.map(({ construct }) => construct);\n\n // Determine output format (TypeScript is default)\n const isJson = options.json === true;\n const defaultOutput = isJson ? 'openapi.json' : 'openapi.ts';\n const outputPath = options.output || join(process.cwd(), defaultOutput);\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n if (isJson) {\n // Generate JSON OpenAPI spec (legacy)\n const spec = await Endpoint.buildOpenApiSchema(endpoints, {\n title: 'API Documentation',\n version: '1.0.0',\n description: 'Auto-generated API documentation from endpoints',\n });\n\n await writeFile(outputPath, JSON.stringify(spec, null, 2));\n logger.log(`OpenAPI JSON spec generated: ${outputPath}`);\n } else {\n // Generate TypeScript OpenAPI module (default)\n const tsGenerator = new OpenApiTsGenerator();\n const tsContent = await tsGenerator.generate(endpoints, {\n title: 'API Documentation',\n version: '1.0.0',\n description: 'Auto-generated API documentation from endpoints',\n });\n\n await writeFile(outputPath, tsContent);\n logger.log(`OpenAPI TypeScript module generated: ${outputPath}`);\n }\n\n logger.log(`Found ${endpoints.length} endpoints`);\n } catch (error) {\n throw new Error(`OpenAPI generation failed: ${(error as Error).message}`);\n }\n}\n"],"mappings":";;;;;;;;AAeA,eAAsB,eACpBA,UAA0B,CAAE,GACb;CACf,MAAM,SAAS;AAEf,KAAI;EAEF,MAAM,SAAS,MAAM,WAAW,QAAQ,IAAI;EAC5C,MAAM,oBAAoB,IAAI;EAG9B,MAAM,kBAAkB,MAAM,kBAAkB,KAAK,OAAO,OAAO;AAEnE,MAAI,gBAAgB,WAAW,GAAG;AAChC,UAAO,IAAI,2BAA2B;AACtC;EACD;EAGD,MAAM,YAAY,gBAAgB,IAAI,CAAC,EAAE,WAAW,KAAK,UAAU;EAGnE,MAAM,SAAS,QAAQ,SAAS;EAChC,MAAM,gBAAgB,SAAS,iBAAiB;EAChD,MAAM,aAAa,QAAQ,UAAU,KAAK,QAAQ,KAAK,EAAE,cAAc;AAGvE,QAAM,MAAM,QAAQ,WAAW,EAAE,EAAE,WAAW,KAAM,EAAC;AAErD,MAAI,QAAQ;GAEV,MAAM,OAAO,MAAM,SAAS,mBAAmB,WAAW;IACxD,OAAO;IACP,SAAS;IACT,aAAa;GACd,EAAC;AAEF,SAAM,UAAU,YAAY,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;AAC1D,UAAO,KAAK,+BAA+B,WAAW,EAAE;EACzD,OAAM;GAEL,MAAM,cAAc,IAAI;GACxB,MAAM,YAAY,MAAM,YAAY,SAAS,WAAW;IACtD,OAAO;IACP,SAAS;IACT,aAAa;GACd,EAAC;AAEF,SAAM,UAAU,YAAY,UAAU;AACtC,UAAO,KAAK,uCAAuC,WAAW,EAAE;EACjE;AAED,SAAO,KAAK,QAAQ,UAAU,OAAO,YAAY;CAClD,SAAQ,OAAO;AACd,QAAM,IAAI,OAAO,6BAA8B,MAAgB,QAAQ;CACxE;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-CIfmeuSW.mjs","names":["options: TemplateOptions","template: TemplateConfig","obj: Record<string, string>"],"sources":["../src/init/generators/package.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate package.json with dependencies based on template and options\n */\nexport function generatePackageJson(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { name, telescope, database, monorepo } = options;\n\n // Start with template dependencies\n const dependencies = { ...template.dependencies };\n const devDependencies = { ...template.devDependencies };\n const scripts = { ...template.scripts };\n\n // Add optional dependencies based on user choices\n if (telescope) {\n dependencies['@geekmidas/telescope'] = 'workspace:*';\n }\n\n if (database) {\n dependencies['@geekmidas/db'] = 'workspace:*';\n dependencies['kysely'] = '~0.28.2';\n dependencies['pg'] = '~8.16.0';\n devDependencies['@types/pg'] = '~8.15.0';\n }\n\n // Add zod for schema validation (commonly used)\n dependencies['zod'] = '~4.1.0';\n\n // For monorepo apps, remove biome/turbo (they're at root) and lint/fmt scripts\n if (monorepo) {\n delete devDependencies['@biomejs/biome'];\n delete devDependencies['turbo'];\n delete scripts['lint'];\n delete scripts['fmt'];\n delete scripts['fmt:check'];\n\n // Add models package as dependency\n dependencies[`@${name}/models`] = 'workspace:*';\n\n // Remove zod from api package (it's in models)\n delete dependencies['zod'];\n }\n\n // Sort dependencies alphabetically\n const sortObject = (obj: Record<string, string>) =>\n Object.fromEntries(\n Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n // For monorepo, derive package name from apiPath (e.g., apps/api -> @name/api)\n let packageName = name;\n if (monorepo && options.apiPath) {\n const pathParts = options.apiPath.split('/');\n const appName = pathParts[pathParts.length - 1] || 'api';\n packageName = `@${name}/${appName}`;\n }\n\n const packageJson = {\n name: packageName,\n version: '0.0.1',\n private: true,\n type: 'module',\n scripts,\n dependencies: sortObject(dependencies),\n devDependencies: sortObject(devDependencies),\n };\n\n return [\n {\n path: 'package.json',\n content: JSON.stringify(packageJson, null, 2) + '\\n',\n },\n ];\n}\n"],"mappings":";;;;AASA,SAAgB,oBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,MAAM,WAAW,UAAU,UAAU,GAAG;CAGhD,MAAM,eAAe,EAAE,GAAG,SAAS,aAAc;CACjD,MAAM,kBAAkB,EAAE,GAAG,SAAS,gBAAiB;CACvD,MAAM,UAAU,EAAE,GAAG,SAAS,QAAS;AAGvC,KAAI,UACF,cAAa,0BAA0B;AAGzC,KAAI,UAAU;AACZ,eAAa,mBAAmB;AAChC,eAAa,YAAY;AACzB,eAAa,QAAQ;AACrB,kBAAgB,eAAe;CAChC;AAGD,cAAa,SAAS;AAGtB,KAAI,UAAU;AACZ,SAAO,gBAAgB;AACvB,SAAO,gBAAgB;AACvB,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,SAAO,QAAQ;AAGf,gBAAc,GAAG,KAAK,YAAY;AAGlC,SAAO,aAAa;CACrB;CAGD,MAAM,aAAa,CAACC,QAClB,OAAO,YACL,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAC3D;CAGH,IAAI,cAAc;AAClB,KAAI,YAAY,QAAQ,SAAS;EAC/B,MAAM,YAAY,QAAQ,QAAQ,MAAM,IAAI;EAC5C,MAAM,UAAU,UAAU,UAAU,SAAS,MAAM;AACnD,iBAAe,GAAG,KAAK,GAAG,QAAQ;CACnC;CAED,MAAM,cAAc;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM;EACN;EACA,cAAc,WAAW,aAAa;EACtC,iBAAiB,WAAW,gBAAgB;CAC7C;AAED,QAAO,CACL;EACE,MAAM;EACN,SAAS,KAAK,UAAU,aAAa,MAAM,EAAE,GAAG;CACjD,CACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"package-PP-o1nvq.cjs","names":["options: TemplateOptions","template: TemplateConfig","obj: Record<string, string>"],"sources":["../src/init/generators/package.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate package.json with dependencies based on template and options\n */\nexport function generatePackageJson(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { name, telescope, database, monorepo } = options;\n\n // Start with template dependencies\n const dependencies = { ...template.dependencies };\n const devDependencies = { ...template.devDependencies };\n const scripts = { ...template.scripts };\n\n // Add optional dependencies based on user choices\n if (telescope) {\n dependencies['@geekmidas/telescope'] = 'workspace:*';\n }\n\n if (database) {\n dependencies['@geekmidas/db'] = 'workspace:*';\n dependencies['kysely'] = '~0.28.2';\n dependencies['pg'] = '~8.16.0';\n devDependencies['@types/pg'] = '~8.15.0';\n }\n\n // Add zod for schema validation (commonly used)\n dependencies['zod'] = '~4.1.0';\n\n // For monorepo apps, remove biome/turbo (they're at root) and lint/fmt scripts\n if (monorepo) {\n delete devDependencies['@biomejs/biome'];\n delete devDependencies['turbo'];\n delete scripts['lint'];\n delete scripts['fmt'];\n delete scripts['fmt:check'];\n\n // Add models package as dependency\n dependencies[`@${name}/models`] = 'workspace:*';\n\n // Remove zod from api package (it's in models)\n delete dependencies['zod'];\n }\n\n // Sort dependencies alphabetically\n const sortObject = (obj: Record<string, string>) =>\n Object.fromEntries(\n Object.entries(obj).sort(([a], [b]) => a.localeCompare(b)),\n );\n\n // For monorepo, derive package name from apiPath (e.g., apps/api -> @name/api)\n let packageName = name;\n if (monorepo && options.apiPath) {\n const pathParts = options.apiPath.split('/');\n const appName = pathParts[pathParts.length - 1] || 'api';\n packageName = `@${name}/${appName}`;\n }\n\n const packageJson = {\n name: packageName,\n version: '0.0.1',\n private: true,\n type: 'module',\n scripts,\n dependencies: sortObject(dependencies),\n devDependencies: sortObject(devDependencies),\n };\n\n return [\n {\n path: 'package.json',\n content: JSON.stringify(packageJson, null, 2) + '\\n',\n },\n ];\n}\n"],"mappings":";;;;;AASA,SAAgB,oBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,MAAM,WAAW,UAAU,UAAU,GAAG;CAGhD,MAAM,eAAe,EAAE,GAAG,SAAS,aAAc;CACjD,MAAM,kBAAkB,EAAE,GAAG,SAAS,gBAAiB;CACvD,MAAM,UAAU,EAAE,GAAG,SAAS,QAAS;AAGvC,KAAI,UACF,cAAa,0BAA0B;AAGzC,KAAI,UAAU;AACZ,eAAa,mBAAmB;AAChC,eAAa,YAAY;AACzB,eAAa,QAAQ;AACrB,kBAAgB,eAAe;CAChC;AAGD,cAAa,SAAS;AAGtB,KAAI,UAAU;AACZ,SAAO,gBAAgB;AACvB,SAAO,gBAAgB;AACvB,SAAO,QAAQ;AACf,SAAO,QAAQ;AACf,SAAO,QAAQ;AAGf,gBAAc,GAAG,KAAK,YAAY;AAGlC,SAAO,aAAa;CACrB;CAGD,MAAM,aAAa,CAACC,QAClB,OAAO,YACL,OAAO,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAC3D;CAGH,IAAI,cAAc;AAClB,KAAI,YAAY,QAAQ,SAAS;EAC/B,MAAM,YAAY,QAAQ,QAAQ,MAAM,IAAI;EAC5C,MAAM,UAAU,UAAU,UAAU,SAAS,MAAM;AACnD,iBAAe,GAAG,KAAK,GAAG,QAAQ;CACnC;CAED,MAAM,cAAc;EAClB,MAAM;EACN,SAAS;EACT,SAAS;EACT,MAAM;EACN;EACA,cAAc,WAAW,aAAa;EACtC,iBAAiB,WAAW,gBAAgB;CAC7C;AAED,QAAO,CACL;EACE,MAAM;EACN,SAAS,KAAK,UAAU,aAAa,MAAM,EAAE,GAAG;CACjD,CACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"serverless-DkHBF2vC.mjs","names":["serverlessTemplate: TemplateConfig","options: TemplateOptions","files: GeneratedFile[]"],"sources":["../src/init/templates/serverless.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from './index.js';\n\nexport const serverlessTemplate: TemplateConfig = {\n name: 'serverless',\n description: 'AWS Lambda handlers',\n\n dependencies: {\n '@geekmidas/constructs': 'workspace:*',\n '@geekmidas/envkit': 'workspace:*',\n '@geekmidas/logger': 'workspace:*',\n '@geekmidas/cloud': 'workspace:*',\n hono: '~4.8.2',\n pino: '~9.6.0',\n },\n\n devDependencies: {\n '@biomejs/biome': '~1.9.4',\n '@geekmidas/cli': 'workspace:*',\n '@types/aws-lambda': '~8.10.92',\n '@types/node': '~22.0.0',\n tsx: '~4.20.0',\n turbo: '~2.3.0',\n typescript: '~5.8.2',\n vitest: '~4.0.0',\n },\n\n scripts: {\n dev: 'gkm dev',\n build: 'gkm build --provider aws-apigatewayv2',\n test: 'vitest',\n 'test:once': 'vitest run',\n typecheck: 'tsc --noEmit',\n lint: 'biome lint .',\n fmt: 'biome format . --write',\n 'fmt:check': 'biome format .',\n },\n\n files: (options: TemplateOptions): GeneratedFile[] => {\n const files: GeneratedFile[] = [\n // src/config/env.ts\n {\n path: 'src/config/env.ts',\n content: `import { EnvironmentParser } from '@geekmidas/envkit';\n\nexport const envParser = new EnvironmentParser(process.env);\n\nexport const config = envParser\n .create((get) => ({\n stage: get('STAGE').string().default('dev'),\n region: get('AWS_REGION').string().default('us-east-1'),${\n options.database\n ? `\n database: {\n url: get('DATABASE_URL').string(),\n },`\n : ''\n }\n }))\n .parse();\n`,\n },\n\n // src/config/logger.ts - using pino\n {\n path: 'src/config/logger.ts',\n content: `import { PinoLogger } from '@geekmidas/logger/pino';\n\nexport const logger = new PinoLogger({\n app: '${options.name}',\n stage: process.env.STAGE || 'dev',\n level: process.env.LOG_LEVEL || 'info',\n});\n`,\n },\n\n // src/endpoints/health.ts\n {\n path: 'src/endpoints/health.ts',\n content: `import { e } from '@geekmidas/constructs/endpoints';\n\nexport default e\n .get('/health')\n .handle(async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n region: process.env.AWS_REGION || 'local',\n }));\n`,\n },\n\n // src/functions/hello.ts\n {\n path: 'src/functions/hello.ts',\n content: `import { f } from '@geekmidas/constructs/functions';\nimport { z } from 'zod';\n\nexport default f\n .input(z.object({ name: z.string() }))\n .output(z.object({ message: z.string() }))\n .handle(async ({ input }) => ({\n message: \\`Hello, \\${input.name}!\\`,\n }));\n`,\n },\n ];\n\n // Add Telescope config if enabled\n if (options.telescope) {\n files.push({\n path: 'src/config/telescope.ts',\n content: `import { Telescope } from '@geekmidas/telescope';\nimport { InMemoryStorage } from '@geekmidas/telescope/storage/memory';\n\n// Note: For production Lambda, consider using a persistent storage\nexport const telescope = new Telescope({\n storage: new InMemoryStorage({ maxEntries: 50 }),\n enabled: process.env.STAGE === 'dev',\n});\n`,\n });\n }\n\n return files;\n },\n};\n"],"mappings":";AAMA,MAAaA,qBAAqC;CAChD,MAAM;CACN,aAAa;CAEb,cAAc;EACZ,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,oBAAoB;EACpB,MAAM;EACN,MAAM;CACP;CAED,iBAAiB;EACf,kBAAkB;EAClB,kBAAkB;EAClB,qBAAqB;EACrB,eAAe;EACf,KAAK;EACL,OAAO;EACP,YAAY;EACZ,QAAQ;CACT;CAED,SAAS;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,aAAa;EACb,WAAW;EACX,MAAM;EACN,KAAK;EACL,aAAa;CACd;CAED,OAAO,CAACC,YAA8C;EACpD,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;8DAQZ,QAAQ,YACH;;;UAID,GACL;;;;GAIE;GAGD;IACE,MAAM;IACN,UAAU;;;UAGR,QAAQ,KAAK;;;;;GAKhB;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;GAUX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;GAUX;EACF;AAGD,MAAI,QAAQ,UACV,OAAM,KAAK;GACT,MAAM;GACN,UAAU;;;;;;;;;EASX,EAAC;AAGJ,SAAO;CACR;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"serverless-Yav3GRVz.cjs","names":["serverlessTemplate: TemplateConfig","options: TemplateOptions","files: GeneratedFile[]"],"sources":["../src/init/templates/serverless.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from './index.js';\n\nexport const serverlessTemplate: TemplateConfig = {\n name: 'serverless',\n description: 'AWS Lambda handlers',\n\n dependencies: {\n '@geekmidas/constructs': 'workspace:*',\n '@geekmidas/envkit': 'workspace:*',\n '@geekmidas/logger': 'workspace:*',\n '@geekmidas/cloud': 'workspace:*',\n hono: '~4.8.2',\n pino: '~9.6.0',\n },\n\n devDependencies: {\n '@biomejs/biome': '~1.9.4',\n '@geekmidas/cli': 'workspace:*',\n '@types/aws-lambda': '~8.10.92',\n '@types/node': '~22.0.0',\n tsx: '~4.20.0',\n turbo: '~2.3.0',\n typescript: '~5.8.2',\n vitest: '~4.0.0',\n },\n\n scripts: {\n dev: 'gkm dev',\n build: 'gkm build --provider aws-apigatewayv2',\n test: 'vitest',\n 'test:once': 'vitest run',\n typecheck: 'tsc --noEmit',\n lint: 'biome lint .',\n fmt: 'biome format . --write',\n 'fmt:check': 'biome format .',\n },\n\n files: (options: TemplateOptions): GeneratedFile[] => {\n const files: GeneratedFile[] = [\n // src/config/env.ts\n {\n path: 'src/config/env.ts',\n content: `import { EnvironmentParser } from '@geekmidas/envkit';\n\nexport const envParser = new EnvironmentParser(process.env);\n\nexport const config = envParser\n .create((get) => ({\n stage: get('STAGE').string().default('dev'),\n region: get('AWS_REGION').string().default('us-east-1'),${\n options.database\n ? `\n database: {\n url: get('DATABASE_URL').string(),\n },`\n : ''\n }\n }))\n .parse();\n`,\n },\n\n // src/config/logger.ts - using pino\n {\n path: 'src/config/logger.ts',\n content: `import { PinoLogger } from '@geekmidas/logger/pino';\n\nexport const logger = new PinoLogger({\n app: '${options.name}',\n stage: process.env.STAGE || 'dev',\n level: process.env.LOG_LEVEL || 'info',\n});\n`,\n },\n\n // src/endpoints/health.ts\n {\n path: 'src/endpoints/health.ts',\n content: `import { e } from '@geekmidas/constructs/endpoints';\n\nexport default e\n .get('/health')\n .handle(async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n region: process.env.AWS_REGION || 'local',\n }));\n`,\n },\n\n // src/functions/hello.ts\n {\n path: 'src/functions/hello.ts',\n content: `import { f } from '@geekmidas/constructs/functions';\nimport { z } from 'zod';\n\nexport default f\n .input(z.object({ name: z.string() }))\n .output(z.object({ message: z.string() }))\n .handle(async ({ input }) => ({\n message: \\`Hello, \\${input.name}!\\`,\n }));\n`,\n },\n ];\n\n // Add Telescope config if enabled\n if (options.telescope) {\n files.push({\n path: 'src/config/telescope.ts',\n content: `import { Telescope } from '@geekmidas/telescope';\nimport { InMemoryStorage } from '@geekmidas/telescope/storage/memory';\n\n// Note: For production Lambda, consider using a persistent storage\nexport const telescope = new Telescope({\n storage: new InMemoryStorage({ maxEntries: 50 }),\n enabled: process.env.STAGE === 'dev',\n});\n`,\n });\n }\n\n return files;\n },\n};\n"],"mappings":";;AAMA,MAAaA,qBAAqC;CAChD,MAAM;CACN,aAAa;CAEb,cAAc;EACZ,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,oBAAoB;EACpB,MAAM;EACN,MAAM;CACP;CAED,iBAAiB;EACf,kBAAkB;EAClB,kBAAkB;EAClB,qBAAqB;EACrB,eAAe;EACf,KAAK;EACL,OAAO;EACP,YAAY;EACZ,QAAQ;CACT;CAED,SAAS;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,aAAa;EACb,WAAW;EACX,MAAM;EACN,KAAK;EACL,aAAa;CACd;CAED,OAAO,CAACC,YAA8C;EACpD,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;8DAQZ,QAAQ,YACH;;;UAID,GACL;;;;GAIE;GAGD;IACE,MAAM;IACN,UAAU;;;UAGR,QAAQ,KAAK;;;;;GAKhB;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;GAUX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;GAUX;EACF;AAGD,MAAI,QAAQ,UACV,OAAM,KAAK;GACT,MAAM;GACN,UAAU;;;;;;;;;EASX,EAAC;AAGJ,SAAO;CACR;AACF"}
@@ -1,64 +0,0 @@
1
- import { apiTemplate } from "./api-BKIN0s0S.mjs";
2
- import { minimalTemplate } from "./minimal-C4GsE45s.mjs";
3
- import { serverlessTemplate } from "./serverless-DkHBF2vC.mjs";
4
- import { workerTemplate } from "./worker-Jme7uOOJ.mjs";
5
-
6
- //#region src/init/templates/index.ts
7
- /**
8
- * All available templates
9
- */
10
- const templates = {
11
- minimal: minimalTemplate,
12
- api: apiTemplate,
13
- serverless: serverlessTemplate,
14
- worker: workerTemplate
15
- };
16
- /**
17
- * Template choices for prompts
18
- */
19
- const templateChoices = [
20
- {
21
- title: "Minimal",
22
- value: "minimal",
23
- description: "Basic health endpoint"
24
- },
25
- {
26
- title: "API",
27
- value: "api",
28
- description: "Full API with auth, database, services"
29
- },
30
- {
31
- title: "Serverless",
32
- value: "serverless",
33
- description: "AWS Lambda handlers"
34
- },
35
- {
36
- title: "Worker",
37
- value: "worker",
38
- description: "Background job processing"
39
- }
40
- ];
41
- /**
42
- * Route style choices for prompts
43
- */
44
- const routeStyleChoices = [{
45
- title: "File-based",
46
- value: "file-based",
47
- description: "Folder structure matches URL paths (users/list.ts → /users)"
48
- }, {
49
- title: "Flat",
50
- value: "flat",
51
- description: "All endpoints in one folder (users-list.ts → /users)"
52
- }];
53
- /**
54
- * Get a template by name
55
- */
56
- function getTemplate(name) {
57
- const template = templates[name];
58
- if (!template) throw new Error(`Unknown template: ${name}`);
59
- return template;
60
- }
61
-
62
- //#endregion
63
- export { getTemplate, routeStyleChoices, templateChoices, templates };
64
- //# sourceMappingURL=templates-CBFUwpBy.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates-CBFUwpBy.mjs","names":["templates: Record<TemplateName, TemplateConfig>","name: TemplateName"],"sources":["../src/init/templates/index.ts"],"sourcesContent":["import { apiTemplate } from './api.js';\nimport { minimalTemplate } from './minimal.js';\nimport { serverlessTemplate } from './serverless.js';\nimport { workerTemplate } from './worker.js';\n\n/**\n * Route organization style\n */\nexport type RouteStyle = 'file-based' | 'flat';\n\n/**\n * Options collected from user prompts\n */\nexport interface TemplateOptions {\n name: string;\n template: TemplateName;\n telescope: boolean;\n database: boolean;\n routeStyle: RouteStyle;\n monorepo: boolean;\n /** Path for the API app in monorepo (e.g., 'apps/api') */\n apiPath: string;\n}\n\n/**\n * A file to be generated\n */\nexport interface GeneratedFile {\n path: string;\n content: string;\n}\n\n/**\n * Template configuration\n */\nexport interface TemplateConfig {\n name: TemplateName;\n description: string;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n files: (options: TemplateOptions) => GeneratedFile[];\n}\n\nexport type TemplateName = 'minimal' | 'api' | 'serverless' | 'worker';\n\n/**\n * All available templates\n */\nexport const templates: Record<TemplateName, TemplateConfig> = {\n minimal: minimalTemplate,\n api: apiTemplate,\n serverless: serverlessTemplate,\n worker: workerTemplate,\n};\n\n/**\n * Template choices for prompts\n */\nexport const templateChoices = [\n {\n title: 'Minimal',\n value: 'minimal' as TemplateName,\n description: 'Basic health endpoint',\n },\n {\n title: 'API',\n value: 'api' as TemplateName,\n description: 'Full API with auth, database, services',\n },\n {\n title: 'Serverless',\n value: 'serverless' as TemplateName,\n description: 'AWS Lambda handlers',\n },\n {\n title: 'Worker',\n value: 'worker' as TemplateName,\n description: 'Background job processing',\n },\n];\n\n/**\n * Route style choices for prompts\n */\nexport const routeStyleChoices = [\n {\n title: 'File-based',\n value: 'file-based' as RouteStyle,\n description: 'Folder structure matches URL paths (users/list.ts → /users)',\n },\n {\n title: 'Flat',\n value: 'flat' as RouteStyle,\n description: 'All endpoints in one folder (users-list.ts → /users)',\n },\n];\n\n/**\n * Get a template by name\n */\nexport function getTemplate(name: TemplateName): TemplateConfig {\n const template = templates[name];\n if (!template) {\n throw new Error(`Unknown template: ${name}`);\n }\n return template;\n}\n"],"mappings":";;;;;;;;;AAiDA,MAAaA,YAAkD;CAC7D,SAAS;CACT,KAAK;CACL,YAAY;CACZ,QAAQ;AACT;;;;AAKD,MAAa,kBAAkB;CAC7B;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;AACF;;;;AAKD,MAAa,oBAAoB,CAC/B;CACE,OAAO;CACP,OAAO;CACP,aAAa;AACd,GACD;CACE,OAAO;CACP,OAAO;CACP,aAAa;AACd,CACF;;;;AAKD,SAAgB,YAAYC,MAAoC;CAC9D,MAAM,WAAW,UAAU;AAC3B,MAAK,SACH,OAAM,IAAI,OAAO,oBAAoB,KAAK;AAE5C,QAAO;AACR"}
@@ -1,87 +0,0 @@
1
- const require_api = require('./api-B3SCEHPf.cjs');
2
- const require_minimal = require('./minimal-Bdhhpp7v.cjs');
3
- const require_serverless = require('./serverless-Yav3GRVz.cjs');
4
- const require_worker = require('./worker--8O5a3Hv.cjs');
5
-
6
- //#region src/init/templates/index.ts
7
- /**
8
- * All available templates
9
- */
10
- const templates = {
11
- minimal: require_minimal.minimalTemplate,
12
- api: require_api.apiTemplate,
13
- serverless: require_serverless.serverlessTemplate,
14
- worker: require_worker.workerTemplate
15
- };
16
- /**
17
- * Template choices for prompts
18
- */
19
- const templateChoices = [
20
- {
21
- title: "Minimal",
22
- value: "minimal",
23
- description: "Basic health endpoint"
24
- },
25
- {
26
- title: "API",
27
- value: "api",
28
- description: "Full API with auth, database, services"
29
- },
30
- {
31
- title: "Serverless",
32
- value: "serverless",
33
- description: "AWS Lambda handlers"
34
- },
35
- {
36
- title: "Worker",
37
- value: "worker",
38
- description: "Background job processing"
39
- }
40
- ];
41
- /**
42
- * Route style choices for prompts
43
- */
44
- const routeStyleChoices = [{
45
- title: "File-based",
46
- value: "file-based",
47
- description: "Folder structure matches URL paths (users/list.ts → /users)"
48
- }, {
49
- title: "Flat",
50
- value: "flat",
51
- description: "All endpoints in one folder (users-list.ts → /users)"
52
- }];
53
- /**
54
- * Get a template by name
55
- */
56
- function getTemplate(name) {
57
- const template = templates[name];
58
- if (!template) throw new Error(`Unknown template: ${name}`);
59
- return template;
60
- }
61
-
62
- //#endregion
63
- Object.defineProperty(exports, 'getTemplate', {
64
- enumerable: true,
65
- get: function () {
66
- return getTemplate;
67
- }
68
- });
69
- Object.defineProperty(exports, 'routeStyleChoices', {
70
- enumerable: true,
71
- get: function () {
72
- return routeStyleChoices;
73
- }
74
- });
75
- Object.defineProperty(exports, 'templateChoices', {
76
- enumerable: true,
77
- get: function () {
78
- return templateChoices;
79
- }
80
- });
81
- Object.defineProperty(exports, 'templates', {
82
- enumerable: true,
83
- get: function () {
84
- return templates;
85
- }
86
- });
87
- //# sourceMappingURL=templates-DM_rtYYW.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates-DM_rtYYW.cjs","names":["templates: Record<TemplateName, TemplateConfig>","minimalTemplate","apiTemplate","serverlessTemplate","workerTemplate","name: TemplateName"],"sources":["../src/init/templates/index.ts"],"sourcesContent":["import { apiTemplate } from './api.js';\nimport { minimalTemplate } from './minimal.js';\nimport { serverlessTemplate } from './serverless.js';\nimport { workerTemplate } from './worker.js';\n\n/**\n * Route organization style\n */\nexport type RouteStyle = 'file-based' | 'flat';\n\n/**\n * Options collected from user prompts\n */\nexport interface TemplateOptions {\n name: string;\n template: TemplateName;\n telescope: boolean;\n database: boolean;\n routeStyle: RouteStyle;\n monorepo: boolean;\n /** Path for the API app in monorepo (e.g., 'apps/api') */\n apiPath: string;\n}\n\n/**\n * A file to be generated\n */\nexport interface GeneratedFile {\n path: string;\n content: string;\n}\n\n/**\n * Template configuration\n */\nexport interface TemplateConfig {\n name: TemplateName;\n description: string;\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n files: (options: TemplateOptions) => GeneratedFile[];\n}\n\nexport type TemplateName = 'minimal' | 'api' | 'serverless' | 'worker';\n\n/**\n * All available templates\n */\nexport const templates: Record<TemplateName, TemplateConfig> = {\n minimal: minimalTemplate,\n api: apiTemplate,\n serverless: serverlessTemplate,\n worker: workerTemplate,\n};\n\n/**\n * Template choices for prompts\n */\nexport const templateChoices = [\n {\n title: 'Minimal',\n value: 'minimal' as TemplateName,\n description: 'Basic health endpoint',\n },\n {\n title: 'API',\n value: 'api' as TemplateName,\n description: 'Full API with auth, database, services',\n },\n {\n title: 'Serverless',\n value: 'serverless' as TemplateName,\n description: 'AWS Lambda handlers',\n },\n {\n title: 'Worker',\n value: 'worker' as TemplateName,\n description: 'Background job processing',\n },\n];\n\n/**\n * Route style choices for prompts\n */\nexport const routeStyleChoices = [\n {\n title: 'File-based',\n value: 'file-based' as RouteStyle,\n description: 'Folder structure matches URL paths (users/list.ts → /users)',\n },\n {\n title: 'Flat',\n value: 'flat' as RouteStyle,\n description: 'All endpoints in one folder (users-list.ts → /users)',\n },\n];\n\n/**\n * Get a template by name\n */\nexport function getTemplate(name: TemplateName): TemplateConfig {\n const template = templates[name];\n if (!template) {\n throw new Error(`Unknown template: ${name}`);\n }\n return template;\n}\n"],"mappings":";;;;;;;;;AAiDA,MAAaA,YAAkD;CAC7D,SAASC;CACT,KAAKC;CACL,YAAYC;CACZ,QAAQC;AACT;;;;AAKD,MAAa,kBAAkB;CAC7B;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;CACD;EACE,OAAO;EACP,OAAO;EACP,aAAa;CACd;AACF;;;;AAKD,MAAa,oBAAoB,CAC/B;CACE,OAAO;CACP,OAAO;CACP,aAAa;AACd,GACD;CACE,OAAO;CACP,OAAO;CACP,aAAa;AACd,CACF;;;;AAKD,SAAgB,YAAYC,MAAoC;CAC9D,MAAM,WAAW,UAAU;AAC3B,MAAK,SACH,OAAM,IAAI,OAAO,oBAAoB,KAAK;AAE5C,QAAO;AACR"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker--8O5a3Hv.cjs","names":["workerTemplate: TemplateConfig","options: TemplateOptions","files: GeneratedFile[]"],"sources":["../src/init/templates/worker.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from './index.js';\n\nexport const workerTemplate: TemplateConfig = {\n name: 'worker',\n description: 'Background job processing',\n\n dependencies: {\n '@geekmidas/constructs': 'workspace:*',\n '@geekmidas/envkit': 'workspace:*',\n '@geekmidas/logger': 'workspace:*',\n '@geekmidas/events': 'workspace:*',\n hono: '~4.8.2',\n pino: '~9.6.0',\n },\n\n devDependencies: {\n '@biomejs/biome': '~1.9.4',\n '@geekmidas/cli': 'workspace:*',\n '@types/node': '~22.0.0',\n tsx: '~4.20.0',\n turbo: '~2.3.0',\n typescript: '~5.8.2',\n vitest: '~4.0.0',\n },\n\n scripts: {\n dev: 'gkm dev',\n build: 'gkm build',\n test: 'vitest',\n 'test:once': 'vitest run',\n typecheck: 'tsc --noEmit',\n lint: 'biome lint .',\n fmt: 'biome format . --write',\n 'fmt:check': 'biome format .',\n },\n\n files: (options: TemplateOptions): GeneratedFile[] => {\n const files: GeneratedFile[] = [\n // src/config/env.ts\n {\n path: 'src/config/env.ts',\n content: `import { EnvironmentParser } from '@geekmidas/envkit';\n\nexport const envParser = new EnvironmentParser(process.env);\n\nexport const config = envParser\n .create((get) => ({\n port: get('PORT').string().transform(Number).default(3000),\n nodeEnv: get('NODE_ENV').string().default('development'),\n rabbitmq: {\n url: get('RABBITMQ_URL').string().default('amqp://localhost:5672'),\n },${\n options.database\n ? `\n database: {\n url: get('DATABASE_URL').string().default('postgresql://localhost:5432/mydb'),\n },`\n : ''\n }\n }))\n .parse();\n`,\n },\n\n // src/config/logger.ts - using pino\n {\n path: 'src/config/logger.ts',\n content: `import { PinoLogger } from '@geekmidas/logger/pino';\n\nexport const logger = new PinoLogger({\n app: '${options.name}',\n level: process.env.LOG_LEVEL || 'info',\n});\n`,\n },\n\n // src/endpoints/health.ts\n {\n path: 'src/endpoints/health.ts',\n content: `import { e } from '@geekmidas/constructs/endpoints';\n\nexport default e\n .get('/health')\n .handle(async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n }));\n`,\n },\n\n // src/events/types.ts\n {\n path: 'src/events/types.ts',\n content: `import type { PublishableMessage } from '@geekmidas/events';\n\n// Define your event types here\nexport type AppEvents =\n | PublishableMessage<'user.created', { userId: string; email: string }>\n | PublishableMessage<'user.updated', { userId: string; changes: Record<string, unknown> }>\n | PublishableMessage<'order.placed', { orderId: string; userId: string; total: number }>;\n`,\n },\n\n // src/subscribers/user-events.ts\n {\n path: 'src/subscribers/user-events.ts',\n content: `import { s } from '@geekmidas/constructs/subscribers';\nimport type { AppEvents } from '../events/types.js';\n\nexport default s<AppEvents>()\n .events(['user.created', 'user.updated'])\n .handle(async ({ event, logger }) => {\n logger.info({ type: event.type, payload: event.payload }, 'Processing user event');\n\n switch (event.type) {\n case 'user.created':\n // Handle user creation\n logger.info({ userId: event.payload.userId }, 'New user created');\n break;\n case 'user.updated':\n // Handle user update\n logger.info({ userId: event.payload.userId }, 'User updated');\n break;\n }\n });\n`,\n },\n\n // src/crons/cleanup.ts\n {\n path: 'src/crons/cleanup.ts',\n content: `import { cron } from '@geekmidas/constructs/crons';\n\n// Run every day at midnight\nexport default cron('0 0 * * *')\n .handle(async ({ logger }) => {\n logger.info('Running cleanup job');\n\n // Add your cleanup logic here\n // e.g., delete old sessions, clean up temp files, etc.\n\n logger.info('Cleanup job completed');\n });\n`,\n },\n ];\n\n // Add Telescope config if enabled\n if (options.telescope) {\n files.push({\n path: 'src/config/telescope.ts',\n content: `import { Telescope } from '@geekmidas/telescope';\nimport { InMemoryStorage } from '@geekmidas/telescope/storage/memory';\n\nexport const telescope = new Telescope({\n storage: new InMemoryStorage({ maxEntries: 100 }),\n enabled: process.env.NODE_ENV === 'development',\n});\n`,\n });\n }\n\n return files;\n },\n};\n"],"mappings":";;AAMA,MAAaA,iBAAiC;CAC5C,MAAM;CACN,aAAa;CAEb,cAAc;EACZ,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,MAAM;EACN,MAAM;CACP;CAED,iBAAiB;EACf,kBAAkB;EAClB,kBAAkB;EAClB,eAAe;EACf,KAAK;EACL,OAAO;EACP,YAAY;EACZ,QAAQ;CACT;CAED,SAAS;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,aAAa;EACb,WAAW;EACX,MAAM;EACN,KAAK;EACL,aAAa;CACd;CAED,OAAO,CAACC,YAA8C;EACpD,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;;;;QAWZ,QAAQ,YACH;;;UAID,GACL;;;;GAIE;GAGD;IACE,MAAM;IACN,UAAU;;;UAGR,QAAQ,KAAK;;;;GAIhB;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;GASX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;GAQX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;;;;;;;;;;;GAoBX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;;;;GAaX;EACF;AAGD,MAAI,QAAQ,UACV,OAAM,KAAK;GACT,MAAM;GACN,UAAU;;;;;;;;EAQX,EAAC;AAGJ,SAAO;CACR;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"worker-Jme7uOOJ.mjs","names":["workerTemplate: TemplateConfig","options: TemplateOptions","files: GeneratedFile[]"],"sources":["../src/init/templates/worker.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from './index.js';\n\nexport const workerTemplate: TemplateConfig = {\n name: 'worker',\n description: 'Background job processing',\n\n dependencies: {\n '@geekmidas/constructs': 'workspace:*',\n '@geekmidas/envkit': 'workspace:*',\n '@geekmidas/logger': 'workspace:*',\n '@geekmidas/events': 'workspace:*',\n hono: '~4.8.2',\n pino: '~9.6.0',\n },\n\n devDependencies: {\n '@biomejs/biome': '~1.9.4',\n '@geekmidas/cli': 'workspace:*',\n '@types/node': '~22.0.0',\n tsx: '~4.20.0',\n turbo: '~2.3.0',\n typescript: '~5.8.2',\n vitest: '~4.0.0',\n },\n\n scripts: {\n dev: 'gkm dev',\n build: 'gkm build',\n test: 'vitest',\n 'test:once': 'vitest run',\n typecheck: 'tsc --noEmit',\n lint: 'biome lint .',\n fmt: 'biome format . --write',\n 'fmt:check': 'biome format .',\n },\n\n files: (options: TemplateOptions): GeneratedFile[] => {\n const files: GeneratedFile[] = [\n // src/config/env.ts\n {\n path: 'src/config/env.ts',\n content: `import { EnvironmentParser } from '@geekmidas/envkit';\n\nexport const envParser = new EnvironmentParser(process.env);\n\nexport const config = envParser\n .create((get) => ({\n port: get('PORT').string().transform(Number).default(3000),\n nodeEnv: get('NODE_ENV').string().default('development'),\n rabbitmq: {\n url: get('RABBITMQ_URL').string().default('amqp://localhost:5672'),\n },${\n options.database\n ? `\n database: {\n url: get('DATABASE_URL').string().default('postgresql://localhost:5432/mydb'),\n },`\n : ''\n }\n }))\n .parse();\n`,\n },\n\n // src/config/logger.ts - using pino\n {\n path: 'src/config/logger.ts',\n content: `import { PinoLogger } from '@geekmidas/logger/pino';\n\nexport const logger = new PinoLogger({\n app: '${options.name}',\n level: process.env.LOG_LEVEL || 'info',\n});\n`,\n },\n\n // src/endpoints/health.ts\n {\n path: 'src/endpoints/health.ts',\n content: `import { e } from '@geekmidas/constructs/endpoints';\n\nexport default e\n .get('/health')\n .handle(async () => ({\n status: 'ok',\n timestamp: new Date().toISOString(),\n }));\n`,\n },\n\n // src/events/types.ts\n {\n path: 'src/events/types.ts',\n content: `import type { PublishableMessage } from '@geekmidas/events';\n\n// Define your event types here\nexport type AppEvents =\n | PublishableMessage<'user.created', { userId: string; email: string }>\n | PublishableMessage<'user.updated', { userId: string; changes: Record<string, unknown> }>\n | PublishableMessage<'order.placed', { orderId: string; userId: string; total: number }>;\n`,\n },\n\n // src/subscribers/user-events.ts\n {\n path: 'src/subscribers/user-events.ts',\n content: `import { s } from '@geekmidas/constructs/subscribers';\nimport type { AppEvents } from '../events/types.js';\n\nexport default s<AppEvents>()\n .events(['user.created', 'user.updated'])\n .handle(async ({ event, logger }) => {\n logger.info({ type: event.type, payload: event.payload }, 'Processing user event');\n\n switch (event.type) {\n case 'user.created':\n // Handle user creation\n logger.info({ userId: event.payload.userId }, 'New user created');\n break;\n case 'user.updated':\n // Handle user update\n logger.info({ userId: event.payload.userId }, 'User updated');\n break;\n }\n });\n`,\n },\n\n // src/crons/cleanup.ts\n {\n path: 'src/crons/cleanup.ts',\n content: `import { cron } from '@geekmidas/constructs/crons';\n\n// Run every day at midnight\nexport default cron('0 0 * * *')\n .handle(async ({ logger }) => {\n logger.info('Running cleanup job');\n\n // Add your cleanup logic here\n // e.g., delete old sessions, clean up temp files, etc.\n\n logger.info('Cleanup job completed');\n });\n`,\n },\n ];\n\n // Add Telescope config if enabled\n if (options.telescope) {\n files.push({\n path: 'src/config/telescope.ts',\n content: `import { Telescope } from '@geekmidas/telescope';\nimport { InMemoryStorage } from '@geekmidas/telescope/storage/memory';\n\nexport const telescope = new Telescope({\n storage: new InMemoryStorage({ maxEntries: 100 }),\n enabled: process.env.NODE_ENV === 'development',\n});\n`,\n });\n }\n\n return files;\n },\n};\n"],"mappings":";AAMA,MAAaA,iBAAiC;CAC5C,MAAM;CACN,aAAa;CAEb,cAAc;EACZ,yBAAyB;EACzB,qBAAqB;EACrB,qBAAqB;EACrB,qBAAqB;EACrB,MAAM;EACN,MAAM;CACP;CAED,iBAAiB;EACf,kBAAkB;EAClB,kBAAkB;EAClB,eAAe;EACf,KAAK;EACL,OAAO;EACP,YAAY;EACZ,QAAQ;CACT;CAED,SAAS;EACP,KAAK;EACL,OAAO;EACP,MAAM;EACN,aAAa;EACb,WAAW;EACX,MAAM;EACN,KAAK;EACL,aAAa;CACd;CAED,OAAO,CAACC,YAA8C;EACpD,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;;;;QAWZ,QAAQ,YACH;;;UAID,GACL;;;;GAIE;GAGD;IACE,MAAM;IACN,UAAU;;;UAGR,QAAQ,KAAK;;;;GAIhB;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;GASX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;GAQX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;;;;;;;;;;;GAoBX;GAGD;IACE,MAAM;IACN,UAAU;;;;;;;;;;;;;GAaX;EACF;AAGD,MAAI,QAAQ,UACV,OAAM,KAAK;GACT,MAAM;GACN,UAAU;;;;;;;;EAQX,EAAC;AAGJ,SAAO;CACR;AACF"}