@geekmidas/cli 0.6.2 → 0.8.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 (274) hide show
  1. package/dist/config.d.cts +1 -1
  2. package/dist/config.d.mts +1 -1
  3. package/dist/index.cjs +2583 -34
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.mjs +2578 -29
  6. package/dist/index.mjs.map +1 -1
  7. package/dist/openapi--vOy9mo4.mjs +978 -0
  8. package/dist/openapi--vOy9mo4.mjs.map +1 -0
  9. package/dist/openapi-CHhTPief.cjs +1014 -0
  10. package/dist/openapi-CHhTPief.cjs.map +1 -0
  11. package/dist/{openapi-react-query-_-B3s8v_.mjs → openapi-react-query-CcciaVu5.mjs} +1 -1
  12. package/dist/{openapi-react-query-_-B3s8v_.mjs.map → openapi-react-query-CcciaVu5.mjs.map} +1 -1
  13. package/dist/{openapi-react-query-Cp-w8_05.cjs → openapi-react-query-o5iMi8tz.cjs} +1 -1
  14. package/dist/{openapi-react-query-Cp-w8_05.cjs.map → openapi-react-query-o5iMi8tz.cjs.map} +1 -1
  15. package/dist/openapi-react-query.cjs +1 -1
  16. package/dist/openapi-react-query.mjs +1 -1
  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-KmjzMgu8.d.cts → types-DXgiA1sF.d.mts} +58 -53
  22. package/dist/{types-Bi7VzDUZ.d.mts → types-b-vwGpqc.d.cts} +58 -53
  23. package/package.json +6 -6
  24. package/src/__tests__/EndpointGenerator.hooks.spec.ts +204 -0
  25. package/src/__tests__/normalizeHooksConfig.spec.ts +63 -0
  26. package/src/build/index.ts +8 -1
  27. package/src/build/types.ts +19 -0
  28. package/src/dev/index.ts +153 -37
  29. package/src/generators/EndpointGenerator.ts +72 -5
  30. package/src/generators/__tests__/EndpointGenerator.spec.ts +1 -1
  31. package/src/init/generators/config.ts +6 -1
  32. package/src/init/generators/package.ts +5 -1
  33. package/src/init/index.ts +9 -1
  34. package/src/init/templates/api.ts +31 -0
  35. package/src/init/templates/index.ts +1 -0
  36. package/src/init/templates/minimal.ts +83 -0
  37. package/src/types.ts +57 -0
  38. package/tsdown.config.ts +6 -0
  39. package/dist/CronGenerator-CCRYptuT.mjs +0 -55
  40. package/dist/CronGenerator-CCRYptuT.mjs.map +0 -1
  41. package/dist/CronGenerator-D4TWXQbh.cjs +0 -61
  42. package/dist/CronGenerator-D4TWXQbh.cjs.map +0 -1
  43. package/dist/CronGenerator-DWS3CCZt.d.cts +0 -14
  44. package/dist/CronGenerator-DZjdkEjI.d.mts +0 -14
  45. package/dist/EndpointGenerator-DGivkPLT.mjs +0 -335
  46. package/dist/EndpointGenerator-DGivkPLT.mjs.map +0 -1
  47. package/dist/EndpointGenerator-Dh7kMtuL.d.mts +0 -19
  48. package/dist/EndpointGenerator-npWEDoK2.cjs +0 -341
  49. package/dist/EndpointGenerator-npWEDoK2.cjs.map +0 -1
  50. package/dist/EndpointGenerator-zBsie_7s.d.cts +0 -19
  51. package/dist/FunctionGenerator-BmDHo27U.d.mts +0 -14
  52. package/dist/FunctionGenerator-CVk0h8tO.mjs +0 -54
  53. package/dist/FunctionGenerator-CVk0h8tO.mjs.map +0 -1
  54. package/dist/FunctionGenerator-DXjXBxUd.d.cts +0 -14
  55. package/dist/FunctionGenerator-DYTnyr4c.cjs +0 -60
  56. package/dist/FunctionGenerator-DYTnyr4c.cjs.map +0 -1
  57. package/dist/Generator-BGY-2dgI.d.cts +0 -27
  58. package/dist/Generator-CDt4pB3W.mjs +0 -41
  59. package/dist/Generator-CDt4pB3W.mjs.map +0 -1
  60. package/dist/Generator-CLVplqm2.cjs +0 -47
  61. package/dist/Generator-CLVplqm2.cjs.map +0 -1
  62. package/dist/Generator-yi9DH5TN.d.mts +0 -27
  63. package/dist/OpenApiTsGenerator-BVS4pOH7.mjs +0 -495
  64. package/dist/OpenApiTsGenerator-BVS4pOH7.mjs.map +0 -1
  65. package/dist/OpenApiTsGenerator-gPIIyppX.cjs +0 -501
  66. package/dist/OpenApiTsGenerator-gPIIyppX.cjs.map +0 -1
  67. package/dist/SubscriberGenerator-Bb-z3Kvx.d.cts +0 -15
  68. package/dist/SubscriberGenerator-CwsXqCpS.d.mts +0 -15
  69. package/dist/SubscriberGenerator-DABaJXML.mjs +0 -200
  70. package/dist/SubscriberGenerator-DABaJXML.mjs.map +0 -1
  71. package/dist/SubscriberGenerator-D_zpNGFr.cjs +0 -206
  72. package/dist/SubscriberGenerator-D_zpNGFr.cjs.map +0 -1
  73. package/dist/api-Bp5TIl1R.mjs +0 -167
  74. package/dist/api-Bp5TIl1R.mjs.map +0 -1
  75. package/dist/api-D4W9-tdZ.cjs +0 -173
  76. package/dist/api-D4W9-tdZ.cjs.map +0 -1
  77. package/dist/build/index.cjs +0 -15
  78. package/dist/build/index.d.cts +0 -7
  79. package/dist/build/index.d.mts +0 -7
  80. package/dist/build/index.mjs +0 -15
  81. package/dist/build/manifests.cjs +0 -4
  82. package/dist/build/manifests.d.cts +0 -13
  83. package/dist/build/manifests.d.mts +0 -13
  84. package/dist/build/manifests.mjs +0 -3
  85. package/dist/build/providerResolver.cjs +0 -5
  86. package/dist/build/providerResolver.d.cts +0 -23
  87. package/dist/build/providerResolver.d.mts +0 -23
  88. package/dist/build/providerResolver.mjs +0 -3
  89. package/dist/build/types.cjs +0 -0
  90. package/dist/build/types.d.cts +0 -3
  91. package/dist/build/types.d.mts +0 -3
  92. package/dist/build/types.mjs +0 -0
  93. package/dist/build-Cu6Mi0Lf.mjs +0 -87
  94. package/dist/build-Cu6Mi0Lf.mjs.map +0 -1
  95. package/dist/build-wmt8ZcmA.cjs +0 -93
  96. package/dist/build-wmt8ZcmA.cjs.map +0 -1
  97. package/dist/config-BP1IZynR.cjs +0 -168
  98. package/dist/config-BP1IZynR.cjs.map +0 -1
  99. package/dist/config-CIzRhm_D.d.mts +0 -11
  100. package/dist/config-CvehIYsb.d.cts +0 -11
  101. package/dist/config-UCK12Lrr.mjs +0 -162
  102. package/dist/config-UCK12Lrr.mjs.map +0 -1
  103. package/dist/dev/index.cjs +0 -17
  104. package/dist/dev/index.d.cts +0 -36
  105. package/dist/dev/index.d.mts +0 -36
  106. package/dist/dev/index.mjs +0 -13
  107. package/dist/dev-BBPWSllq.mjs +0 -348
  108. package/dist/dev-BBPWSllq.mjs.map +0 -1
  109. package/dist/dev-C2lCgE53.cjs +0 -378
  110. package/dist/dev-C2lCgE53.cjs.map +0 -1
  111. package/dist/docker-2-ipZDOJ.cjs +0 -119
  112. package/dist/docker-2-ipZDOJ.cjs.map +0 -1
  113. package/dist/docker-31GNwU3F.mjs +0 -113
  114. package/dist/docker-31GNwU3F.mjs.map +0 -1
  115. package/dist/env-CQ3hXAAW.d.mts +0 -11
  116. package/dist/env-CS0jvg7k.cjs +0 -144
  117. package/dist/env-CS0jvg7k.cjs.map +0 -1
  118. package/dist/env-D4YFgMqo.d.cts +0 -11
  119. package/dist/env-DEeVOvVu.mjs +0 -138
  120. package/dist/env-DEeVOvVu.mjs.map +0 -1
  121. package/dist/generators/CronGenerator.cjs +0 -4
  122. package/dist/generators/CronGenerator.d.cts +0 -5
  123. package/dist/generators/CronGenerator.d.mts +0 -5
  124. package/dist/generators/CronGenerator.mjs +0 -4
  125. package/dist/generators/EndpointGenerator.cjs +0 -4
  126. package/dist/generators/EndpointGenerator.d.cts +0 -5
  127. package/dist/generators/EndpointGenerator.d.mts +0 -5
  128. package/dist/generators/EndpointGenerator.mjs +0 -4
  129. package/dist/generators/FunctionGenerator.cjs +0 -4
  130. package/dist/generators/FunctionGenerator.d.cts +0 -5
  131. package/dist/generators/FunctionGenerator.d.mts +0 -5
  132. package/dist/generators/FunctionGenerator.mjs +0 -4
  133. package/dist/generators/Generator.cjs +0 -3
  134. package/dist/generators/Generator.d.cts +0 -4
  135. package/dist/generators/Generator.d.mts +0 -4
  136. package/dist/generators/Generator.mjs +0 -3
  137. package/dist/generators/OpenApiTsGenerator.cjs +0 -3
  138. package/dist/generators/OpenApiTsGenerator.d.cts +0 -44
  139. package/dist/generators/OpenApiTsGenerator.d.mts +0 -44
  140. package/dist/generators/OpenApiTsGenerator.mjs +0 -3
  141. package/dist/generators/SubscriberGenerator.cjs +0 -4
  142. package/dist/generators/SubscriberGenerator.d.cts +0 -5
  143. package/dist/generators/SubscriberGenerator.d.mts +0 -5
  144. package/dist/generators/SubscriberGenerator.mjs +0 -4
  145. package/dist/generators/index.cjs +0 -12
  146. package/dist/generators/index.d.cts +0 -8
  147. package/dist/generators/index.d.mts +0 -8
  148. package/dist/generators/index.mjs +0 -8
  149. package/dist/generators-3IemvCLk.cjs +0 -0
  150. package/dist/generators-FNpdfN6J.mjs +0 -0
  151. package/dist/index-DG6xNQMH.d.cts +0 -81
  152. package/dist/index-DZgrOOOW.d.mts +0 -81
  153. package/dist/init/generators/config.cjs +0 -3
  154. package/dist/init/generators/config.d.cts +0 -3
  155. package/dist/init/generators/config.d.mts +0 -3
  156. package/dist/init/generators/config.mjs +0 -3
  157. package/dist/init/generators/docker.cjs +0 -3
  158. package/dist/init/generators/docker.d.cts +0 -11
  159. package/dist/init/generators/docker.d.mts +0 -11
  160. package/dist/init/generators/docker.mjs +0 -3
  161. package/dist/init/generators/env.cjs +0 -3
  162. package/dist/init/generators/env.d.cts +0 -3
  163. package/dist/init/generators/env.d.mts +0 -3
  164. package/dist/init/generators/env.mjs +0 -3
  165. package/dist/init/generators/index.cjs +0 -14
  166. package/dist/init/generators/index.d.cts +0 -6
  167. package/dist/init/generators/index.d.mts +0 -6
  168. package/dist/init/generators/index.mjs +0 -11
  169. package/dist/init/generators/models.cjs +0 -3
  170. package/dist/init/generators/models.d.cts +0 -11
  171. package/dist/init/generators/models.d.mts +0 -11
  172. package/dist/init/generators/models.mjs +0 -3
  173. package/dist/init/generators/monorepo.cjs +0 -3
  174. package/dist/init/generators/monorepo.d.cts +0 -11
  175. package/dist/init/generators/monorepo.d.mts +0 -11
  176. package/dist/init/generators/monorepo.mjs +0 -3
  177. package/dist/init/generators/package.cjs +0 -8
  178. package/dist/init/generators/package.d.cts +0 -3
  179. package/dist/init/generators/package.d.mts +0 -3
  180. package/dist/init/generators/package.mjs +0 -8
  181. package/dist/init/generators/source.cjs +0 -3
  182. package/dist/init/generators/source.d.cts +0 -3
  183. package/dist/init/generators/source.d.mts +0 -3
  184. package/dist/init/generators/source.mjs +0 -3
  185. package/dist/init/index.cjs +0 -16
  186. package/dist/init/index.d.cts +0 -17
  187. package/dist/init/index.d.mts +0 -17
  188. package/dist/init/index.mjs +0 -16
  189. package/dist/init/templates/api.cjs +0 -3
  190. package/dist/init/templates/api.d.cts +0 -7
  191. package/dist/init/templates/api.d.mts +0 -7
  192. package/dist/init/templates/api.mjs +0 -3
  193. package/dist/init/templates/index.cjs +0 -12
  194. package/dist/init/templates/index.d.cts +0 -2
  195. package/dist/init/templates/index.d.mts +0 -2
  196. package/dist/init/templates/index.mjs +0 -7
  197. package/dist/init/templates/minimal.cjs +0 -3
  198. package/dist/init/templates/minimal.d.cts +0 -7
  199. package/dist/init/templates/minimal.d.mts +0 -7
  200. package/dist/init/templates/minimal.mjs +0 -3
  201. package/dist/init/templates/serverless.cjs +0 -3
  202. package/dist/init/templates/serverless.d.cts +0 -7
  203. package/dist/init/templates/serverless.d.mts +0 -7
  204. package/dist/init/templates/serverless.mjs +0 -3
  205. package/dist/init/templates/worker.cjs +0 -3
  206. package/dist/init/templates/worker.d.cts +0 -7
  207. package/dist/init/templates/worker.d.mts +0 -7
  208. package/dist/init/templates/worker.mjs +0 -3
  209. package/dist/init/utils.cjs +0 -7
  210. package/dist/init/utils.d.cts +0 -25
  211. package/dist/init/utils.d.mts +0 -25
  212. package/dist/init/utils.mjs +0 -3
  213. package/dist/init-BMA7xi8r.mjs +0 -161
  214. package/dist/init-BMA7xi8r.mjs.map +0 -1
  215. package/dist/init-D-7WEk-b.cjs +0 -167
  216. package/dist/init-D-7WEk-b.cjs.map +0 -1
  217. package/dist/manifests-BNKG6AXf.mjs +0 -68
  218. package/dist/manifests-BNKG6AXf.mjs.map +0 -1
  219. package/dist/manifests-D13Ej8AE.cjs +0 -80
  220. package/dist/manifests-D13Ej8AE.cjs.map +0 -1
  221. package/dist/minimal-BkyASH_C.mjs +0 -93
  222. package/dist/minimal-BkyASH_C.mjs.map +0 -1
  223. package/dist/minimal-CSFggzdH.cjs +0 -99
  224. package/dist/minimal-CSFggzdH.cjs.map +0 -1
  225. package/dist/models-BWlDfviw.mjs +0 -115
  226. package/dist/models-BWlDfviw.mjs.map +0 -1
  227. package/dist/models-BapGSoHC.cjs +0 -121
  228. package/dist/models-BapGSoHC.cjs.map +0 -1
  229. package/dist/monorepo-BBOWhkcd.mjs +0 -184
  230. package/dist/monorepo-BBOWhkcd.mjs.map +0 -1
  231. package/dist/monorepo-CFtxHeDh.cjs +0 -190
  232. package/dist/monorepo-CFtxHeDh.cjs.map +0 -1
  233. package/dist/openapi-DA9RkPJl.mjs +0 -74
  234. package/dist/openapi-DA9RkPJl.mjs.map +0 -1
  235. package/dist/openapi-DZH6RQHk.cjs +0 -98
  236. package/dist/openapi-DZH6RQHk.cjs.map +0 -1
  237. package/dist/package-6h-7QfJZ.d.cts +0 -11
  238. package/dist/package-BCe_KvGv.d.mts +0 -11
  239. package/dist/package-C3If80n1.mjs +0 -57
  240. package/dist/package-C3If80n1.mjs.map +0 -1
  241. package/dist/package-Dk8IMBOB.cjs +0 -62
  242. package/dist/package-Dk8IMBOB.cjs.map +0 -1
  243. package/dist/providerResolver-DEVKngbC.mjs +0 -96
  244. package/dist/providerResolver-DEVKngbC.mjs.map +0 -1
  245. package/dist/providerResolver-DOTbN9jo.cjs +0 -114
  246. package/dist/providerResolver-DOTbN9jo.cjs.map +0 -1
  247. package/dist/serverless-AGOS-l3G.cjs +0 -119
  248. package/dist/serverless-AGOS-l3G.cjs.map +0 -1
  249. package/dist/serverless-D5HjJByU.mjs +0 -113
  250. package/dist/serverless-D5HjJByU.mjs.map +0 -1
  251. package/dist/source-C1cyfHcF.cjs +0 -17
  252. package/dist/source-C1cyfHcF.cjs.map +0 -1
  253. package/dist/source-C3LiNUV9.d.mts +0 -11
  254. package/dist/source-CkQHBpwu.mjs +0 -11
  255. package/dist/source-CkQHBpwu.mjs.map +0 -1
  256. package/dist/source-Dtcjbokc.d.cts +0 -11
  257. package/dist/templates-C0EMmhwb.mjs +0 -88
  258. package/dist/templates-C0EMmhwb.mjs.map +0 -1
  259. package/dist/templates-CbgQ9dw0.cjs +0 -123
  260. package/dist/templates-CbgQ9dw0.cjs.map +0 -1
  261. package/dist/types-D2xYkOal.d.mts +0 -51
  262. package/dist/types-DA-r8HWZ.d.cts +0 -51
  263. package/dist/types.cjs +0 -0
  264. package/dist/types.d.cts +0 -2
  265. package/dist/types.d.mts +0 -2
  266. package/dist/types.mjs +0 -0
  267. package/dist/utils-CKEzCxc1.mjs +0 -69
  268. package/dist/utils-CKEzCxc1.mjs.map +0 -1
  269. package/dist/utils-DSdN2MTt.cjs +0 -99
  270. package/dist/utils-DSdN2MTt.cjs.map +0 -1
  271. package/dist/worker-CGhlqNH-.cjs +0 -156
  272. package/dist/worker-CGhlqNH-.cjs.map +0 -1
  273. package/dist/worker-CiP420As.mjs +0 -150
  274. package/dist/worker-CiP420As.mjs.map +0 -1
@@ -1,6 +1,5 @@
1
1
  //#region src/types.d.ts
2
- type MainProvider = 'aws' | 'server';
3
- type LegacyProvider = 'server' | 'aws-apigatewayv1' | 'aws-apigatewayv2' | 'aws-lambda';
2
+
4
3
  type Routes = string | string[];
5
4
  interface ProviderConfig {
6
5
  enabled?: boolean;
@@ -29,6 +28,14 @@ interface TelescopeConfig {
29
28
  /** Enable WebSocket for real-time updates (default: true, requires @hono/node-ws for Node.js) */
30
29
  websocket?: boolean;
31
30
  }
31
+ interface StudioConfig {
32
+ /** Enable/disable studio (default: true in development) */
33
+ enabled?: boolean;
34
+ /** Path prefix for studio UI (default: /__studio) */
35
+ path?: string;
36
+ /** Schema to introspect (default: 'public') */
37
+ schema?: string;
38
+ }
32
39
  interface OpenApiConfig {
33
40
  /** Enable OpenAPI generation (default: true) */
34
41
  enabled?: boolean;
@@ -39,6 +46,33 @@ interface OpenApiConfig {
39
46
  /** API description */
40
47
  description?: string;
41
48
  }
49
+ interface HooksConfig {
50
+ /**
51
+ * Path to a module exporting server lifecycle hooks.
52
+ * The module should export `beforeSetup` and/or `afterSetup` functions.
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * // src/config/hooks.ts
57
+ * import type { Hono } from 'hono';
58
+ * import type { Logger } from '@geekmidas/logger';
59
+ * import type { EnvironmentParser } from '@geekmidas/envkit';
60
+ *
61
+ * // Called BEFORE gkm endpoints are registered
62
+ * export function beforeSetup(app: Hono, ctx: { envParser: EnvironmentParser; logger: Logger }) {
63
+ * app.use('*', cors());
64
+ * app.get('/custom/health', (c) => c.json({ status: 'ok' }));
65
+ * }
66
+ *
67
+ * // Called AFTER gkm endpoints are registered
68
+ * export function afterSetup(app: Hono, ctx: { envParser: EnvironmentParser; logger: Logger }) {
69
+ * app.notFound((c) => c.json({ error: 'Not found' }, 404));
70
+ * app.onError((err, c) => c.json({ error: err.message }, 500));
71
+ * }
72
+ * ```
73
+ */
74
+ server?: string;
75
+ }
42
76
  interface ProvidersConfig {
43
77
  aws?: {
44
78
  apiGateway?: {
@@ -60,6 +94,16 @@ interface GkmConfig {
60
94
  envParser: string;
61
95
  logger: string;
62
96
  providers?: ProvidersConfig;
97
+ /**
98
+ * Server lifecycle hooks for customizing the Hono app.
99
+ * Allows adding custom routes, middleware, error handlers, etc.
100
+ *
101
+ * @example
102
+ * hooks: {
103
+ * server: './src/config/hooks'
104
+ * }
105
+ */
106
+ hooks?: HooksConfig;
63
107
  /**
64
108
  * Telescope configuration for debugging/monitoring.
65
109
  * Can be:
@@ -68,6 +112,16 @@ interface GkmConfig {
68
112
  * - A TelescopeConfig object for inline configuration
69
113
  */
70
114
  telescope?: string | boolean | TelescopeConfig;
115
+ /**
116
+ * Studio configuration for database browsing.
117
+ * Can be:
118
+ * - A string path to a module that exports a Studio instance (recommended)
119
+ * - A boolean to enable/disable with defaults
120
+ * - A StudioConfig object for inline configuration
121
+ *
122
+ * Requires a database connection configured via services.
123
+ */
124
+ studio?: string | boolean | StudioConfig;
71
125
  /**
72
126
  * OpenAPI generation configuration.
73
127
  * Can be:
@@ -104,55 +158,6 @@ interface GkmConfig {
104
158
  */
105
159
  env?: string | string[];
106
160
  }
107
- interface BuildOptions {
108
- provider?: MainProvider;
109
- providers?: LegacyProvider[];
110
- enableOpenApi?: boolean;
111
- }
112
- interface RouteInfo {
113
- path: string;
114
- method: string;
115
- handler: string;
116
- timeout?: number;
117
- memorySize?: number;
118
- environment?: string[];
119
- authorizer: string;
120
- }
121
- interface FunctionInfo {
122
- name: string;
123
- handler: string;
124
- timeout?: number;
125
- memorySize?: number;
126
- environment?: string[];
127
- }
128
- interface CronInfo {
129
- name: string;
130
- handler: string;
131
- schedule: string;
132
- timeout?: number;
133
- memorySize?: number;
134
- environment?: string[];
135
- }
136
- interface SubscriberInfo {
137
- name: string;
138
- handler: string;
139
- subscribedEvents: string[];
140
- timeout?: number;
141
- memorySize?: number;
142
- environment?: string[];
143
- }
144
- interface RoutesManifest {
145
- routes: RouteInfo[];
146
- }
147
- interface FunctionsManifest {
148
- functions: FunctionInfo[];
149
- }
150
- interface CronsManifest {
151
- crons: CronInfo[];
152
- }
153
- interface SubscribersManifest {
154
- subscribers: SubscriberInfo[];
155
- }
156
161
  //#endregion
157
- export { AWSApiGatewayConfig, AWSLambdaConfig, BuildOptions, CronInfo, CronsManifest, FunctionInfo, FunctionsManifest, GkmConfig, LegacyProvider, MainProvider, OpenApiConfig, ProviderConfig, ProvidersConfig, RouteInfo, Routes, RoutesManifest, Runtime, ServerConfig, SubscriberInfo, SubscribersManifest, TelescopeConfig };
158
- //# sourceMappingURL=types-Bi7VzDUZ.d.mts.map
162
+ export { GkmConfig, OpenApiConfig };
163
+ //# sourceMappingURL=types-b-vwGpqc.d.cts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekmidas/cli",
3
- "version": "0.6.2",
3
+ "version": "0.8.0",
4
4
  "description": "CLI tools for building Lambda handlers, server applications, and generating OpenAPI specs",
5
5
  "private": false,
6
6
  "type": "module",
@@ -50,14 +50,14 @@
50
50
  "typescript": "^5.8.2",
51
51
  "vitest": "^3.2.4",
52
52
  "zod": "~4.1.13",
53
- "@geekmidas/testkit": "0.1.0"
53
+ "@geekmidas/testkit": "0.3.1"
54
54
  },
55
55
  "peerDependencies": {
56
- "@geekmidas/constructs": "~0.2.4",
57
- "@geekmidas/schema": "~0.0.3",
58
- "@geekmidas/logger": "~0.1.0",
59
56
  "@geekmidas/envkit": "~0.1.0",
60
- "@geekmidas/telescope": "~0.0.1"
57
+ "@geekmidas/logger": "~0.1.0",
58
+ "@geekmidas/constructs": "~0.2.4",
59
+ "@geekmidas/telescope": "~0.1.0",
60
+ "@geekmidas/schema": "~0.0.3"
61
61
  },
62
62
  "peerDependenciesMeta": {
63
63
  "@geekmidas/telescope": {
@@ -0,0 +1,204 @@
1
+ import { mkdir, readFile, rm } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { e } from '@geekmidas/constructs/endpoints';
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
+ import type { BuildContext } from '../build/types';
6
+ import { EndpointGenerator } from '../generators/EndpointGenerator';
7
+ import type { GeneratedConstruct } from '../generators/Generator';
8
+
9
+ // Create a minimal mock endpoint for testing
10
+ const mockEndpoint = e.get('/test').handle(async () => ({ ok: true }));
11
+
12
+ describe('EndpointGenerator hooks generation', () => {
13
+ const testOutputDir = join(process.cwd(), '.test-output');
14
+ let generator: EndpointGenerator;
15
+
16
+ // Mock endpoint construct for testing
17
+ const mockConstruct: GeneratedConstruct<typeof mockEndpoint> = {
18
+ key: 'testEndpoint',
19
+ construct: mockEndpoint,
20
+ path: {
21
+ relative: '/project/src/endpoints/test.ts',
22
+ absolute: '/project/src/endpoints/test.ts',
23
+ },
24
+ };
25
+
26
+ beforeEach(async () => {
27
+ generator = new EndpointGenerator();
28
+ await mkdir(testOutputDir, { recursive: true });
29
+ });
30
+
31
+ afterEach(async () => {
32
+ await rm(testOutputDir, { recursive: true, force: true });
33
+ });
34
+
35
+ const baseContext: BuildContext = {
36
+ envParserPath: '/project/src/config/env.ts',
37
+ envParserImportPattern: '{ envParser }',
38
+ loggerPath: '/project/src/config/logger.ts',
39
+ loggerImportPattern: 'logger',
40
+ };
41
+
42
+ describe('generateAppFile', () => {
43
+ it('should not include hooks when hooks config is undefined', async () => {
44
+ await generator.build(baseContext, [mockConstruct], testOutputDir, {
45
+ provider: 'server',
46
+ });
47
+
48
+ const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
49
+
50
+ expect(appContent).not.toContain('serverHooks');
51
+ expect(appContent).not.toContain('beforeSetup');
52
+ expect(appContent).not.toContain('afterSetup');
53
+ });
54
+
55
+ it('should include hooks imports when hooks config is provided', async () => {
56
+ const contextWithHooks: BuildContext = {
57
+ ...baseContext,
58
+ hooks: {
59
+ serverHooksPath: '/project/src/config/hooks.ts',
60
+ },
61
+ };
62
+
63
+ await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
64
+ provider: 'server',
65
+ });
66
+
67
+ const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
68
+
69
+ expect(appContent).toContain('import * as serverHooks from');
70
+ expect(appContent).toContain('hooks.ts');
71
+ });
72
+
73
+ it('should include beforeSetup hook call', async () => {
74
+ const contextWithHooks: BuildContext = {
75
+ ...baseContext,
76
+ hooks: {
77
+ serverHooksPath: '/project/src/config/hooks.ts',
78
+ },
79
+ };
80
+
81
+ await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
82
+ provider: 'server',
83
+ });
84
+
85
+ const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
86
+
87
+ expect(appContent).toContain(
88
+ "if (typeof serverHooks.beforeSetup === 'function')",
89
+ );
90
+ expect(appContent).toContain(
91
+ 'await serverHooks.beforeSetup(honoApp, { envParser, logger })',
92
+ );
93
+ });
94
+
95
+ it('should include afterSetup hook call', async () => {
96
+ const contextWithHooks: BuildContext = {
97
+ ...baseContext,
98
+ hooks: {
99
+ serverHooksPath: '/project/src/config/hooks.ts',
100
+ },
101
+ };
102
+
103
+ await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
104
+ provider: 'server',
105
+ });
106
+
107
+ const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
108
+
109
+ expect(appContent).toContain(
110
+ "if (typeof serverHooks.afterSetup === 'function')",
111
+ );
112
+ expect(appContent).toContain(
113
+ 'await serverHooks.afterSetup(honoApp, { envParser, logger })',
114
+ );
115
+ });
116
+
117
+ it('should place telescope before beforeSetup, and beforeSetup before endpoints', async () => {
118
+ const contextWithHooks: BuildContext = {
119
+ ...baseContext,
120
+ hooks: {
121
+ serverHooksPath: '/project/src/config/hooks.ts',
122
+ },
123
+ telescope: {
124
+ enabled: true,
125
+ path: '/__telescope',
126
+ maxEntries: 100,
127
+ recordBody: true,
128
+ ignore: [],
129
+ websocket: false,
130
+ },
131
+ };
132
+
133
+ await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
134
+ provider: 'server',
135
+ });
136
+
137
+ const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
138
+
139
+ // Use specific patterns to find the actual calls (not imports/comments)
140
+ const telescopeIndex = appContent.indexOf('createMiddleware(telescope)');
141
+ const beforeSetupCallIndex = appContent.indexOf(
142
+ 'serverHooks.beforeSetup(honoApp',
143
+ );
144
+ const setupEndpointsIndex = appContent.indexOf(
145
+ 'await setupEndpoints(honoApp',
146
+ );
147
+
148
+ expect(telescopeIndex).toBeGreaterThan(0);
149
+ expect(beforeSetupCallIndex).toBeGreaterThan(0);
150
+ expect(setupEndpointsIndex).toBeGreaterThan(0);
151
+ // Telescope middleware first (to capture all requests)
152
+ expect(telescopeIndex).toBeLessThan(beforeSetupCallIndex);
153
+ // Then beforeSetup hook
154
+ expect(beforeSetupCallIndex).toBeLessThan(setupEndpointsIndex);
155
+ });
156
+
157
+ it('should place afterSetup after setupEndpoints', async () => {
158
+ const contextWithHooks: BuildContext = {
159
+ ...baseContext,
160
+ hooks: {
161
+ serverHooksPath: '/project/src/config/hooks.ts',
162
+ },
163
+ };
164
+
165
+ await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
166
+ provider: 'server',
167
+ });
168
+
169
+ const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
170
+
171
+ // Use specific patterns to find the actual calls (not imports/comments)
172
+ const setupEndpointsIndex = appContent.indexOf(
173
+ 'await setupEndpoints(honoApp',
174
+ );
175
+ const afterSetupCallIndex = appContent.indexOf(
176
+ 'serverHooks.afterSetup(honoApp',
177
+ );
178
+
179
+ expect(setupEndpointsIndex).toBeGreaterThan(0);
180
+ expect(afterSetupCallIndex).toBeGreaterThan(0);
181
+ expect(afterSetupCallIndex).toBeGreaterThan(setupEndpointsIndex);
182
+ });
183
+
184
+ it('should generate correct relative import path for hooks', async () => {
185
+ const contextWithHooks: BuildContext = {
186
+ ...baseContext,
187
+ hooks: {
188
+ serverHooksPath: join(testOutputDir, '../../src/config/hooks.ts'),
189
+ },
190
+ };
191
+
192
+ await generator.build(contextWithHooks, [mockConstruct], testOutputDir, {
193
+ provider: 'server',
194
+ });
195
+
196
+ const appContent = await readFile(join(testOutputDir, 'app.ts'), 'utf-8');
197
+
198
+ // Should have a relative import path
199
+ expect(appContent).toMatch(
200
+ /import \* as serverHooks from '\.\.\/.*hooks\.ts'/,
201
+ );
202
+ });
203
+ });
204
+ });
@@ -0,0 +1,63 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { normalizeHooksConfig } from '../dev';
3
+
4
+ describe('normalizeHooksConfig', () => {
5
+ const originalCwd = process.cwd();
6
+
7
+ beforeEach(() => {
8
+ vi.spyOn(process, 'cwd').mockReturnValue('/test/project');
9
+ });
10
+
11
+ afterEach(() => {
12
+ vi.restoreAllMocks();
13
+ });
14
+
15
+ it('should return undefined when hooks config is undefined', () => {
16
+ const result = normalizeHooksConfig(undefined);
17
+ expect(result).toBeUndefined();
18
+ });
19
+
20
+ it('should return undefined when hooks config is empty object', () => {
21
+ const result = normalizeHooksConfig({});
22
+ expect(result).toBeUndefined();
23
+ });
24
+
25
+ it('should return undefined when server hooks path is not provided', () => {
26
+ const result = normalizeHooksConfig({ server: undefined });
27
+ expect(result).toBeUndefined();
28
+ });
29
+
30
+ it('should normalize path with .ts extension', () => {
31
+ const result = normalizeHooksConfig({ server: './src/hooks.ts' });
32
+
33
+ expect(result).toBeDefined();
34
+ expect(result!.serverHooksPath).toBe('/test/project/src/hooks.ts');
35
+ });
36
+
37
+ it('should add .ts extension when missing', () => {
38
+ const result = normalizeHooksConfig({ server: './src/hooks' });
39
+
40
+ expect(result).toBeDefined();
41
+ expect(result!.serverHooksPath).toBe('/test/project/src/hooks.ts');
42
+ });
43
+
44
+ it('should resolve relative paths from cwd', () => {
45
+ const result = normalizeHooksConfig({ server: 'config/server-hooks' });
46
+
47
+ expect(result).toBeDefined();
48
+ expect(result!.serverHooksPath).toBe(
49
+ '/test/project/config/server-hooks.ts',
50
+ );
51
+ });
52
+
53
+ it('should handle nested directory paths', () => {
54
+ const result = normalizeHooksConfig({
55
+ server: './src/config/hooks/server',
56
+ });
57
+
58
+ expect(result).toBeDefined();
59
+ expect(result!.serverHooksPath).toBe(
60
+ '/test/project/src/config/hooks/server.ts',
61
+ );
62
+ });
63
+ });
@@ -5,7 +5,7 @@ import type { Endpoint } from '@geekmidas/constructs/endpoints';
5
5
  import type { Function } from '@geekmidas/constructs/functions';
6
6
  import type { Subscriber } from '@geekmidas/constructs/subscribers';
7
7
  import { loadConfig, parseModuleConfig } from '../config';
8
- import { normalizeTelescopeConfig } from '../dev';
8
+ import { normalizeHooksConfig, normalizeTelescopeConfig } from '../dev';
9
9
  import {
10
10
  CronGenerator,
11
11
  EndpointGenerator,
@@ -55,12 +55,19 @@ export async function buildCommand(options: BuildOptions): Promise<void> {
55
55
  logger.log(`🔭 Telescope enabled at ${telescope.path}`);
56
56
  }
57
57
 
58
+ // Normalize hooks configuration
59
+ const hooks = normalizeHooksConfig(config.hooks);
60
+ if (hooks) {
61
+ logger.log(`🪝 Server hooks enabled`);
62
+ }
63
+
58
64
  const buildContext: BuildContext = {
59
65
  envParserPath,
60
66
  envParserImportPattern,
61
67
  loggerPath,
62
68
  loggerImportPattern,
63
69
  telescope,
70
+ hooks,
64
71
  };
65
72
 
66
73
  // Initialize generators
@@ -38,12 +38,31 @@ export interface NormalizedTelescopeConfig {
38
38
  websocket: boolean;
39
39
  }
40
40
 
41
+ export interface NormalizedStudioConfig {
42
+ enabled: boolean;
43
+ /** Path to user's studio module (if provided) */
44
+ studioPath?: string;
45
+ /** Import pattern for studio (e.g., '{ studio }' or 'studio') */
46
+ studioImportPattern?: string;
47
+ /** UI path for studio dashboard */
48
+ path: string;
49
+ /** Database schema to introspect */
50
+ schema: string;
51
+ }
52
+
53
+ export interface NormalizedHooksConfig {
54
+ /** Path to server hooks module */
55
+ serverHooksPath: string;
56
+ }
57
+
41
58
  export interface BuildContext {
42
59
  envParserPath: string;
43
60
  envParserImportPattern: string;
44
61
  loggerPath: string;
45
62
  loggerImportPattern: string;
46
63
  telescope?: NormalizedTelescopeConfig;
64
+ studio?: NormalizedStudioConfig;
65
+ hooks?: NormalizedHooksConfig;
47
66
  }
48
67
 
49
68
  export interface ProviderBuildResult {