@geekmidas/cli 0.0.26 → 0.1.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 (142) hide show
  1. package/FUNCTION_CRON_SUPPORT.md +266 -0
  2. package/README.md +21 -4
  3. package/dist/CronGenerator-ClbRcmz_.mjs +53 -0
  4. package/dist/CronGenerator-ClbRcmz_.mjs.map +1 -0
  5. package/dist/CronGenerator-Ctl4USy4.cjs +59 -0
  6. package/dist/CronGenerator-Ctl4USy4.cjs.map +1 -0
  7. package/dist/EndpointGenerator-Dj7AumHi.cjs +164 -0
  8. package/dist/EndpointGenerator-Dj7AumHi.cjs.map +1 -0
  9. package/dist/EndpointGenerator-uBA1ixUw.mjs +158 -0
  10. package/dist/EndpointGenerator-uBA1ixUw.mjs.map +1 -0
  11. package/dist/FunctionGenerator-DN681IUn.cjs +58 -0
  12. package/dist/FunctionGenerator-DN681IUn.cjs.map +1 -0
  13. package/dist/FunctionGenerator-crAa-JC7.mjs +52 -0
  14. package/dist/FunctionGenerator-crAa-JC7.mjs.map +1 -0
  15. package/dist/Generator-C3tYSTQY.cjs +47 -0
  16. package/dist/Generator-C3tYSTQY.cjs.map +1 -0
  17. package/dist/Generator-CDt4pB3W.mjs +41 -0
  18. package/dist/Generator-CDt4pB3W.mjs.map +1 -0
  19. package/dist/__tests__/config.spec.cjs +98 -0
  20. package/dist/__tests__/config.spec.cjs.map +1 -0
  21. package/dist/__tests__/config.spec.mjs +97 -0
  22. package/dist/__tests__/config.spec.mjs.map +1 -0
  23. package/dist/__tests__/test-helpers.cjs +14 -0
  24. package/dist/__tests__/test-helpers.mjs +4 -0
  25. package/dist/build/__tests__/index-new.spec.cjs +286 -0
  26. package/dist/build/__tests__/index-new.spec.cjs.map +1 -0
  27. package/dist/build/__tests__/index-new.spec.mjs +285 -0
  28. package/dist/build/__tests__/index-new.spec.mjs.map +1 -0
  29. package/dist/build/index.cjs +11 -0
  30. package/dist/build/index.mjs +11 -0
  31. package/dist/build/manifests.cjs +3 -0
  32. package/dist/build/manifests.mjs +3 -0
  33. package/dist/build/providerResolver.cjs +5 -0
  34. package/dist/build/providerResolver.mjs +3 -0
  35. package/dist/build/types.cjs +0 -0
  36. package/dist/build/types.mjs +0 -0
  37. package/dist/build-BZdwxCLW.mjs +64 -0
  38. package/dist/build-BZdwxCLW.mjs.map +1 -0
  39. package/dist/build-BfQFnU5-.cjs +70 -0
  40. package/dist/build-BfQFnU5-.cjs.map +1 -0
  41. package/dist/{chunk-CUT6urMc.cjs → chunk-CsX-DzYB.cjs} +12 -0
  42. package/dist/config-CXxYmz_o.mjs +30 -0
  43. package/dist/config-CXxYmz_o.mjs.map +1 -0
  44. package/dist/config-RcNESK0T.cjs +36 -0
  45. package/dist/config-RcNESK0T.cjs.map +1 -0
  46. package/dist/config.cjs +1 -1
  47. package/dist/config.mjs +1 -1
  48. package/dist/esm-9eeZntth.mjs +3777 -0
  49. package/dist/esm-9eeZntth.mjs.map +1 -0
  50. package/dist/esm-Crmo4h9t.cjs +4392 -0
  51. package/dist/esm-Crmo4h9t.cjs.map +1 -0
  52. package/dist/esm-CsJbr7gi.mjs +3 -0
  53. package/dist/esm-w09tAC4l.cjs +8 -0
  54. package/dist/generators/CronGenerator.cjs +4 -0
  55. package/dist/generators/CronGenerator.mjs +4 -0
  56. package/dist/generators/EndpointGenerator.cjs +4 -0
  57. package/dist/generators/EndpointGenerator.mjs +4 -0
  58. package/dist/generators/FunctionGenerator.cjs +4 -0
  59. package/dist/generators/FunctionGenerator.mjs +4 -0
  60. package/dist/generators/Generator.cjs +3 -0
  61. package/dist/generators/Generator.mjs +3 -0
  62. package/dist/generators/__tests__/CronGenerator.spec.cjs +216 -0
  63. package/dist/generators/__tests__/CronGenerator.spec.cjs.map +1 -0
  64. package/dist/generators/__tests__/CronGenerator.spec.mjs +215 -0
  65. package/dist/generators/__tests__/CronGenerator.spec.mjs.map +1 -0
  66. package/dist/generators/__tests__/EndpointGenerator.spec.cjs +182 -0
  67. package/dist/generators/__tests__/EndpointGenerator.spec.cjs.map +1 -0
  68. package/dist/generators/__tests__/EndpointGenerator.spec.mjs +181 -0
  69. package/dist/generators/__tests__/EndpointGenerator.spec.mjs.map +1 -0
  70. package/dist/generators/__tests__/FunctionGenerator.spec.cjs +152 -0
  71. package/dist/generators/__tests__/FunctionGenerator.spec.cjs.map +1 -0
  72. package/dist/generators/__tests__/FunctionGenerator.spec.mjs +151 -0
  73. package/dist/generators/__tests__/FunctionGenerator.spec.mjs.map +1 -0
  74. package/dist/generators/index.cjs +10 -0
  75. package/dist/generators/index.mjs +7 -0
  76. package/dist/generators-CsLujGXs.mjs +0 -0
  77. package/dist/generators-_pY7sHy1.cjs +0 -0
  78. package/dist/index.cjs +68 -26
  79. package/dist/index.cjs.map +1 -0
  80. package/dist/index.mjs +67 -25
  81. package/dist/index.mjs.map +1 -0
  82. package/dist/manifests-BTtfDMX8.cjs +26 -0
  83. package/dist/manifests-BTtfDMX8.cjs.map +1 -0
  84. package/dist/manifests-HX4z4kkz.mjs +20 -0
  85. package/dist/manifests-HX4z4kkz.mjs.map +1 -0
  86. package/dist/{openapi-CksVdkh2.mjs → openapi-BivnatiC.mjs} +8 -6
  87. package/dist/openapi-BivnatiC.mjs.map +1 -0
  88. package/dist/{openapi-D4QQJUPY.cjs → openapi-DW-qF3oW.cjs} +9 -7
  89. package/dist/openapi-DW-qF3oW.cjs.map +1 -0
  90. package/dist/{openapi-react-query-C1JLYUOs.cjs → openapi-react-query-J0BzBHhN.cjs} +4 -3
  91. package/dist/openapi-react-query-J0BzBHhN.cjs.map +1 -0
  92. package/dist/{openapi-react-query-DpT3XHFC.mjs → openapi-react-query-lgS7AVEz.mjs} +3 -2
  93. package/dist/openapi-react-query-lgS7AVEz.mjs.map +1 -0
  94. package/dist/openapi-react-query.cjs +1 -1
  95. package/dist/openapi-react-query.mjs +1 -1
  96. package/dist/openapi.cjs +4 -3
  97. package/dist/openapi.mjs +4 -3
  98. package/dist/providerResolver-B_TjNF0_.mjs +96 -0
  99. package/dist/providerResolver-B_TjNF0_.mjs.map +1 -0
  100. package/dist/providerResolver-Cs-0YCaP.cjs +114 -0
  101. package/dist/providerResolver-Cs-0YCaP.cjs.map +1 -0
  102. package/dist/test-helpers-ARd8GDgx.cjs +199 -0
  103. package/dist/test-helpers-ARd8GDgx.cjs.map +1 -0
  104. package/dist/test-helpers-DdVBk23F.mjs +133 -0
  105. package/dist/test-helpers-DdVBk23F.mjs.map +1 -0
  106. package/examples/cron-example.ts +45 -0
  107. package/examples/function-example.ts +40 -0
  108. package/examples/gkm.config.json +22 -0
  109. package/examples/gkm.minimal.config.json +7 -0
  110. package/examples/gkm.production.config.json +27 -0
  111. package/package.json +35 -14
  112. package/src/__tests__/config.spec.ts +110 -0
  113. package/src/__tests__/test-helpers.ts +178 -0
  114. package/src/build/__tests__/index-new.spec.ts +578 -0
  115. package/src/build/index.ts +136 -0
  116. package/src/build/manifests.ts +32 -0
  117. package/src/build/providerResolver.ts +184 -0
  118. package/src/build/types.ts +37 -0
  119. package/src/config.ts +14 -6
  120. package/src/generators/CronGenerator.ts +97 -0
  121. package/src/generators/EndpointGenerator.ts +290 -0
  122. package/src/generators/FunctionGenerator.ts +96 -0
  123. package/src/generators/Generator.ts +95 -0
  124. package/src/generators/__tests__/CronGenerator.spec.ts +445 -0
  125. package/src/generators/__tests__/EndpointGenerator.spec.ts +372 -0
  126. package/src/generators/__tests__/FunctionGenerator.spec.ts +257 -0
  127. package/src/generators/index.ts +8 -0
  128. package/src/index.ts +57 -22
  129. package/src/openapi.ts +4 -3
  130. package/src/types.ts +73 -2
  131. package/dist/build-BTggTCYL.cjs +0 -176
  132. package/dist/build-Ca4P6_lY.mjs +0 -170
  133. package/dist/build.cjs +0 -5
  134. package/dist/build.mjs +0 -5
  135. package/dist/config-BNqUMsvc.cjs +0 -24
  136. package/dist/config-BciAdY6_.mjs +0 -18
  137. package/dist/loadEndpoints-BBIavB9h.cjs +0 -37
  138. package/dist/loadEndpoints-DAZ53Og2.mjs +0 -31
  139. package/dist/loadEndpoints.cjs +0 -3
  140. package/dist/loadEndpoints.mjs +0 -3
  141. package/src/build.ts +0 -305
  142. package/src/loadEndpoints.ts +0 -48
@@ -1,31 +0,0 @@
1
- import { Endpoint } from "@geekmidas/api/server";
2
- import fg from "fast-glob";
3
-
4
- //#region src/loadEndpoints.ts
5
- async function loadEndpoints(routes) {
6
- const logger = console;
7
- const files = await fg.stream(routes, {
8
- cwd: process.cwd(),
9
- absolute: true
10
- });
11
- const endpoints = [];
12
- for await (const f of files) try {
13
- const file = f.toString();
14
- const module = await import(file);
15
- for (const [exportName, exportValue] of Object.entries(module)) if (Endpoint.isEndpoint(exportValue)) {
16
- exportValue.operationId = exportName;
17
- endpoints.push({
18
- name: exportName,
19
- endpoint: exportValue,
20
- file
21
- });
22
- }
23
- } catch (error) {
24
- logger.warn(`Failed to load ${f}:`, error.message);
25
- throw new Error("Failed to load endpoints. Please check the logs for details.");
26
- }
27
- return endpoints;
28
- }
29
-
30
- //#endregion
31
- export { loadEndpoints };
@@ -1,3 +0,0 @@
1
- const require_loadEndpoints = require('./loadEndpoints-BBIavB9h.cjs');
2
-
3
- exports.loadEndpoints = require_loadEndpoints.loadEndpoints;
@@ -1,3 +0,0 @@
1
- import { loadEndpoints } from "./loadEndpoints-DAZ53Og2.mjs";
2
-
3
- export { loadEndpoints };
package/src/build.ts DELETED
@@ -1,305 +0,0 @@
1
- import { mkdir, writeFile } from 'node:fs/promises';
2
- import { dirname, join, relative } from 'path';
3
- import { loadConfig } from './config.js';
4
- import { loadEndpoints } from './loadEndpoints.js';
5
- import type {
6
- BuildOptions,
7
- Provider,
8
- RouteInfo,
9
- RoutesManifest,
10
- } from './types.js';
11
-
12
- const logger = console;
13
- export async function buildCommand(options: BuildOptions): Promise<void> {
14
- logger.log(`Building with providers: ${options.providers.join(', ')}`);
15
-
16
- const config = await loadConfig();
17
- logger.log(`Loading routes from: ${config.routes}`);
18
- logger.log(`Using envParser: ${config.envParser}`);
19
-
20
- // Parse envParser configuration
21
- const [envParserPath, envParserName] = config.envParser.split('#');
22
- const envParserImportPattern = !envParserName
23
- ? 'envParser'
24
- : envParserName === 'envParser'
25
- ? '{ envParser }'
26
- : `{ ${envParserName} as envParser }`;
27
-
28
- // Parse logger configuration
29
- const [loggerPath, loggerName] = config.logger.split('#');
30
- const loggerImportPattern = !loggerName
31
- ? 'logger'
32
- : loggerName === 'logger'
33
- ? '{ logger }'
34
- : `{ ${loggerName} as logger }`;
35
-
36
- // Load all endpoints using the refactored function
37
- const loadedEndpoints = await loadEndpoints(config.routes);
38
-
39
- if (loadedEndpoints.length === 0) {
40
- logger.log('No endpoints found to process');
41
- return;
42
- }
43
-
44
- const allEndpoints = loadedEndpoints.map(({ name, endpoint, file }) => {
45
- const routeInfo: RouteInfo = {
46
- path: endpoint._path,
47
- method: endpoint.method,
48
- handler: '', // Will be filled in later
49
- };
50
-
51
- logger.log(
52
- `Found endpoint: ${name} - ${routeInfo.method} ${routeInfo.path}`,
53
- );
54
-
55
- return {
56
- file: relative(process.cwd(), file),
57
- exportName: name,
58
- endpoint,
59
- routeInfo,
60
- };
61
- });
62
-
63
- // Process each provider
64
- for (const provider of options.providers) {
65
- const routes: RouteInfo[] = [];
66
- const outputDir = join(process.cwd(), '.gkm', provider);
67
-
68
- // Ensure output directory exists
69
- await mkdir(outputDir, { recursive: true });
70
-
71
- logger.log(`\nGenerating handlers for provider: ${provider}`);
72
-
73
- // Generate handlers based on provider
74
- if (provider === 'server') {
75
- // Generate single server file with all endpoints
76
- const serverFile = await generateServerFile(
77
- outputDir,
78
- allEndpoints,
79
- envParserPath,
80
- envParserImportPattern,
81
- loggerPath,
82
- loggerImportPattern,
83
- options.enableOpenApi || false,
84
- );
85
-
86
- routes.push({
87
- path: '*',
88
- method: 'ALL',
89
- handler: relative(process.cwd(), serverFile),
90
- });
91
-
92
- logger.log(
93
- `Generated server app with ${allEndpoints.length} endpoints${options.enableOpenApi ? ' (OpenAPI enabled)' : ''}`,
94
- );
95
- } else {
96
- // Generate individual handler files for AWS providers
97
- for (const { file, exportName, routeInfo } of allEndpoints) {
98
- const handlerFile = await generateHandlerFile(
99
- outputDir,
100
- file,
101
- exportName,
102
- provider,
103
- routeInfo,
104
- envParserPath,
105
- envParserImportPattern,
106
- );
107
-
108
- routes.push({
109
- ...routeInfo,
110
- handler: relative(process.cwd(), handlerFile).replace(
111
- /\.ts$/,
112
- '.handler',
113
- ),
114
- });
115
-
116
- logger.log(
117
- `Generated handler for ${routeInfo.method} ${routeInfo.path}`,
118
- );
119
- }
120
- }
121
-
122
- // Generate routes.json
123
- const manifest: RoutesManifest = { routes };
124
- const manifestPath = join(outputDir, 'routes.json');
125
- await writeFile(manifestPath, JSON.stringify(manifest, null, 2));
126
-
127
- logger.log(
128
- `Generated ${routes.length} handlers in ${relative(process.cwd(), outputDir)}`,
129
- );
130
- logger.log(`Routes manifest: ${relative(process.cwd(), manifestPath)}`);
131
- }
132
- }
133
-
134
- async function generateServerFile(
135
- outputDir: string,
136
- endpoints: Array<{
137
- file: string;
138
- exportName: string;
139
- endpoint: any;
140
- routeInfo: RouteInfo;
141
- }>,
142
- envParserPath: string,
143
- envParserImportPattern: string,
144
- loggerPath: string,
145
- loggerImportPattern: string,
146
- enableOpenApi: boolean,
147
- ): Promise<string> {
148
- const serverFileName = 'app.ts';
149
- const serverPath = join(outputDir, serverFileName);
150
-
151
- // Group imports by file
152
- const importsByFile = new Map<string, string[]>();
153
-
154
- for (const { file, exportName } of endpoints) {
155
- const relativePath = relative(dirname(serverPath), file);
156
- const importPath = relativePath.replace(/\.ts$/, '.js');
157
-
158
- if (!importsByFile.has(importPath)) {
159
- importsByFile.set(importPath, []);
160
- }
161
- importsByFile.get(importPath)!.push(exportName);
162
- }
163
-
164
- const relativeEnvParserPath = relative(dirname(serverPath), envParserPath);
165
- const relativeLoggerPath = relative(dirname(serverPath), loggerPath);
166
-
167
- // Generate import statements
168
- const imports = Array.from(importsByFile.entries())
169
- .map(
170
- ([importPath, exports]) =>
171
- `import { ${exports.join(', ')} } from '${importPath}';`,
172
- )
173
- .join('\n');
174
-
175
- const allExportNames = endpoints.map(({ exportName }) => exportName);
176
-
177
- const content = `import { HonoEndpoint } from '@geekmidas/api/hono';
178
- import { Endpoint } from '@geekmidas/api/server';
179
- import { ServiceDiscovery } from '@geekmidas/api/services';
180
- import { Hono } from 'hono';
181
- import ${envParserImportPattern} from '${relativeEnvParserPath}';
182
- import ${loggerImportPattern} from '${relativeLoggerPath}';
183
- ${imports}
184
-
185
- export function createApp(app?: Hono, enableOpenApi: boolean = ${enableOpenApi}): Hono {
186
- const honoApp = app || new Hono();
187
-
188
- const endpoints: Endpoint<any, any, any, any, any, any, any>[] = [
189
- ${allExportNames.join(',\n ')}
190
- ];
191
-
192
- const serviceDiscovery = ServiceDiscovery.getInstance(
193
- logger,
194
- envParser
195
- );
196
-
197
- // Configure OpenAPI options based on enableOpenApi flag
198
- const openApiOptions: any = enableOpenApi ? {
199
- docsPath: '/docs',
200
- openApiOptions: {
201
- title: 'API Documentation',
202
- version: '1.0.0',
203
- description: 'Generated API documentation'
204
- }
205
- } : { docsPath: false };
206
-
207
- HonoEndpoint.addRoutes(endpoints, serviceDiscovery, honoApp, openApiOptions);
208
-
209
- return honoApp;
210
- }
211
-
212
- // Default export for convenience
213
- export default createApp;
214
- `;
215
-
216
- await writeFile(serverPath, content);
217
- return serverPath;
218
- }
219
-
220
- async function generateHandlerFile(
221
- outputDir: string,
222
- sourceFile: string,
223
- exportName: string,
224
- provider: Provider,
225
- _routeInfo: RouteInfo,
226
- envParserPath: string,
227
- envParserImportPattern: string,
228
- ): Promise<string> {
229
- const handlerFileName = `${exportName}.ts`;
230
- const handlerPath = join(outputDir, handlerFileName);
231
-
232
- const relativePath = relative(dirname(handlerPath), sourceFile);
233
- const importPath = relativePath.replace(/\.ts$/, '.js');
234
-
235
- const relativeEnvParserPath = relative(dirname(handlerPath), envParserPath);
236
-
237
- let content: string;
238
-
239
- switch (provider) {
240
- case 'aws-apigatewayv1':
241
- content = generateAWSApiGatewayV1Handler(
242
- importPath,
243
- exportName,
244
- relativeEnvParserPath,
245
- envParserImportPattern,
246
- );
247
- break;
248
- case 'aws-apigatewayv2':
249
- content = generateAWSApiGatewayV2Handler(
250
- importPath,
251
- exportName,
252
- relativeEnvParserPath,
253
- envParserImportPattern,
254
- );
255
- break;
256
- case 'server':
257
- content = generateServerHandler(importPath, exportName);
258
- break;
259
- default:
260
- throw new Error(`Unsupported provider: ${provider}`);
261
- }
262
-
263
- await writeFile(handlerPath, content);
264
- return handlerPath;
265
- }
266
-
267
- function generateAWSApiGatewayV1Handler(
268
- importPath: string,
269
- exportName: string,
270
- envParserPath: string,
271
- envParserImportPattern: string,
272
- ): string {
273
- return `import { AmazonApiGatewayV1Endpoint } from '@geekmidas/api/aws-apigateway';
274
- import { ${exportName} } from '${importPath}';
275
- import ${envParserImportPattern} from '${envParserPath}';
276
-
277
- const adapter = new AmazonApiGatewayV1Endpoint(envParser, ${exportName});
278
-
279
- export const handler = adapter.handler;
280
- `;
281
- }
282
-
283
- function generateAWSApiGatewayV2Handler(
284
- importPath: string,
285
- exportName: string,
286
- envParserPath: string,
287
- envParserImportPattern: string,
288
- ): string {
289
- return `import { AmazonApiGatewayV2Endpoint } from '@geekmidas/api/aws-apigateway';
290
- import { ${exportName} } from '${importPath}';
291
- import ${envParserImportPattern} from '${envParserPath}';
292
-
293
- const adapter = new AmazonApiGatewayV2Endpoint(envParser, ${exportName});
294
-
295
- export const handler = adapter.handler;
296
- `;
297
- }
298
-
299
- function generateServerHandler(importPath: string, exportName: string): string {
300
- return `import { ${exportName} } from '${importPath}';
301
-
302
- // Server handler - implement based on your server framework
303
- export const handler = ${exportName};
304
- `;
305
- }
@@ -1,48 +0,0 @@
1
- import { Endpoint } from '@geekmidas/api/server';
2
- import fg from 'fast-glob';
3
- import type { Routes } from './types';
4
-
5
- export interface LoadedEndpoint {
6
- name: string;
7
- endpoint: Endpoint<any, any, any, any, any, any>;
8
- file: string;
9
- }
10
-
11
- export async function loadEndpoints(routes: Routes): Promise<LoadedEndpoint[]> {
12
- const logger = console;
13
-
14
- // Find all endpoint files
15
- const files = await fg.stream(routes, {
16
- cwd: process.cwd(),
17
- absolute: true,
18
- });
19
-
20
- // Load endpoints
21
- const endpoints: LoadedEndpoint[] = [];
22
-
23
- for await (const f of files) {
24
- try {
25
- const file = f.toString();
26
- const module = await import(file);
27
-
28
- // Check all exports for endpoints
29
- for (const [exportName, exportValue] of Object.entries(module)) {
30
- if (Endpoint.isEndpoint(exportValue)) {
31
- exportValue.operationId = exportName;
32
- endpoints.push({
33
- name: exportName,
34
- endpoint: exportValue as Endpoint<any, any, any, any, any, any>,
35
- file,
36
- });
37
- }
38
- }
39
- } catch (error) {
40
- logger.warn(`Failed to load ${f}:`, (error as Error).message);
41
- throw new Error(
42
- 'Failed to load endpoints. Please check the logs for details.',
43
- );
44
- }
45
- }
46
-
47
- return endpoints;
48
- }