@geekmidas/cli 0.6.2 → 0.7.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 (271) hide show
  1. package/dist/config.d.cts +1 -1
  2. package/dist/config.d.mts +1 -1
  3. package/dist/index.cjs +2561 -34
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.mjs +2556 -29
  6. package/dist/index.mjs.map +1 -1
  7. package/dist/openapi-Mwy2_R4W.mjs +957 -0
  8. package/dist/openapi-Mwy2_R4W.mjs.map +1 -0
  9. package/dist/{openapi-react-query-_-B3s8v_.mjs → openapi-react-query-CcciaVu5.mjs} +1 -1
  10. package/dist/{openapi-react-query-_-B3s8v_.mjs.map → openapi-react-query-CcciaVu5.mjs.map} +1 -1
  11. package/dist/{openapi-react-query-Cp-w8_05.cjs → openapi-react-query-o5iMi8tz.cjs} +1 -1
  12. package/dist/{openapi-react-query-Cp-w8_05.cjs.map → openapi-react-query-o5iMi8tz.cjs.map} +1 -1
  13. package/dist/openapi-react-query.cjs +1 -1
  14. package/dist/openapi-react-query.mjs +1 -1
  15. package/dist/openapi-tAIbJJU_.cjs +993 -0
  16. package/dist/openapi-tAIbJJU_.cjs.map +1 -0
  17. package/dist/openapi.cjs +1 -4
  18. package/dist/openapi.d.cts +1 -1
  19. package/dist/openapi.d.mts +1 -1
  20. package/dist/openapi.mjs +1 -4
  21. package/dist/{types-Bi7VzDUZ.d.mts → types-B3TXoj7v.d.mts} +21 -53
  22. package/dist/{types-KmjzMgu8.d.cts → types-C0hwnSjm.d.cts} +21 -53
  23. package/package.json +5 -5
  24. package/src/build/types.ts +13 -0
  25. package/src/dev/index.ts +71 -8
  26. package/src/generators/EndpointGenerator.ts +46 -5
  27. package/src/generators/__tests__/EndpointGenerator.spec.ts +1 -1
  28. package/src/init/generators/config.ts +6 -1
  29. package/src/init/generators/package.ts +5 -1
  30. package/src/init/index.ts +9 -1
  31. package/src/init/templates/api.ts +31 -0
  32. package/src/init/templates/index.ts +1 -0
  33. package/src/init/templates/minimal.ts +83 -0
  34. package/src/types.ts +19 -0
  35. package/tsdown.config.ts +6 -0
  36. package/dist/CronGenerator-CCRYptuT.mjs +0 -55
  37. package/dist/CronGenerator-CCRYptuT.mjs.map +0 -1
  38. package/dist/CronGenerator-D4TWXQbh.cjs +0 -61
  39. package/dist/CronGenerator-D4TWXQbh.cjs.map +0 -1
  40. package/dist/CronGenerator-DWS3CCZt.d.cts +0 -14
  41. package/dist/CronGenerator-DZjdkEjI.d.mts +0 -14
  42. package/dist/EndpointGenerator-DGivkPLT.mjs +0 -335
  43. package/dist/EndpointGenerator-DGivkPLT.mjs.map +0 -1
  44. package/dist/EndpointGenerator-Dh7kMtuL.d.mts +0 -19
  45. package/dist/EndpointGenerator-npWEDoK2.cjs +0 -341
  46. package/dist/EndpointGenerator-npWEDoK2.cjs.map +0 -1
  47. package/dist/EndpointGenerator-zBsie_7s.d.cts +0 -19
  48. package/dist/FunctionGenerator-BmDHo27U.d.mts +0 -14
  49. package/dist/FunctionGenerator-CVk0h8tO.mjs +0 -54
  50. package/dist/FunctionGenerator-CVk0h8tO.mjs.map +0 -1
  51. package/dist/FunctionGenerator-DXjXBxUd.d.cts +0 -14
  52. package/dist/FunctionGenerator-DYTnyr4c.cjs +0 -60
  53. package/dist/FunctionGenerator-DYTnyr4c.cjs.map +0 -1
  54. package/dist/Generator-BGY-2dgI.d.cts +0 -27
  55. package/dist/Generator-CDt4pB3W.mjs +0 -41
  56. package/dist/Generator-CDt4pB3W.mjs.map +0 -1
  57. package/dist/Generator-CLVplqm2.cjs +0 -47
  58. package/dist/Generator-CLVplqm2.cjs.map +0 -1
  59. package/dist/Generator-yi9DH5TN.d.mts +0 -27
  60. package/dist/OpenApiTsGenerator-BVS4pOH7.mjs +0 -495
  61. package/dist/OpenApiTsGenerator-BVS4pOH7.mjs.map +0 -1
  62. package/dist/OpenApiTsGenerator-gPIIyppX.cjs +0 -501
  63. package/dist/OpenApiTsGenerator-gPIIyppX.cjs.map +0 -1
  64. package/dist/SubscriberGenerator-Bb-z3Kvx.d.cts +0 -15
  65. package/dist/SubscriberGenerator-CwsXqCpS.d.mts +0 -15
  66. package/dist/SubscriberGenerator-DABaJXML.mjs +0 -200
  67. package/dist/SubscriberGenerator-DABaJXML.mjs.map +0 -1
  68. package/dist/SubscriberGenerator-D_zpNGFr.cjs +0 -206
  69. package/dist/SubscriberGenerator-D_zpNGFr.cjs.map +0 -1
  70. package/dist/api-Bp5TIl1R.mjs +0 -167
  71. package/dist/api-Bp5TIl1R.mjs.map +0 -1
  72. package/dist/api-D4W9-tdZ.cjs +0 -173
  73. package/dist/api-D4W9-tdZ.cjs.map +0 -1
  74. package/dist/build/index.cjs +0 -15
  75. package/dist/build/index.d.cts +0 -7
  76. package/dist/build/index.d.mts +0 -7
  77. package/dist/build/index.mjs +0 -15
  78. package/dist/build/manifests.cjs +0 -4
  79. package/dist/build/manifests.d.cts +0 -13
  80. package/dist/build/manifests.d.mts +0 -13
  81. package/dist/build/manifests.mjs +0 -3
  82. package/dist/build/providerResolver.cjs +0 -5
  83. package/dist/build/providerResolver.d.cts +0 -23
  84. package/dist/build/providerResolver.d.mts +0 -23
  85. package/dist/build/providerResolver.mjs +0 -3
  86. package/dist/build/types.cjs +0 -0
  87. package/dist/build/types.d.cts +0 -3
  88. package/dist/build/types.d.mts +0 -3
  89. package/dist/build/types.mjs +0 -0
  90. package/dist/build-Cu6Mi0Lf.mjs +0 -87
  91. package/dist/build-Cu6Mi0Lf.mjs.map +0 -1
  92. package/dist/build-wmt8ZcmA.cjs +0 -93
  93. package/dist/build-wmt8ZcmA.cjs.map +0 -1
  94. package/dist/config-BP1IZynR.cjs +0 -168
  95. package/dist/config-BP1IZynR.cjs.map +0 -1
  96. package/dist/config-CIzRhm_D.d.mts +0 -11
  97. package/dist/config-CvehIYsb.d.cts +0 -11
  98. package/dist/config-UCK12Lrr.mjs +0 -162
  99. package/dist/config-UCK12Lrr.mjs.map +0 -1
  100. package/dist/dev/index.cjs +0 -17
  101. package/dist/dev/index.d.cts +0 -36
  102. package/dist/dev/index.d.mts +0 -36
  103. package/dist/dev/index.mjs +0 -13
  104. package/dist/dev-BBPWSllq.mjs +0 -348
  105. package/dist/dev-BBPWSllq.mjs.map +0 -1
  106. package/dist/dev-C2lCgE53.cjs +0 -378
  107. package/dist/dev-C2lCgE53.cjs.map +0 -1
  108. package/dist/docker-2-ipZDOJ.cjs +0 -119
  109. package/dist/docker-2-ipZDOJ.cjs.map +0 -1
  110. package/dist/docker-31GNwU3F.mjs +0 -113
  111. package/dist/docker-31GNwU3F.mjs.map +0 -1
  112. package/dist/env-CQ3hXAAW.d.mts +0 -11
  113. package/dist/env-CS0jvg7k.cjs +0 -144
  114. package/dist/env-CS0jvg7k.cjs.map +0 -1
  115. package/dist/env-D4YFgMqo.d.cts +0 -11
  116. package/dist/env-DEeVOvVu.mjs +0 -138
  117. package/dist/env-DEeVOvVu.mjs.map +0 -1
  118. package/dist/generators/CronGenerator.cjs +0 -4
  119. package/dist/generators/CronGenerator.d.cts +0 -5
  120. package/dist/generators/CronGenerator.d.mts +0 -5
  121. package/dist/generators/CronGenerator.mjs +0 -4
  122. package/dist/generators/EndpointGenerator.cjs +0 -4
  123. package/dist/generators/EndpointGenerator.d.cts +0 -5
  124. package/dist/generators/EndpointGenerator.d.mts +0 -5
  125. package/dist/generators/EndpointGenerator.mjs +0 -4
  126. package/dist/generators/FunctionGenerator.cjs +0 -4
  127. package/dist/generators/FunctionGenerator.d.cts +0 -5
  128. package/dist/generators/FunctionGenerator.d.mts +0 -5
  129. package/dist/generators/FunctionGenerator.mjs +0 -4
  130. package/dist/generators/Generator.cjs +0 -3
  131. package/dist/generators/Generator.d.cts +0 -4
  132. package/dist/generators/Generator.d.mts +0 -4
  133. package/dist/generators/Generator.mjs +0 -3
  134. package/dist/generators/OpenApiTsGenerator.cjs +0 -3
  135. package/dist/generators/OpenApiTsGenerator.d.cts +0 -44
  136. package/dist/generators/OpenApiTsGenerator.d.mts +0 -44
  137. package/dist/generators/OpenApiTsGenerator.mjs +0 -3
  138. package/dist/generators/SubscriberGenerator.cjs +0 -4
  139. package/dist/generators/SubscriberGenerator.d.cts +0 -5
  140. package/dist/generators/SubscriberGenerator.d.mts +0 -5
  141. package/dist/generators/SubscriberGenerator.mjs +0 -4
  142. package/dist/generators/index.cjs +0 -12
  143. package/dist/generators/index.d.cts +0 -8
  144. package/dist/generators/index.d.mts +0 -8
  145. package/dist/generators/index.mjs +0 -8
  146. package/dist/generators-3IemvCLk.cjs +0 -0
  147. package/dist/generators-FNpdfN6J.mjs +0 -0
  148. package/dist/index-DG6xNQMH.d.cts +0 -81
  149. package/dist/index-DZgrOOOW.d.mts +0 -81
  150. package/dist/init/generators/config.cjs +0 -3
  151. package/dist/init/generators/config.d.cts +0 -3
  152. package/dist/init/generators/config.d.mts +0 -3
  153. package/dist/init/generators/config.mjs +0 -3
  154. package/dist/init/generators/docker.cjs +0 -3
  155. package/dist/init/generators/docker.d.cts +0 -11
  156. package/dist/init/generators/docker.d.mts +0 -11
  157. package/dist/init/generators/docker.mjs +0 -3
  158. package/dist/init/generators/env.cjs +0 -3
  159. package/dist/init/generators/env.d.cts +0 -3
  160. package/dist/init/generators/env.d.mts +0 -3
  161. package/dist/init/generators/env.mjs +0 -3
  162. package/dist/init/generators/index.cjs +0 -14
  163. package/dist/init/generators/index.d.cts +0 -6
  164. package/dist/init/generators/index.d.mts +0 -6
  165. package/dist/init/generators/index.mjs +0 -11
  166. package/dist/init/generators/models.cjs +0 -3
  167. package/dist/init/generators/models.d.cts +0 -11
  168. package/dist/init/generators/models.d.mts +0 -11
  169. package/dist/init/generators/models.mjs +0 -3
  170. package/dist/init/generators/monorepo.cjs +0 -3
  171. package/dist/init/generators/monorepo.d.cts +0 -11
  172. package/dist/init/generators/monorepo.d.mts +0 -11
  173. package/dist/init/generators/monorepo.mjs +0 -3
  174. package/dist/init/generators/package.cjs +0 -8
  175. package/dist/init/generators/package.d.cts +0 -3
  176. package/dist/init/generators/package.d.mts +0 -3
  177. package/dist/init/generators/package.mjs +0 -8
  178. package/dist/init/generators/source.cjs +0 -3
  179. package/dist/init/generators/source.d.cts +0 -3
  180. package/dist/init/generators/source.d.mts +0 -3
  181. package/dist/init/generators/source.mjs +0 -3
  182. package/dist/init/index.cjs +0 -16
  183. package/dist/init/index.d.cts +0 -17
  184. package/dist/init/index.d.mts +0 -17
  185. package/dist/init/index.mjs +0 -16
  186. package/dist/init/templates/api.cjs +0 -3
  187. package/dist/init/templates/api.d.cts +0 -7
  188. package/dist/init/templates/api.d.mts +0 -7
  189. package/dist/init/templates/api.mjs +0 -3
  190. package/dist/init/templates/index.cjs +0 -12
  191. package/dist/init/templates/index.d.cts +0 -2
  192. package/dist/init/templates/index.d.mts +0 -2
  193. package/dist/init/templates/index.mjs +0 -7
  194. package/dist/init/templates/minimal.cjs +0 -3
  195. package/dist/init/templates/minimal.d.cts +0 -7
  196. package/dist/init/templates/minimal.d.mts +0 -7
  197. package/dist/init/templates/minimal.mjs +0 -3
  198. package/dist/init/templates/serverless.cjs +0 -3
  199. package/dist/init/templates/serverless.d.cts +0 -7
  200. package/dist/init/templates/serverless.d.mts +0 -7
  201. package/dist/init/templates/serverless.mjs +0 -3
  202. package/dist/init/templates/worker.cjs +0 -3
  203. package/dist/init/templates/worker.d.cts +0 -7
  204. package/dist/init/templates/worker.d.mts +0 -7
  205. package/dist/init/templates/worker.mjs +0 -3
  206. package/dist/init/utils.cjs +0 -7
  207. package/dist/init/utils.d.cts +0 -25
  208. package/dist/init/utils.d.mts +0 -25
  209. package/dist/init/utils.mjs +0 -3
  210. package/dist/init-BMA7xi8r.mjs +0 -161
  211. package/dist/init-BMA7xi8r.mjs.map +0 -1
  212. package/dist/init-D-7WEk-b.cjs +0 -167
  213. package/dist/init-D-7WEk-b.cjs.map +0 -1
  214. package/dist/manifests-BNKG6AXf.mjs +0 -68
  215. package/dist/manifests-BNKG6AXf.mjs.map +0 -1
  216. package/dist/manifests-D13Ej8AE.cjs +0 -80
  217. package/dist/manifests-D13Ej8AE.cjs.map +0 -1
  218. package/dist/minimal-BkyASH_C.mjs +0 -93
  219. package/dist/minimal-BkyASH_C.mjs.map +0 -1
  220. package/dist/minimal-CSFggzdH.cjs +0 -99
  221. package/dist/minimal-CSFggzdH.cjs.map +0 -1
  222. package/dist/models-BWlDfviw.mjs +0 -115
  223. package/dist/models-BWlDfviw.mjs.map +0 -1
  224. package/dist/models-BapGSoHC.cjs +0 -121
  225. package/dist/models-BapGSoHC.cjs.map +0 -1
  226. package/dist/monorepo-BBOWhkcd.mjs +0 -184
  227. package/dist/monorepo-BBOWhkcd.mjs.map +0 -1
  228. package/dist/monorepo-CFtxHeDh.cjs +0 -190
  229. package/dist/monorepo-CFtxHeDh.cjs.map +0 -1
  230. package/dist/openapi-DA9RkPJl.mjs +0 -74
  231. package/dist/openapi-DA9RkPJl.mjs.map +0 -1
  232. package/dist/openapi-DZH6RQHk.cjs +0 -98
  233. package/dist/openapi-DZH6RQHk.cjs.map +0 -1
  234. package/dist/package-6h-7QfJZ.d.cts +0 -11
  235. package/dist/package-BCe_KvGv.d.mts +0 -11
  236. package/dist/package-C3If80n1.mjs +0 -57
  237. package/dist/package-C3If80n1.mjs.map +0 -1
  238. package/dist/package-Dk8IMBOB.cjs +0 -62
  239. package/dist/package-Dk8IMBOB.cjs.map +0 -1
  240. package/dist/providerResolver-DEVKngbC.mjs +0 -96
  241. package/dist/providerResolver-DEVKngbC.mjs.map +0 -1
  242. package/dist/providerResolver-DOTbN9jo.cjs +0 -114
  243. package/dist/providerResolver-DOTbN9jo.cjs.map +0 -1
  244. package/dist/serverless-AGOS-l3G.cjs +0 -119
  245. package/dist/serverless-AGOS-l3G.cjs.map +0 -1
  246. package/dist/serverless-D5HjJByU.mjs +0 -113
  247. package/dist/serverless-D5HjJByU.mjs.map +0 -1
  248. package/dist/source-C1cyfHcF.cjs +0 -17
  249. package/dist/source-C1cyfHcF.cjs.map +0 -1
  250. package/dist/source-C3LiNUV9.d.mts +0 -11
  251. package/dist/source-CkQHBpwu.mjs +0 -11
  252. package/dist/source-CkQHBpwu.mjs.map +0 -1
  253. package/dist/source-Dtcjbokc.d.cts +0 -11
  254. package/dist/templates-C0EMmhwb.mjs +0 -88
  255. package/dist/templates-C0EMmhwb.mjs.map +0 -1
  256. package/dist/templates-CbgQ9dw0.cjs +0 -123
  257. package/dist/templates-CbgQ9dw0.cjs.map +0 -1
  258. package/dist/types-D2xYkOal.d.mts +0 -51
  259. package/dist/types-DA-r8HWZ.d.cts +0 -51
  260. package/dist/types.cjs +0 -0
  261. package/dist/types.d.cts +0 -2
  262. package/dist/types.d.mts +0 -2
  263. package/dist/types.mjs +0 -0
  264. package/dist/utils-CKEzCxc1.mjs +0 -69
  265. package/dist/utils-CKEzCxc1.mjs.map +0 -1
  266. package/dist/utils-DSdN2MTt.cjs +0 -99
  267. package/dist/utils-DSdN2MTt.cjs.map +0 -1
  268. package/dist/worker-CGhlqNH-.cjs +0 -156
  269. package/dist/worker-CGhlqNH-.cjs.map +0 -1
  270. package/dist/worker-CiP420As.mjs +0 -150
  271. package/dist/worker-CiP420As.mjs.map +0 -1
@@ -1,348 +0,0 @@
1
- import { loadConfig, parseModuleConfig } from "./config-Bq72aj8e.mjs";
2
- import { resolveProviders } from "./providerResolver-DEVKngbC.mjs";
3
- import { CronGenerator } from "./CronGenerator-CCRYptuT.mjs";
4
- import { EndpointGenerator } from "./EndpointGenerator-DGivkPLT.mjs";
5
- import { FunctionGenerator } from "./FunctionGenerator-CVk0h8tO.mjs";
6
- import { SubscriberGenerator } from "./SubscriberGenerator-DABaJXML.mjs";
7
- import { generateOpenApi, resolveOpenApiConfig } from "./openapi-DA9RkPJl.mjs";
8
- import { mkdir } from "node:fs/promises";
9
- import { join, resolve } from "node:path";
10
- import { spawn } from "node:child_process";
11
- import { existsSync } from "node:fs";
12
- import { createServer } from "node:net";
13
- import chokidar from "chokidar";
14
- import { config } from "dotenv";
15
- import fg from "fast-glob";
16
-
17
- //#region src/dev/index.ts
18
- const logger = console;
19
- /**
20
- * Load environment files
21
- * @internal Exported for testing
22
- */
23
- function loadEnvFiles(envConfig, cwd = process.cwd()) {
24
- const loaded = [];
25
- const missing = [];
26
- const envFiles = envConfig ? Array.isArray(envConfig) ? envConfig : [envConfig] : [".env"];
27
- for (const envFile of envFiles) {
28
- const envPath = resolve(cwd, envFile);
29
- if (existsSync(envPath)) {
30
- config({
31
- path: envPath,
32
- override: true,
33
- quiet: true
34
- });
35
- loaded.push(envFile);
36
- } else if (envConfig) missing.push(envFile);
37
- }
38
- return {
39
- loaded,
40
- missing
41
- };
42
- }
43
- /**
44
- * Check if a port is available
45
- * @internal Exported for testing
46
- */
47
- async function isPortAvailable(port) {
48
- return new Promise((resolve$1) => {
49
- const server = createServer();
50
- server.once("error", (err) => {
51
- if (err.code === "EADDRINUSE") resolve$1(false);
52
- else resolve$1(false);
53
- });
54
- server.once("listening", () => {
55
- server.close();
56
- resolve$1(true);
57
- });
58
- server.listen(port);
59
- });
60
- }
61
- /**
62
- * Find an available port starting from the preferred port
63
- * @internal Exported for testing
64
- */
65
- async function findAvailablePort(preferredPort, maxAttempts = 10) {
66
- for (let i = 0; i < maxAttempts; i++) {
67
- const port = preferredPort + i;
68
- if (await isPortAvailable(port)) return port;
69
- logger.log(`⚠️ Port ${port} is in use, trying ${port + 1}...`);
70
- }
71
- throw new Error(`Could not find an available port after trying ${maxAttempts} ports starting from ${preferredPort}`);
72
- }
73
- /**
74
- * Normalize telescope configuration
75
- * @internal Exported for testing
76
- */
77
- function normalizeTelescopeConfig(config$1) {
78
- if (config$1 === false) return void 0;
79
- if (typeof config$1 === "string") {
80
- const { path: telescopePath, importPattern: telescopeImportPattern } = parseModuleConfig(config$1, "telescope");
81
- return {
82
- enabled: true,
83
- telescopePath,
84
- telescopeImportPattern,
85
- path: "/__telescope",
86
- ignore: [],
87
- recordBody: true,
88
- maxEntries: 1e3,
89
- websocket: true
90
- };
91
- }
92
- const isEnabled = config$1 === true || config$1 === void 0 || config$1.enabled !== false;
93
- if (!isEnabled) return void 0;
94
- const telescopeConfig = typeof config$1 === "object" ? config$1 : {};
95
- return {
96
- enabled: true,
97
- path: telescopeConfig.path ?? "/__telescope",
98
- ignore: telescopeConfig.ignore ?? [],
99
- recordBody: telescopeConfig.recordBody ?? true,
100
- maxEntries: telescopeConfig.maxEntries ?? 1e3,
101
- websocket: telescopeConfig.websocket ?? true
102
- };
103
- }
104
- async function devCommand(options) {
105
- const defaultEnv = loadEnvFiles(".env");
106
- if (defaultEnv.loaded.length > 0) logger.log(`📦 Loaded env: ${defaultEnv.loaded.join(", ")}`);
107
- const config$1 = await loadConfig();
108
- if (config$1.env) {
109
- const { loaded, missing } = loadEnvFiles(config$1.env);
110
- if (loaded.length > 0) logger.log(`📦 Loaded env: ${loaded.join(", ")}`);
111
- if (missing.length > 0) logger.warn(`⚠️ Missing env files: ${missing.join(", ")}`);
112
- }
113
- const resolved = resolveProviders(config$1, { provider: "server" });
114
- logger.log("🚀 Starting development server...");
115
- logger.log(`Loading routes from: ${config$1.routes}`);
116
- if (config$1.functions) logger.log(`Loading functions from: ${config$1.functions}`);
117
- if (config$1.crons) logger.log(`Loading crons from: ${config$1.crons}`);
118
- if (config$1.subscribers) logger.log(`Loading subscribers from: ${config$1.subscribers}`);
119
- logger.log(`Using envParser: ${config$1.envParser}`);
120
- const { path: envParserPath, importPattern: envParserImportPattern } = parseModuleConfig(config$1.envParser, "envParser");
121
- const { path: loggerPath, importPattern: loggerImportPattern } = parseModuleConfig(config$1.logger, "logger");
122
- const telescope = normalizeTelescopeConfig(config$1.telescope);
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}`);
126
- const buildContext = {
127
- envParserPath,
128
- envParserImportPattern,
129
- loggerPath,
130
- loggerImportPattern,
131
- telescope
132
- };
133
- await buildServer(config$1, buildContext, resolved.providers[0], resolved.enableOpenApi);
134
- if (openApiConfig.enabled) await generateOpenApi(config$1);
135
- const runtime = config$1.runtime ?? "node";
136
- const devServer = new DevServer(resolved.providers[0], options.port || 3e3, resolved.enableOpenApi, telescope, runtime);
137
- await devServer.start();
138
- const envParserFile = config$1.envParser.split("#")[0];
139
- const loggerFile = config$1.logger.split("#")[0];
140
- const watchPatterns = [
141
- config$1.routes,
142
- ...config$1.functions ? [config$1.functions] : [],
143
- ...config$1.crons ? [config$1.crons] : [],
144
- ...config$1.subscribers ? [config$1.subscribers] : [],
145
- envParserFile.endsWith(".ts") ? envParserFile : `${envParserFile}.ts`,
146
- loggerFile.endsWith(".ts") ? loggerFile : `${loggerFile}.ts`
147
- ].flat();
148
- const normalizedPatterns = watchPatterns.map((p) => p.startsWith("./") ? p.slice(2) : p);
149
- logger.log(`👀 Watching for changes in: ${normalizedPatterns.join(", ")}`);
150
- const resolvedFiles = await fg(normalizedPatterns, {
151
- cwd: process.cwd(),
152
- absolute: false,
153
- onlyFiles: true
154
- });
155
- const dirsToWatch = [...new Set(resolvedFiles.map((f) => f.split("/").slice(0, -1).join("/")))];
156
- logger.log(`📁 Found ${resolvedFiles.length} files in ${dirsToWatch.length} directories`);
157
- const watcher = chokidar.watch([...resolvedFiles, ...dirsToWatch], {
158
- ignored: /(^|[\/\\])\../,
159
- persistent: true,
160
- ignoreInitial: true,
161
- cwd: process.cwd()
162
- });
163
- watcher.on("ready", () => {
164
- logger.log("🔍 File watcher ready");
165
- });
166
- watcher.on("error", (error) => {
167
- logger.error("❌ Watcher error:", error);
168
- });
169
- let rebuildTimeout = null;
170
- watcher.on("change", async (path) => {
171
- logger.log(`📝 File changed: ${path}`);
172
- if (rebuildTimeout) clearTimeout(rebuildTimeout);
173
- rebuildTimeout = setTimeout(async () => {
174
- try {
175
- logger.log("🔄 Rebuilding...");
176
- await buildServer(config$1, buildContext, resolved.providers[0], resolved.enableOpenApi);
177
- if (openApiConfig.enabled) await generateOpenApi(config$1, { silent: true });
178
- logger.log("✅ Rebuild complete, restarting server...");
179
- await devServer.restart();
180
- } catch (error) {
181
- logger.error("❌ Rebuild failed:", error.message);
182
- }
183
- }, 300);
184
- });
185
- const shutdown = async () => {
186
- logger.log("\n🛑 Shutting down...");
187
- await watcher.close();
188
- await devServer.stop();
189
- process.exit(0);
190
- };
191
- process.on("SIGINT", shutdown);
192
- process.on("SIGTERM", shutdown);
193
- }
194
- async function buildServer(config$1, context, provider, enableOpenApi) {
195
- const endpointGenerator = new EndpointGenerator();
196
- const functionGenerator = new FunctionGenerator();
197
- const cronGenerator = new CronGenerator();
198
- const subscriberGenerator = new SubscriberGenerator();
199
- const [allEndpoints, allFunctions, allCrons, allSubscribers] = await Promise.all([
200
- endpointGenerator.load(config$1.routes),
201
- config$1.functions ? functionGenerator.load(config$1.functions) : [],
202
- config$1.crons ? cronGenerator.load(config$1.crons) : [],
203
- config$1.subscribers ? subscriberGenerator.load(config$1.subscribers) : []
204
- ]);
205
- const outputDir = join(process.cwd(), ".gkm", provider);
206
- await mkdir(outputDir, { recursive: true });
207
- await Promise.all([
208
- endpointGenerator.build(context, allEndpoints, outputDir, {
209
- provider,
210
- enableOpenApi
211
- }),
212
- functionGenerator.build(context, allFunctions, outputDir, { provider }),
213
- cronGenerator.build(context, allCrons, outputDir, { provider }),
214
- subscriberGenerator.build(context, allSubscribers, outputDir, { provider })
215
- ]);
216
- }
217
- var DevServer = class {
218
- serverProcess = null;
219
- isRunning = false;
220
- actualPort;
221
- constructor(provider, requestedPort, enableOpenApi, telescope, runtime = "node") {
222
- this.provider = provider;
223
- this.requestedPort = requestedPort;
224
- this.enableOpenApi = enableOpenApi;
225
- this.telescope = telescope;
226
- this.runtime = runtime;
227
- this.actualPort = requestedPort;
228
- }
229
- async start() {
230
- if (this.isRunning) await this.stop();
231
- this.actualPort = await findAvailablePort(this.requestedPort);
232
- if (this.actualPort !== this.requestedPort) logger.log(`ℹ️ Port ${this.requestedPort} was in use, using port ${this.actualPort} instead`);
233
- const serverEntryPath = join(process.cwd(), ".gkm", this.provider, "server.ts");
234
- await this.createServerEntry();
235
- logger.log(`\n✨ Starting server on port ${this.actualPort}...`);
236
- this.serverProcess = spawn("npx", [
237
- "tsx",
238
- serverEntryPath,
239
- "--port",
240
- this.actualPort.toString()
241
- ], {
242
- stdio: "inherit",
243
- env: {
244
- ...process.env,
245
- NODE_ENV: "development"
246
- },
247
- detached: true
248
- });
249
- this.isRunning = true;
250
- this.serverProcess.on("error", (error) => {
251
- logger.error("❌ Server error:", error);
252
- });
253
- this.serverProcess.on("exit", (code, signal) => {
254
- if (code !== null && code !== 0 && signal !== "SIGTERM") logger.error(`❌ Server exited with code ${code}`);
255
- this.isRunning = false;
256
- });
257
- await new Promise((resolve$1) => setTimeout(resolve$1, 1e3));
258
- if (this.isRunning) {
259
- logger.log(`\n🎉 Server running at http://localhost:${this.actualPort}`);
260
- if (this.enableOpenApi) logger.log(`📚 API Docs available at http://localhost:${this.actualPort}/docs`);
261
- if (this.telescope) logger.log(`🔭 Telescope available at http://localhost:${this.actualPort}${this.telescope.path}`);
262
- }
263
- }
264
- async stop() {
265
- if (this.serverProcess && this.isRunning) {
266
- const pid = this.serverProcess.pid;
267
- if (pid) try {
268
- process.kill(-pid, "SIGTERM");
269
- } catch {}
270
- await new Promise((resolve$1) => {
271
- const timeout = setTimeout(() => {
272
- if (pid) try {
273
- process.kill(-pid, "SIGKILL");
274
- } catch {}
275
- resolve$1();
276
- }, 3e3);
277
- this.serverProcess?.on("exit", () => {
278
- clearTimeout(timeout);
279
- resolve$1();
280
- });
281
- });
282
- this.serverProcess = null;
283
- this.isRunning = false;
284
- }
285
- }
286
- async restart() {
287
- const portToReuse = this.actualPort;
288
- await this.stop();
289
- let attempts = 0;
290
- while (attempts < 30) {
291
- if (await isPortAvailable(portToReuse)) break;
292
- await new Promise((resolve$1) => setTimeout(resolve$1, 100));
293
- attempts++;
294
- }
295
- this.requestedPort = portToReuse;
296
- await this.start();
297
- }
298
- async createServerEntry() {
299
- const { writeFile: writeFile$1 } = await import("node:fs/promises");
300
- const { relative: relative$1, dirname: dirname$1 } = await import("node:path");
301
- const serverPath = join(process.cwd(), ".gkm", this.provider, "server.ts");
302
- const relativeAppPath = relative$1(dirname$1(serverPath), join(dirname$1(serverPath), "app.js"));
303
- const serveCode = this.runtime === "bun" ? `Bun.serve({
304
- port,
305
- fetch: app.fetch,
306
- });` : `const { serve } = await import('@hono/node-server');
307
- const server = serve({
308
- fetch: app.fetch,
309
- port,
310
- });
311
- // Inject WebSocket support if available
312
- const injectWs = (app as any).__injectWebSocket;
313
- if (injectWs) {
314
- injectWs(server);
315
- console.log('🔌 Telescope real-time updates enabled');
316
- }`;
317
- const content = `#!/usr/bin/env node
318
- /**
319
- * Development server entry point
320
- * This file is auto-generated by 'gkm dev'
321
- */
322
- import { createApp } from './${relativeAppPath.startsWith(".") ? relativeAppPath : "./" + relativeAppPath}';
323
-
324
- const port = process.argv.includes('--port')
325
- ? Number.parseInt(process.argv[process.argv.indexOf('--port') + 1])
326
- : 3000;
327
-
328
- // createApp is async to support optional WebSocket setup
329
- const { app, start } = await createApp(undefined, ${this.enableOpenApi});
330
-
331
- // Start the server
332
- start({
333
- port,
334
- serve: async (app, port) => {
335
- ${serveCode}
336
- },
337
- }).catch((error) => {
338
- console.error('Failed to start server:', error);
339
- process.exit(1);
340
- });
341
- `;
342
- await writeFile$1(serverPath, content);
343
- }
344
- };
345
-
346
- //#endregion
347
- export { devCommand, findAvailablePort, isPortAvailable, loadEnvFiles, normalizeTelescopeConfig };
348
- //# sourceMappingURL=dev-BBPWSllq.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dev-BBPWSllq.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":"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"}