@geekmidas/cli 0.5.1 → 0.6.1

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 (247) 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-BVS4pOH7.mjs} +2 -2
  11. package/dist/{OpenApiTsGenerator-C4mHHaku.mjs.map → OpenApiTsGenerator-BVS4pOH7.mjs.map} +1 -1
  12. package/dist/{OpenApiTsGenerator-Be-sKGTT.cjs → OpenApiTsGenerator-gPIIyppX.cjs} +2 -2
  13. package/dist/{OpenApiTsGenerator-Be-sKGTT.cjs.map → OpenApiTsGenerator-gPIIyppX.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-Cu6Mi0Lf.mjs} +3 -3
  33. package/dist/{build-B8C_qHir.mjs.map → build-Cu6Mi0Lf.mjs.map} +1 -1
  34. package/dist/{build-D0Wr49bf.cjs → build-wmt8ZcmA.cjs} +3 -3
  35. package/dist/{build-D0Wr49bf.cjs.map → build-wmt8ZcmA.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-BBPWSllq.mjs} +6 -1
  49. package/dist/dev-BBPWSllq.mjs.map +1 -0
  50. package/dist/{dev-DHqYn8k4.cjs → dev-C2lCgE53.cjs} +6 -1
  51. package/dist/dev-C2lCgE53.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-DA9RkPJl.mjs +74 -0
  161. package/dist/openapi-DA9RkPJl.mjs.map +1 -0
  162. package/dist/openapi-DZH6RQHk.cjs +98 -0
  163. package/dist/openapi-DZH6RQHk.cjs.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 +6 -3
  212. package/src/dev/index.ts +18 -0
  213. package/src/generators/OpenApiTsGenerator.ts +1 -1
  214. package/src/init/generators/config.ts +23 -5
  215. package/src/init/generators/package.ts +11 -4
  216. package/src/init/index.ts +26 -7
  217. package/src/init/templates/api.ts +38 -56
  218. package/src/init/templates/index.ts +46 -11
  219. package/src/init/templates/minimal.ts +23 -10
  220. package/src/init/templates/serverless.ts +23 -11
  221. package/src/init/templates/worker.ts +23 -10
  222. package/src/openapi.ts +83 -45
  223. package/src/types.ts +30 -0
  224. package/dist/api-B3SCEHPf.cjs.map +0 -1
  225. package/dist/api-BKIN0s0S.mjs.map +0 -1
  226. package/dist/config-CLEDqKO3.cjs.map +0 -1
  227. package/dist/config-Dp8RonV_.mjs.map +0 -1
  228. package/dist/dev-B734w3L1.mjs.map +0 -1
  229. package/dist/dev-DHqYn8k4.cjs.map +0 -1
  230. package/dist/init-CtOnZn3G.mjs.map +0 -1
  231. package/dist/init-qLFsWR-R.cjs.map +0 -1
  232. package/dist/minimal-Bdhhpp7v.cjs.map +0 -1
  233. package/dist/minimal-C4GsE45s.mjs.map +0 -1
  234. package/dist/openapi-BQWPWyNB.cjs +0 -56
  235. package/dist/openapi-BQWPWyNB.cjs.map +0 -1
  236. package/dist/openapi-DBX8cJJ8.mjs +0 -50
  237. package/dist/openapi-DBX8cJJ8.mjs.map +0 -1
  238. package/dist/package-CIfmeuSW.mjs.map +0 -1
  239. package/dist/package-PP-o1nvq.cjs.map +0 -1
  240. package/dist/serverless-DkHBF2vC.mjs.map +0 -1
  241. package/dist/serverless-Yav3GRVz.cjs.map +0 -1
  242. package/dist/templates-CBFUwpBy.mjs +0 -64
  243. package/dist/templates-CBFUwpBy.mjs.map +0 -1
  244. package/dist/templates-DM_rtYYW.cjs +0 -87
  245. package/dist/templates-DM_rtYYW.cjs.map +0 -1
  246. package/dist/worker--8O5a3Hv.cjs.map +0 -1
  247. package/dist/worker-Jme7uOOJ.mjs.map +0 -1
@@ -29,6 +29,16 @@ interface TelescopeConfig {
29
29
  /** Enable WebSocket for real-time updates (default: true, requires @hono/node-ws for Node.js) */
30
30
  websocket?: boolean;
31
31
  }
32
+ interface OpenApiConfig {
33
+ /** Enable OpenAPI generation (default: true) */
34
+ enabled?: boolean;
35
+ /** API title */
36
+ title?: string;
37
+ /** API version */
38
+ version?: string;
39
+ /** API description */
40
+ description?: string;
41
+ }
32
42
  interface ProvidersConfig {
33
43
  aws?: {
34
44
  apiGateway?: {
@@ -58,6 +68,25 @@ interface GkmConfig {
58
68
  * - A TelescopeConfig object for inline configuration
59
69
  */
60
70
  telescope?: string | boolean | TelescopeConfig;
71
+ /**
72
+ * OpenAPI generation configuration.
73
+ * Can be:
74
+ * - A boolean to enable/disable with defaults (output: ./src/api/openapi.ts)
75
+ * - An OpenApiConfig object for customization
76
+ *
77
+ * When enabled, OpenAPI spec is generated on startup and regenerated on route changes.
78
+ *
79
+ * @example
80
+ * openapi: true
81
+ *
82
+ * @example
83
+ * openapi: {
84
+ * output: './src/api/openapi.ts',
85
+ * title: 'My API',
86
+ * version: '1.0.0',
87
+ * }
88
+ */
89
+ openapi?: boolean | OpenApiConfig;
61
90
  /** Runtime to use for dev server (default: 'node') */
62
91
  runtime?: Runtime;
63
92
  /**
@@ -125,5 +154,5 @@ interface SubscribersManifest {
125
154
  subscribers: SubscriberInfo[];
126
155
  }
127
156
  //#endregion
128
- export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
129
- //# sourceMappingURL=types-Cxl8-uwV.d.mts.map
157
+ export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, OpenApiConfig, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
158
+ //# sourceMappingURL=types-Bi7VzDUZ.d.mts.map
@@ -1,4 +1,4 @@
1
- import { CronInfo, FunctionInfo, RouteInfo } from "./types-Cxl8-uwV.mjs";
1
+ import { CronInfo, FunctionInfo, RouteInfo } from "./types-Bi7VzDUZ.mjs";
2
2
  import { Cron } from "@geekmidas/constructs/crons";
3
3
  import { Endpoint } from "@geekmidas/constructs/endpoints";
4
4
  import { Function } from "@geekmidas/constructs/functions";
@@ -48,4 +48,4 @@ interface ProviderBuildResult {
48
48
  }
49
49
  //#endregion
50
50
  export { BuildContext, NormalizedTelescopeConfig, ProcessedCron, ProcessedEndpoint, ProcessedFunction, ProviderBuildResult };
51
- //# sourceMappingURL=types-C4KITv-y.d.mts.map
51
+ //# sourceMappingURL=types-D2xYkOal.d.mts.map
@@ -1,4 +1,4 @@
1
- import { CronInfo, FunctionInfo, RouteInfo } from "./types-DB99_qIy.cjs";
1
+ import { CronInfo, FunctionInfo, RouteInfo } from "./types-KmjzMgu8.cjs";
2
2
  import { Cron } from "@geekmidas/constructs/crons";
3
3
  import { Endpoint } from "@geekmidas/constructs/endpoints";
4
4
  import { Function } from "@geekmidas/constructs/functions";
@@ -48,4 +48,4 @@ interface ProviderBuildResult {
48
48
  }
49
49
  //#endregion
50
50
  export { BuildContext, NormalizedTelescopeConfig, ProcessedCron, ProcessedEndpoint, ProcessedFunction, ProviderBuildResult };
51
- //# sourceMappingURL=types-DLFN49M3.d.cts.map
51
+ //# sourceMappingURL=types-DA-r8HWZ.d.cts.map
@@ -29,6 +29,16 @@ interface TelescopeConfig {
29
29
  /** Enable WebSocket for real-time updates (default: true, requires @hono/node-ws for Node.js) */
30
30
  websocket?: boolean;
31
31
  }
32
+ interface OpenApiConfig {
33
+ /** Enable OpenAPI generation (default: true) */
34
+ enabled?: boolean;
35
+ /** API title */
36
+ title?: string;
37
+ /** API version */
38
+ version?: string;
39
+ /** API description */
40
+ description?: string;
41
+ }
32
42
  interface ProvidersConfig {
33
43
  aws?: {
34
44
  apiGateway?: {
@@ -58,6 +68,25 @@ interface GkmConfig {
58
68
  * - A TelescopeConfig object for inline configuration
59
69
  */
60
70
  telescope?: string | boolean | TelescopeConfig;
71
+ /**
72
+ * OpenAPI generation configuration.
73
+ * Can be:
74
+ * - A boolean to enable/disable with defaults (output: ./src/api/openapi.ts)
75
+ * - An OpenApiConfig object for customization
76
+ *
77
+ * When enabled, OpenAPI spec is generated on startup and regenerated on route changes.
78
+ *
79
+ * @example
80
+ * openapi: true
81
+ *
82
+ * @example
83
+ * openapi: {
84
+ * output: './src/api/openapi.ts',
85
+ * title: 'My API',
86
+ * version: '1.0.0',
87
+ * }
88
+ */
89
+ openapi?: boolean | OpenApiConfig;
61
90
  /** Runtime to use for dev server (default: 'node') */
62
91
  runtime?: Runtime;
63
92
  /**
@@ -125,5 +154,5 @@ interface SubscribersManifest {
125
154
  subscribers: SubscriberInfo[];
126
155
  }
127
156
  //#endregion
128
- export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
129
- //# sourceMappingURL=types-DB99_qIy.d.cts.map
157
+ export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, OpenApiConfig, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
158
+ //# sourceMappingURL=types-KmjzMgu8.d.cts.map
package/dist/types.d.cts CHANGED
@@ -1,2 +1,2 @@
1
- import { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig } from "./types-DB99_qIy.cjs";
2
- export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
1
+ import { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, OpenApiConfig, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig } from "./types-KmjzMgu8.cjs";
2
+ export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, OpenApiConfig, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
package/dist/types.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig } from "./types-Cxl8-uwV.mjs";
2
- export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
1
+ import { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, OpenApiConfig, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig } from "./types-Bi7VzDUZ.mjs";
2
+ export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, OpenApiConfig, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
@@ -66,4 +66,4 @@ function getRunCommand(pkgManager, script) {
66
66
 
67
67
  //#endregion
68
68
  export { checkDirectoryExists, detectPackageManager, getInstallCommand, getRunCommand, validateProjectName };
69
- //# sourceMappingURL=utils-C31-SWHP.mjs.map
69
+ //# sourceMappingURL=utils-CKEzCxc1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-C31-SWHP.mjs","names":["cwd: string","name: string","pkgManager: PackageManager","script: string"],"sources":["../src/init/utils.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\n/**\n * Detect the package manager being used based on lockfiles or npm_config_user_agent\n */\nexport function detectPackageManager(\n cwd: string = process.cwd(),\n): PackageManager {\n // Check for lockfiles in cwd\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n\n // Check npm_config_user_agent (set when running via npx/pnpm dlx/etc)\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n return 'npm';\n}\n\n/**\n * Validate project name for npm package naming conventions\n */\nexport function validateProjectName(name: string): boolean | string {\n if (!name) {\n return 'Project name is required';\n }\n\n // Check for valid npm package name characters\n if (!/^[a-z0-9-_@/.]+$/i.test(name)) {\n return 'Project name can only contain letters, numbers, hyphens, underscores, @, /, and .';\n }\n\n // Check for reserved names\n const reserved = ['node_modules', '.git', 'package.json', 'src'];\n if (reserved.includes(name.toLowerCase())) {\n return `\"${name}\" is a reserved name`;\n }\n\n return true;\n}\n\n/**\n * Check if a directory already exists at the target path\n */\nexport function checkDirectoryExists(\n name: string,\n cwd: string = process.cwd(),\n): boolean | string {\n const targetPath = join(cwd, name);\n if (existsSync(targetPath)) {\n return `Directory \"${name}\" already exists`;\n }\n return true;\n}\n\n/**\n * Get the install command for a package manager\n */\nexport function getInstallCommand(pkgManager: PackageManager): string {\n switch (pkgManager) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn';\n case 'bun':\n return 'bun install';\n case 'npm':\n default:\n return 'npm install';\n }\n}\n\n/**\n * Get the dev command for a package manager\n */\nexport function getRunCommand(\n pkgManager: PackageManager,\n script: string,\n): string {\n switch (pkgManager) {\n case 'pnpm':\n return `pnpm ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'bun':\n return `bun run ${script}`;\n case 'npm':\n default:\n return `npm run ${script}`;\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,qBACdA,MAAc,QAAQ,KAAK,EACX;AAEhB,KAAI,WAAW,KAAK,KAAK,iBAAiB,CAAC,CAAE,QAAO;AACpD,KAAI,WAAW,KAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,WAAW,KAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,WAAW,KAAK,KAAK,oBAAoB,CAAC,CAAE,QAAO;CAGvD,MAAM,YAAY,QAAQ,IAAI,yBAAyB;AACvD,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,MAAM,CAAE,QAAO;AAEtC,QAAO;AACR;;;;AAKD,SAAgB,oBAAoBC,MAAgC;AAClE,MAAK,KACH,QAAO;AAIT,MAAK,oBAAoB,KAAK,KAAK,CACjC,QAAO;CAIT,MAAM,WAAW;EAAC;EAAgB;EAAQ;EAAgB;CAAM;AAChE,KAAI,SAAS,SAAS,KAAK,aAAa,CAAC,CACvC,SAAQ,GAAG,KAAK;AAGlB,QAAO;AACR;;;;AAKD,SAAgB,qBACdA,MACAD,MAAc,QAAQ,KAAK,EACT;CAClB,MAAM,aAAa,KAAK,KAAK,KAAK;AAClC,KAAI,WAAW,WAAW,CACxB,SAAQ,aAAa,KAAK;AAE5B,QAAO;AACR;;;;AAKD,SAAgB,kBAAkBE,YAAoC;AACpE,SAAQ,YAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;AAKD,SAAgB,cACdA,YACAC,QACQ;AACR,SAAQ,YAAR;EACE,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,MACH,SAAQ,UAAU,OAAO;EAC3B,KAAK;EACL,QACE,SAAQ,UAAU,OAAO;CAC5B;AACF"}
1
+ {"version":3,"file":"utils-CKEzCxc1.mjs","names":["cwd: string","name: string","pkgManager: PackageManager","script: string"],"sources":["../src/init/utils.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\n/**\n * Detect the package manager being used based on lockfiles or npm_config_user_agent\n */\nexport function detectPackageManager(\n cwd: string = process.cwd(),\n): PackageManager {\n // Check for lockfiles in cwd\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n\n // Check npm_config_user_agent (set when running via npx/pnpm dlx/etc)\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n return 'npm';\n}\n\n/**\n * Validate project name for npm package naming conventions\n */\nexport function validateProjectName(name: string): boolean | string {\n if (!name) {\n return 'Project name is required';\n }\n\n // Check for valid npm package name characters\n if (!/^[a-z0-9-_@/.]+$/i.test(name)) {\n return 'Project name can only contain letters, numbers, hyphens, underscores, @, /, and .';\n }\n\n // Check for reserved names\n const reserved = ['node_modules', '.git', 'package.json', 'src'];\n if (reserved.includes(name.toLowerCase())) {\n return `\"${name}\" is a reserved name`;\n }\n\n return true;\n}\n\n/**\n * Check if a directory already exists at the target path\n */\nexport function checkDirectoryExists(\n name: string,\n cwd: string = process.cwd(),\n): boolean | string {\n const targetPath = join(cwd, name);\n if (existsSync(targetPath)) {\n return `Directory \"${name}\" already exists`;\n }\n return true;\n}\n\n/**\n * Get the install command for a package manager\n */\nexport function getInstallCommand(pkgManager: PackageManager): string {\n switch (pkgManager) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn';\n case 'bun':\n return 'bun install';\n case 'npm':\n default:\n return 'npm install';\n }\n}\n\n/**\n * Get the dev command for a package manager\n */\nexport function getRunCommand(\n pkgManager: PackageManager,\n script: string,\n): string {\n switch (pkgManager) {\n case 'pnpm':\n return `pnpm ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'bun':\n return `bun run ${script}`;\n case 'npm':\n default:\n return `npm run ${script}`;\n }\n}\n"],"mappings":";;;;;;;AAQA,SAAgB,qBACdA,MAAc,QAAQ,KAAK,EACX;AAEhB,KAAI,WAAW,KAAK,KAAK,iBAAiB,CAAC,CAAE,QAAO;AACpD,KAAI,WAAW,KAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,WAAW,KAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,WAAW,KAAK,KAAK,oBAAoB,CAAC,CAAE,QAAO;CAGvD,MAAM,YAAY,QAAQ,IAAI,yBAAyB;AACvD,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,MAAM,CAAE,QAAO;AAEtC,QAAO;AACR;;;;AAKD,SAAgB,oBAAoBC,MAAgC;AAClE,MAAK,KACH,QAAO;AAIT,MAAK,oBAAoB,KAAK,KAAK,CACjC,QAAO;CAIT,MAAM,WAAW;EAAC;EAAgB;EAAQ;EAAgB;CAAM;AAChE,KAAI,SAAS,SAAS,KAAK,aAAa,CAAC,CACvC,SAAQ,GAAG,KAAK;AAGlB,QAAO;AACR;;;;AAKD,SAAgB,qBACdA,MACAD,MAAc,QAAQ,KAAK,EACT;CAClB,MAAM,aAAa,KAAK,KAAK,KAAK;AAClC,KAAI,WAAW,WAAW,CACxB,SAAQ,aAAa,KAAK;AAE5B,QAAO;AACR;;;;AAKD,SAAgB,kBAAkBE,YAAoC;AACpE,SAAQ,YAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;AAKD,SAAgB,cACdA,YACAC,QACQ;AACR,SAAQ,YAAR;EACE,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,MACH,SAAQ,UAAU,OAAO;EAC3B,KAAK;EACL,QACE,SAAQ,UAAU,OAAO;CAC5B;AACF"}
@@ -96,4 +96,4 @@ Object.defineProperty(exports, 'validateProjectName', {
96
96
  return validateProjectName;
97
97
  }
98
98
  });
99
- //# sourceMappingURL=utils-BX3F4fT8.cjs.map
99
+ //# sourceMappingURL=utils-DSdN2MTt.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-BX3F4fT8.cjs","names":["cwd: string","name: string","pkgManager: PackageManager","script: string"],"sources":["../src/init/utils.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\n/**\n * Detect the package manager being used based on lockfiles or npm_config_user_agent\n */\nexport function detectPackageManager(\n cwd: string = process.cwd(),\n): PackageManager {\n // Check for lockfiles in cwd\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n\n // Check npm_config_user_agent (set when running via npx/pnpm dlx/etc)\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n return 'npm';\n}\n\n/**\n * Validate project name for npm package naming conventions\n */\nexport function validateProjectName(name: string): boolean | string {\n if (!name) {\n return 'Project name is required';\n }\n\n // Check for valid npm package name characters\n if (!/^[a-z0-9-_@/.]+$/i.test(name)) {\n return 'Project name can only contain letters, numbers, hyphens, underscores, @, /, and .';\n }\n\n // Check for reserved names\n const reserved = ['node_modules', '.git', 'package.json', 'src'];\n if (reserved.includes(name.toLowerCase())) {\n return `\"${name}\" is a reserved name`;\n }\n\n return true;\n}\n\n/**\n * Check if a directory already exists at the target path\n */\nexport function checkDirectoryExists(\n name: string,\n cwd: string = process.cwd(),\n): boolean | string {\n const targetPath = join(cwd, name);\n if (existsSync(targetPath)) {\n return `Directory \"${name}\" already exists`;\n }\n return true;\n}\n\n/**\n * Get the install command for a package manager\n */\nexport function getInstallCommand(pkgManager: PackageManager): string {\n switch (pkgManager) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn';\n case 'bun':\n return 'bun install';\n case 'npm':\n default:\n return 'npm install';\n }\n}\n\n/**\n * Get the dev command for a package manager\n */\nexport function getRunCommand(\n pkgManager: PackageManager,\n script: string,\n): string {\n switch (pkgManager) {\n case 'pnpm':\n return `pnpm ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'bun':\n return `bun run ${script}`;\n case 'npm':\n default:\n return `npm run ${script}`;\n }\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,qBACdA,MAAc,QAAQ,KAAK,EACX;AAEhB,KAAI,wBAAW,oBAAK,KAAK,iBAAiB,CAAC,CAAE,QAAO;AACpD,KAAI,wBAAW,oBAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,wBAAW,oBAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,wBAAW,oBAAK,KAAK,oBAAoB,CAAC,CAAE,QAAO;CAGvD,MAAM,YAAY,QAAQ,IAAI,yBAAyB;AACvD,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,MAAM,CAAE,QAAO;AAEtC,QAAO;AACR;;;;AAKD,SAAgB,oBAAoBC,MAAgC;AAClE,MAAK,KACH,QAAO;AAIT,MAAK,oBAAoB,KAAK,KAAK,CACjC,QAAO;CAIT,MAAM,WAAW;EAAC;EAAgB;EAAQ;EAAgB;CAAM;AAChE,KAAI,SAAS,SAAS,KAAK,aAAa,CAAC,CACvC,SAAQ,GAAG,KAAK;AAGlB,QAAO;AACR;;;;AAKD,SAAgB,qBACdA,MACAD,MAAc,QAAQ,KAAK,EACT;CAClB,MAAM,aAAa,oBAAK,KAAK,KAAK;AAClC,KAAI,wBAAW,WAAW,CACxB,SAAQ,aAAa,KAAK;AAE5B,QAAO;AACR;;;;AAKD,SAAgB,kBAAkBE,YAAoC;AACpE,SAAQ,YAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;AAKD,SAAgB,cACdA,YACAC,QACQ;AACR,SAAQ,YAAR;EACE,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,MACH,SAAQ,UAAU,OAAO;EAC3B,KAAK;EACL,QACE,SAAQ,UAAU,OAAO;CAC5B;AACF"}
1
+ {"version":3,"file":"utils-DSdN2MTt.cjs","names":["cwd: string","name: string","pkgManager: PackageManager","script: string"],"sources":["../src/init/utils.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\n/**\n * Detect the package manager being used based on lockfiles or npm_config_user_agent\n */\nexport function detectPackageManager(\n cwd: string = process.cwd(),\n): PackageManager {\n // Check for lockfiles in cwd\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n\n // Check npm_config_user_agent (set when running via npx/pnpm dlx/etc)\n const userAgent = process.env.npm_config_user_agent || '';\n if (userAgent.includes('pnpm')) return 'pnpm';\n if (userAgent.includes('yarn')) return 'yarn';\n if (userAgent.includes('bun')) return 'bun';\n\n return 'npm';\n}\n\n/**\n * Validate project name for npm package naming conventions\n */\nexport function validateProjectName(name: string): boolean | string {\n if (!name) {\n return 'Project name is required';\n }\n\n // Check for valid npm package name characters\n if (!/^[a-z0-9-_@/.]+$/i.test(name)) {\n return 'Project name can only contain letters, numbers, hyphens, underscores, @, /, and .';\n }\n\n // Check for reserved names\n const reserved = ['node_modules', '.git', 'package.json', 'src'];\n if (reserved.includes(name.toLowerCase())) {\n return `\"${name}\" is a reserved name`;\n }\n\n return true;\n}\n\n/**\n * Check if a directory already exists at the target path\n */\nexport function checkDirectoryExists(\n name: string,\n cwd: string = process.cwd(),\n): boolean | string {\n const targetPath = join(cwd, name);\n if (existsSync(targetPath)) {\n return `Directory \"${name}\" already exists`;\n }\n return true;\n}\n\n/**\n * Get the install command for a package manager\n */\nexport function getInstallCommand(pkgManager: PackageManager): string {\n switch (pkgManager) {\n case 'pnpm':\n return 'pnpm install';\n case 'yarn':\n return 'yarn';\n case 'bun':\n return 'bun install';\n case 'npm':\n default:\n return 'npm install';\n }\n}\n\n/**\n * Get the dev command for a package manager\n */\nexport function getRunCommand(\n pkgManager: PackageManager,\n script: string,\n): string {\n switch (pkgManager) {\n case 'pnpm':\n return `pnpm ${script}`;\n case 'yarn':\n return `yarn ${script}`;\n case 'bun':\n return `bun run ${script}`;\n case 'npm':\n default:\n return `npm run ${script}`;\n }\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,qBACdA,MAAc,QAAQ,KAAK,EACX;AAEhB,KAAI,wBAAW,oBAAK,KAAK,iBAAiB,CAAC,CAAE,QAAO;AACpD,KAAI,wBAAW,oBAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,wBAAW,oBAAK,KAAK,YAAY,CAAC,CAAE,QAAO;AAC/C,KAAI,wBAAW,oBAAK,KAAK,oBAAoB,CAAC,CAAE,QAAO;CAGvD,MAAM,YAAY,QAAQ,IAAI,yBAAyB;AACvD,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,OAAO,CAAE,QAAO;AACvC,KAAI,UAAU,SAAS,MAAM,CAAE,QAAO;AAEtC,QAAO;AACR;;;;AAKD,SAAgB,oBAAoBC,MAAgC;AAClE,MAAK,KACH,QAAO;AAIT,MAAK,oBAAoB,KAAK,KAAK,CACjC,QAAO;CAIT,MAAM,WAAW;EAAC;EAAgB;EAAQ;EAAgB;CAAM;AAChE,KAAI,SAAS,SAAS,KAAK,aAAa,CAAC,CACvC,SAAQ,GAAG,KAAK;AAGlB,QAAO;AACR;;;;AAKD,SAAgB,qBACdA,MACAD,MAAc,QAAQ,KAAK,EACT;CAClB,MAAM,aAAa,oBAAK,KAAK,KAAK;AAClC,KAAI,wBAAW,WAAW,CACxB,SAAQ,aAAa,KAAK;AAE5B,QAAO;AACR;;;;AAKD,SAAgB,kBAAkBE,YAAoC;AACpE,SAAQ,YAAR;EACE,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,MACH,QAAO;EACT,KAAK;EACL,QACE,QAAO;CACV;AACF;;;;AAKD,SAAgB,cACdA,YACAC,QACQ;AACR,SAAQ,YAAR;EACE,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,OACH,SAAQ,OAAO,OAAO;EACxB,KAAK,MACH,SAAQ,UAAU,OAAO;EAC3B,KAAK;EACL,QACE,SAAQ,UAAU,OAAO;CAC5B;AACF"}
@@ -31,6 +31,18 @@ const workerTemplate = {
31
31
  "fmt:check": "biome format ."
32
32
  },
33
33
  files: (options) => {
34
+ const { loggerType, routesStructure } = options;
35
+ const loggerContent = `import { createLogger } from '@geekmidas/logger/${loggerType}';
36
+
37
+ export const logger = createLogger();
38
+ `;
39
+ const getRoutePath = (file) => {
40
+ switch (routesStructure) {
41
+ case "centralized-endpoints": return `src/endpoints/${file}`;
42
+ case "centralized-routes": return `src/routes/${file}`;
43
+ case "domain-based": return `src/${file.replace(".ts", "")}/routes/index.ts`;
44
+ }
45
+ };
34
46
  const files = [
35
47
  {
36
48
  path: "src/config/env.ts",
@@ -54,16 +66,10 @@ export const config = envParser
54
66
  },
55
67
  {
56
68
  path: "src/config/logger.ts",
57
- content: `import { PinoLogger } from '@geekmidas/logger/pino';
58
-
59
- export const logger = new PinoLogger({
60
- app: '${options.name}',
61
- level: process.env.LOG_LEVEL || 'info',
62
- });
63
- `
69
+ content: loggerContent
64
70
  },
65
71
  {
66
- path: "src/endpoints/health.ts",
72
+ path: getRoutePath("health.ts"),
67
73
  content: `import { e } from '@geekmidas/constructs/endpoints';
68
74
 
69
75
  export default e
@@ -147,4 +153,4 @@ Object.defineProperty(exports, 'workerTemplate', {
147
153
  return workerTemplate;
148
154
  }
149
155
  });
150
- //# sourceMappingURL=worker--8O5a3Hv.cjs.map
156
+ //# sourceMappingURL=worker-CGhlqNH-.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-CGhlqNH-.cjs","names":["workerTemplate: TemplateConfig","options: TemplateOptions","file: string","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 { loggerType, routesStructure } = options;\n\n const loggerContent = `import { createLogger } from '@geekmidas/logger/${loggerType}';\n\nexport const logger = createLogger();\n`;\n\n // Get route path based on structure\n const getRoutePath = (file: string) => {\n switch (routesStructure) {\n case 'centralized-endpoints':\n return `src/endpoints/${file}`;\n case 'centralized-routes':\n return `src/routes/${file}`;\n case 'domain-based':\n return `src/${file.replace('.ts', '')}/routes/index.ts`;\n }\n };\n\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\n {\n path: 'src/config/logger.ts',\n content: loggerContent,\n },\n\n // health endpoint\n {\n path: getRoutePath('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,MAAM,EAAE,YAAY,iBAAiB,GAAG;EAExC,MAAM,iBAAiB,kDAAkD,WAAW;;;;EAMpF,MAAM,eAAe,CAACC,SAAiB;AACrC,WAAQ,iBAAR;IACE,KAAK,wBACH,SAAQ,gBAAgB,KAAK;IAC/B,KAAK,qBACH,SAAQ,aAAa,KAAK;IAC5B,KAAK,eACH,SAAQ,MAAM,KAAK,QAAQ,OAAO,GAAG,CAAC;GACzC;EACF;EAED,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;;;;QAWZ,QAAQ,YACH;;;UAID,GACL;;;;GAIE;GAGD;IACE,MAAM;IACN,SAAS;GACV;GAGD;IACE,MAAM,aAAa,YAAY;IAC/B,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"}
@@ -30,6 +30,18 @@ const workerTemplate = {
30
30
  "fmt:check": "biome format ."
31
31
  },
32
32
  files: (options) => {
33
+ const { loggerType, routesStructure } = options;
34
+ const loggerContent = `import { createLogger } from '@geekmidas/logger/${loggerType}';
35
+
36
+ export const logger = createLogger();
37
+ `;
38
+ const getRoutePath = (file) => {
39
+ switch (routesStructure) {
40
+ case "centralized-endpoints": return `src/endpoints/${file}`;
41
+ case "centralized-routes": return `src/routes/${file}`;
42
+ case "domain-based": return `src/${file.replace(".ts", "")}/routes/index.ts`;
43
+ }
44
+ };
33
45
  const files = [
34
46
  {
35
47
  path: "src/config/env.ts",
@@ -53,16 +65,10 @@ export const config = envParser
53
65
  },
54
66
  {
55
67
  path: "src/config/logger.ts",
56
- content: `import { PinoLogger } from '@geekmidas/logger/pino';
57
-
58
- export const logger = new PinoLogger({
59
- app: '${options.name}',
60
- level: process.env.LOG_LEVEL || 'info',
61
- });
62
- `
68
+ content: loggerContent
63
69
  },
64
70
  {
65
- path: "src/endpoints/health.ts",
71
+ path: getRoutePath("health.ts"),
66
72
  content: `import { e } from '@geekmidas/constructs/endpoints';
67
73
 
68
74
  export default e
@@ -141,4 +147,4 @@ export const telescope = new Telescope({
141
147
 
142
148
  //#endregion
143
149
  export { workerTemplate };
144
- //# sourceMappingURL=worker-Jme7uOOJ.mjs.map
150
+ //# sourceMappingURL=worker-CiP420As.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-CiP420As.mjs","names":["workerTemplate: TemplateConfig","options: TemplateOptions","file: string","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 { loggerType, routesStructure } = options;\n\n const loggerContent = `import { createLogger } from '@geekmidas/logger/${loggerType}';\n\nexport const logger = createLogger();\n`;\n\n // Get route path based on structure\n const getRoutePath = (file: string) => {\n switch (routesStructure) {\n case 'centralized-endpoints':\n return `src/endpoints/${file}`;\n case 'centralized-routes':\n return `src/routes/${file}`;\n case 'domain-based':\n return `src/${file.replace('.ts', '')}/routes/index.ts`;\n }\n };\n\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\n {\n path: 'src/config/logger.ts',\n content: loggerContent,\n },\n\n // health endpoint\n {\n path: getRoutePath('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,MAAM,EAAE,YAAY,iBAAiB,GAAG;EAExC,MAAM,iBAAiB,kDAAkD,WAAW;;;;EAMpF,MAAM,eAAe,CAACC,SAAiB;AACrC,WAAQ,iBAAR;IACE,KAAK,wBACH,SAAQ,gBAAgB,KAAK;IAC/B,KAAK,qBACH,SAAQ,aAAa,KAAK;IAC5B,KAAK,eACH,SAAQ,MAAM,KAAK,QAAQ,OAAO,GAAG,CAAC;GACzC;EACF;EAED,MAAMC,QAAyB;GAE7B;IACE,MAAM;IACN,UAAU;;;;;;;;;;QAWZ,QAAQ,YACH;;;UAID,GACL;;;;GAIE;GAGD;IACE,MAAM;IACN,SAAS;GACV;GAGD;IACE,MAAM,aAAa,YAAY;IAC/B,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,6 +1,6 @@
1
- import type { GkmConfig } from '@geekmidas/cli';
1
+ import { defineConfig } from '@geekmidas/cli/config';
2
2
 
3
- const config: GkmConfig = {
3
+ export default defineConfig({
4
4
  // Glob pattern to find endpoint files
5
5
  routes: 'src/routes/**/*.ts',
6
6
 
@@ -11,6 +11,4 @@ const config: GkmConfig = {
11
11
  // Logger configuration
12
12
  // Format: path#exportName (if no #exportName, treats as default import)
13
13
  logger: './src/logger.ts#logger',
14
- };
15
-
16
- export default config;
14
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekmidas/cli",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
4
4
  "description": "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs",
5
5
  "private": false,
6
6
  "type": "module",
@@ -53,11 +53,11 @@
53
53
  "@geekmidas/testkit": "0.0.17"
54
54
  },
55
55
  "peerDependencies": {
56
- "@geekmidas/constructs": "~0.2.1",
56
+ "@geekmidas/constructs": "~0.2.3",
57
57
  "@geekmidas/envkit": "~0.1.0",
58
58
  "@geekmidas/logger": "~0.0.1",
59
- "@geekmidas/telescope": "~0.0.1",
60
- "@geekmidas/schema": "~0.0.3"
59
+ "@geekmidas/schema": "~0.0.3",
60
+ "@geekmidas/telescope": "~0.0.1"
61
61
  },
62
62
  "peerDependenciesMeta": {
63
63
  "@geekmidas/telescope": {