@geekmidas/cli 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (298) hide show
  1. package/dist/CronGenerator-BPTqNYOR.d.cts +14 -0
  2. package/dist/{CronGenerator-Bh26MaNA.mjs → CronGenerator-CCRYptuT.mjs} +2 -2
  3. package/dist/{CronGenerator-Bh26MaNA.mjs.map → CronGenerator-CCRYptuT.mjs.map} +1 -1
  4. package/dist/{CronGenerator-C6MF8rlG.cjs → CronGenerator-D4TWXQbh.cjs} +2 -2
  5. package/dist/{CronGenerator-C6MF8rlG.cjs.map → CronGenerator-D4TWXQbh.cjs.map} +1 -1
  6. package/dist/CronGenerator-YAj59JUd.d.mts +14 -0
  7. package/dist/EndpointGenerator-ChAD1INz.d.cts +19 -0
  8. package/dist/EndpointGenerator-Cj3O1U8-.d.mts +19 -0
  9. package/dist/{EndpointGenerator-CzDhG7Or.mjs → EndpointGenerator-DGivkPLT.mjs} +22 -6
  10. package/dist/EndpointGenerator-DGivkPLT.mjs.map +1 -0
  11. package/dist/{EndpointGenerator-BxNCkus4.cjs → EndpointGenerator-npWEDoK2.cjs} +22 -6
  12. package/dist/EndpointGenerator-npWEDoK2.cjs.map +1 -0
  13. package/dist/FunctionGenerator-429-9NER.d.cts +14 -0
  14. package/dist/FunctionGenerator-BQ4ehoID.d.mts +14 -0
  15. package/dist/{FunctionGenerator-BNE_GC7N.mjs → FunctionGenerator-CVk0h8tO.mjs} +2 -2
  16. package/dist/{FunctionGenerator-BNE_GC7N.mjs.map → FunctionGenerator-CVk0h8tO.mjs.map} +1 -1
  17. package/dist/{FunctionGenerator-FgZUTd8L.cjs → FunctionGenerator-DYTnyr4c.cjs} +2 -2
  18. package/dist/{FunctionGenerator-FgZUTd8L.cjs.map → FunctionGenerator-DYTnyr4c.cjs.map} +1 -1
  19. package/dist/Generator-BjHK_qce.d.mts +27 -0
  20. package/dist/{Generator-UanJW0_V.mjs → Generator-CDt4pB3W.mjs} +1 -1
  21. package/dist/{Generator-UanJW0_V.mjs.map → Generator-CDt4pB3W.mjs.map} +1 -1
  22. package/dist/{Generator-CDoEXCDg.cjs → Generator-CLVplqm2.cjs} +1 -1
  23. package/dist/{Generator-CDoEXCDg.cjs.map → Generator-CLVplqm2.cjs.map} +1 -1
  24. package/dist/Generator-DxQMCQp7.d.cts +27 -0
  25. package/dist/{OpenApiTsGenerator-NBNEoaeO.cjs → OpenApiTsGenerator-Be-sKGTT.cjs} +1 -1
  26. package/dist/{OpenApiTsGenerator-NBNEoaeO.cjs.map → OpenApiTsGenerator-Be-sKGTT.cjs.map} +1 -1
  27. package/dist/{OpenApiTsGenerator-q3aWNkuM.mjs → OpenApiTsGenerator-C4mHHaku.mjs} +1 -1
  28. package/dist/{OpenApiTsGenerator-q3aWNkuM.mjs.map → OpenApiTsGenerator-C4mHHaku.mjs.map} +1 -1
  29. package/dist/SubscriberGenerator-7uX42xyG.d.mts +15 -0
  30. package/dist/{SubscriberGenerator-Dnlj_1FK.mjs → SubscriberGenerator-DABaJXML.mjs} +2 -2
  31. package/dist/{SubscriberGenerator-Dnlj_1FK.mjs.map → SubscriberGenerator-DABaJXML.mjs.map} +1 -1
  32. package/dist/{SubscriberGenerator-Bd-a7aiw.cjs → SubscriberGenerator-D_zpNGFr.cjs} +2 -2
  33. package/dist/{SubscriberGenerator-Bd-a7aiw.cjs.map → SubscriberGenerator-D_zpNGFr.cjs.map} +1 -1
  34. package/dist/SubscriberGenerator-Dtb3HS4i.d.cts +15 -0
  35. package/dist/api-B3SCEHPf.cjs +190 -0
  36. package/dist/api-B3SCEHPf.cjs.map +1 -0
  37. package/dist/api-BKIN0s0S.mjs +184 -0
  38. package/dist/api-BKIN0s0S.mjs.map +1 -0
  39. package/dist/build/index.cjs +11 -10
  40. package/dist/build/index.d.cts +7 -0
  41. package/dist/build/index.d.mts +7 -0
  42. package/dist/build/index.mjs +11 -10
  43. package/dist/build/manifests.cjs +1 -1
  44. package/dist/build/manifests.d.cts +13 -0
  45. package/dist/build/manifests.d.mts +13 -0
  46. package/dist/build/manifests.mjs +1 -1
  47. package/dist/build/providerResolver.cjs +1 -1
  48. package/dist/build/providerResolver.d.cts +23 -0
  49. package/dist/build/providerResolver.d.mts +23 -0
  50. package/dist/build/providerResolver.mjs +1 -1
  51. package/dist/build/types.d.cts +3 -0
  52. package/dist/build/types.d.mts +3 -0
  53. package/dist/{build-DyDgu_D1.mjs → build-B8C_qHir.mjs} +15 -13
  54. package/dist/build-B8C_qHir.mjs.map +1 -0
  55. package/dist/{build-CWtHnJMQ.cjs → build-D0Wr49bf.cjs} +15 -13
  56. package/dist/build-D0Wr49bf.cjs.map +1 -0
  57. package/dist/config-Ba-Gbpbc.d.cts +11 -0
  58. package/dist/config-Bq72aj8e.mjs +75 -0
  59. package/dist/config-Bq72aj8e.mjs.map +1 -0
  60. package/dist/config-CFls09Ey.cjs +93 -0
  61. package/dist/config-CFls09Ey.cjs.map +1 -0
  62. package/dist/config-CLEDqKO3.cjs +157 -0
  63. package/dist/config-CLEDqKO3.cjs.map +1 -0
  64. package/dist/config-DBsmMDhf.d.mts +11 -0
  65. package/dist/config-Dp8RonV_.mjs +151 -0
  66. package/dist/config-Dp8RonV_.mjs.map +1 -0
  67. package/dist/config.cjs +4 -2
  68. package/dist/config.d.cts +48 -0
  69. package/dist/config.d.mts +48 -0
  70. package/dist/config.mjs +2 -2
  71. package/dist/dev/index.cjs +10 -9
  72. package/dist/dev/index.d.cts +36 -0
  73. package/dist/dev/index.d.mts +36 -0
  74. package/dist/dev/index.mjs +10 -10
  75. package/dist/{dev-CpA8AQPX.mjs → dev-B734w3L1.mjs} +93 -49
  76. package/dist/dev-B734w3L1.mjs.map +1 -0
  77. package/dist/{dev-CgDYC4o8.cjs → dev-DHqYn8k4.cjs} +71 -21
  78. package/dist/dev-DHqYn8k4.cjs.map +1 -0
  79. package/dist/docker-5d8Yh5_X.cjs +119 -0
  80. package/dist/docker-5d8Yh5_X.cjs.map +1 -0
  81. package/dist/docker-DlUqdFle.mjs +113 -0
  82. package/dist/docker-DlUqdFle.mjs.map +1 -0
  83. package/dist/env-B-OKjgI4.cjs +144 -0
  84. package/dist/env-B-OKjgI4.cjs.map +1 -0
  85. package/dist/env-HfuJRlg5.d.cts +11 -0
  86. package/dist/env-nd-iQPYM.d.mts +11 -0
  87. package/dist/env-tv1HlZlw.mjs +138 -0
  88. package/dist/env-tv1HlZlw.mjs.map +1 -0
  89. package/dist/generators/CronGenerator.cjs +2 -2
  90. package/dist/generators/CronGenerator.d.cts +5 -0
  91. package/dist/generators/CronGenerator.d.mts +5 -0
  92. package/dist/generators/CronGenerator.mjs +2 -2
  93. package/dist/generators/EndpointGenerator.cjs +2 -2
  94. package/dist/generators/EndpointGenerator.d.cts +5 -0
  95. package/dist/generators/EndpointGenerator.d.mts +5 -0
  96. package/dist/generators/EndpointGenerator.mjs +2 -2
  97. package/dist/generators/FunctionGenerator.cjs +2 -2
  98. package/dist/generators/FunctionGenerator.d.cts +5 -0
  99. package/dist/generators/FunctionGenerator.d.mts +5 -0
  100. package/dist/generators/FunctionGenerator.mjs +2 -2
  101. package/dist/generators/Generator.cjs +1 -1
  102. package/dist/generators/Generator.d.cts +4 -0
  103. package/dist/generators/Generator.d.mts +4 -0
  104. package/dist/generators/Generator.mjs +1 -1
  105. package/dist/generators/OpenApiTsGenerator.cjs +1 -1
  106. package/dist/generators/OpenApiTsGenerator.d.cts +44 -0
  107. package/dist/generators/OpenApiTsGenerator.d.mts +44 -0
  108. package/dist/generators/OpenApiTsGenerator.mjs +1 -1
  109. package/dist/generators/SubscriberGenerator.cjs +2 -2
  110. package/dist/generators/SubscriberGenerator.d.cts +5 -0
  111. package/dist/generators/SubscriberGenerator.d.mts +5 -0
  112. package/dist/generators/SubscriberGenerator.mjs +2 -2
  113. package/dist/generators/index.cjs +6 -6
  114. package/dist/generators/index.d.cts +8 -0
  115. package/dist/generators/index.d.mts +8 -0
  116. package/dist/generators/index.mjs +6 -6
  117. package/dist/index-C523No_B.d.mts +64 -0
  118. package/dist/index-DrzN4xkQ.d.cts +64 -0
  119. package/dist/index.cjs +48 -16
  120. package/dist/index.cjs.map +1 -1
  121. package/dist/index.d.cts +1 -0
  122. package/dist/index.d.mts +1 -0
  123. package/dist/index.mjs +48 -16
  124. package/dist/index.mjs.map +1 -1
  125. package/dist/init/generators/config.cjs +3 -0
  126. package/dist/init/generators/config.d.cts +3 -0
  127. package/dist/init/generators/config.d.mts +3 -0
  128. package/dist/init/generators/config.mjs +3 -0
  129. package/dist/init/generators/docker.cjs +3 -0
  130. package/dist/init/generators/docker.d.cts +11 -0
  131. package/dist/init/generators/docker.d.mts +11 -0
  132. package/dist/init/generators/docker.mjs +3 -0
  133. package/dist/init/generators/env.cjs +3 -0
  134. package/dist/init/generators/env.d.cts +3 -0
  135. package/dist/init/generators/env.d.mts +3 -0
  136. package/dist/init/generators/env.mjs +3 -0
  137. package/dist/init/generators/index.cjs +9 -0
  138. package/dist/init/generators/index.d.cts +6 -0
  139. package/dist/init/generators/index.d.mts +6 -0
  140. package/dist/init/generators/index.mjs +6 -0
  141. package/dist/init/generators/models.cjs +3 -0
  142. package/dist/init/generators/models.d.cts +11 -0
  143. package/dist/init/generators/models.d.mts +11 -0
  144. package/dist/init/generators/models.mjs +3 -0
  145. package/dist/init/generators/monorepo.cjs +3 -0
  146. package/dist/init/generators/monorepo.d.cts +11 -0
  147. package/dist/init/generators/monorepo.d.mts +11 -0
  148. package/dist/init/generators/monorepo.mjs +3 -0
  149. package/dist/init/generators/package.cjs +3 -0
  150. package/dist/init/generators/package.d.cts +3 -0
  151. package/dist/init/generators/package.d.mts +3 -0
  152. package/dist/init/generators/package.mjs +3 -0
  153. package/dist/init/generators/source.cjs +3 -0
  154. package/dist/init/generators/source.d.cts +3 -0
  155. package/dist/init/generators/source.d.mts +3 -0
  156. package/dist/init/generators/source.mjs +3 -0
  157. package/dist/init/index.cjs +16 -0
  158. package/dist/init/index.d.cts +17 -0
  159. package/dist/init/index.d.mts +17 -0
  160. package/dist/init/index.mjs +16 -0
  161. package/dist/init/templates/api.cjs +3 -0
  162. package/dist/init/templates/api.d.cts +7 -0
  163. package/dist/init/templates/api.d.mts +7 -0
  164. package/dist/init/templates/api.mjs +3 -0
  165. package/dist/init/templates/index.cjs +10 -0
  166. package/dist/init/templates/index.d.cts +2 -0
  167. package/dist/init/templates/index.d.mts +2 -0
  168. package/dist/init/templates/index.mjs +7 -0
  169. package/dist/init/templates/minimal.cjs +3 -0
  170. package/dist/init/templates/minimal.d.cts +7 -0
  171. package/dist/init/templates/minimal.d.mts +7 -0
  172. package/dist/init/templates/minimal.mjs +3 -0
  173. package/dist/init/templates/serverless.cjs +3 -0
  174. package/dist/init/templates/serverless.d.cts +7 -0
  175. package/dist/init/templates/serverless.d.mts +7 -0
  176. package/dist/init/templates/serverless.mjs +3 -0
  177. package/dist/init/templates/worker.cjs +3 -0
  178. package/dist/init/templates/worker.d.cts +7 -0
  179. package/dist/init/templates/worker.d.mts +7 -0
  180. package/dist/init/templates/worker.mjs +3 -0
  181. package/dist/init/utils.cjs +7 -0
  182. package/dist/init/utils.d.cts +25 -0
  183. package/dist/init/utils.d.mts +25 -0
  184. package/dist/init/utils.mjs +3 -0
  185. package/dist/init-CtOnZn3G.mjs +145 -0
  186. package/dist/init-CtOnZn3G.mjs.map +1 -0
  187. package/dist/init-qLFsWR-R.cjs +151 -0
  188. package/dist/init-qLFsWR-R.cjs.map +1 -0
  189. package/dist/{manifests-C2eMoMUm.mjs → manifests-DIA_2QYd.mjs} +1 -1
  190. package/dist/{manifests-C2eMoMUm.mjs.map → manifests-DIA_2QYd.mjs.map} +1 -1
  191. package/dist/{manifests-CK1VV_pM.cjs → manifests-VJ9-2JpW.cjs} +1 -1
  192. package/dist/{manifests-CK1VV_pM.cjs.map → manifests-VJ9-2JpW.cjs.map} +1 -1
  193. package/dist/minimal-Bdhhpp7v.cjs +93 -0
  194. package/dist/minimal-Bdhhpp7v.cjs.map +1 -0
  195. package/dist/minimal-C4GsE45s.mjs +87 -0
  196. package/dist/minimal-C4GsE45s.mjs.map +1 -0
  197. package/dist/models-DyNwdOcz.cjs +121 -0
  198. package/dist/models-DyNwdOcz.cjs.map +1 -0
  199. package/dist/models-cvNg6Oea.mjs +115 -0
  200. package/dist/models-cvNg6Oea.mjs.map +1 -0
  201. package/dist/monorepo-Cknwzj5C.mjs +184 -0
  202. package/dist/monorepo-Cknwzj5C.mjs.map +1 -0
  203. package/dist/monorepo-sEK8gW59.cjs +190 -0
  204. package/dist/monorepo-sEK8gW59.cjs.map +1 -0
  205. package/dist/{openapi-DhK4b0lB.cjs → openapi-BQWPWyNB.cjs} +4 -4
  206. package/dist/{openapi-DhK4b0lB.cjs.map → openapi-BQWPWyNB.cjs.map} +1 -1
  207. package/dist/{openapi-DRTRGhTt.mjs → openapi-DBX8cJJ8.mjs} +4 -4
  208. package/dist/{openapi-DRTRGhTt.mjs.map → openapi-DBX8cJJ8.mjs.map} +1 -1
  209. package/dist/{openapi-react-query-D9Z7lh0p.cjs → openapi-react-query-DxHjXQvg.cjs} +1 -1
  210. package/dist/{openapi-react-query-D9Z7lh0p.cjs.map → openapi-react-query-DxHjXQvg.cjs.map} +1 -1
  211. package/dist/{openapi-react-query-MEBlYIM1.mjs → openapi-react-query-o7Mp1Jd5.mjs} +1 -1
  212. package/dist/{openapi-react-query-MEBlYIM1.mjs.map → openapi-react-query-o7Mp1Jd5.mjs.map} +1 -1
  213. package/dist/openapi-react-query.cjs +1 -1
  214. package/dist/openapi-react-query.d.cts +11 -0
  215. package/dist/openapi-react-query.d.mts +11 -0
  216. package/dist/openapi-react-query.mjs +1 -1
  217. package/dist/openapi.cjs +5 -5
  218. package/dist/openapi.d.cts +11 -0
  219. package/dist/openapi.d.mts +11 -0
  220. package/dist/openapi.mjs +5 -5
  221. package/dist/package-C7WhWU8m.d.mts +11 -0
  222. package/dist/package-CIfmeuSW.mjs +51 -0
  223. package/dist/package-CIfmeuSW.mjs.map +1 -0
  224. package/dist/package-DvWEMz6z.d.cts +11 -0
  225. package/dist/package-PP-o1nvq.cjs +57 -0
  226. package/dist/package-PP-o1nvq.cjs.map +1 -0
  227. package/dist/{providerResolver-B_TjNF0_.mjs → providerResolver-DEVKngbC.mjs} +1 -1
  228. package/dist/{providerResolver-B_TjNF0_.mjs.map → providerResolver-DEVKngbC.mjs.map} +1 -1
  229. package/dist/{providerResolver-DgvzNfP4.cjs → providerResolver-DOTbN9jo.cjs} +1 -1
  230. package/dist/{providerResolver-DgvzNfP4.cjs.map → providerResolver-DOTbN9jo.cjs.map} +1 -1
  231. package/dist/serverless-DkHBF2vC.mjs +108 -0
  232. package/dist/serverless-DkHBF2vC.mjs.map +1 -0
  233. package/dist/serverless-Yav3GRVz.cjs +114 -0
  234. package/dist/serverless-Yav3GRVz.cjs.map +1 -0
  235. package/dist/source-D6v2BnKT.d.mts +11 -0
  236. package/dist/source-D8fK9qRo.d.cts +11 -0
  237. package/dist/source-DT5Xhiob.cjs +17 -0
  238. package/dist/source-DT5Xhiob.cjs.map +1 -0
  239. package/dist/source-DnaH_MLA.mjs +11 -0
  240. package/dist/source-DnaH_MLA.mjs.map +1 -0
  241. package/dist/templates-CBFUwpBy.mjs +64 -0
  242. package/dist/templates-CBFUwpBy.mjs.map +1 -0
  243. package/dist/templates-DM_rtYYW.cjs +87 -0
  244. package/dist/templates-DM_rtYYW.cjs.map +1 -0
  245. package/dist/types-C4KITv-y.d.mts +51 -0
  246. package/dist/types-Cxl8-uwV.d.mts +129 -0
  247. package/dist/types-DB99_qIy.d.cts +129 -0
  248. package/dist/types-DLFN49M3.d.cts +51 -0
  249. package/dist/types.d.cts +2 -0
  250. package/dist/types.d.mts +2 -0
  251. package/dist/utils-BX3F4fT8.cjs +99 -0
  252. package/dist/utils-BX3F4fT8.cjs.map +1 -0
  253. package/dist/utils-C31-SWHP.mjs +69 -0
  254. package/dist/utils-C31-SWHP.mjs.map +1 -0
  255. package/dist/worker--8O5a3Hv.cjs +150 -0
  256. package/dist/worker--8O5a3Hv.cjs.map +1 -0
  257. package/dist/worker-Jme7uOOJ.mjs +144 -0
  258. package/dist/worker-Jme7uOOJ.mjs.map +1 -0
  259. package/package.json +11 -3
  260. package/src/__tests__/loadEnvFiles.spec.ts +131 -0
  261. package/src/build/index.ts +14 -16
  262. package/src/build/types.ts +5 -0
  263. package/src/config.ts +57 -0
  264. package/src/dev/index.ts +77 -17
  265. package/src/generators/EndpointGenerator.ts +37 -8
  266. package/src/index.ts +26 -0
  267. package/src/init/__tests__/generators.spec.ts +366 -0
  268. package/src/init/__tests__/init.spec.ts +341 -0
  269. package/src/init/__tests__/utils.spec.ts +104 -0
  270. package/src/init/generators/config.ts +192 -0
  271. package/src/init/generators/docker.ts +134 -0
  272. package/src/init/generators/env.ts +182 -0
  273. package/src/init/generators/index.ts +4 -0
  274. package/src/init/generators/models.ts +129 -0
  275. package/src/init/generators/monorepo.ts +211 -0
  276. package/src/init/generators/package.ts +81 -0
  277. package/src/init/generators/source.ts +15 -0
  278. package/src/init/index.ts +206 -0
  279. package/src/init/templates/api.ts +218 -0
  280. package/src/init/templates/index.ts +108 -0
  281. package/src/init/templates/minimal.ts +102 -0
  282. package/src/init/templates/serverless.ts +129 -0
  283. package/src/init/templates/worker.ts +169 -0
  284. package/src/init/utils.ts +98 -0
  285. package/src/types.ts +22 -2
  286. package/tsdown.config.ts +1 -1
  287. package/dist/EndpointGenerator-BxNCkus4.cjs.map +0 -1
  288. package/dist/EndpointGenerator-CzDhG7Or.mjs.map +0 -1
  289. package/dist/build-CWtHnJMQ.cjs.map +0 -1
  290. package/dist/build-DyDgu_D1.mjs.map +0 -1
  291. package/dist/config-AFmFKmU0.mjs +0 -30
  292. package/dist/config-AFmFKmU0.mjs.map +0 -1
  293. package/dist/config-BVIJpAsa.cjs +0 -36
  294. package/dist/config-BVIJpAsa.cjs.map +0 -1
  295. package/dist/dev-CgDYC4o8.cjs.map +0 -1
  296. package/dist/dev-CpA8AQPX.mjs.map +0 -1
  297. /package/dist/{generators-CEKtVh81.cjs → generators-3IemvCLk.cjs} +0 -0
  298. /package/dist/{generators-CsLujGXs.mjs → generators-FNpdfN6J.mjs} +0 -0
package/dist/config.cjs CHANGED
@@ -1,3 +1,5 @@
1
- const require_config = require('./config-BVIJpAsa.cjs');
1
+ const require_config = require('./config-CFls09Ey.cjs');
2
2
 
3
- exports.loadConfig = require_config.loadConfig;
3
+ exports.defineConfig = require_config.defineConfig;
4
+ exports.loadConfig = require_config.loadConfig;
5
+ exports.parseModuleConfig = require_config.parseModuleConfig;
@@ -0,0 +1,48 @@
1
+ import { GkmConfig } from "./types-DB99_qIy.cjs";
2
+
3
+ //#region src/config.d.ts
4
+
5
+ /**
6
+ * Define GKM configuration with full TypeScript support.
7
+ * This is an identity function that provides type safety and autocomplete.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // gkm.config.ts
12
+ * import { defineConfig } from '@geekmidas/cli/config';
13
+ *
14
+ * export default defineConfig({
15
+ * routes: './src/endpoints/**\/*.ts',
16
+ * envParser: './src/config/env',
17
+ * logger: './src/config/logger',
18
+ * telescope: true,
19
+ * });
20
+ * ```
21
+ */
22
+ declare function defineConfig(config: GkmConfig): GkmConfig;
23
+ interface ParsedModuleConfig {
24
+ path: string;
25
+ importPattern: string;
26
+ }
27
+ /**
28
+ * Parse a module config string into path and import pattern.
29
+ *
30
+ * @param configString - Config string in format "./path/to/module" or "./path/to/module#exportName"
31
+ * @param defaultAlias - The default alias name to use if no export name specified
32
+ * @returns Object with path and import pattern
33
+ *
34
+ * @example
35
+ * parseModuleConfig('./src/config/env', 'envParser')
36
+ * // { path: './src/config/env', importPattern: 'envParser' }
37
+ *
38
+ * parseModuleConfig('./src/config/env#envParser', 'envParser')
39
+ * // { path: './src/config/env', importPattern: '{ envParser }' }
40
+ *
41
+ * parseModuleConfig('./src/config/env#myEnv', 'envParser')
42
+ * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }
43
+ */
44
+ declare function parseModuleConfig(configString: string, defaultAlias: string): ParsedModuleConfig;
45
+ declare function loadConfig(cwd?: string): Promise<GkmConfig>;
46
+ //#endregion
47
+ export { ParsedModuleConfig, defineConfig, loadConfig, parseModuleConfig };
48
+ //# sourceMappingURL=config.d.cts.map
@@ -0,0 +1,48 @@
1
+ import { GkmConfig } from "./types-Cxl8-uwV.mjs";
2
+
3
+ //#region src/config.d.ts
4
+
5
+ /**
6
+ * Define GKM configuration with full TypeScript support.
7
+ * This is an identity function that provides type safety and autocomplete.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * // gkm.config.ts
12
+ * import { defineConfig } from '@geekmidas/cli/config';
13
+ *
14
+ * export default defineConfig({
15
+ * routes: './src/endpoints/**\/*.ts',
16
+ * envParser: './src/config/env',
17
+ * logger: './src/config/logger',
18
+ * telescope: true,
19
+ * });
20
+ * ```
21
+ */
22
+ declare function defineConfig(config: GkmConfig): GkmConfig;
23
+ interface ParsedModuleConfig {
24
+ path: string;
25
+ importPattern: string;
26
+ }
27
+ /**
28
+ * Parse a module config string into path and import pattern.
29
+ *
30
+ * @param configString - Config string in format "./path/to/module" or "./path/to/module#exportName"
31
+ * @param defaultAlias - The default alias name to use if no export name specified
32
+ * @returns Object with path and import pattern
33
+ *
34
+ * @example
35
+ * parseModuleConfig('./src/config/env', 'envParser')
36
+ * // { path: './src/config/env', importPattern: 'envParser' }
37
+ *
38
+ * parseModuleConfig('./src/config/env#envParser', 'envParser')
39
+ * // { path: './src/config/env', importPattern: '{ envParser }' }
40
+ *
41
+ * parseModuleConfig('./src/config/env#myEnv', 'envParser')
42
+ * // { path: './src/config/env', importPattern: '{ myEnv as envParser }' }
43
+ */
44
+ declare function parseModuleConfig(configString: string, defaultAlias: string): ParsedModuleConfig;
45
+ declare function loadConfig(cwd?: string): Promise<GkmConfig>;
46
+ //#endregion
47
+ export { ParsedModuleConfig, defineConfig, loadConfig, parseModuleConfig };
48
+ //# sourceMappingURL=config.d.mts.map
package/dist/config.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { loadConfig } from "./config-AFmFKmU0.mjs";
1
+ import { defineConfig, loadConfig, parseModuleConfig } from "./config-Bq72aj8e.mjs";
2
2
 
3
- export { loadConfig };
3
+ export { defineConfig, loadConfig, parseModuleConfig };
@@ -1,14 +1,15 @@
1
- require('../config-BVIJpAsa.cjs');
2
- require('../Generator-CDoEXCDg.cjs');
3
- require('../CronGenerator-C6MF8rlG.cjs');
4
- require('../EndpointGenerator-BxNCkus4.cjs');
5
- require('../FunctionGenerator-FgZUTd8L.cjs');
6
- require('../SubscriberGenerator-Bd-a7aiw.cjs');
7
- require('../generators-CEKtVh81.cjs');
8
- require('../providerResolver-DgvzNfP4.cjs');
9
- const require_dev = require('../dev-CgDYC4o8.cjs');
1
+ require('../config-CFls09Ey.cjs');
2
+ require('../providerResolver-DOTbN9jo.cjs');
3
+ require('../Generator-CLVplqm2.cjs');
4
+ require('../CronGenerator-D4TWXQbh.cjs');
5
+ require('../EndpointGenerator-npWEDoK2.cjs');
6
+ require('../FunctionGenerator-DYTnyr4c.cjs');
7
+ require('../SubscriberGenerator-D_zpNGFr.cjs');
8
+ require('../generators-3IemvCLk.cjs');
9
+ const require_dev = require('../dev-DHqYn8k4.cjs');
10
10
 
11
11
  exports.devCommand = require_dev.devCommand;
12
12
  exports.findAvailablePort = require_dev.findAvailablePort;
13
13
  exports.isPortAvailable = require_dev.isPortAvailable;
14
+ exports.loadEnvFiles = require_dev.loadEnvFiles;
14
15
  exports.normalizeTelescopeConfig = require_dev.normalizeTelescopeConfig;
@@ -0,0 +1,36 @@
1
+ import { GkmConfig } from "../types-DB99_qIy.cjs";
2
+ import { NormalizedTelescopeConfig } from "../types-DLFN49M3.cjs";
3
+
4
+ //#region src/dev/index.d.ts
5
+
6
+ /**
7
+ * Load environment files
8
+ * @internal Exported for testing
9
+ */
10
+ declare function loadEnvFiles(envConfig: string | string[] | undefined, cwd?: string): {
11
+ loaded: string[];
12
+ missing: string[];
13
+ };
14
+ /**
15
+ * Check if a port is available
16
+ * @internal Exported for testing
17
+ */
18
+ declare function isPortAvailable(port: number): Promise<boolean>;
19
+ /**
20
+ * Find an available port starting from the preferred port
21
+ * @internal Exported for testing
22
+ */
23
+ declare function findAvailablePort(preferredPort: number, maxAttempts?: number): Promise<number>;
24
+ /**
25
+ * Normalize telescope configuration
26
+ * @internal Exported for testing
27
+ */
28
+ declare function normalizeTelescopeConfig(config: GkmConfig['telescope']): NormalizedTelescopeConfig | undefined;
29
+ interface DevOptions {
30
+ port?: number;
31
+ enableOpenApi?: boolean;
32
+ }
33
+ declare function devCommand(options: DevOptions): Promise<void>;
34
+ //#endregion
35
+ export { DevOptions, devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig };
36
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1,36 @@
1
+ import { GkmConfig } from "../types-Cxl8-uwV.mjs";
2
+ import { NormalizedTelescopeConfig } from "../types-C4KITv-y.mjs";
3
+
4
+ //#region src/dev/index.d.ts
5
+
6
+ /**
7
+ * Load environment files
8
+ * @internal Exported for testing
9
+ */
10
+ declare function loadEnvFiles(envConfig: string | string[] | undefined, cwd?: string): {
11
+ loaded: string[];
12
+ missing: string[];
13
+ };
14
+ /**
15
+ * Check if a port is available
16
+ * @internal Exported for testing
17
+ */
18
+ declare function isPortAvailable(port: number): Promise<boolean>;
19
+ /**
20
+ * Find an available port starting from the preferred port
21
+ * @internal Exported for testing
22
+ */
23
+ declare function findAvailablePort(preferredPort: number, maxAttempts?: number): Promise<number>;
24
+ /**
25
+ * Normalize telescope configuration
26
+ * @internal Exported for testing
27
+ */
28
+ declare function normalizeTelescopeConfig(config: GkmConfig['telescope']): NormalizedTelescopeConfig | undefined;
29
+ interface DevOptions {
30
+ port?: number;
31
+ enableOpenApi?: boolean;
32
+ }
33
+ declare function devCommand(options: DevOptions): Promise<void>;
34
+ //#endregion
35
+ export { DevOptions, devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig };
36
+ //# sourceMappingURL=index.d.mts.map
@@ -1,11 +1,11 @@
1
- import "../config-AFmFKmU0.mjs";
2
- import "../Generator-UanJW0_V.mjs";
3
- import "../CronGenerator-Bh26MaNA.mjs";
4
- import "../EndpointGenerator-CzDhG7Or.mjs";
5
- import "../FunctionGenerator-BNE_GC7N.mjs";
6
- import "../SubscriberGenerator-Dnlj_1FK.mjs";
7
- import "../generators-CsLujGXs.mjs";
8
- import "../providerResolver-B_TjNF0_.mjs";
9
- import { devCommand, findAvailablePort, isPortAvailable, normalizeTelescopeConfig } from "../dev-CpA8AQPX.mjs";
1
+ import "../config-Bq72aj8e.mjs";
2
+ import "../providerResolver-DEVKngbC.mjs";
3
+ import "../Generator-CDt4pB3W.mjs";
4
+ import "../CronGenerator-CCRYptuT.mjs";
5
+ import "../EndpointGenerator-DGivkPLT.mjs";
6
+ import "../FunctionGenerator-CVk0h8tO.mjs";
7
+ import "../SubscriberGenerator-DABaJXML.mjs";
8
+ import "../generators-FNpdfN6J.mjs";
9
+ import { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig } from "../dev-B734w3L1.mjs";
10
10
 
11
- export { devCommand, findAvailablePort, isPortAvailable, normalizeTelescopeConfig };
11
+ export { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig };
@@ -1,32 +1,58 @@
1
- import { loadConfig } from "./config-AFmFKmU0.mjs";
2
- import { CronGenerator } from "./CronGenerator-Bh26MaNA.mjs";
3
- import { EndpointGenerator } from "./EndpointGenerator-CzDhG7Or.mjs";
4
- import { FunctionGenerator } from "./FunctionGenerator-BNE_GC7N.mjs";
5
- import { SubscriberGenerator } from "./SubscriberGenerator-Dnlj_1FK.mjs";
6
- import { resolveProviders } from "./providerResolver-B_TjNF0_.mjs";
1
+ import { loadConfig, parseModuleConfig } from "./config-Bq72aj8e.mjs";
2
+ import { resolveProviders } from "./providerResolver-DEVKngbC.mjs";
3
+ import { CronGenerator } from "./CronGenerator-CCRYptuT.mjs";
4
+ import { EndpointGenerator } from "./EndpointGenerator-DGivkPLT.mjs";
5
+ import { FunctionGenerator } from "./FunctionGenerator-CVk0h8tO.mjs";
6
+ import { SubscriberGenerator } from "./SubscriberGenerator-DABaJXML.mjs";
7
7
  import { mkdir } from "node:fs/promises";
8
- import { join } from "node:path";
9
- import fg from "fast-glob";
8
+ import { join, resolve } from "node:path";
10
9
  import { spawn } from "node:child_process";
10
+ import { existsSync } from "node:fs";
11
11
  import { createServer } from "node:net";
12
12
  import chokidar from "chokidar";
13
+ import { config } from "dotenv";
14
+ import fg from "fast-glob";
13
15
 
14
16
  //#region src/dev/index.ts
15
17
  const logger = console;
16
18
  /**
19
+ * Load environment files
20
+ * @internal Exported for testing
21
+ */
22
+ function loadEnvFiles(envConfig, cwd = process.cwd()) {
23
+ const loaded = [];
24
+ const missing = [];
25
+ const envFiles = envConfig ? Array.isArray(envConfig) ? envConfig : [envConfig] : [".env"];
26
+ for (const envFile of envFiles) {
27
+ const envPath = resolve(cwd, envFile);
28
+ if (existsSync(envPath)) {
29
+ config({
30
+ path: envPath,
31
+ override: true,
32
+ quiet: true
33
+ });
34
+ loaded.push(envFile);
35
+ } else if (envConfig) missing.push(envFile);
36
+ }
37
+ return {
38
+ loaded,
39
+ missing
40
+ };
41
+ }
42
+ /**
17
43
  * Check if a port is available
18
44
  * @internal Exported for testing
19
45
  */
20
46
  async function isPortAvailable(port) {
21
- return new Promise((resolve) => {
47
+ return new Promise((resolve$1) => {
22
48
  const server = createServer();
23
49
  server.once("error", (err) => {
24
- if (err.code === "EADDRINUSE") resolve(false);
25
- else resolve(false);
50
+ if (err.code === "EADDRINUSE") resolve$1(false);
51
+ else resolve$1(false);
26
52
  });
27
53
  server.once("listening", () => {
28
54
  server.close();
29
- resolve(true);
55
+ resolve$1(true);
30
56
  });
31
57
  server.listen(port);
32
58
  });
@@ -47,11 +73,24 @@ async function findAvailablePort(preferredPort, maxAttempts = 10) {
47
73
  * Normalize telescope configuration
48
74
  * @internal Exported for testing
49
75
  */
50
- function normalizeTelescopeConfig(config) {
51
- if (config === false) return void 0;
52
- const isEnabled = config === true || config === void 0 || config.enabled !== false;
76
+ function normalizeTelescopeConfig(config$1) {
77
+ if (config$1 === false) return void 0;
78
+ if (typeof config$1 === "string") {
79
+ const { path: telescopePath, importPattern: telescopeImportPattern } = parseModuleConfig(config$1, "telescope");
80
+ return {
81
+ enabled: true,
82
+ telescopePath,
83
+ telescopeImportPattern,
84
+ path: "/__telescope",
85
+ ignore: [],
86
+ recordBody: true,
87
+ maxEntries: 1e3,
88
+ websocket: true
89
+ };
90
+ }
91
+ const isEnabled = config$1 === true || config$1 === void 0 || config$1.enabled !== false;
53
92
  if (!isEnabled) return void 0;
54
- const telescopeConfig = typeof config === "object" ? config : {};
93
+ const telescopeConfig = typeof config$1 === "object" ? config$1 : {};
55
94
  return {
56
95
  enabled: true,
57
96
  path: telescopeConfig.path ?? "/__telescope",
@@ -62,19 +101,24 @@ function normalizeTelescopeConfig(config) {
62
101
  };
63
102
  }
64
103
  async function devCommand(options) {
65
- const config = await loadConfig();
66
- const resolved = resolveProviders(config, { provider: "server" });
104
+ const defaultEnv = loadEnvFiles(".env");
105
+ if (defaultEnv.loaded.length > 0) logger.log(`📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
106
+ const config$1 = await loadConfig();
107
+ if (config$1.env) {
108
+ const { loaded, missing } = loadEnvFiles(config$1.env);
109
+ if (loaded.length > 0) logger.log(`📦 Loaded env: ${loaded.join(", ")}`);
110
+ if (missing.length > 0) logger.warn(`⚠️ Missing env files: ${missing.join(", ")}`);
111
+ }
112
+ const resolved = resolveProviders(config$1, { provider: "server" });
67
113
  logger.log("🚀 Starting development server...");
68
- logger.log(`Loading routes from: ${config.routes}`);
69
- if (config.functions) logger.log(`Loading functions from: ${config.functions}`);
70
- if (config.crons) logger.log(`Loading crons from: ${config.crons}`);
71
- if (config.subscribers) logger.log(`Loading subscribers from: ${config.subscribers}`);
72
- logger.log(`Using envParser: ${config.envParser}`);
73
- const [envParserPath, envParserName] = config.envParser.split("#");
74
- const envParserImportPattern = !envParserName ? "envParser" : envParserName === "envParser" ? "{ envParser }" : `{ ${envParserName} as envParser }`;
75
- const [loggerPath, loggerName] = config.logger.split("#");
76
- const loggerImportPattern = !loggerName ? "logger" : loggerName === "logger" ? "{ logger }" : `{ ${loggerName} as logger }`;
77
- const telescope = normalizeTelescopeConfig(config.telescope);
114
+ logger.log(`Loading routes from: ${config$1.routes}`);
115
+ if (config$1.functions) logger.log(`Loading functions from: ${config$1.functions}`);
116
+ if (config$1.crons) logger.log(`Loading crons from: ${config$1.crons}`);
117
+ if (config$1.subscribers) logger.log(`Loading subscribers from: ${config$1.subscribers}`);
118
+ logger.log(`Using envParser: ${config$1.envParser}`);
119
+ const { path: envParserPath, importPattern: envParserImportPattern } = parseModuleConfig(config$1.envParser, "envParser");
120
+ const { path: loggerPath, importPattern: loggerImportPattern } = parseModuleConfig(config$1.logger, "logger");
121
+ const telescope = normalizeTelescopeConfig(config$1.telescope);
78
122
  if (telescope) logger.log(`🔭 Telescope enabled at ${telescope.path}`);
79
123
  const buildContext = {
80
124
  envParserPath,
@@ -83,17 +127,17 @@ async function devCommand(options) {
83
127
  loggerImportPattern,
84
128
  telescope
85
129
  };
86
- await buildServer(config, buildContext, resolved.providers[0], resolved.enableOpenApi);
87
- const runtime = config.runtime ?? "node";
130
+ await buildServer(config$1, buildContext, resolved.providers[0], resolved.enableOpenApi);
131
+ const runtime = config$1.runtime ?? "node";
88
132
  const devServer = new DevServer(resolved.providers[0], options.port || 3e3, resolved.enableOpenApi, telescope, runtime);
89
133
  await devServer.start();
90
- const envParserFile = config.envParser.split("#")[0];
91
- const loggerFile = config.logger.split("#")[0];
134
+ const envParserFile = config$1.envParser.split("#")[0];
135
+ const loggerFile = config$1.logger.split("#")[0];
92
136
  const watchPatterns = [
93
- config.routes,
94
- ...config.functions ? [config.functions] : [],
95
- ...config.crons ? [config.crons] : [],
96
- ...config.subscribers ? [config.subscribers] : [],
137
+ config$1.routes,
138
+ ...config$1.functions ? [config$1.functions] : [],
139
+ ...config$1.crons ? [config$1.crons] : [],
140
+ ...config$1.subscribers ? [config$1.subscribers] : [],
97
141
  envParserFile.endsWith(".ts") ? envParserFile : `${envParserFile}.ts`,
98
142
  loggerFile.endsWith(".ts") ? loggerFile : `${loggerFile}.ts`
99
143
  ].flat();
@@ -125,7 +169,7 @@ async function devCommand(options) {
125
169
  rebuildTimeout = setTimeout(async () => {
126
170
  try {
127
171
  logger.log("🔄 Rebuilding...");
128
- await buildServer(config, buildContext, resolved.providers[0], resolved.enableOpenApi);
172
+ await buildServer(config$1, buildContext, resolved.providers[0], resolved.enableOpenApi);
129
173
  logger.log("✅ Rebuild complete, restarting server...");
130
174
  await devServer.restart();
131
175
  } catch (error) {
@@ -142,16 +186,16 @@ async function devCommand(options) {
142
186
  process.on("SIGINT", shutdown);
143
187
  process.on("SIGTERM", shutdown);
144
188
  }
145
- async function buildServer(config, context, provider, enableOpenApi) {
189
+ async function buildServer(config$1, context, provider, enableOpenApi) {
146
190
  const endpointGenerator = new EndpointGenerator();
147
191
  const functionGenerator = new FunctionGenerator();
148
192
  const cronGenerator = new CronGenerator();
149
193
  const subscriberGenerator = new SubscriberGenerator();
150
194
  const [allEndpoints, allFunctions, allCrons, allSubscribers] = await Promise.all([
151
- endpointGenerator.load(config.routes),
152
- config.functions ? functionGenerator.load(config.functions) : [],
153
- config.crons ? cronGenerator.load(config.crons) : [],
154
- config.subscribers ? subscriberGenerator.load(config.subscribers) : []
195
+ endpointGenerator.load(config$1.routes),
196
+ config$1.functions ? functionGenerator.load(config$1.functions) : [],
197
+ config$1.crons ? cronGenerator.load(config$1.crons) : [],
198
+ config$1.subscribers ? subscriberGenerator.load(config$1.subscribers) : []
155
199
  ]);
156
200
  const outputDir = join(process.cwd(), ".gkm", provider);
157
201
  await mkdir(outputDir, { recursive: true });
@@ -205,7 +249,7 @@ var DevServer = class {
205
249
  if (code !== null && code !== 0 && signal !== "SIGTERM") logger.error(`❌ Server exited with code ${code}`);
206
250
  this.isRunning = false;
207
251
  });
208
- await new Promise((resolve) => setTimeout(resolve, 1e3));
252
+ await new Promise((resolve$1) => setTimeout(resolve$1, 1e3));
209
253
  if (this.isRunning) {
210
254
  logger.log(`\n🎉 Server running at http://localhost:${this.actualPort}`);
211
255
  if (this.enableOpenApi) logger.log(`📚 API Docs available at http://localhost:${this.actualPort}/docs`);
@@ -218,16 +262,16 @@ var DevServer = class {
218
262
  if (pid) try {
219
263
  process.kill(-pid, "SIGTERM");
220
264
  } catch {}
221
- await new Promise((resolve) => {
265
+ await new Promise((resolve$1) => {
222
266
  const timeout = setTimeout(() => {
223
267
  if (pid) try {
224
268
  process.kill(-pid, "SIGKILL");
225
269
  } catch {}
226
- resolve();
270
+ resolve$1();
227
271
  }, 3e3);
228
272
  this.serverProcess?.on("exit", () => {
229
273
  clearTimeout(timeout);
230
- resolve();
274
+ resolve$1();
231
275
  });
232
276
  });
233
277
  this.serverProcess = null;
@@ -240,7 +284,7 @@ var DevServer = class {
240
284
  let attempts = 0;
241
285
  while (attempts < 30) {
242
286
  if (await isPortAvailable(portToReuse)) break;
243
- await new Promise((resolve) => setTimeout(resolve, 100));
287
+ await new Promise((resolve$1) => setTimeout(resolve$1, 100));
244
288
  attempts++;
245
289
  }
246
290
  this.requestedPort = portToReuse;
@@ -295,5 +339,5 @@ start({
295
339
  };
296
340
 
297
341
  //#endregion
298
- export { devCommand, findAvailablePort, isPortAvailable, normalizeTelescopeConfig };
299
- //# sourceMappingURL=dev-CpA8AQPX.mjs.map
342
+ export { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig };
343
+ //# sourceMappingURL=dev-B734w3L1.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-B734w3L1.mjs","names":["envConfig: string | string[] | undefined","cwd: string","loaded: string[]","missing: string[]","port: number","resolve","err: NodeJS.ErrnoException","preferredPort: number","config: GkmConfig['telescope']","config","telescopeConfig: TelescopeConfig","options: DevOptions","buildContext: BuildContext","runtime: Runtime","rebuildTimeout: NodeJS.Timeout | null","config: any","context: BuildContext","provider: LegacyProvider","enableOpenApi: boolean","requestedPort: number","telescope?: NormalizedTelescopeConfig"],"sources":["../src/dev/index.ts"],"sourcesContent":["import { type ChildProcess, spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport { mkdir } from 'node:fs/promises';\nimport { createServer } from 'node:net';\nimport { join, resolve } from 'node:path';\nimport chokidar from 'chokidar';\nimport { config as dotenvConfig } from 'dotenv';\nimport fg from 'fast-glob';\nimport { resolveProviders } from '../build/providerResolver';\nimport type { BuildContext, NormalizedTelescopeConfig } from '../build/types';\nimport { loadConfig, parseModuleConfig } from '../config';\nimport {\n CronGenerator,\n EndpointGenerator,\n FunctionGenerator,\n SubscriberGenerator,\n} from '../generators';\nimport type {\n GkmConfig,\n LegacyProvider,\n Runtime,\n TelescopeConfig,\n} from '../types';\n\nconst logger = console;\n\n/**\n * Load environment files\n * @internal Exported for testing\n */\nexport function loadEnvFiles(\n envConfig: string | string[] | undefined,\n cwd: string = process.cwd(),\n): { loaded: string[]; missing: string[] } {\n const loaded: string[] = [];\n const missing: string[] = [];\n\n // Normalize to array\n const envFiles = envConfig\n ? Array.isArray(envConfig)\n ? envConfig\n : [envConfig]\n : ['.env'];\n\n // Load each env file in order (later files override earlier)\n for (const envFile of envFiles) {\n const envPath = resolve(cwd, envFile);\n if (existsSync(envPath)) {\n dotenvConfig({ path: envPath, override: true, quiet: true });\n loaded.push(envFile);\n } else if (envConfig) {\n // Only report as missing if explicitly configured\n missing.push(envFile);\n }\n }\n\n return { loaded, missing };\n}\n\n/**\n * Check if a port is available\n * @internal Exported for testing\n */\nexport async function isPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer();\n\n server.once('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n resolve(false);\n } else {\n resolve(false);\n }\n });\n\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n\n server.listen(port);\n });\n}\n\n/**\n * Find an available port starting from the preferred port\n * @internal Exported for testing\n */\nexport async function findAvailablePort(\n preferredPort: number,\n maxAttempts = 10,\n): Promise<number> {\n for (let i = 0; i < maxAttempts; i++) {\n const port = preferredPort + i;\n if (await isPortAvailable(port)) {\n return port;\n }\n logger.log(`⚠️ Port ${port} is in use, trying ${port + 1}...`);\n }\n\n throw new Error(\n `Could not find an available port after trying ${maxAttempts} ports starting from ${preferredPort}`,\n );\n}\n\n/**\n * Normalize telescope configuration\n * @internal Exported for testing\n */\nexport function normalizeTelescopeConfig(\n config: GkmConfig['telescope'],\n): NormalizedTelescopeConfig | undefined {\n if (config === false) {\n return undefined;\n }\n\n // Handle string path (e.g., './src/config/telescope')\n if (typeof config === 'string') {\n const { path: telescopePath, importPattern: telescopeImportPattern } =\n parseModuleConfig(config, 'telescope');\n\n return {\n enabled: true,\n telescopePath,\n telescopeImportPattern,\n path: '/__telescope',\n ignore: [],\n recordBody: true,\n maxEntries: 1000,\n websocket: true,\n };\n }\n\n // Default to enabled in development mode\n const isEnabled =\n config === true || config === undefined || config.enabled !== false;\n\n if (!isEnabled) {\n return undefined;\n }\n\n const telescopeConfig: TelescopeConfig =\n typeof config === 'object' ? config : {};\n\n return {\n enabled: true,\n path: telescopeConfig.path ?? '/__telescope',\n ignore: telescopeConfig.ignore ?? [],\n recordBody: telescopeConfig.recordBody ?? true,\n maxEntries: telescopeConfig.maxEntries ?? 1000,\n websocket: telescopeConfig.websocket ?? true,\n };\n}\n\nexport interface DevOptions {\n port?: number;\n enableOpenApi?: boolean;\n}\n\nexport async function devCommand(options: DevOptions): Promise<void> {\n // Load default .env file BEFORE loading config\n // This ensures env vars are available when config and its dependencies are loaded\n const defaultEnv = loadEnvFiles('.env');\n if (defaultEnv.loaded.length > 0) {\n logger.log(`📦 Loaded env: ${defaultEnv.loaded.join(', ')}`);\n }\n\n const config = await loadConfig();\n\n // Load any additional env files specified in config\n if (config.env) {\n const { loaded, missing } = loadEnvFiles(config.env);\n if (loaded.length > 0) {\n logger.log(`📦 Loaded env: ${loaded.join(', ')}`);\n }\n if (missing.length > 0) {\n logger.warn(`⚠️ Missing env files: ${missing.join(', ')}`);\n }\n }\n\n // Force server provider for dev mode\n const resolved = resolveProviders(config, { provider: 'server' });\n\n logger.log('🚀 Starting development server...');\n logger.log(`Loading routes from: ${config.routes}`);\n if (config.functions) {\n logger.log(`Loading functions from: ${config.functions}`);\n }\n if (config.crons) {\n logger.log(`Loading crons from: ${config.crons}`);\n }\n if (config.subscribers) {\n logger.log(`Loading subscribers from: ${config.subscribers}`);\n }\n logger.log(`Using envParser: ${config.envParser}`);\n\n // Parse envParser and logger configuration\n const { path: envParserPath, importPattern: envParserImportPattern } =\n parseModuleConfig(config.envParser, 'envParser');\n const { path: loggerPath, importPattern: loggerImportPattern } =\n parseModuleConfig(config.logger, 'logger');\n\n // Normalize telescope configuration\n const telescope = normalizeTelescopeConfig(config.telescope);\n if (telescope) {\n logger.log(`🔭 Telescope enabled at ${telescope.path}`);\n }\n\n const buildContext: BuildContext = {\n envParserPath,\n envParserImportPattern,\n loggerPath,\n loggerImportPattern,\n telescope,\n };\n\n // Build initial version\n await buildServer(\n config,\n buildContext,\n resolved.providers[0] as LegacyProvider,\n resolved.enableOpenApi,\n );\n\n // Determine runtime (default to node)\n const runtime: Runtime = config.runtime ?? 'node';\n\n // Start the dev server\n const devServer = new DevServer(\n resolved.providers[0] as LegacyProvider,\n options.port || 3000,\n resolved.enableOpenApi,\n telescope,\n runtime,\n );\n\n await devServer.start();\n\n // Watch for file changes\n const envParserFile = config.envParser.split('#')[0];\n const loggerFile = config.logger.split('#')[0];\n\n const watchPatterns = [\n config.routes,\n ...(config.functions ? [config.functions] : []),\n ...(config.crons ? [config.crons] : []),\n ...(config.subscribers ? [config.subscribers] : []),\n // Add .ts extension if not present for config files\n envParserFile.endsWith('.ts') ? envParserFile : `${envParserFile}.ts`,\n loggerFile.endsWith('.ts') ? loggerFile : `${loggerFile}.ts`,\n ].flat();\n\n // Normalize patterns - remove leading ./ when using cwd option\n const normalizedPatterns = watchPatterns.map((p) =>\n p.startsWith('./') ? p.slice(2) : p,\n );\n\n logger.log(`👀 Watching for changes in: ${normalizedPatterns.join(', ')}`);\n\n // Resolve glob patterns to actual files (chokidar 4.x doesn't support globs)\n const resolvedFiles = await fg(normalizedPatterns, {\n cwd: process.cwd(),\n absolute: false,\n onlyFiles: true,\n });\n\n // Also watch the directories for new files\n const dirsToWatch = [\n ...new Set(resolvedFiles.map((f) => f.split('/').slice(0, -1).join('/'))),\n ];\n\n logger.log(\n `📁 Found ${resolvedFiles.length} files in ${dirsToWatch.length} directories`,\n );\n\n const watcher = chokidar.watch([...resolvedFiles, ...dirsToWatch], {\n ignored: /(^|[\\/\\\\])\\../, // ignore dotfiles\n persistent: true,\n ignoreInitial: true,\n cwd: process.cwd(),\n });\n\n watcher.on('ready', () => {\n logger.log('🔍 File watcher ready');\n });\n\n watcher.on('error', (error) => {\n logger.error('❌ Watcher error:', error);\n });\n\n let rebuildTimeout: NodeJS.Timeout | null = null;\n\n watcher.on('change', async (path) => {\n logger.log(`📝 File changed: ${path}`);\n\n // Debounce rebuilds\n if (rebuildTimeout) {\n clearTimeout(rebuildTimeout);\n }\n\n rebuildTimeout = setTimeout(async () => {\n try {\n logger.log('🔄 Rebuilding...');\n await buildServer(\n config,\n buildContext,\n resolved.providers[0] as LegacyProvider,\n resolved.enableOpenApi,\n );\n logger.log('✅ Rebuild complete, restarting server...');\n await devServer.restart();\n } catch (error) {\n logger.error('❌ Rebuild failed:', (error as Error).message);\n }\n }, 300);\n });\n\n // Handle graceful shutdown\n const shutdown = async () => {\n logger.log('\\n🛑 Shutting down...');\n await watcher.close();\n await devServer.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n}\n\nasync function buildServer(\n config: any,\n context: BuildContext,\n provider: LegacyProvider,\n enableOpenApi: boolean,\n): Promise<void> {\n // Initialize generators\n const endpointGenerator = new EndpointGenerator();\n const functionGenerator = new FunctionGenerator();\n const cronGenerator = new CronGenerator();\n const subscriberGenerator = new SubscriberGenerator();\n\n // Load all constructs\n const [allEndpoints, allFunctions, allCrons, allSubscribers] =\n await Promise.all([\n endpointGenerator.load(config.routes),\n config.functions ? functionGenerator.load(config.functions) : [],\n config.crons ? cronGenerator.load(config.crons) : [],\n config.subscribers ? subscriberGenerator.load(config.subscribers) : [],\n ]);\n\n // Ensure .gkm directory exists\n const outputDir = join(process.cwd(), '.gkm', provider);\n await mkdir(outputDir, { recursive: true });\n\n // Build for server provider\n await Promise.all([\n endpointGenerator.build(context, allEndpoints, outputDir, {\n provider,\n enableOpenApi,\n }),\n functionGenerator.build(context, allFunctions, outputDir, { provider }),\n cronGenerator.build(context, allCrons, outputDir, { provider }),\n subscriberGenerator.build(context, allSubscribers, outputDir, { provider }),\n ]);\n}\n\nclass DevServer {\n private serverProcess: ChildProcess | null = null;\n private isRunning = false;\n private actualPort: number;\n\n constructor(\n private provider: LegacyProvider,\n private requestedPort: number,\n private enableOpenApi: boolean,\n private telescope?: NormalizedTelescopeConfig,\n private runtime: Runtime = 'node',\n ) {\n this.actualPort = requestedPort;\n }\n\n async start(): Promise<void> {\n if (this.isRunning) {\n await this.stop();\n }\n\n // Find an available port\n this.actualPort = await findAvailablePort(this.requestedPort);\n\n if (this.actualPort !== this.requestedPort) {\n logger.log(\n `ℹ️ Port ${this.requestedPort} was in use, using port ${this.actualPort} instead`,\n );\n }\n\n const serverEntryPath = join(\n process.cwd(),\n '.gkm',\n this.provider,\n 'server.ts',\n );\n\n // Create server entry file\n await this.createServerEntry();\n\n logger.log(`\\n✨ Starting server on port ${this.actualPort}...`);\n\n // Start the server using tsx (TypeScript execution)\n // Use detached: true so we can kill the entire process tree\n this.serverProcess = spawn(\n 'npx',\n ['tsx', serverEntryPath, '--port', this.actualPort.toString()],\n {\n stdio: 'inherit',\n env: { ...process.env, NODE_ENV: 'development' },\n detached: true,\n },\n );\n\n this.isRunning = true;\n\n this.serverProcess.on('error', (error) => {\n logger.error('❌ Server error:', error);\n });\n\n this.serverProcess.on('exit', (code, signal) => {\n if (code !== null && code !== 0 && signal !== 'SIGTERM') {\n logger.error(`❌ Server exited with code ${code}`);\n }\n this.isRunning = false;\n });\n\n // Give the server a moment to start\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n if (this.isRunning) {\n logger.log(`\\n🎉 Server running at http://localhost:${this.actualPort}`);\n if (this.enableOpenApi) {\n logger.log(\n `📚 API Docs available at http://localhost:${this.actualPort}/docs`,\n );\n }\n if (this.telescope) {\n logger.log(\n `🔭 Telescope available at http://localhost:${this.actualPort}${this.telescope.path}`,\n );\n }\n }\n }\n\n async stop(): Promise<void> {\n if (this.serverProcess && this.isRunning) {\n const pid = this.serverProcess.pid;\n\n // Kill the entire process group (negative PID kills the group)\n if (pid) {\n try {\n process.kill(-pid, 'SIGTERM');\n } catch {\n // Process might already be dead\n }\n }\n\n // Wait for process to exit\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n if (pid) {\n try {\n process.kill(-pid, 'SIGKILL');\n } catch {\n // Process might already be dead\n }\n }\n resolve();\n }, 3000);\n\n this.serverProcess?.on('exit', () => {\n clearTimeout(timeout);\n resolve();\n });\n });\n\n this.serverProcess = null;\n this.isRunning = false;\n }\n }\n\n async restart(): Promise<void> {\n const portToReuse = this.actualPort;\n await this.stop();\n\n // Wait for port to be released (up to 3 seconds)\n let attempts = 0;\n while (attempts < 30) {\n if (await isPortAvailable(portToReuse)) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n attempts++;\n }\n\n // Force reuse the same port\n this.requestedPort = portToReuse;\n await this.start();\n }\n\n private async createServerEntry(): Promise<void> {\n const { writeFile } = await import('node:fs/promises');\n const { relative, dirname } = await import('node:path');\n\n const serverPath = join(process.cwd(), '.gkm', this.provider, 'server.ts');\n\n const relativeAppPath = relative(\n dirname(serverPath),\n join(dirname(serverPath), 'app.js'),\n );\n\n const serveCode =\n this.runtime === 'bun'\n ? `Bun.serve({\n port,\n fetch: app.fetch,\n });`\n : `const { serve } = await import('@hono/node-server');\n const server = serve({\n fetch: app.fetch,\n port,\n });\n // Inject WebSocket support if available\n const injectWs = (app as any).__injectWebSocket;\n if (injectWs) {\n injectWs(server);\n console.log('🔌 Telescope real-time updates enabled');\n }`;\n\n const content = `#!/usr/bin/env node\n/**\n * Development server entry point\n * This file is auto-generated by 'gkm dev'\n */\nimport { createApp } from './${relativeAppPath.startsWith('.') ? relativeAppPath : './' + relativeAppPath}';\n\nconst port = process.argv.includes('--port')\n ? Number.parseInt(process.argv[process.argv.indexOf('--port') + 1])\n : 3000;\n\n// createApp is async to support optional WebSocket setup\nconst { app, start } = await createApp(undefined, ${this.enableOpenApi});\n\n// Start the server\nstart({\n port,\n serve: async (app, port) => {\n ${serveCode}\n },\n}).catch((error) => {\n console.error('Failed to start server:', error);\n process.exit(1);\n});\n`;\n\n await writeFile(serverPath, content);\n }\n}\n"],"mappings":"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"}