@geekmidas/cli 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +7 -7
  2. package/dist/{CronGenerator-BPTqNYOR.d.cts → CronGenerator-DWS3CCZt.d.cts} +4 -4
  3. package/dist/{CronGenerator-YAj59JUd.d.mts → CronGenerator-DZjdkEjI.d.mts} +4 -4
  4. package/dist/{EndpointGenerator-ChAD1INz.d.cts → EndpointGenerator-Dh7kMtuL.d.mts} +4 -4
  5. package/dist/{EndpointGenerator-Cj3O1U8-.d.mts → EndpointGenerator-zBsie_7s.d.cts} +4 -4
  6. package/dist/{FunctionGenerator-429-9NER.d.cts → FunctionGenerator-BmDHo27U.d.mts} +4 -4
  7. package/dist/{FunctionGenerator-BQ4ehoID.d.mts → FunctionGenerator-DXjXBxUd.d.cts} +4 -4
  8. package/dist/{Generator-BjHK_qce.d.mts → Generator-BGY-2dgI.d.cts} +3 -3
  9. package/dist/{Generator-DxQMCQp7.d.cts → Generator-yi9DH5TN.d.mts} +3 -3
  10. package/dist/{OpenApiTsGenerator-C4mHHaku.mjs → OpenApiTsGenerator-0ZDYWro5.mjs} +1 -1
  11. package/dist/{OpenApiTsGenerator-C4mHHaku.mjs.map → OpenApiTsGenerator-0ZDYWro5.mjs.map} +1 -1
  12. package/dist/{OpenApiTsGenerator-Be-sKGTT.cjs → OpenApiTsGenerator-wLwpaq_I.cjs} +1 -1
  13. package/dist/{OpenApiTsGenerator-Be-sKGTT.cjs.map → OpenApiTsGenerator-wLwpaq_I.cjs.map} +1 -1
  14. package/dist/{SubscriberGenerator-7uX42xyG.d.mts → SubscriberGenerator-Bb-z3Kvx.d.cts} +4 -4
  15. package/dist/{SubscriberGenerator-Dtb3HS4i.d.cts → SubscriberGenerator-CwsXqCpS.d.mts} +4 -4
  16. package/dist/{api-BKIN0s0S.mjs → api-Bp5TIl1R.mjs} +29 -46
  17. package/dist/api-Bp5TIl1R.mjs.map +1 -0
  18. package/dist/{api-B3SCEHPf.cjs → api-D4W9-tdZ.cjs} +29 -46
  19. package/dist/api-D4W9-tdZ.cjs.map +1 -0
  20. package/dist/build/index.cjs +5 -3
  21. package/dist/build/index.d.cts +1 -1
  22. package/dist/build/index.d.mts +1 -1
  23. package/dist/build/index.mjs +5 -3
  24. package/dist/build/manifests.cjs +1 -1
  25. package/dist/build/manifests.d.cts +1 -1
  26. package/dist/build/manifests.d.mts +1 -1
  27. package/dist/build/manifests.mjs +1 -1
  28. package/dist/build/providerResolver.d.cts +1 -1
  29. package/dist/build/providerResolver.d.mts +1 -1
  30. package/dist/build/types.d.cts +2 -2
  31. package/dist/build/types.d.mts +2 -2
  32. package/dist/{build-B8C_qHir.mjs → build-BLriHKgm.mjs} +3 -3
  33. package/dist/{build-B8C_qHir.mjs.map → build-BLriHKgm.mjs.map} +1 -1
  34. package/dist/{build-D0Wr49bf.cjs → build-Z3yGHcy2.cjs} +3 -3
  35. package/dist/{build-D0Wr49bf.cjs.map → build-Z3yGHcy2.cjs.map} +1 -1
  36. package/dist/{config-CLEDqKO3.cjs → config-BP1IZynR.cjs} +17 -6
  37. package/dist/config-BP1IZynR.cjs.map +1 -0
  38. package/dist/{config-Ba-Gbpbc.d.cts → config-CIzRhm_D.d.mts} +2 -2
  39. package/dist/{config-DBsmMDhf.d.mts → config-CvehIYsb.d.cts} +2 -2
  40. package/dist/{config-Dp8RonV_.mjs → config-UCK12Lrr.mjs} +17 -6
  41. package/dist/config-UCK12Lrr.mjs.map +1 -0
  42. package/dist/config.d.cts +1 -1
  43. package/dist/config.d.mts +1 -1
  44. package/dist/dev/index.cjs +3 -1
  45. package/dist/dev/index.d.cts +2 -2
  46. package/dist/dev/index.d.mts +2 -2
  47. package/dist/dev/index.mjs +3 -1
  48. package/dist/{dev-B734w3L1.mjs → dev-BimlVcuk.mjs} +6 -1
  49. package/dist/dev-BimlVcuk.mjs.map +1 -0
  50. package/dist/{dev-DHqYn8k4.cjs → dev-Dcrb_ZSL.cjs} +6 -1
  51. package/dist/dev-Dcrb_ZSL.cjs.map +1 -0
  52. package/dist/{docker-5d8Yh5_X.cjs → docker-2-ipZDOJ.cjs} +1 -1
  53. package/dist/{docker-5d8Yh5_X.cjs.map → docker-2-ipZDOJ.cjs.map} +1 -1
  54. package/dist/{docker-DlUqdFle.mjs → docker-31GNwU3F.mjs} +1 -1
  55. package/dist/{docker-DlUqdFle.mjs.map → docker-31GNwU3F.mjs.map} +1 -1
  56. package/dist/{env-HfuJRlg5.d.cts → env-CQ3hXAAW.d.mts} +2 -2
  57. package/dist/{env-B-OKjgI4.cjs → env-CS0jvg7k.cjs} +1 -1
  58. package/dist/{env-B-OKjgI4.cjs.map → env-CS0jvg7k.cjs.map} +1 -1
  59. package/dist/{env-nd-iQPYM.d.mts → env-D4YFgMqo.d.cts} +2 -2
  60. package/dist/{env-tv1HlZlw.mjs → env-DEeVOvVu.mjs} +1 -1
  61. package/dist/{env-tv1HlZlw.mjs.map → env-DEeVOvVu.mjs.map} +1 -1
  62. package/dist/generators/CronGenerator.d.cts +4 -4
  63. package/dist/generators/CronGenerator.d.mts +4 -4
  64. package/dist/generators/EndpointGenerator.d.cts +4 -4
  65. package/dist/generators/EndpointGenerator.d.mts +4 -4
  66. package/dist/generators/FunctionGenerator.d.cts +4 -4
  67. package/dist/generators/FunctionGenerator.d.mts +4 -4
  68. package/dist/generators/Generator.d.cts +3 -3
  69. package/dist/generators/Generator.d.mts +3 -3
  70. package/dist/generators/OpenApiTsGenerator.cjs +1 -1
  71. package/dist/generators/OpenApiTsGenerator.mjs +1 -1
  72. package/dist/generators/SubscriberGenerator.d.cts +4 -4
  73. package/dist/generators/SubscriberGenerator.d.mts +4 -4
  74. package/dist/generators/index.d.cts +7 -7
  75. package/dist/generators/index.d.mts +7 -7
  76. package/dist/{index-C523No_B.d.mts → index-DG6xNQMH.d.cts} +25 -8
  77. package/dist/{index-DrzN4xkQ.d.cts → index-DZgrOOOW.d.mts} +25 -8
  78. package/dist/index.cjs +21 -21
  79. package/dist/index.cjs.map +1 -1
  80. package/dist/index.mjs +21 -21
  81. package/dist/index.mjs.map +1 -1
  82. package/dist/init/generators/config.cjs +1 -1
  83. package/dist/init/generators/config.d.cts +2 -2
  84. package/dist/init/generators/config.d.mts +2 -2
  85. package/dist/init/generators/config.mjs +1 -1
  86. package/dist/init/generators/docker.cjs +1 -1
  87. package/dist/init/generators/docker.d.cts +1 -1
  88. package/dist/init/generators/docker.d.mts +1 -1
  89. package/dist/init/generators/docker.mjs +1 -1
  90. package/dist/init/generators/env.cjs +1 -1
  91. package/dist/init/generators/env.d.cts +2 -2
  92. package/dist/init/generators/env.d.mts +2 -2
  93. package/dist/init/generators/env.mjs +1 -1
  94. package/dist/init/generators/index.cjs +9 -4
  95. package/dist/init/generators/index.d.cts +5 -5
  96. package/dist/init/generators/index.d.mts +5 -5
  97. package/dist/init/generators/index.mjs +9 -4
  98. package/dist/init/generators/models.cjs +1 -1
  99. package/dist/init/generators/models.d.cts +1 -1
  100. package/dist/init/generators/models.d.mts +1 -1
  101. package/dist/init/generators/models.mjs +1 -1
  102. package/dist/init/generators/monorepo.cjs +1 -1
  103. package/dist/init/generators/monorepo.d.cts +1 -1
  104. package/dist/init/generators/monorepo.d.mts +1 -1
  105. package/dist/init/generators/monorepo.mjs +1 -1
  106. package/dist/init/generators/package.cjs +6 -1
  107. package/dist/init/generators/package.d.cts +2 -2
  108. package/dist/init/generators/package.d.mts +2 -2
  109. package/dist/init/generators/package.mjs +6 -1
  110. package/dist/init/generators/source.cjs +1 -1
  111. package/dist/init/generators/source.d.cts +2 -2
  112. package/dist/init/generators/source.d.mts +2 -2
  113. package/dist/init/generators/source.mjs +1 -1
  114. package/dist/init/index.cjs +14 -14
  115. package/dist/init/index.d.cts +1 -1
  116. package/dist/init/index.d.mts +1 -1
  117. package/dist/init/index.mjs +14 -14
  118. package/dist/init/templates/api.cjs +1 -1
  119. package/dist/init/templates/api.d.cts +1 -1
  120. package/dist/init/templates/api.d.mts +1 -1
  121. package/dist/init/templates/api.mjs +1 -1
  122. package/dist/init/templates/index.cjs +8 -6
  123. package/dist/init/templates/index.d.cts +2 -2
  124. package/dist/init/templates/index.d.mts +2 -2
  125. package/dist/init/templates/index.mjs +6 -6
  126. package/dist/init/templates/minimal.cjs +1 -1
  127. package/dist/init/templates/minimal.d.cts +1 -1
  128. package/dist/init/templates/minimal.d.mts +1 -1
  129. package/dist/init/templates/minimal.mjs +1 -1
  130. package/dist/init/templates/serverless.cjs +1 -1
  131. package/dist/init/templates/serverless.d.cts +1 -1
  132. package/dist/init/templates/serverless.d.mts +1 -1
  133. package/dist/init/templates/serverless.mjs +1 -1
  134. package/dist/init/templates/worker.cjs +1 -1
  135. package/dist/init/templates/worker.d.cts +1 -1
  136. package/dist/init/templates/worker.d.mts +1 -1
  137. package/dist/init/templates/worker.mjs +1 -1
  138. package/dist/init/utils.cjs +1 -1
  139. package/dist/init/utils.mjs +1 -1
  140. package/dist/{init-CtOnZn3G.mjs → init-BMA7xi8r.mjs} +37 -21
  141. package/dist/init-BMA7xi8r.mjs.map +1 -0
  142. package/dist/{init-qLFsWR-R.cjs → init-D-7WEk-b.cjs} +37 -21
  143. package/dist/init-D-7WEk-b.cjs.map +1 -0
  144. package/dist/{manifests-DIA_2QYd.mjs → manifests-BNKG6AXf.mjs} +1 -1
  145. package/dist/{manifests-DIA_2QYd.mjs.map → manifests-BNKG6AXf.mjs.map} +1 -1
  146. package/dist/{manifests-VJ9-2JpW.cjs → manifests-D13Ej8AE.cjs} +1 -1
  147. package/dist/{manifests-VJ9-2JpW.cjs.map → manifests-D13Ej8AE.cjs.map} +1 -1
  148. package/dist/{minimal-C4GsE45s.mjs → minimal-BkyASH_C.mjs} +15 -9
  149. package/dist/minimal-BkyASH_C.mjs.map +1 -0
  150. package/dist/{minimal-Bdhhpp7v.cjs → minimal-CSFggzdH.cjs} +15 -9
  151. package/dist/minimal-CSFggzdH.cjs.map +1 -0
  152. package/dist/{models-cvNg6Oea.mjs → models-BWlDfviw.mjs} +1 -1
  153. package/dist/{models-cvNg6Oea.mjs.map → models-BWlDfviw.mjs.map} +1 -1
  154. package/dist/{models-DyNwdOcz.cjs → models-BapGSoHC.cjs} +1 -1
  155. package/dist/{models-DyNwdOcz.cjs.map → models-BapGSoHC.cjs.map} +1 -1
  156. package/dist/{monorepo-Cknwzj5C.mjs → monorepo-BBOWhkcd.mjs} +1 -1
  157. package/dist/{monorepo-Cknwzj5C.mjs.map → monorepo-BBOWhkcd.mjs.map} +1 -1
  158. package/dist/{monorepo-sEK8gW59.cjs → monorepo-CFtxHeDh.cjs} +1 -1
  159. package/dist/{monorepo-sEK8gW59.cjs.map → monorepo-CFtxHeDh.cjs.map} +1 -1
  160. package/dist/openapi-CTae4ybf.cjs +98 -0
  161. package/dist/openapi-CTae4ybf.cjs.map +1 -0
  162. package/dist/openapi-Dn9MeKg3.mjs +74 -0
  163. package/dist/openapi-Dn9MeKg3.mjs.map +1 -0
  164. package/dist/{openapi-react-query-DxHjXQvg.cjs → openapi-react-query-Cp-w8_05.cjs} +1 -1
  165. package/dist/{openapi-react-query-DxHjXQvg.cjs.map → openapi-react-query-Cp-w8_05.cjs.map} +1 -1
  166. package/dist/{openapi-react-query-o7Mp1Jd5.mjs → openapi-react-query-_-B3s8v_.mjs} +1 -1
  167. package/dist/{openapi-react-query-o7Mp1Jd5.mjs.map → openapi-react-query-_-B3s8v_.mjs.map} +1 -1
  168. package/dist/openapi-react-query.cjs +1 -1
  169. package/dist/openapi-react-query.mjs +1 -1
  170. package/dist/openapi.cjs +6 -3
  171. package/dist/openapi.d.cts +23 -3
  172. package/dist/openapi.d.mts +23 -3
  173. package/dist/openapi.mjs +3 -3
  174. package/dist/{package-C7WhWU8m.d.mts → package-6h-7QfJZ.d.cts} +2 -2
  175. package/dist/{package-DvWEMz6z.d.cts → package-BCe_KvGv.d.mts} +2 -2
  176. package/dist/{package-CIfmeuSW.mjs → package-C3If80n1.mjs} +7 -1
  177. package/dist/package-C3If80n1.mjs.map +1 -0
  178. package/dist/{package-PP-o1nvq.cjs → package-Dk8IMBOB.cjs} +6 -1
  179. package/dist/package-Dk8IMBOB.cjs.map +1 -0
  180. package/dist/{serverless-Yav3GRVz.cjs → serverless-AGOS-l3G.cjs} +15 -10
  181. package/dist/serverless-AGOS-l3G.cjs.map +1 -0
  182. package/dist/{serverless-DkHBF2vC.mjs → serverless-D5HjJByU.mjs} +15 -10
  183. package/dist/serverless-D5HjJByU.mjs.map +1 -0
  184. package/dist/{source-DT5Xhiob.cjs → source-C1cyfHcF.cjs} +1 -1
  185. package/dist/{source-DT5Xhiob.cjs.map → source-C1cyfHcF.cjs.map} +1 -1
  186. package/dist/{source-D6v2BnKT.d.mts → source-C3LiNUV9.d.mts} +2 -2
  187. package/dist/{source-DnaH_MLA.mjs → source-CkQHBpwu.mjs} +1 -1
  188. package/dist/{source-DnaH_MLA.mjs.map → source-CkQHBpwu.mjs.map} +1 -1
  189. package/dist/{source-D8fK9qRo.d.cts → source-Dtcjbokc.d.cts} +2 -2
  190. package/dist/templates-C0EMmhwb.mjs +88 -0
  191. package/dist/templates-C0EMmhwb.mjs.map +1 -0
  192. package/dist/templates-CbgQ9dw0.cjs +123 -0
  193. package/dist/templates-CbgQ9dw0.cjs.map +1 -0
  194. package/dist/{types-Cxl8-uwV.d.mts → types-Bi7VzDUZ.d.mts} +31 -2
  195. package/dist/{types-C4KITv-y.d.mts → types-D2xYkOal.d.mts} +2 -2
  196. package/dist/{types-DLFN49M3.d.cts → types-DA-r8HWZ.d.cts} +2 -2
  197. package/dist/{types-DB99_qIy.d.cts → types-KmjzMgu8.d.cts} +31 -2
  198. package/dist/types.d.cts +2 -2
  199. package/dist/types.d.mts +2 -2
  200. package/dist/{utils-C31-SWHP.mjs → utils-CKEzCxc1.mjs} +1 -1
  201. package/dist/{utils-C31-SWHP.mjs.map → utils-CKEzCxc1.mjs.map} +1 -1
  202. package/dist/{utils-BX3F4fT8.cjs → utils-DSdN2MTt.cjs} +1 -1
  203. package/dist/{utils-BX3F4fT8.cjs.map → utils-DSdN2MTt.cjs.map} +1 -1
  204. package/dist/{worker--8O5a3Hv.cjs → worker-CGhlqNH-.cjs} +15 -9
  205. package/dist/worker-CGhlqNH-.cjs.map +1 -0
  206. package/dist/{worker-Jme7uOOJ.mjs → worker-CiP420As.mjs} +15 -9
  207. package/dist/worker-CiP420As.mjs.map +1 -0
  208. package/examples/gkm.config.ts +3 -5
  209. package/package.json +4 -4
  210. package/src/__tests__/openapi.spec.ts +395 -302
  211. package/src/dev/__tests__/index.spec.ts +114 -119
  212. package/src/dev/index.ts +18 -0
  213. package/src/init/generators/config.ts +23 -5
  214. package/src/init/generators/package.ts +11 -4
  215. package/src/init/index.ts +26 -7
  216. package/src/init/templates/api.ts +38 -56
  217. package/src/init/templates/index.ts +46 -11
  218. package/src/init/templates/minimal.ts +23 -10
  219. package/src/init/templates/serverless.ts +23 -11
  220. package/src/init/templates/worker.ts +23 -10
  221. package/src/openapi.ts +83 -45
  222. package/src/types.ts +30 -0
  223. package/dist/api-B3SCEHPf.cjs.map +0 -1
  224. package/dist/api-BKIN0s0S.mjs.map +0 -1
  225. package/dist/config-CLEDqKO3.cjs.map +0 -1
  226. package/dist/config-Dp8RonV_.mjs.map +0 -1
  227. package/dist/dev-B734w3L1.mjs.map +0 -1
  228. package/dist/dev-DHqYn8k4.cjs.map +0 -1
  229. package/dist/init-CtOnZn3G.mjs.map +0 -1
  230. package/dist/init-qLFsWR-R.cjs.map +0 -1
  231. package/dist/minimal-Bdhhpp7v.cjs.map +0 -1
  232. package/dist/minimal-C4GsE45s.mjs.map +0 -1
  233. package/dist/openapi-BQWPWyNB.cjs +0 -56
  234. package/dist/openapi-BQWPWyNB.cjs.map +0 -1
  235. package/dist/openapi-DBX8cJJ8.mjs +0 -50
  236. package/dist/openapi-DBX8cJJ8.mjs.map +0 -1
  237. package/dist/package-CIfmeuSW.mjs.map +0 -1
  238. package/dist/package-PP-o1nvq.cjs.map +0 -1
  239. package/dist/serverless-DkHBF2vC.mjs.map +0 -1
  240. package/dist/serverless-Yav3GRVz.cjs.map +0 -1
  241. package/dist/templates-CBFUwpBy.mjs +0 -64
  242. package/dist/templates-CBFUwpBy.mjs.map +0 -1
  243. package/dist/templates-DM_rtYYW.cjs +0 -87
  244. package/dist/templates-DM_rtYYW.cjs.map +0 -1
  245. package/dist/worker--8O5a3Hv.cjs.map +0 -1
  246. package/dist/worker-Jme7uOOJ.mjs.map +0 -1
@@ -3,15 +3,22 @@
3
3
  * Generate configuration files (gkm.config.ts, tsconfig.json, biome.json, turbo.json)
4
4
  */
5
5
  function generateConfigFiles(options, template) {
6
- const { telescope } = options;
6
+ const { telescope, routesStructure } = options;
7
7
  const isServerless = template.name === "serverless";
8
8
  const hasWorker = template.name === "worker";
9
- let gkmConfig = `import { defineConfig } from '@geekmidas/cli';
9
+ const getRoutesGlob = () => {
10
+ switch (routesStructure) {
11
+ case "centralized-endpoints": return "./src/endpoints/**/*.ts";
12
+ case "centralized-routes": return "./src/routes/**/*.ts";
13
+ case "domain-based": return "./src/**/routes/*.ts";
14
+ }
15
+ };
16
+ let gkmConfig = `import { defineConfig } from '@geekmidas/cli/config';
10
17
 
11
18
  export default defineConfig({
12
- routes: './src/endpoints/**/*.ts',
13
- envParser: './src/config/env',
14
- logger: './src/config/logger',`;
19
+ routes: '${getRoutesGlob()}',
20
+ envParser: './src/config/env#envParser',
21
+ logger: './src/config/logger#logger',`;
15
22
  if (isServerless || hasWorker) gkmConfig += `
16
23
  functions: './src/functions/**/*.ts',`;
17
24
  if (hasWorker) gkmConfig += `
@@ -23,6 +30,10 @@ export default defineConfig({
23
30
  path: '/__telescope',
24
31
  },`;
25
32
  gkmConfig += `
33
+ openapi: {
34
+ enabled: true,
35
+ },`;
36
+ gkmConfig += `
26
37
  });
27
38
  `;
28
39
  const tsConfig = options.monorepo ? {
@@ -148,4 +159,4 @@ export default defineConfig({
148
159
 
149
160
  //#endregion
150
161
  export { generateConfigFiles };
151
- //# sourceMappingURL=config-Dp8RonV_.mjs.map
162
+ //# sourceMappingURL=config-UCK12Lrr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-UCK12Lrr.mjs","names":["options: TemplateOptions","template: TemplateConfig"],"sources":["../src/init/generators/config.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate configuration files (gkm.config.ts, tsconfig.json, biome.json, turbo.json)\n */\nexport function generateConfigFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { telescope, routesStructure } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n // Get routes glob pattern based on structure\n const getRoutesGlob = () => {\n switch (routesStructure) {\n case 'centralized-endpoints':\n return './src/endpoints/**/*.ts';\n case 'centralized-routes':\n return './src/routes/**/*.ts';\n case 'domain-based':\n return './src/**/routes/*.ts';\n }\n };\n\n // Build gkm.config.ts\n let gkmConfig = `import { defineConfig } from '@geekmidas/cli/config';\n\nexport default defineConfig({\n routes: '${getRoutesGlob()}',\n envParser: './src/config/env#envParser',\n logger: './src/config/logger#logger',`;\n\n if (isServerless || hasWorker) {\n gkmConfig += `\n functions: './src/functions/**/*.ts',`;\n }\n\n if (hasWorker) {\n gkmConfig += `\n crons: './src/crons/**/*.ts',\n subscribers: './src/subscribers/**/*.ts',`;\n }\n\n if (telescope) {\n gkmConfig += `\n telescope: {\n enabled: true,\n path: '/__telescope',\n },`;\n }\n\n // Always add openapi config (output path is fixed to .gkm/openapi.ts)\n gkmConfig += `\n openapi: {\n enabled: true,\n },`;\n\n gkmConfig += `\n});\n`;\n\n // Build tsconfig.json - extends root for monorepo, standalone for non-monorepo\n const tsConfig = options.monorepo\n ? {\n extends: '../../tsconfig.json',\n compilerOptions: {\n outDir: './dist',\n rootDir: './src',\n baseUrl: '.',\n paths: {\n [`@${options.name}/*`]: ['../../packages/*/src'],\n },\n },\n include: ['src/**/*.ts'],\n exclude: ['node_modules', 'dist'],\n }\n : {\n compilerOptions: {\n target: 'ES2022',\n module: 'NodeNext',\n moduleResolution: 'NodeNext',\n lib: ['ES2022'],\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n forceConsistentCasingInFileNames: true,\n resolveJsonModule: true,\n declaration: true,\n declarationMap: true,\n outDir: './dist',\n rootDir: './src',\n },\n include: ['src/**/*.ts'],\n exclude: ['node_modules', 'dist'],\n };\n\n // Skip biome.json and turbo.json for monorepo (they're at root)\n if (options.monorepo) {\n return [\n {\n path: 'gkm.config.ts',\n content: gkmConfig,\n },\n {\n path: 'tsconfig.json',\n content: JSON.stringify(tsConfig, null, 2) + '\\n',\n },\n ];\n }\n\n // Build biome.json\n const biomeConfig = {\n $schema: 'https://biomejs.dev/schemas/1.9.4/schema.json',\n vcs: {\n enabled: true,\n clientKind: 'git',\n useIgnoreFile: true,\n },\n organizeImports: {\n enabled: true,\n },\n formatter: {\n enabled: true,\n indentStyle: 'space',\n indentWidth: 2,\n lineWidth: 80,\n },\n javascript: {\n formatter: {\n quoteStyle: 'single',\n trailingCommas: 'all',\n semicolons: 'always',\n arrowParentheses: 'always',\n },\n },\n linter: {\n enabled: true,\n rules: {\n recommended: true,\n correctness: {\n noUnusedImports: 'error',\n noUnusedVariables: 'error',\n },\n style: {\n noNonNullAssertion: 'off',\n },\n },\n },\n files: {\n ignore: ['node_modules', 'dist', '.gkm', 'coverage'],\n },\n };\n\n // Build turbo.json\n const turboConfig = {\n $schema: 'https://turbo.build/schema.json',\n tasks: {\n build: {\n dependsOn: ['^build'],\n outputs: ['dist/**'],\n },\n dev: {\n cache: false,\n persistent: true,\n },\n test: {\n dependsOn: ['^build'],\n cache: false,\n },\n 'test:once': {\n dependsOn: ['^build'],\n outputs: ['coverage/**'],\n },\n typecheck: {\n dependsOn: ['^build'],\n outputs: [],\n },\n lint: {\n outputs: [],\n },\n fmt: {\n outputs: [],\n },\n },\n };\n\n return [\n {\n path: 'gkm.config.ts',\n content: gkmConfig,\n },\n {\n path: 'tsconfig.json',\n content: JSON.stringify(tsConfig, null, 2) + '\\n',\n },\n {\n path: 'biome.json',\n content: JSON.stringify(biomeConfig, null, 2) + '\\n',\n },\n {\n path: 'turbo.json',\n content: JSON.stringify(turboConfig, null, 2) + '\\n',\n },\n ];\n}\n"],"mappings":";;;;AASA,SAAgB,oBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,WAAW,iBAAiB,GAAG;CACvC,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAGpC,MAAM,gBAAgB,MAAM;AAC1B,UAAQ,iBAAR;GACE,KAAK,wBACH,QAAO;GACT,KAAK,qBACH,QAAO;GACT,KAAK,eACH,QAAO;EACV;CACF;CAGD,IAAI,aAAa;;;aAGN,eAAe,CAAC;;;AAI3B,KAAI,gBAAgB,UAClB,eAAc;;AAIhB,KAAI,UACF,eAAc;;;AAKhB,KAAI,UACF,eAAc;;;;;AAQhB,eAAc;;;;AAKd,eAAc;;;CAKd,MAAM,WAAW,QAAQ,WACrB;EACE,SAAS;EACT,iBAAiB;GACf,QAAQ;GACR,SAAS;GACT,SAAS;GACT,OAAO,IACH,GAAG,QAAQ,KAAK,MAAM,CAAC,sBAAuB,EACjD;EACF;EACD,SAAS,CAAC,aAAc;EACxB,SAAS,CAAC,gBAAgB,MAAO;CAClC,IACD;EACE,iBAAiB;GACf,QAAQ;GACR,QAAQ;GACR,kBAAkB;GAClB,KAAK,CAAC,QAAS;GACf,QAAQ;GACR,iBAAiB;GACjB,cAAc;GACd,kCAAkC;GAClC,mBAAmB;GACnB,aAAa;GACb,gBAAgB;GAChB,QAAQ;GACR,SAAS;EACV;EACD,SAAS,CAAC,aAAc;EACxB,SAAS,CAAC,gBAAgB,MAAO;CAClC;AAGL,KAAI,QAAQ,SACV,QAAO,CACL;EACE,MAAM;EACN,SAAS;CACV,GACD;EACE,MAAM;EACN,SAAS,KAAK,UAAU,UAAU,MAAM,EAAE,GAAG;CAC9C,CACF;CAIH,MAAM,cAAc;EAClB,SAAS;EACT,KAAK;GACH,SAAS;GACT,YAAY;GACZ,eAAe;EAChB;EACD,iBAAiB,EACf,SAAS,KACV;EACD,WAAW;GACT,SAAS;GACT,aAAa;GACb,aAAa;GACb,WAAW;EACZ;EACD,YAAY,EACV,WAAW;GACT,YAAY;GACZ,gBAAgB;GAChB,YAAY;GACZ,kBAAkB;EACnB,EACF;EACD,QAAQ;GACN,SAAS;GACT,OAAO;IACL,aAAa;IACb,aAAa;KACX,iBAAiB;KACjB,mBAAmB;IACpB;IACD,OAAO,EACL,oBAAoB,MACrB;GACF;EACF;EACD,OAAO,EACL,QAAQ;GAAC;GAAgB;GAAQ;GAAQ;EAAW,EACrD;CACF;CAGD,MAAM,cAAc;EAClB,SAAS;EACT,OAAO;GACL,OAAO;IACL,WAAW,CAAC,QAAS;IACrB,SAAS,CAAC,SAAU;GACrB;GACD,KAAK;IACH,OAAO;IACP,YAAY;GACb;GACD,MAAM;IACJ,WAAW,CAAC,QAAS;IACrB,OAAO;GACR;GACD,aAAa;IACX,WAAW,CAAC,QAAS;IACrB,SAAS,CAAC,aAAc;GACzB;GACD,WAAW;IACT,WAAW,CAAC,QAAS;IACrB,SAAS,CAAE;GACZ;GACD,MAAM,EACJ,SAAS,CAAE,EACZ;GACD,KAAK,EACH,SAAS,CAAE,EACZ;EACF;CACF;AAED,QAAO;EACL;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS,KAAK,UAAU,UAAU,MAAM,EAAE,GAAG;EAC9C;EACD;GACE,MAAM;GACN,SAAS,KAAK,UAAU,aAAa,MAAM,EAAE,GAAG;EACjD;EACD;GACE,MAAM;GACN,SAAS,KAAK,UAAU,aAAa,MAAM,EAAE,GAAG;EACjD;CACF;AACF"}
package/dist/config.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { GkmConfig } from "./types-DB99_qIy.cjs";
1
+ import { GkmConfig } from "./types-KmjzMgu8.cjs";
2
2
 
3
3
  //#region src/config.d.ts
4
4
 
package/dist/config.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { GkmConfig } from "./types-Cxl8-uwV.mjs";
1
+ import { GkmConfig } from "./types-Bi7VzDUZ.mjs";
2
2
 
3
3
  //#region src/config.d.ts
4
4
 
@@ -6,7 +6,9 @@ require('../EndpointGenerator-npWEDoK2.cjs');
6
6
  require('../FunctionGenerator-DYTnyr4c.cjs');
7
7
  require('../SubscriberGenerator-D_zpNGFr.cjs');
8
8
  require('../generators-3IemvCLk.cjs');
9
- const require_dev = require('../dev-DHqYn8k4.cjs');
9
+ require('../OpenApiTsGenerator-wLwpaq_I.cjs');
10
+ require('../openapi-CTae4ybf.cjs');
11
+ const require_dev = require('../dev-Dcrb_ZSL.cjs');
10
12
 
11
13
  exports.devCommand = require_dev.devCommand;
12
14
  exports.findAvailablePort = require_dev.findAvailablePort;
@@ -1,5 +1,5 @@
1
- import { GkmConfig } from "../types-DB99_qIy.cjs";
2
- import { NormalizedTelescopeConfig } from "../types-DLFN49M3.cjs";
1
+ import { GkmConfig } from "../types-KmjzMgu8.cjs";
2
+ import { NormalizedTelescopeConfig } from "../types-DA-r8HWZ.cjs";
3
3
 
4
4
  //#region src/dev/index.d.ts
5
5
 
@@ -1,5 +1,5 @@
1
- import { GkmConfig } from "../types-Cxl8-uwV.mjs";
2
- import { NormalizedTelescopeConfig } from "../types-C4KITv-y.mjs";
1
+ import { GkmConfig } from "../types-Bi7VzDUZ.mjs";
2
+ import { NormalizedTelescopeConfig } from "../types-D2xYkOal.mjs";
3
3
 
4
4
  //#region src/dev/index.d.ts
5
5
 
@@ -6,6 +6,8 @@ import "../EndpointGenerator-DGivkPLT.mjs";
6
6
  import "../FunctionGenerator-CVk0h8tO.mjs";
7
7
  import "../SubscriberGenerator-DABaJXML.mjs";
8
8
  import "../generators-FNpdfN6J.mjs";
9
- import { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig } from "../dev-B734w3L1.mjs";
9
+ import "../OpenApiTsGenerator-0ZDYWro5.mjs";
10
+ import "../openapi-Dn9MeKg3.mjs";
11
+ import { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig } from "../dev-BimlVcuk.mjs";
10
12
 
11
13
  export { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig };
@@ -4,6 +4,7 @@ import { CronGenerator } from "./CronGenerator-CCRYptuT.mjs";
4
4
  import { EndpointGenerator } from "./EndpointGenerator-DGivkPLT.mjs";
5
5
  import { FunctionGenerator } from "./FunctionGenerator-CVk0h8tO.mjs";
6
6
  import { SubscriberGenerator } from "./SubscriberGenerator-DABaJXML.mjs";
7
+ import { generateOpenApi, resolveOpenApiConfig } from "./openapi-Dn9MeKg3.mjs";
7
8
  import { mkdir } from "node:fs/promises";
8
9
  import { join, resolve } from "node:path";
9
10
  import { spawn } from "node:child_process";
@@ -120,6 +121,8 @@ async function devCommand(options) {
120
121
  const { path: loggerPath, importPattern: loggerImportPattern } = parseModuleConfig(config$1.logger, "logger");
121
122
  const telescope = normalizeTelescopeConfig(config$1.telescope);
122
123
  if (telescope) logger.log(`🔭 Telescope enabled at ${telescope.path}`);
124
+ const openApiConfig = resolveOpenApiConfig(config$1);
125
+ if (openApiConfig.enabled) logger.log(`📄 OpenAPI output: ${openApiConfig.output}`);
123
126
  const buildContext = {
124
127
  envParserPath,
125
128
  envParserImportPattern,
@@ -128,6 +131,7 @@ async function devCommand(options) {
128
131
  telescope
129
132
  };
130
133
  await buildServer(config$1, buildContext, resolved.providers[0], resolved.enableOpenApi);
134
+ if (openApiConfig.enabled) await generateOpenApi(config$1);
131
135
  const runtime = config$1.runtime ?? "node";
132
136
  const devServer = new DevServer(resolved.providers[0], options.port || 3e3, resolved.enableOpenApi, telescope, runtime);
133
137
  await devServer.start();
@@ -170,6 +174,7 @@ async function devCommand(options) {
170
174
  try {
171
175
  logger.log("🔄 Rebuilding...");
172
176
  await buildServer(config$1, buildContext, resolved.providers[0], resolved.enableOpenApi);
177
+ if (openApiConfig.enabled) await generateOpenApi(config$1, { silent: true });
173
178
  logger.log("✅ Rebuild complete, restarting server...");
174
179
  await devServer.restart();
175
180
  } catch (error) {
@@ -340,4 +345,4 @@ start({
340
345
 
341
346
  //#endregion
342
347
  export { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig };
343
- //# sourceMappingURL=dev-B734w3L1.mjs.map
348
+ //# sourceMappingURL=dev-BimlVcuk.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-BimlVcuk.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 { generateOpenApi, resolveOpenApiConfig } from '../openapi';\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 // Resolve OpenAPI configuration\n const openApiConfig = resolveOpenApiConfig(config);\n if (openApiConfig.enabled) {\n logger.log(`📄 OpenAPI output: ${openApiConfig.output}`);\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 // Generate OpenAPI spec on startup\n if (openApiConfig.enabled) {\n await generateOpenApi(config);\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\n // Regenerate OpenAPI if enabled\n if (openApiConfig.enabled) {\n await generateOpenApi(config, { silent: true });\n }\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":";;;;;;;;;;;;;;;;;AAyBA,MAAM,SAAS;;;;;AAMf,SAAgB,aACdA,WACAC,MAAc,QAAQ,KAAK,EACc;CACzC,MAAMC,SAAmB,CAAE;CAC3B,MAAMC,UAAoB,CAAE;CAG5B,MAAM,WAAW,YACb,MAAM,QAAQ,UAAU,GACtB,YACA,CAAC,SAAU,IACb,CAAC,MAAO;AAGZ,MAAK,MAAM,WAAW,UAAU;EAC9B,MAAM,UAAU,QAAQ,KAAK,QAAQ;AACrC,MAAI,WAAW,QAAQ,EAAE;AACvB,UAAa;IAAE,MAAM;IAAS,UAAU;IAAM,OAAO;GAAM,EAAC;AAC5D,UAAO,KAAK,QAAQ;EACrB,WAAU,UAET,SAAQ,KAAK,QAAQ;CAExB;AAED,QAAO;EAAE;EAAQ;CAAS;AAC3B;;;;;AAMD,eAAsB,gBAAgBC,MAAgC;AACpE,QAAO,IAAI,QAAQ,CAACC,cAAY;EAC9B,MAAM,SAAS,cAAc;AAE7B,SAAO,KAAK,SAAS,CAACC,QAA+B;AACnD,OAAI,IAAI,SAAS,aACf,WAAQ,MAAM;OAEd,WAAQ,MAAM;EAEjB,EAAC;AAEF,SAAO,KAAK,aAAa,MAAM;AAC7B,UAAO,OAAO;AACd,aAAQ,KAAK;EACd,EAAC;AAEF,SAAO,OAAO,KAAK;CACpB;AACF;;;;;AAMD,eAAsB,kBACpBC,eACA,cAAc,IACG;AACjB,MAAK,IAAI,IAAI,GAAG,IAAI,aAAa,KAAK;EACpC,MAAM,OAAO,gBAAgB;AAC7B,MAAI,MAAM,gBAAgB,KAAK,CAC7B,QAAO;AAET,SAAO,KAAK,WAAW,KAAK,qBAAqB,OAAO,EAAE,KAAK;CAChE;AAED,OAAM,IAAI,OACP,gDAAgD,YAAY,uBAAuB,cAAc;AAErG;;;;;AAMD,SAAgB,yBACdC,UACuC;AACvC,KAAIC,aAAW,MACb;AAIF,YAAWA,aAAW,UAAU;EAC9B,MAAM,EAAE,MAAM,eAAe,eAAe,wBAAwB,GAClE,kBAAkBA,UAAQ,YAAY;AAExC,SAAO;GACL,SAAS;GACT;GACA;GACA,MAAM;GACN,QAAQ,CAAE;GACV,YAAY;GACZ,YAAY;GACZ,WAAW;EACZ;CACF;CAGD,MAAM,YACJA,aAAW,QAAQA,uBAAwBA,SAAO,YAAY;AAEhE,MAAK,UACH;CAGF,MAAMC,yBACGD,aAAW,WAAWA,WAAS,CAAE;AAE1C,QAAO;EACL,SAAS;EACT,MAAM,gBAAgB,QAAQ;EAC9B,QAAQ,gBAAgB,UAAU,CAAE;EACpC,YAAY,gBAAgB,cAAc;EAC1C,YAAY,gBAAgB,cAAc;EAC1C,WAAW,gBAAgB,aAAa;CACzC;AACF;AAOD,eAAsB,WAAWE,SAAoC;CAGnE,MAAM,aAAa,aAAa,OAAO;AACvC,KAAI,WAAW,OAAO,SAAS,EAC7B,QAAO,KAAK,iBAAiB,WAAW,OAAO,KAAK,KAAK,CAAC,EAAE;CAG9D,MAAMF,WAAS,MAAM,YAAY;AAGjC,KAAIA,SAAO,KAAK;EACd,MAAM,EAAE,QAAQ,SAAS,GAAG,aAAaA,SAAO,IAAI;AACpD,MAAI,OAAO,SAAS,EAClB,QAAO,KAAK,iBAAiB,OAAO,KAAK,KAAK,CAAC,EAAE;AAEnD,MAAI,QAAQ,SAAS,EACnB,QAAO,MAAM,yBAAyB,QAAQ,KAAK,KAAK,CAAC,EAAE;CAE9D;CAGD,MAAM,WAAW,iBAAiBA,UAAQ,EAAE,UAAU,SAAU,EAAC;AAEjE,QAAO,IAAI,oCAAoC;AAC/C,QAAO,KAAK,uBAAuBA,SAAO,OAAO,EAAE;AACnD,KAAIA,SAAO,UACT,QAAO,KAAK,0BAA0BA,SAAO,UAAU,EAAE;AAE3D,KAAIA,SAAO,MACT,QAAO,KAAK,sBAAsBA,SAAO,MAAM,EAAE;AAEnD,KAAIA,SAAO,YACT,QAAO,KAAK,4BAA4BA,SAAO,YAAY,EAAE;AAE/D,QAAO,KAAK,mBAAmBA,SAAO,UAAU,EAAE;CAGlD,MAAM,EAAE,MAAM,eAAe,eAAe,wBAAwB,GAClE,kBAAkBA,SAAO,WAAW,YAAY;CAClD,MAAM,EAAE,MAAM,YAAY,eAAe,qBAAqB,GAC5D,kBAAkBA,SAAO,QAAQ,SAAS;CAG5C,MAAM,YAAY,yBAAyBA,SAAO,UAAU;AAC5D,KAAI,UACF,QAAO,KAAK,0BAA0B,UAAU,KAAK,EAAE;CAIzD,MAAM,gBAAgB,qBAAqBA,SAAO;AAClD,KAAI,cAAc,QAChB,QAAO,KAAK,qBAAqB,cAAc,OAAO,EAAE;CAG1D,MAAMG,eAA6B;EACjC;EACA;EACA;EACA;EACA;CACD;AAGD,OAAM,YACJH,UACA,cACA,SAAS,UAAU,IACnB,SAAS,cACV;AAGD,KAAI,cAAc,QAChB,OAAM,gBAAgBA,SAAO;CAI/B,MAAMI,UAAmBJ,SAAO,WAAW;CAG3C,MAAM,YAAY,IAAI,UACpB,SAAS,UAAU,IACnB,QAAQ,QAAQ,KAChB,SAAS,eACT,WACA;AAGF,OAAM,UAAU,OAAO;CAGvB,MAAM,gBAAgB,SAAO,UAAU,MAAM,IAAI,CAAC;CAClD,MAAM,aAAa,SAAO,OAAO,MAAM,IAAI,CAAC;CAE5C,MAAM,gBAAgB;EACpBA,SAAO;EACP,GAAIA,SAAO,YAAY,CAACA,SAAO,SAAU,IAAG,CAAE;EAC9C,GAAIA,SAAO,QAAQ,CAACA,SAAO,KAAM,IAAG,CAAE;EACtC,GAAIA,SAAO,cAAc,CAACA,SAAO,WAAY,IAAG,CAAE;EAElD,cAAc,SAAS,MAAM,GAAG,iBAAiB,EAAE,cAAc;EACjE,WAAW,SAAS,MAAM,GAAG,cAAc,EAAE,WAAW;CACzD,EAAC,MAAM;CAGR,MAAM,qBAAqB,cAAc,IAAI,CAAC,MAC5C,EAAE,WAAW,KAAK,GAAG,EAAE,MAAM,EAAE,GAAG,EACnC;AAED,QAAO,KAAK,8BAA8B,mBAAmB,KAAK,KAAK,CAAC,EAAE;CAG1E,MAAM,gBAAgB,MAAM,GAAG,oBAAoB;EACjD,KAAK,QAAQ,KAAK;EAClB,UAAU;EACV,WAAW;CACZ,EAAC;CAGF,MAAM,cAAc,CAClB,GAAG,IAAI,IAAI,cAAc,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CACzE;AAED,QAAO,KACJ,WAAW,cAAc,OAAO,YAAY,YAAY,OAAO,cACjE;CAED,MAAM,UAAU,SAAS,MAAM,CAAC,GAAG,eAAe,GAAG,WAAY,GAAE;EACjE,SAAS;EACT,YAAY;EACZ,eAAe;EACf,KAAK,QAAQ,KAAK;CACnB,EAAC;AAEF,SAAQ,GAAG,SAAS,MAAM;AACxB,SAAO,IAAI,wBAAwB;CACpC,EAAC;AAEF,SAAQ,GAAG,SAAS,CAAC,UAAU;AAC7B,SAAO,MAAM,oBAAoB,MAAM;CACxC,EAAC;CAEF,IAAIK,iBAAwC;AAE5C,SAAQ,GAAG,UAAU,OAAO,SAAS;AACnC,SAAO,KAAK,mBAAmB,KAAK,EAAE;AAGtC,MAAI,eACF,cAAa,eAAe;AAG9B,mBAAiB,WAAW,YAAY;AACtC,OAAI;AACF,WAAO,IAAI,mBAAmB;AAC9B,UAAM,YACJL,UACA,cACA,SAAS,UAAU,IACnB,SAAS,cACV;AAGD,QAAI,cAAc,QAChB,OAAM,gBAAgBA,UAAQ,EAAE,QAAQ,KAAM,EAAC;AAGjD,WAAO,IAAI,2CAA2C;AACtD,UAAM,UAAU,SAAS;GAC1B,SAAQ,OAAO;AACd,WAAO,MAAM,qBAAsB,MAAgB,QAAQ;GAC5D;EACF,GAAE,IAAI;CACR,EAAC;CAGF,MAAM,WAAW,YAAY;AAC3B,SAAO,IAAI,wBAAwB;AACnC,QAAM,QAAQ,OAAO;AACrB,QAAM,UAAU,MAAM;AACtB,UAAQ,KAAK,EAAE;CAChB;AAED,SAAQ,GAAG,UAAU,SAAS;AAC9B,SAAQ,GAAG,WAAW,SAAS;AAChC;AAED,eAAe,YACbM,UACAC,SACAC,UACAC,eACe;CAEf,MAAM,oBAAoB,IAAI;CAC9B,MAAM,oBAAoB,IAAI;CAC9B,MAAM,gBAAgB,IAAI;CAC1B,MAAM,sBAAsB,IAAI;CAGhC,MAAM,CAAC,cAAc,cAAc,UAAU,eAAe,GAC1D,MAAM,QAAQ,IAAI;EAChB,kBAAkB,KAAKT,SAAO,OAAO;EACrCA,SAAO,YAAY,kBAAkB,KAAKA,SAAO,UAAU,GAAG,CAAE;EAChEA,SAAO,QAAQ,cAAc,KAAKA,SAAO,MAAM,GAAG,CAAE;EACpDA,SAAO,cAAc,oBAAoB,KAAKA,SAAO,YAAY,GAAG,CAAE;CACvE,EAAC;CAGJ,MAAM,YAAY,KAAK,QAAQ,KAAK,EAAE,QAAQ,SAAS;AACvD,OAAM,MAAM,WAAW,EAAE,WAAW,KAAM,EAAC;AAG3C,OAAM,QAAQ,IAAI;EAChB,kBAAkB,MAAM,SAAS,cAAc,WAAW;GACxD;GACA;EACD,EAAC;EACF,kBAAkB,MAAM,SAAS,cAAc,WAAW,EAAE,SAAU,EAAC;EACvE,cAAc,MAAM,SAAS,UAAU,WAAW,EAAE,SAAU,EAAC;EAC/D,oBAAoB,MAAM,SAAS,gBAAgB,WAAW,EAAE,SAAU,EAAC;CAC5E,EAAC;AACH;AAED,IAAM,YAAN,MAAgB;CACd,AAAQ,gBAAqC;CAC7C,AAAQ,YAAY;CACpB,AAAQ;CAER,YACUQ,UACAE,eACAD,eACAE,WACAP,UAAmB,QAC3B;EALQ;EACA;EACA;EACA;EACA;AAER,OAAK,aAAa;CACnB;CAED,MAAM,QAAuB;AAC3B,MAAI,KAAK,UACP,OAAM,KAAK,MAAM;AAInB,OAAK,aAAa,MAAM,kBAAkB,KAAK,cAAc;AAE7D,MAAI,KAAK,eAAe,KAAK,cAC3B,QAAO,KACJ,WAAW,KAAK,cAAc,0BAA0B,KAAK,WAAW,UAC1E;EAGH,MAAM,kBAAkB,KACtB,QAAQ,KAAK,EACb,QACA,KAAK,UACL,YACD;AAGD,QAAM,KAAK,mBAAmB;AAE9B,SAAO,KAAK,8BAA8B,KAAK,WAAW,KAAK;AAI/D,OAAK,gBAAgB,MACnB,OACA;GAAC;GAAO;GAAiB;GAAU,KAAK,WAAW,UAAU;EAAC,GAC9D;GACE,OAAO;GACP,KAAK;IAAE,GAAG,QAAQ;IAAK,UAAU;GAAe;GAChD,UAAU;EACX,EACF;AAED,OAAK,YAAY;AAEjB,OAAK,cAAc,GAAG,SAAS,CAAC,UAAU;AACxC,UAAO,MAAM,mBAAmB,MAAM;EACvC,EAAC;AAEF,OAAK,cAAc,GAAG,QAAQ,CAAC,MAAM,WAAW;AAC9C,OAAI,SAAS,QAAQ,SAAS,KAAK,WAAW,UAC5C,QAAO,OAAO,4BAA4B,KAAK,EAAE;AAEnD,QAAK,YAAY;EAClB,EAAC;AAGF,QAAM,IAAI,QAAQ,CAACR,cAAY,WAAWA,WAAS,IAAK;AAExD,MAAI,KAAK,WAAW;AAClB,UAAO,KAAK,0CAA0C,KAAK,WAAW,EAAE;AACxE,OAAI,KAAK,cACP,QAAO,KACJ,4CAA4C,KAAK,WAAW,OAC9D;AAEH,OAAI,KAAK,UACP,QAAO,KACJ,6CAA6C,KAAK,WAAW,EAAE,KAAK,UAAU,KAAK,EACrF;EAEJ;CACF;CAED,MAAM,OAAsB;AAC1B,MAAI,KAAK,iBAAiB,KAAK,WAAW;GACxC,MAAM,MAAM,KAAK,cAAc;AAG/B,OAAI,IACF,KAAI;AACF,YAAQ,MAAM,KAAK,UAAU;GAC9B,QAAO,CAEP;AAIH,SAAM,IAAI,QAAc,CAACA,cAAY;IACnC,MAAM,UAAU,WAAW,MAAM;AAC/B,SAAI,IACF,KAAI;AACF,cAAQ,MAAM,KAAK,UAAU;KAC9B,QAAO,CAEP;AAEH,gBAAS;IACV,GAAE,IAAK;AAER,SAAK,eAAe,GAAG,QAAQ,MAAM;AACnC,kBAAa,QAAQ;AACrB,gBAAS;IACV,EAAC;GACH;AAED,QAAK,gBAAgB;AACrB,QAAK,YAAY;EAClB;CACF;CAED,MAAM,UAAyB;EAC7B,MAAM,cAAc,KAAK;AACzB,QAAM,KAAK,MAAM;EAGjB,IAAI,WAAW;AACf,SAAO,WAAW,IAAI;AACpB,OAAI,MAAM,gBAAgB,YAAY,CACpC;AAEF,SAAM,IAAI,QAAQ,CAACA,cAAY,WAAWA,WAAS,IAAI;AACvD;EACD;AAGD,OAAK,gBAAgB;AACrB,QAAM,KAAK,OAAO;CACnB;CAED,MAAc,oBAAmC;EAC/C,MAAM,EAAE,wBAAW,GAAG,MAAM,OAAO;EACnC,MAAM,EAAE,sBAAU,oBAAS,GAAG,MAAM,OAAO;EAE3C,MAAM,aAAa,KAAK,QAAQ,KAAK,EAAE,QAAQ,KAAK,UAAU,YAAY;EAE1E,MAAM,kBAAkB,WACtB,UAAQ,WAAW,EACnB,KAAK,UAAQ,WAAW,EAAE,SAAS,CACpC;EAED,MAAM,YACJ,KAAK,YAAY,SACZ;;;YAIA;;;;;;;;;;;EAYP,MAAM,WAAW;;;;;+BAKU,gBAAgB,WAAW,IAAI,GAAG,kBAAkB,OAAO,gBAAgB;;;;;;;oDAOtD,KAAK,cAAc;;;;;;MAMjE,UAAU;;;;;;;AAQZ,QAAM,YAAU,YAAY,QAAQ;CACrC;AACF"}
@@ -5,6 +5,7 @@ const require_CronGenerator = require('./CronGenerator-D4TWXQbh.cjs');
5
5
  const require_EndpointGenerator = require('./EndpointGenerator-npWEDoK2.cjs');
6
6
  const require_FunctionGenerator = require('./FunctionGenerator-DYTnyr4c.cjs');
7
7
  const require_SubscriberGenerator = require('./SubscriberGenerator-D_zpNGFr.cjs');
8
+ const require_openapi = require('./openapi-CTae4ybf.cjs');
8
9
  const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
9
10
  const node_path = require_chunk.__toESM(require("node:path"));
10
11
  const node_child_process = require_chunk.__toESM(require("node:child_process"));
@@ -121,6 +122,8 @@ async function devCommand(options) {
121
122
  const { path: loggerPath, importPattern: loggerImportPattern } = require_config.parseModuleConfig(config.logger, "logger");
122
123
  const telescope = normalizeTelescopeConfig(config.telescope);
123
124
  if (telescope) logger.log(`🔭 Telescope enabled at ${telescope.path}`);
125
+ const openApiConfig = require_openapi.resolveOpenApiConfig(config);
126
+ if (openApiConfig.enabled) logger.log(`📄 OpenAPI output: ${openApiConfig.output}`);
124
127
  const buildContext = {
125
128
  envParserPath,
126
129
  envParserImportPattern,
@@ -129,6 +132,7 @@ async function devCommand(options) {
129
132
  telescope
130
133
  };
131
134
  await buildServer(config, buildContext, resolved.providers[0], resolved.enableOpenApi);
135
+ if (openApiConfig.enabled) await require_openapi.generateOpenApi(config);
132
136
  const runtime = config.runtime ?? "node";
133
137
  const devServer = new DevServer(resolved.providers[0], options.port || 3e3, resolved.enableOpenApi, telescope, runtime);
134
138
  await devServer.start();
@@ -171,6 +175,7 @@ async function devCommand(options) {
171
175
  try {
172
176
  logger.log("🔄 Rebuilding...");
173
177
  await buildServer(config, buildContext, resolved.providers[0], resolved.enableOpenApi);
178
+ if (openApiConfig.enabled) await require_openapi.generateOpenApi(config, { silent: true });
174
179
  logger.log("✅ Rebuild complete, restarting server...");
175
180
  await devServer.restart();
176
181
  } catch (error) {
@@ -370,4 +375,4 @@ Object.defineProperty(exports, 'normalizeTelescopeConfig', {
370
375
  return normalizeTelescopeConfig;
371
376
  }
372
377
  });
373
- //# sourceMappingURL=dev-DHqYn8k4.cjs.map
378
+ //# sourceMappingURL=dev-Dcrb_ZSL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev-Dcrb_ZSL.cjs","names":["envConfig: string | string[] | undefined","cwd: string","loaded: string[]","missing: string[]","port: number","resolve","err: NodeJS.ErrnoException","preferredPort: number","config: GkmConfig['telescope']","telescopeConfig: TelescopeConfig","options: DevOptions","buildContext: BuildContext","runtime: Runtime","rebuildTimeout: NodeJS.Timeout | null","config: any","context: BuildContext","provider: LegacyProvider","enableOpenApi: boolean","EndpointGenerator","FunctionGenerator","CronGenerator","SubscriberGenerator","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 { generateOpenApi, resolveOpenApiConfig } from '../openapi';\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 // Resolve OpenAPI configuration\n const openApiConfig = resolveOpenApiConfig(config);\n if (openApiConfig.enabled) {\n logger.log(`📄 OpenAPI output: ${openApiConfig.output}`);\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 // Generate OpenAPI spec on startup\n if (openApiConfig.enabled) {\n await generateOpenApi(config);\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\n // Regenerate OpenAPI if enabled\n if (openApiConfig.enabled) {\n await generateOpenApi(config, { silent: true });\n }\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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"}
@@ -116,4 +116,4 @@ Object.defineProperty(exports, 'generateDockerFiles', {
116
116
  return generateDockerFiles;
117
117
  }
118
118
  });
119
- //# sourceMappingURL=docker-5d8Yh5_X.cjs.map
119
+ //# sourceMappingURL=docker-2-ipZDOJ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-5d8Yh5_X.cjs","names":["options: TemplateOptions","template: TemplateConfig","services: string[]","volumes: string[]"],"sources":["../src/init/generators/docker.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate docker-compose.yml based on template and options\n */\nexport function generateDockerFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n const services: string[] = [];\n const volumes: string[] = [];\n\n // PostgreSQL database\n if (database) {\n services.push(` postgres:\n image: postgres:16-alpine\n container_name: ${options.name}-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: ${options.name.replace(/-/g, '_')}_dev\n ports:\n - '5432:5432'\n volumes:\n - postgres_data:/var/lib/postgresql/data\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U postgres']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' postgres_data:');\n }\n\n // Redis - different setup for serverless vs standard\n if (isServerless) {\n // Use serverless-redis-http for Lambda compatibility\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5\n\n serverless-redis:\n image: hiett/serverless-redis-http:latest\n container_name: ${options.name}-serverless-redis\n restart: unless-stopped\n ports:\n - '8079:80'\n environment:\n SRH_MODE: env\n SRH_TOKEN: local_dev_token\n SRH_CONNECTION_STRING: redis://redis:6379\n depends_on:\n redis:\n condition: service_healthy`);\n volumes.push(' redis_data:');\n } else {\n // Standard Redis for non-serverless templates\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' redis_data:');\n }\n\n // RabbitMQ for worker template\n if (hasWorker) {\n services.push(` rabbitmq:\n image: rabbitmq:3-management-alpine\n container_name: ${options.name}-rabbitmq\n restart: unless-stopped\n ports:\n - '5672:5672'\n - '15672:15672'\n environment:\n RABBITMQ_DEFAULT_USER: guest\n RABBITMQ_DEFAULT_PASS: guest\n volumes:\n - rabbitmq_data:/var/lib/rabbitmq\n healthcheck:\n test: ['CMD', 'rabbitmq-diagnostics', 'check_running']\n interval: 10s\n timeout: 5s\n retries: 5`);\n volumes.push(' rabbitmq_data:');\n }\n\n // Build docker-compose.yml\n let dockerCompose = `version: '3.8'\n\nservices:\n${services.join('\\n\\n')}\n`;\n\n if (volumes.length > 0) {\n dockerCompose += `\nvolumes:\n${volumes.join('\\n')}\n`;\n }\n\n return [\n {\n path: 'docker-compose.yml',\n content: dockerCompose,\n },\n ];\n}\n"],"mappings":";;;;;AASA,SAAgB,oBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAMC,WAAqB,CAAE;CAC7B,MAAMC,UAAoB,CAAE;AAG5B,KAAI,UAAU;AACZ,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;qBAKd,QAAQ,KAAK,QAAQ,MAAM,IAAI,CAAC;;;;;;;;;kBASnC;AACd,UAAQ,KAAK,mBAAmB;CACjC;AAGD,KAAI,cAAc;AAEhB,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;sBAcb,QAAQ,KAAK;;;;;;;;;;oCAUC;AAChC,UAAQ,KAAK,gBAAgB;CAC9B,OAAM;AAEL,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;kBAUjB;AACd,UAAQ,KAAK,gBAAgB;CAC9B;AAGD,KAAI,WAAW;AACb,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;kBAcjB;AACd,UAAQ,KAAK,mBAAmB;CACjC;CAGD,IAAI,iBAAiB;;;EAGrB,SAAS,KAAK,OAAO,CAAC;;AAGtB,KAAI,QAAQ,SAAS,EACnB,mBAAkB;;EAEpB,QAAQ,KAAK,KAAK,CAAC;;AAInB,QAAO,CACL;EACE,MAAM;EACN,SAAS;CACV,CACF;AACF"}
1
+ {"version":3,"file":"docker-2-ipZDOJ.cjs","names":["options: TemplateOptions","template: TemplateConfig","services: string[]","volumes: string[]"],"sources":["../src/init/generators/docker.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate docker-compose.yml based on template and options\n */\nexport function generateDockerFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n const services: string[] = [];\n const volumes: string[] = [];\n\n // PostgreSQL database\n if (database) {\n services.push(` postgres:\n image: postgres:16-alpine\n container_name: ${options.name}-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: ${options.name.replace(/-/g, '_')}_dev\n ports:\n - '5432:5432'\n volumes:\n - postgres_data:/var/lib/postgresql/data\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U postgres']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' postgres_data:');\n }\n\n // Redis - different setup for serverless vs standard\n if (isServerless) {\n // Use serverless-redis-http for Lambda compatibility\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5\n\n serverless-redis:\n image: hiett/serverless-redis-http:latest\n container_name: ${options.name}-serverless-redis\n restart: unless-stopped\n ports:\n - '8079:80'\n environment:\n SRH_MODE: env\n SRH_TOKEN: local_dev_token\n SRH_CONNECTION_STRING: redis://redis:6379\n depends_on:\n redis:\n condition: service_healthy`);\n volumes.push(' redis_data:');\n } else {\n // Standard Redis for non-serverless templates\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' redis_data:');\n }\n\n // RabbitMQ for worker template\n if (hasWorker) {\n services.push(` rabbitmq:\n image: rabbitmq:3-management-alpine\n container_name: ${options.name}-rabbitmq\n restart: unless-stopped\n ports:\n - '5672:5672'\n - '15672:15672'\n environment:\n RABBITMQ_DEFAULT_USER: guest\n RABBITMQ_DEFAULT_PASS: guest\n volumes:\n - rabbitmq_data:/var/lib/rabbitmq\n healthcheck:\n test: ['CMD', 'rabbitmq-diagnostics', 'check_running']\n interval: 10s\n timeout: 5s\n retries: 5`);\n volumes.push(' rabbitmq_data:');\n }\n\n // Build docker-compose.yml\n let dockerCompose = `version: '3.8'\n\nservices:\n${services.join('\\n\\n')}\n`;\n\n if (volumes.length > 0) {\n dockerCompose += `\nvolumes:\n${volumes.join('\\n')}\n`;\n }\n\n return [\n {\n path: 'docker-compose.yml',\n content: dockerCompose,\n },\n ];\n}\n"],"mappings":";;;;;AASA,SAAgB,oBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAMC,WAAqB,CAAE;CAC7B,MAAMC,UAAoB,CAAE;AAG5B,KAAI,UAAU;AACZ,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;qBAKd,QAAQ,KAAK,QAAQ,MAAM,IAAI,CAAC;;;;;;;;;kBASnC;AACd,UAAQ,KAAK,mBAAmB;CACjC;AAGD,KAAI,cAAc;AAEhB,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;sBAcb,QAAQ,KAAK;;;;;;;;;;oCAUC;AAChC,UAAQ,KAAK,gBAAgB;CAC9B,OAAM;AAEL,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;kBAUjB;AACd,UAAQ,KAAK,gBAAgB;CAC9B;AAGD,KAAI,WAAW;AACb,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;kBAcjB;AACd,UAAQ,KAAK,mBAAmB;CACjC;CAGD,IAAI,iBAAiB;;;EAGrB,SAAS,KAAK,OAAO,CAAC;;AAGtB,KAAI,QAAQ,SAAS,EACnB,mBAAkB;;EAEpB,QAAQ,KAAK,KAAK,CAAC;;AAInB,QAAO,CACL;EACE,MAAM;EACN,SAAS;CACV,CACF;AACF"}
@@ -110,4 +110,4 @@ ${volumes.join("\n")}
110
110
 
111
111
  //#endregion
112
112
  export { generateDockerFiles };
113
- //# sourceMappingURL=docker-DlUqdFle.mjs.map
113
+ //# sourceMappingURL=docker-31GNwU3F.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-DlUqdFle.mjs","names":["options: TemplateOptions","template: TemplateConfig","services: string[]","volumes: string[]"],"sources":["../src/init/generators/docker.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate docker-compose.yml based on template and options\n */\nexport function generateDockerFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n const services: string[] = [];\n const volumes: string[] = [];\n\n // PostgreSQL database\n if (database) {\n services.push(` postgres:\n image: postgres:16-alpine\n container_name: ${options.name}-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: ${options.name.replace(/-/g, '_')}_dev\n ports:\n - '5432:5432'\n volumes:\n - postgres_data:/var/lib/postgresql/data\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U postgres']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' postgres_data:');\n }\n\n // Redis - different setup for serverless vs standard\n if (isServerless) {\n // Use serverless-redis-http for Lambda compatibility\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5\n\n serverless-redis:\n image: hiett/serverless-redis-http:latest\n container_name: ${options.name}-serverless-redis\n restart: unless-stopped\n ports:\n - '8079:80'\n environment:\n SRH_MODE: env\n SRH_TOKEN: local_dev_token\n SRH_CONNECTION_STRING: redis://redis:6379\n depends_on:\n redis:\n condition: service_healthy`);\n volumes.push(' redis_data:');\n } else {\n // Standard Redis for non-serverless templates\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' redis_data:');\n }\n\n // RabbitMQ for worker template\n if (hasWorker) {\n services.push(` rabbitmq:\n image: rabbitmq:3-management-alpine\n container_name: ${options.name}-rabbitmq\n restart: unless-stopped\n ports:\n - '5672:5672'\n - '15672:15672'\n environment:\n RABBITMQ_DEFAULT_USER: guest\n RABBITMQ_DEFAULT_PASS: guest\n volumes:\n - rabbitmq_data:/var/lib/rabbitmq\n healthcheck:\n test: ['CMD', 'rabbitmq-diagnostics', 'check_running']\n interval: 10s\n timeout: 5s\n retries: 5`);\n volumes.push(' rabbitmq_data:');\n }\n\n // Build docker-compose.yml\n let dockerCompose = `version: '3.8'\n\nservices:\n${services.join('\\n\\n')}\n`;\n\n if (volumes.length > 0) {\n dockerCompose += `\nvolumes:\n${volumes.join('\\n')}\n`;\n }\n\n return [\n {\n path: 'docker-compose.yml',\n content: dockerCompose,\n },\n ];\n}\n"],"mappings":";;;;AASA,SAAgB,oBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAMC,WAAqB,CAAE;CAC7B,MAAMC,UAAoB,CAAE;AAG5B,KAAI,UAAU;AACZ,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;qBAKd,QAAQ,KAAK,QAAQ,MAAM,IAAI,CAAC;;;;;;;;;kBASnC;AACd,UAAQ,KAAK,mBAAmB;CACjC;AAGD,KAAI,cAAc;AAEhB,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;sBAcb,QAAQ,KAAK;;;;;;;;;;oCAUC;AAChC,UAAQ,KAAK,gBAAgB;CAC9B,OAAM;AAEL,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;kBAUjB;AACd,UAAQ,KAAK,gBAAgB;CAC9B;AAGD,KAAI,WAAW;AACb,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;kBAcjB;AACd,UAAQ,KAAK,mBAAmB;CACjC;CAGD,IAAI,iBAAiB;;;EAGrB,SAAS,KAAK,OAAO,CAAC;;AAGtB,KAAI,QAAQ,SAAS,EACnB,mBAAkB;;EAEpB,QAAQ,KAAK,KAAK,CAAC;;AAInB,QAAO,CACL;EACE,MAAM;EACN,SAAS;CACV,CACF;AACF"}
1
+ {"version":3,"file":"docker-31GNwU3F.mjs","names":["options: TemplateOptions","template: TemplateConfig","services: string[]","volumes: string[]"],"sources":["../src/init/generators/docker.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate docker-compose.yml based on template and options\n */\nexport function generateDockerFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n const services: string[] = [];\n const volumes: string[] = [];\n\n // PostgreSQL database\n if (database) {\n services.push(` postgres:\n image: postgres:16-alpine\n container_name: ${options.name}-postgres\n restart: unless-stopped\n environment:\n POSTGRES_USER: postgres\n POSTGRES_PASSWORD: postgres\n POSTGRES_DB: ${options.name.replace(/-/g, '_')}_dev\n ports:\n - '5432:5432'\n volumes:\n - postgres_data:/var/lib/postgresql/data\n healthcheck:\n test: ['CMD-SHELL', 'pg_isready -U postgres']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' postgres_data:');\n }\n\n // Redis - different setup for serverless vs standard\n if (isServerless) {\n // Use serverless-redis-http for Lambda compatibility\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5\n\n serverless-redis:\n image: hiett/serverless-redis-http:latest\n container_name: ${options.name}-serverless-redis\n restart: unless-stopped\n ports:\n - '8079:80'\n environment:\n SRH_MODE: env\n SRH_TOKEN: local_dev_token\n SRH_CONNECTION_STRING: redis://redis:6379\n depends_on:\n redis:\n condition: service_healthy`);\n volumes.push(' redis_data:');\n } else {\n // Standard Redis for non-serverless templates\n services.push(` redis:\n image: redis:7-alpine\n container_name: ${options.name}-redis\n restart: unless-stopped\n ports:\n - '6379:6379'\n volumes:\n - redis_data:/data\n healthcheck:\n test: ['CMD', 'redis-cli', 'ping']\n interval: 5s\n timeout: 5s\n retries: 5`);\n volumes.push(' redis_data:');\n }\n\n // RabbitMQ for worker template\n if (hasWorker) {\n services.push(` rabbitmq:\n image: rabbitmq:3-management-alpine\n container_name: ${options.name}-rabbitmq\n restart: unless-stopped\n ports:\n - '5672:5672'\n - '15672:15672'\n environment:\n RABBITMQ_DEFAULT_USER: guest\n RABBITMQ_DEFAULT_PASS: guest\n volumes:\n - rabbitmq_data:/var/lib/rabbitmq\n healthcheck:\n test: ['CMD', 'rabbitmq-diagnostics', 'check_running']\n interval: 10s\n timeout: 5s\n retries: 5`);\n volumes.push(' rabbitmq_data:');\n }\n\n // Build docker-compose.yml\n let dockerCompose = `version: '3.8'\n\nservices:\n${services.join('\\n\\n')}\n`;\n\n if (volumes.length > 0) {\n dockerCompose += `\nvolumes:\n${volumes.join('\\n')}\n`;\n }\n\n return [\n {\n path: 'docker-compose.yml',\n content: dockerCompose,\n },\n ];\n}\n"],"mappings":";;;;AASA,SAAgB,oBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAMC,WAAqB,CAAE;CAC7B,MAAMC,UAAoB,CAAE;AAG5B,KAAI,UAAU;AACZ,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;qBAKd,QAAQ,KAAK,QAAQ,MAAM,IAAI,CAAC;;;;;;;;;kBASnC;AACd,UAAQ,KAAK,mBAAmB;CACjC;AAGD,KAAI,cAAc;AAEhB,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;sBAcb,QAAQ,KAAK;;;;;;;;;;oCAUC;AAChC,UAAQ,KAAK,gBAAgB;CAC9B,OAAM;AAEL,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;kBAUjB;AACd,UAAQ,KAAK,gBAAgB;CAC9B;AAGD,KAAI,WAAW;AACb,WAAS,MAAM;;sBAEG,QAAQ,KAAK;;;;;;;;;;;;;;kBAcjB;AACd,UAAQ,KAAK,mBAAmB;CACjC;CAGD,IAAI,iBAAiB;;;EAGrB,SAAS,KAAK,OAAO,CAAC;;AAGtB,KAAI,QAAQ,SAAS,EACnB,mBAAkB;;EAEpB,QAAQ,KAAK,KAAK,CAAC;;AAInB,QAAO,CACL;EACE,MAAM;EACN,SAAS;CACV,CACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { GeneratedFile, TemplateConfig, TemplateOptions } from "./index-DrzN4xkQ.cjs";
1
+ import { GeneratedFile, TemplateConfig, TemplateOptions } from "./index-DZgrOOOW.mjs";
2
2
 
3
3
  //#region src/init/generators/env.d.ts
4
4
 
@@ -8,4 +8,4 @@ import { GeneratedFile, TemplateConfig, TemplateOptions } from "./index-DrzN4xkQ
8
8
  declare function generateEnvFiles(options: TemplateOptions, template: TemplateConfig): GeneratedFile[];
9
9
  //#endregion
10
10
  export { generateEnvFiles };
11
- //# sourceMappingURL=env-HfuJRlg5.d.cts.map
11
+ //# sourceMappingURL=env-CQ3hXAAW.d.mts.map
@@ -141,4 +141,4 @@ Object.defineProperty(exports, 'generateEnvFiles', {
141
141
  return generateEnvFiles;
142
142
  }
143
143
  });
144
- //# sourceMappingURL=env-B-OKjgI4.cjs.map
144
+ //# sourceMappingURL=env-CS0jvg7k.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-B-OKjgI4.cjs","names":["options: TemplateOptions","template: TemplateConfig","files: GeneratedFile[]"],"sources":["../src/init/generators/env.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate environment files (.env, .env.example, .env.development, .env.test, .gitignore)\n */\nexport function generateEnvFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n // Build base env content\n let baseEnv = `# Application\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=info\n`;\n\n if (isServerless) {\n baseEnv = `# AWS\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=info\n`;\n }\n\n if (database) {\n baseEnv += `\n# Database\nDATABASE_URL=postgresql://user:password@localhost:5432/mydb\n`;\n }\n\n if (hasWorker) {\n baseEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n baseEnv += `\n# Authentication\nJWT_SECRET=your-secret-key-change-in-production\n`;\n\n // Development env\n let devEnv = `# Development Environment\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=debug\n`;\n\n if (isServerless) {\n devEnv = `# Development Environment\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=debug\n`;\n }\n\n if (database) {\n devEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_dev\n`;\n }\n\n if (hasWorker) {\n devEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n devEnv += `\n# Authentication\nJWT_SECRET=dev-secret-not-for-production\n`;\n\n // Test env\n let testEnv = `# Test Environment\nNODE_ENV=test\nPORT=3001\nLOG_LEVEL=error\n`;\n\n if (isServerless) {\n testEnv = `# Test Environment\nSTAGE=test\nAWS_REGION=us-east-1\nLOG_LEVEL=error\n`;\n }\n\n if (database) {\n testEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_test\n`;\n }\n\n if (hasWorker) {\n testEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n testEnv += `\n# Authentication\nJWT_SECRET=test-secret-not-for-production\n`;\n\n const files: GeneratedFile[] = [\n {\n path: '.env.example',\n content: baseEnv,\n },\n {\n path: '.env',\n content: baseEnv,\n },\n {\n path: '.env.development',\n content: devEnv,\n },\n {\n path: '.env.test',\n content: testEnv,\n },\n ];\n\n // Only add .gitignore for non-monorepo (monorepo has it at root)\n if (!options.monorepo) {\n const gitignore = `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n.gkm/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\npnpm-debug.log*\n\n# Test coverage\ncoverage/\n\n# TypeScript cache\n*.tsbuildinfo\n`;\n files.push({\n path: '.gitignore',\n content: gitignore,\n });\n }\n\n return files;\n}\n"],"mappings":";;;;;AASA,SAAgB,iBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAGpC,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAMZ,IAAI,UAAU;;;;;AAMd,KAAI,aACF,WAAU;;;;;AAOZ,KAAI,SACF,YAAW;;;;AAMb,KAAI,UACF,YAAW;;;;AAMb,YAAW;;;;CAMX,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAKZ,MAAMC,QAAyB;EAC7B;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;CACF;AAGD,MAAK,QAAQ,UAAU;EACrB,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCnB,QAAM,KAAK;GACT,MAAM;GACN,SAAS;EACV,EAAC;CACH;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"env-CS0jvg7k.cjs","names":["options: TemplateOptions","template: TemplateConfig","files: GeneratedFile[]"],"sources":["../src/init/generators/env.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate environment files (.env, .env.example, .env.development, .env.test, .gitignore)\n */\nexport function generateEnvFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n // Build base env content\n let baseEnv = `# Application\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=info\n`;\n\n if (isServerless) {\n baseEnv = `# AWS\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=info\n`;\n }\n\n if (database) {\n baseEnv += `\n# Database\nDATABASE_URL=postgresql://user:password@localhost:5432/mydb\n`;\n }\n\n if (hasWorker) {\n baseEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n baseEnv += `\n# Authentication\nJWT_SECRET=your-secret-key-change-in-production\n`;\n\n // Development env\n let devEnv = `# Development Environment\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=debug\n`;\n\n if (isServerless) {\n devEnv = `# Development Environment\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=debug\n`;\n }\n\n if (database) {\n devEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_dev\n`;\n }\n\n if (hasWorker) {\n devEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n devEnv += `\n# Authentication\nJWT_SECRET=dev-secret-not-for-production\n`;\n\n // Test env\n let testEnv = `# Test Environment\nNODE_ENV=test\nPORT=3001\nLOG_LEVEL=error\n`;\n\n if (isServerless) {\n testEnv = `# Test Environment\nSTAGE=test\nAWS_REGION=us-east-1\nLOG_LEVEL=error\n`;\n }\n\n if (database) {\n testEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_test\n`;\n }\n\n if (hasWorker) {\n testEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n testEnv += `\n# Authentication\nJWT_SECRET=test-secret-not-for-production\n`;\n\n const files: GeneratedFile[] = [\n {\n path: '.env.example',\n content: baseEnv,\n },\n {\n path: '.env',\n content: baseEnv,\n },\n {\n path: '.env.development',\n content: devEnv,\n },\n {\n path: '.env.test',\n content: testEnv,\n },\n ];\n\n // Only add .gitignore for non-monorepo (monorepo has it at root)\n if (!options.monorepo) {\n const gitignore = `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n.gkm/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\npnpm-debug.log*\n\n# Test coverage\ncoverage/\n\n# TypeScript cache\n*.tsbuildinfo\n`;\n files.push({\n path: '.gitignore',\n content: gitignore,\n });\n }\n\n return files;\n}\n"],"mappings":";;;;;AASA,SAAgB,iBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAGpC,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAMZ,IAAI,UAAU;;;;;AAMd,KAAI,aACF,WAAU;;;;;AAOZ,KAAI,SACF,YAAW;;;;AAMb,KAAI,UACF,YAAW;;;;AAMb,YAAW;;;;CAMX,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAKZ,MAAMC,QAAyB;EAC7B;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;CACF;AAGD,MAAK,QAAQ,UAAU;EACrB,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCnB,QAAM,KAAK;GACT,MAAM;GACN,SAAS;EACV,EAAC;CACH;AAED,QAAO;AACR"}
@@ -1,4 +1,4 @@
1
- import { GeneratedFile, TemplateConfig, TemplateOptions } from "./index-C523No_B.mjs";
1
+ import { GeneratedFile, TemplateConfig, TemplateOptions } from "./index-DG6xNQMH.cjs";
2
2
 
3
3
  //#region src/init/generators/env.d.ts
4
4
 
@@ -8,4 +8,4 @@ import { GeneratedFile, TemplateConfig, TemplateOptions } from "./index-C523No_B
8
8
  declare function generateEnvFiles(options: TemplateOptions, template: TemplateConfig): GeneratedFile[];
9
9
  //#endregion
10
10
  export { generateEnvFiles };
11
- //# sourceMappingURL=env-nd-iQPYM.d.mts.map
11
+ //# sourceMappingURL=env-D4YFgMqo.d.cts.map
@@ -135,4 +135,4 @@ coverage/
135
135
 
136
136
  //#endregion
137
137
  export { generateEnvFiles };
138
- //# sourceMappingURL=env-tv1HlZlw.mjs.map
138
+ //# sourceMappingURL=env-DEeVOvVu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-tv1HlZlw.mjs","names":["options: TemplateOptions","template: TemplateConfig","files: GeneratedFile[]"],"sources":["../src/init/generators/env.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate environment files (.env, .env.example, .env.development, .env.test, .gitignore)\n */\nexport function generateEnvFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n // Build base env content\n let baseEnv = `# Application\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=info\n`;\n\n if (isServerless) {\n baseEnv = `# AWS\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=info\n`;\n }\n\n if (database) {\n baseEnv += `\n# Database\nDATABASE_URL=postgresql://user:password@localhost:5432/mydb\n`;\n }\n\n if (hasWorker) {\n baseEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n baseEnv += `\n# Authentication\nJWT_SECRET=your-secret-key-change-in-production\n`;\n\n // Development env\n let devEnv = `# Development Environment\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=debug\n`;\n\n if (isServerless) {\n devEnv = `# Development Environment\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=debug\n`;\n }\n\n if (database) {\n devEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_dev\n`;\n }\n\n if (hasWorker) {\n devEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n devEnv += `\n# Authentication\nJWT_SECRET=dev-secret-not-for-production\n`;\n\n // Test env\n let testEnv = `# Test Environment\nNODE_ENV=test\nPORT=3001\nLOG_LEVEL=error\n`;\n\n if (isServerless) {\n testEnv = `# Test Environment\nSTAGE=test\nAWS_REGION=us-east-1\nLOG_LEVEL=error\n`;\n }\n\n if (database) {\n testEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_test\n`;\n }\n\n if (hasWorker) {\n testEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n testEnv += `\n# Authentication\nJWT_SECRET=test-secret-not-for-production\n`;\n\n const files: GeneratedFile[] = [\n {\n path: '.env.example',\n content: baseEnv,\n },\n {\n path: '.env',\n content: baseEnv,\n },\n {\n path: '.env.development',\n content: devEnv,\n },\n {\n path: '.env.test',\n content: testEnv,\n },\n ];\n\n // Only add .gitignore for non-monorepo (monorepo has it at root)\n if (!options.monorepo) {\n const gitignore = `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n.gkm/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\npnpm-debug.log*\n\n# Test coverage\ncoverage/\n\n# TypeScript cache\n*.tsbuildinfo\n`;\n files.push({\n path: '.gitignore',\n content: gitignore,\n });\n }\n\n return files;\n}\n"],"mappings":";;;;AASA,SAAgB,iBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAGpC,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAMZ,IAAI,UAAU;;;;;AAMd,KAAI,aACF,WAAU;;;;;AAOZ,KAAI,SACF,YAAW;;;;AAMb,KAAI,UACF,YAAW;;;;AAMb,YAAW;;;;CAMX,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAKZ,MAAMC,QAAyB;EAC7B;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;CACF;AAGD,MAAK,QAAQ,UAAU;EACrB,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCnB,QAAM,KAAK;GACT,MAAM;GACN,SAAS;EACV,EAAC;CACH;AAED,QAAO;AACR"}
1
+ {"version":3,"file":"env-DEeVOvVu.mjs","names":["options: TemplateOptions","template: TemplateConfig","files: GeneratedFile[]"],"sources":["../src/init/generators/env.ts"],"sourcesContent":["import type {\n GeneratedFile,\n TemplateConfig,\n TemplateOptions,\n} from '../templates/index.js';\n\n/**\n * Generate environment files (.env, .env.example, .env.development, .env.test, .gitignore)\n */\nexport function generateEnvFiles(\n options: TemplateOptions,\n template: TemplateConfig,\n): GeneratedFile[] {\n const { database } = options;\n const isServerless = template.name === 'serverless';\n const hasWorker = template.name === 'worker';\n\n // Build base env content\n let baseEnv = `# Application\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=info\n`;\n\n if (isServerless) {\n baseEnv = `# AWS\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=info\n`;\n }\n\n if (database) {\n baseEnv += `\n# Database\nDATABASE_URL=postgresql://user:password@localhost:5432/mydb\n`;\n }\n\n if (hasWorker) {\n baseEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n baseEnv += `\n# Authentication\nJWT_SECRET=your-secret-key-change-in-production\n`;\n\n // Development env\n let devEnv = `# Development Environment\nNODE_ENV=development\nPORT=3000\nLOG_LEVEL=debug\n`;\n\n if (isServerless) {\n devEnv = `# Development Environment\nSTAGE=dev\nAWS_REGION=us-east-1\nLOG_LEVEL=debug\n`;\n }\n\n if (database) {\n devEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_dev\n`;\n }\n\n if (hasWorker) {\n devEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n devEnv += `\n# Authentication\nJWT_SECRET=dev-secret-not-for-production\n`;\n\n // Test env\n let testEnv = `# Test Environment\nNODE_ENV=test\nPORT=3001\nLOG_LEVEL=error\n`;\n\n if (isServerless) {\n testEnv = `# Test Environment\nSTAGE=test\nAWS_REGION=us-east-1\nLOG_LEVEL=error\n`;\n }\n\n if (database) {\n testEnv += `\n# Database\nDATABASE_URL=postgresql://postgres:postgres@localhost:5432/mydb_test\n`;\n }\n\n if (hasWorker) {\n testEnv += `\n# Message Queue\nRABBITMQ_URL=amqp://localhost:5672\n`;\n }\n\n testEnv += `\n# Authentication\nJWT_SECRET=test-secret-not-for-production\n`;\n\n const files: GeneratedFile[] = [\n {\n path: '.env.example',\n content: baseEnv,\n },\n {\n path: '.env',\n content: baseEnv,\n },\n {\n path: '.env.development',\n content: devEnv,\n },\n {\n path: '.env.test',\n content: testEnv,\n },\n ];\n\n // Only add .gitignore for non-monorepo (monorepo has it at root)\n if (!options.monorepo) {\n const gitignore = `# Dependencies\nnode_modules/\n\n# Build output\ndist/\n.gkm/\n\n# Environment\n.env\n.env.local\n.env.*.local\n\n# IDE\n.idea/\n.vscode/\n*.swp\n*.swo\n\n# OS\n.DS_Store\nThumbs.db\n\n# Logs\n*.log\nnpm-debug.log*\nyarn-debug.log*\npnpm-debug.log*\n\n# Test coverage\ncoverage/\n\n# TypeScript cache\n*.tsbuildinfo\n`;\n files.push({\n path: '.gitignore',\n content: gitignore,\n });\n }\n\n return files;\n}\n"],"mappings":";;;;AASA,SAAgB,iBACdA,SACAC,UACiB;CACjB,MAAM,EAAE,UAAU,GAAG;CACrB,MAAM,eAAe,SAAS,SAAS;CACvC,MAAM,YAAY,SAAS,SAAS;CAGpC,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAMZ,IAAI,UAAU;;;;;AAMd,KAAI,aACF,WAAU;;;;;AAOZ,KAAI,SACF,YAAW;;;;AAMb,KAAI,UACF,YAAW;;;;AAMb,YAAW;;;;CAMX,IAAI,WAAW;;;;;AAMf,KAAI,aACF,YAAW;;;;;AAOb,KAAI,SACF,aAAY;;;;AAMd,KAAI,UACF,aAAY;;;;AAMd,aAAY;;;;CAKZ,MAAMC,QAAyB;EAC7B;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;EACD;GACE,MAAM;GACN,SAAS;EACV;CACF;AAGD,MAAK,QAAQ,UAAU;EACrB,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCnB,QAAM,KAAK;GACT,MAAM;GACN,SAAS;EACV,EAAC;CACH;AAED,QAAO;AACR"}
@@ -1,5 +1,5 @@
1
- import "../types-DB99_qIy.cjs";
2
- import "../types-DLFN49M3.cjs";
3
- import "../Generator-DxQMCQp7.cjs";
4
- import { CronGenerator } from "../CronGenerator-BPTqNYOR.cjs";
1
+ import "../types-KmjzMgu8.cjs";
2
+ import "../types-DA-r8HWZ.cjs";
3
+ import "../Generator-BGY-2dgI.cjs";
4
+ import { CronGenerator } from "../CronGenerator-DWS3CCZt.cjs";
5
5
  export { CronGenerator };
@@ -1,5 +1,5 @@
1
- import "../types-Cxl8-uwV.mjs";
2
- import "../types-C4KITv-y.mjs";
3
- import "../Generator-BjHK_qce.mjs";
4
- import { CronGenerator } from "../CronGenerator-YAj59JUd.mjs";
1
+ import "../types-Bi7VzDUZ.mjs";
2
+ import "../types-D2xYkOal.mjs";
3
+ import "../Generator-yi9DH5TN.mjs";
4
+ import { CronGenerator } from "../CronGenerator-DZjdkEjI.mjs";
5
5
  export { CronGenerator };
@@ -1,5 +1,5 @@
1
- import "../types-DB99_qIy.cjs";
2
- import "../types-DLFN49M3.cjs";
3
- import "../Generator-DxQMCQp7.cjs";
4
- import { EndpointGenerator } from "../EndpointGenerator-ChAD1INz.cjs";
1
+ import "../types-KmjzMgu8.cjs";
2
+ import "../types-DA-r8HWZ.cjs";
3
+ import "../Generator-BGY-2dgI.cjs";
4
+ import { EndpointGenerator } from "../EndpointGenerator-zBsie_7s.cjs";
5
5
  export { EndpointGenerator };
@@ -1,5 +1,5 @@
1
- import "../types-Cxl8-uwV.mjs";
2
- import "../types-C4KITv-y.mjs";
3
- import "../Generator-BjHK_qce.mjs";
4
- import { EndpointGenerator } from "../EndpointGenerator-Cj3O1U8-.mjs";
1
+ import "../types-Bi7VzDUZ.mjs";
2
+ import "../types-D2xYkOal.mjs";
3
+ import "../Generator-yi9DH5TN.mjs";
4
+ import { EndpointGenerator } from "../EndpointGenerator-Dh7kMtuL.mjs";
5
5
  export { EndpointGenerator };
@@ -1,5 +1,5 @@
1
- import "../types-DB99_qIy.cjs";
2
- import "../types-DLFN49M3.cjs";
3
- import "../Generator-DxQMCQp7.cjs";
4
- import { FunctionGenerator } from "../FunctionGenerator-429-9NER.cjs";
1
+ import "../types-KmjzMgu8.cjs";
2
+ import "../types-DA-r8HWZ.cjs";
3
+ import "../Generator-BGY-2dgI.cjs";
4
+ import { FunctionGenerator } from "../FunctionGenerator-DXjXBxUd.cjs";
5
5
  export { FunctionGenerator };
@@ -1,5 +1,5 @@
1
- import "../types-Cxl8-uwV.mjs";
2
- import "../types-C4KITv-y.mjs";
3
- import "../Generator-BjHK_qce.mjs";
4
- import { FunctionGenerator } from "../FunctionGenerator-BQ4ehoID.mjs";
1
+ import "../types-Bi7VzDUZ.mjs";
2
+ import "../types-D2xYkOal.mjs";
3
+ import "../Generator-yi9DH5TN.mjs";
4
+ import { FunctionGenerator } from "../FunctionGenerator-BmDHo27U.mjs";
5
5
  export { FunctionGenerator };
@@ -1,4 +1,4 @@
1
- import "../types-DB99_qIy.cjs";
2
- import "../types-DLFN49M3.cjs";
3
- import { ConstructGenerator, GeneratedConstruct, GeneratorOptions } from "../Generator-DxQMCQp7.cjs";
1
+ import "../types-KmjzMgu8.cjs";
2
+ import "../types-DA-r8HWZ.cjs";
3
+ import { ConstructGenerator, GeneratedConstruct, GeneratorOptions } from "../Generator-BGY-2dgI.cjs";
4
4
  export { ConstructGenerator, GeneratedConstruct, GeneratorOptions };
@@ -1,4 +1,4 @@
1
- import "../types-Cxl8-uwV.mjs";
2
- import "../types-C4KITv-y.mjs";
3
- import { ConstructGenerator, GeneratedConstruct, GeneratorOptions } from "../Generator-BjHK_qce.mjs";
1
+ import "../types-Bi7VzDUZ.mjs";
2
+ import "../types-D2xYkOal.mjs";
3
+ import { ConstructGenerator, GeneratedConstruct, GeneratorOptions } from "../Generator-yi9DH5TN.mjs";
4
4
  export { ConstructGenerator, GeneratedConstruct, GeneratorOptions };
@@ -1,3 +1,3 @@
1
- const require_OpenApiTsGenerator = require('../OpenApiTsGenerator-Be-sKGTT.cjs');
1
+ const require_OpenApiTsGenerator = require('../OpenApiTsGenerator-wLwpaq_I.cjs');
2
2
 
3
3
  exports.OpenApiTsGenerator = require_OpenApiTsGenerator.OpenApiTsGenerator;
@@ -1,3 +1,3 @@
1
- import { OpenApiTsGenerator } from "../OpenApiTsGenerator-C4mHHaku.mjs";
1
+ import { OpenApiTsGenerator } from "../OpenApiTsGenerator-0ZDYWro5.mjs";
2
2
 
3
3
  export { OpenApiTsGenerator };
@@ -1,5 +1,5 @@
1
- import "../types-DB99_qIy.cjs";
2
- import "../types-DLFN49M3.cjs";
3
- import "../Generator-DxQMCQp7.cjs";
4
- import { SubscriberGenerator } from "../SubscriberGenerator-Dtb3HS4i.cjs";
1
+ import "../types-KmjzMgu8.cjs";
2
+ import "../types-DA-r8HWZ.cjs";
3
+ import "../Generator-BGY-2dgI.cjs";
4
+ import { SubscriberGenerator } from "../SubscriberGenerator-Bb-z3Kvx.cjs";
5
5
  export { SubscriberGenerator };
@@ -1,5 +1,5 @@
1
- import "../types-Cxl8-uwV.mjs";
2
- import "../types-C4KITv-y.mjs";
3
- import "../Generator-BjHK_qce.mjs";
4
- import { SubscriberGenerator } from "../SubscriberGenerator-7uX42xyG.mjs";
1
+ import "../types-Bi7VzDUZ.mjs";
2
+ import "../types-D2xYkOal.mjs";
3
+ import "../Generator-yi9DH5TN.mjs";
4
+ import { SubscriberGenerator } from "../SubscriberGenerator-CwsXqCpS.mjs";
5
5
  export { SubscriberGenerator };