@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.
- package/dist/config.d.cts +1 -1
- package/dist/config.d.mts +1 -1
- package/dist/index.cjs +2583 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +2578 -29
- package/dist/index.mjs.map +1 -1
- package/dist/openapi--vOy9mo4.mjs +978 -0
- package/dist/openapi--vOy9mo4.mjs.map +1 -0
- package/dist/openapi-CHhTPief.cjs +1014 -0
- package/dist/openapi-CHhTPief.cjs.map +1 -0
- package/dist/{openapi-react-query-_-B3s8v_.mjs → openapi-react-query-CcciaVu5.mjs} +1 -1
- package/dist/{openapi-react-query-_-B3s8v_.mjs.map → openapi-react-query-CcciaVu5.mjs.map} +1 -1
- package/dist/{openapi-react-query-Cp-w8_05.cjs → openapi-react-query-o5iMi8tz.cjs} +1 -1
- package/dist/{openapi-react-query-Cp-w8_05.cjs.map → openapi-react-query-o5iMi8tz.cjs.map} +1 -1
- package/dist/openapi-react-query.cjs +1 -1
- package/dist/openapi-react-query.mjs +1 -1
- package/dist/openapi.cjs +1 -4
- package/dist/openapi.d.cts +1 -1
- package/dist/openapi.d.mts +1 -1
- package/dist/openapi.mjs +1 -4
- package/dist/{types-KmjzMgu8.d.cts → types-DXgiA1sF.d.mts} +58 -53
- package/dist/{types-Bi7VzDUZ.d.mts → types-b-vwGpqc.d.cts} +58 -53
- package/package.json +6 -6
- package/src/__tests__/EndpointGenerator.hooks.spec.ts +204 -0
- package/src/__tests__/normalizeHooksConfig.spec.ts +63 -0
- package/src/build/index.ts +8 -1
- package/src/build/types.ts +19 -0
- package/src/dev/index.ts +153 -37
- package/src/generators/EndpointGenerator.ts +72 -5
- package/src/generators/__tests__/EndpointGenerator.spec.ts +1 -1
- package/src/init/generators/config.ts +6 -1
- package/src/init/generators/package.ts +5 -1
- package/src/init/index.ts +9 -1
- package/src/init/templates/api.ts +31 -0
- package/src/init/templates/index.ts +1 -0
- package/src/init/templates/minimal.ts +83 -0
- package/src/types.ts +57 -0
- package/tsdown.config.ts +6 -0
- package/dist/CronGenerator-CCRYptuT.mjs +0 -55
- package/dist/CronGenerator-CCRYptuT.mjs.map +0 -1
- package/dist/CronGenerator-D4TWXQbh.cjs +0 -61
- package/dist/CronGenerator-D4TWXQbh.cjs.map +0 -1
- package/dist/CronGenerator-DWS3CCZt.d.cts +0 -14
- package/dist/CronGenerator-DZjdkEjI.d.mts +0 -14
- package/dist/EndpointGenerator-DGivkPLT.mjs +0 -335
- package/dist/EndpointGenerator-DGivkPLT.mjs.map +0 -1
- package/dist/EndpointGenerator-Dh7kMtuL.d.mts +0 -19
- package/dist/EndpointGenerator-npWEDoK2.cjs +0 -341
- package/dist/EndpointGenerator-npWEDoK2.cjs.map +0 -1
- package/dist/EndpointGenerator-zBsie_7s.d.cts +0 -19
- package/dist/FunctionGenerator-BmDHo27U.d.mts +0 -14
- package/dist/FunctionGenerator-CVk0h8tO.mjs +0 -54
- package/dist/FunctionGenerator-CVk0h8tO.mjs.map +0 -1
- package/dist/FunctionGenerator-DXjXBxUd.d.cts +0 -14
- package/dist/FunctionGenerator-DYTnyr4c.cjs +0 -60
- package/dist/FunctionGenerator-DYTnyr4c.cjs.map +0 -1
- package/dist/Generator-BGY-2dgI.d.cts +0 -27
- package/dist/Generator-CDt4pB3W.mjs +0 -41
- package/dist/Generator-CDt4pB3W.mjs.map +0 -1
- package/dist/Generator-CLVplqm2.cjs +0 -47
- package/dist/Generator-CLVplqm2.cjs.map +0 -1
- package/dist/Generator-yi9DH5TN.d.mts +0 -27
- package/dist/OpenApiTsGenerator-BVS4pOH7.mjs +0 -495
- package/dist/OpenApiTsGenerator-BVS4pOH7.mjs.map +0 -1
- package/dist/OpenApiTsGenerator-gPIIyppX.cjs +0 -501
- package/dist/OpenApiTsGenerator-gPIIyppX.cjs.map +0 -1
- package/dist/SubscriberGenerator-Bb-z3Kvx.d.cts +0 -15
- package/dist/SubscriberGenerator-CwsXqCpS.d.mts +0 -15
- package/dist/SubscriberGenerator-DABaJXML.mjs +0 -200
- package/dist/SubscriberGenerator-DABaJXML.mjs.map +0 -1
- package/dist/SubscriberGenerator-D_zpNGFr.cjs +0 -206
- package/dist/SubscriberGenerator-D_zpNGFr.cjs.map +0 -1
- package/dist/api-Bp5TIl1R.mjs +0 -167
- package/dist/api-Bp5TIl1R.mjs.map +0 -1
- package/dist/api-D4W9-tdZ.cjs +0 -173
- package/dist/api-D4W9-tdZ.cjs.map +0 -1
- package/dist/build/index.cjs +0 -15
- package/dist/build/index.d.cts +0 -7
- package/dist/build/index.d.mts +0 -7
- package/dist/build/index.mjs +0 -15
- package/dist/build/manifests.cjs +0 -4
- package/dist/build/manifests.d.cts +0 -13
- package/dist/build/manifests.d.mts +0 -13
- package/dist/build/manifests.mjs +0 -3
- package/dist/build/providerResolver.cjs +0 -5
- package/dist/build/providerResolver.d.cts +0 -23
- package/dist/build/providerResolver.d.mts +0 -23
- package/dist/build/providerResolver.mjs +0 -3
- package/dist/build/types.cjs +0 -0
- package/dist/build/types.d.cts +0 -3
- package/dist/build/types.d.mts +0 -3
- package/dist/build/types.mjs +0 -0
- package/dist/build-Cu6Mi0Lf.mjs +0 -87
- package/dist/build-Cu6Mi0Lf.mjs.map +0 -1
- package/dist/build-wmt8ZcmA.cjs +0 -93
- package/dist/build-wmt8ZcmA.cjs.map +0 -1
- package/dist/config-BP1IZynR.cjs +0 -168
- package/dist/config-BP1IZynR.cjs.map +0 -1
- package/dist/config-CIzRhm_D.d.mts +0 -11
- package/dist/config-CvehIYsb.d.cts +0 -11
- package/dist/config-UCK12Lrr.mjs +0 -162
- package/dist/config-UCK12Lrr.mjs.map +0 -1
- package/dist/dev/index.cjs +0 -17
- package/dist/dev/index.d.cts +0 -36
- package/dist/dev/index.d.mts +0 -36
- package/dist/dev/index.mjs +0 -13
- package/dist/dev-BBPWSllq.mjs +0 -348
- package/dist/dev-BBPWSllq.mjs.map +0 -1
- package/dist/dev-C2lCgE53.cjs +0 -378
- package/dist/dev-C2lCgE53.cjs.map +0 -1
- package/dist/docker-2-ipZDOJ.cjs +0 -119
- package/dist/docker-2-ipZDOJ.cjs.map +0 -1
- package/dist/docker-31GNwU3F.mjs +0 -113
- package/dist/docker-31GNwU3F.mjs.map +0 -1
- package/dist/env-CQ3hXAAW.d.mts +0 -11
- package/dist/env-CS0jvg7k.cjs +0 -144
- package/dist/env-CS0jvg7k.cjs.map +0 -1
- package/dist/env-D4YFgMqo.d.cts +0 -11
- package/dist/env-DEeVOvVu.mjs +0 -138
- package/dist/env-DEeVOvVu.mjs.map +0 -1
- package/dist/generators/CronGenerator.cjs +0 -4
- package/dist/generators/CronGenerator.d.cts +0 -5
- package/dist/generators/CronGenerator.d.mts +0 -5
- package/dist/generators/CronGenerator.mjs +0 -4
- package/dist/generators/EndpointGenerator.cjs +0 -4
- package/dist/generators/EndpointGenerator.d.cts +0 -5
- package/dist/generators/EndpointGenerator.d.mts +0 -5
- package/dist/generators/EndpointGenerator.mjs +0 -4
- package/dist/generators/FunctionGenerator.cjs +0 -4
- package/dist/generators/FunctionGenerator.d.cts +0 -5
- package/dist/generators/FunctionGenerator.d.mts +0 -5
- package/dist/generators/FunctionGenerator.mjs +0 -4
- package/dist/generators/Generator.cjs +0 -3
- package/dist/generators/Generator.d.cts +0 -4
- package/dist/generators/Generator.d.mts +0 -4
- package/dist/generators/Generator.mjs +0 -3
- package/dist/generators/OpenApiTsGenerator.cjs +0 -3
- package/dist/generators/OpenApiTsGenerator.d.cts +0 -44
- package/dist/generators/OpenApiTsGenerator.d.mts +0 -44
- package/dist/generators/OpenApiTsGenerator.mjs +0 -3
- package/dist/generators/SubscriberGenerator.cjs +0 -4
- package/dist/generators/SubscriberGenerator.d.cts +0 -5
- package/dist/generators/SubscriberGenerator.d.mts +0 -5
- package/dist/generators/SubscriberGenerator.mjs +0 -4
- package/dist/generators/index.cjs +0 -12
- package/dist/generators/index.d.cts +0 -8
- package/dist/generators/index.d.mts +0 -8
- package/dist/generators/index.mjs +0 -8
- package/dist/generators-3IemvCLk.cjs +0 -0
- package/dist/generators-FNpdfN6J.mjs +0 -0
- package/dist/index-DG6xNQMH.d.cts +0 -81
- package/dist/index-DZgrOOOW.d.mts +0 -81
- package/dist/init/generators/config.cjs +0 -3
- package/dist/init/generators/config.d.cts +0 -3
- package/dist/init/generators/config.d.mts +0 -3
- package/dist/init/generators/config.mjs +0 -3
- package/dist/init/generators/docker.cjs +0 -3
- package/dist/init/generators/docker.d.cts +0 -11
- package/dist/init/generators/docker.d.mts +0 -11
- package/dist/init/generators/docker.mjs +0 -3
- package/dist/init/generators/env.cjs +0 -3
- package/dist/init/generators/env.d.cts +0 -3
- package/dist/init/generators/env.d.mts +0 -3
- package/dist/init/generators/env.mjs +0 -3
- package/dist/init/generators/index.cjs +0 -14
- package/dist/init/generators/index.d.cts +0 -6
- package/dist/init/generators/index.d.mts +0 -6
- package/dist/init/generators/index.mjs +0 -11
- package/dist/init/generators/models.cjs +0 -3
- package/dist/init/generators/models.d.cts +0 -11
- package/dist/init/generators/models.d.mts +0 -11
- package/dist/init/generators/models.mjs +0 -3
- package/dist/init/generators/monorepo.cjs +0 -3
- package/dist/init/generators/monorepo.d.cts +0 -11
- package/dist/init/generators/monorepo.d.mts +0 -11
- package/dist/init/generators/monorepo.mjs +0 -3
- package/dist/init/generators/package.cjs +0 -8
- package/dist/init/generators/package.d.cts +0 -3
- package/dist/init/generators/package.d.mts +0 -3
- package/dist/init/generators/package.mjs +0 -8
- package/dist/init/generators/source.cjs +0 -3
- package/dist/init/generators/source.d.cts +0 -3
- package/dist/init/generators/source.d.mts +0 -3
- package/dist/init/generators/source.mjs +0 -3
- package/dist/init/index.cjs +0 -16
- package/dist/init/index.d.cts +0 -17
- package/dist/init/index.d.mts +0 -17
- package/dist/init/index.mjs +0 -16
- package/dist/init/templates/api.cjs +0 -3
- package/dist/init/templates/api.d.cts +0 -7
- package/dist/init/templates/api.d.mts +0 -7
- package/dist/init/templates/api.mjs +0 -3
- package/dist/init/templates/index.cjs +0 -12
- package/dist/init/templates/index.d.cts +0 -2
- package/dist/init/templates/index.d.mts +0 -2
- package/dist/init/templates/index.mjs +0 -7
- package/dist/init/templates/minimal.cjs +0 -3
- package/dist/init/templates/minimal.d.cts +0 -7
- package/dist/init/templates/minimal.d.mts +0 -7
- package/dist/init/templates/minimal.mjs +0 -3
- package/dist/init/templates/serverless.cjs +0 -3
- package/dist/init/templates/serverless.d.cts +0 -7
- package/dist/init/templates/serverless.d.mts +0 -7
- package/dist/init/templates/serverless.mjs +0 -3
- package/dist/init/templates/worker.cjs +0 -3
- package/dist/init/templates/worker.d.cts +0 -7
- package/dist/init/templates/worker.d.mts +0 -7
- package/dist/init/templates/worker.mjs +0 -3
- package/dist/init/utils.cjs +0 -7
- package/dist/init/utils.d.cts +0 -25
- package/dist/init/utils.d.mts +0 -25
- package/dist/init/utils.mjs +0 -3
- package/dist/init-BMA7xi8r.mjs +0 -161
- package/dist/init-BMA7xi8r.mjs.map +0 -1
- package/dist/init-D-7WEk-b.cjs +0 -167
- package/dist/init-D-7WEk-b.cjs.map +0 -1
- package/dist/manifests-BNKG6AXf.mjs +0 -68
- package/dist/manifests-BNKG6AXf.mjs.map +0 -1
- package/dist/manifests-D13Ej8AE.cjs +0 -80
- package/dist/manifests-D13Ej8AE.cjs.map +0 -1
- package/dist/minimal-BkyASH_C.mjs +0 -93
- package/dist/minimal-BkyASH_C.mjs.map +0 -1
- package/dist/minimal-CSFggzdH.cjs +0 -99
- package/dist/minimal-CSFggzdH.cjs.map +0 -1
- package/dist/models-BWlDfviw.mjs +0 -115
- package/dist/models-BWlDfviw.mjs.map +0 -1
- package/dist/models-BapGSoHC.cjs +0 -121
- package/dist/models-BapGSoHC.cjs.map +0 -1
- package/dist/monorepo-BBOWhkcd.mjs +0 -184
- package/dist/monorepo-BBOWhkcd.mjs.map +0 -1
- package/dist/monorepo-CFtxHeDh.cjs +0 -190
- package/dist/monorepo-CFtxHeDh.cjs.map +0 -1
- package/dist/openapi-DA9RkPJl.mjs +0 -74
- package/dist/openapi-DA9RkPJl.mjs.map +0 -1
- package/dist/openapi-DZH6RQHk.cjs +0 -98
- package/dist/openapi-DZH6RQHk.cjs.map +0 -1
- package/dist/package-6h-7QfJZ.d.cts +0 -11
- package/dist/package-BCe_KvGv.d.mts +0 -11
- package/dist/package-C3If80n1.mjs +0 -57
- package/dist/package-C3If80n1.mjs.map +0 -1
- package/dist/package-Dk8IMBOB.cjs +0 -62
- package/dist/package-Dk8IMBOB.cjs.map +0 -1
- package/dist/providerResolver-DEVKngbC.mjs +0 -96
- package/dist/providerResolver-DEVKngbC.mjs.map +0 -1
- package/dist/providerResolver-DOTbN9jo.cjs +0 -114
- package/dist/providerResolver-DOTbN9jo.cjs.map +0 -1
- package/dist/serverless-AGOS-l3G.cjs +0 -119
- package/dist/serverless-AGOS-l3G.cjs.map +0 -1
- package/dist/serverless-D5HjJByU.mjs +0 -113
- package/dist/serverless-D5HjJByU.mjs.map +0 -1
- package/dist/source-C1cyfHcF.cjs +0 -17
- package/dist/source-C1cyfHcF.cjs.map +0 -1
- package/dist/source-C3LiNUV9.d.mts +0 -11
- package/dist/source-CkQHBpwu.mjs +0 -11
- package/dist/source-CkQHBpwu.mjs.map +0 -1
- package/dist/source-Dtcjbokc.d.cts +0 -11
- package/dist/templates-C0EMmhwb.mjs +0 -88
- package/dist/templates-C0EMmhwb.mjs.map +0 -1
- package/dist/templates-CbgQ9dw0.cjs +0 -123
- package/dist/templates-CbgQ9dw0.cjs.map +0 -1
- package/dist/types-D2xYkOal.d.mts +0 -51
- package/dist/types-DA-r8HWZ.d.cts +0 -51
- package/dist/types.cjs +0 -0
- package/dist/types.d.cts +0 -2
- package/dist/types.d.mts +0 -2
- package/dist/types.mjs +0 -0
- package/dist/utils-CKEzCxc1.mjs +0 -69
- package/dist/utils-CKEzCxc1.mjs.map +0 -1
- package/dist/utils-DSdN2MTt.cjs +0 -99
- package/dist/utils-DSdN2MTt.cjs.map +0 -1
- package/dist/worker-CGhlqNH-.cjs +0 -156
- package/dist/worker-CGhlqNH-.cjs.map +0 -1
- package/dist/worker-CiP420As.mjs +0 -150
- package/dist/worker-CiP420As.mjs.map +0 -1
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
//#region src/types.d.ts
|
|
2
|
-
|
|
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 {
|
|
158
|
-
//# sourceMappingURL=types-
|
|
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.
|
|
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
|
|
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/
|
|
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
|
+
});
|
package/src/build/index.ts
CHANGED
|
@@ -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
|
package/src/build/types.ts
CHANGED
|
@@ -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 {
|