@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
@@ -0,0 +1,158 @@
1
+ import { ConstructGenerator } from "./Generator-CDt4pB3W.mjs";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { dirname, join, relative } from "node:path";
4
+ import { Endpoint } from "@geekmidas/api/server";
5
+
6
+ //#region src/generators/EndpointGenerator.ts
7
+ var EndpointGenerator = class extends ConstructGenerator {
8
+ isConstruct(value) {
9
+ return Endpoint.isEndpoint(value);
10
+ }
11
+ async build(context, constructs, outputDir, options) {
12
+ const provider = options?.provider || "aws-apigatewayv2";
13
+ const enableOpenApi = options?.enableOpenApi || false;
14
+ const logger = console;
15
+ const routes = [];
16
+ if (constructs.length === 0) return routes;
17
+ if (provider === "server") {
18
+ const serverFile = await this.generateServerFile(outputDir, constructs, context, enableOpenApi);
19
+ routes.push({
20
+ path: "*",
21
+ method: "ALL",
22
+ handler: relative(process.cwd(), serverFile)
23
+ });
24
+ logger.log(`Generated server app with ${constructs.length} endpoints${enableOpenApi ? " (OpenAPI enabled)" : ""}`);
25
+ } else if (provider === "aws-lambda") {
26
+ const routesDir = join(outputDir, "routes");
27
+ await mkdir(routesDir, { recursive: true });
28
+ for (const { key, construct, path } of constructs) {
29
+ const handlerFile = await this.generateHandlerFile(routesDir, path.relative, key, "aws-apigatewayv2", construct, context);
30
+ const routeInfo = {
31
+ path: construct._path,
32
+ method: construct.method,
33
+ handler: relative(process.cwd(), handlerFile).replace(/\.ts$/, ".handler")
34
+ };
35
+ routes.push(routeInfo);
36
+ logger.log(`Generated handler for ${routeInfo.method} ${routeInfo.path}`);
37
+ }
38
+ } else for (const { key, construct, path } of constructs) {
39
+ const handlerFile = await this.generateHandlerFile(outputDir, path.relative, key, provider, construct, context);
40
+ const routeInfo = {
41
+ path: construct._path,
42
+ method: construct.method,
43
+ handler: relative(process.cwd(), handlerFile).replace(/\.ts$/, ".handler")
44
+ };
45
+ routes.push(routeInfo);
46
+ logger.log(`Generated handler for ${routeInfo.method} ${routeInfo.path}`);
47
+ }
48
+ return routes;
49
+ }
50
+ async generateHandlerFile(outputDir, sourceFile, exportName, provider, _endpoint, context) {
51
+ const handlerFileName = `${exportName}.ts`;
52
+ const handlerPath = join(outputDir, handlerFileName);
53
+ const relativePath = relative(dirname(handlerPath), sourceFile);
54
+ const importPath = relativePath.replace(/\.ts$/, ".js");
55
+ const relativeEnvParserPath = relative(dirname(handlerPath), context.envParserPath);
56
+ let content;
57
+ switch (provider) {
58
+ case "aws-apigatewayv1":
59
+ content = this.generateAWSApiGatewayV1Handler(importPath, exportName, relativeEnvParserPath, context.envParserImportPattern);
60
+ break;
61
+ case "aws-apigatewayv2":
62
+ content = this.generateAWSApiGatewayV2Handler(importPath, exportName, relativeEnvParserPath, context.envParserImportPattern);
63
+ break;
64
+ case "server":
65
+ content = this.generateServerHandler(importPath, exportName);
66
+ break;
67
+ default: throw new Error(`Unsupported provider: ${provider}`);
68
+ }
69
+ await writeFile(handlerPath, content);
70
+ return handlerPath;
71
+ }
72
+ async generateServerFile(outputDir, endpoints, context, enableOpenApi) {
73
+ const serverFileName = "app.ts";
74
+ const serverPath = join(outputDir, serverFileName);
75
+ const importsByFile = /* @__PURE__ */ new Map();
76
+ for (const { path, key } of endpoints) {
77
+ const relativePath = relative(dirname(serverPath), path.relative);
78
+ const importPath = relativePath.replace(/\.ts$/, ".js");
79
+ if (!importsByFile.has(importPath)) importsByFile.set(importPath, []);
80
+ importsByFile.get(importPath).push(key);
81
+ }
82
+ const relativeEnvParserPath = relative(dirname(serverPath), context.envParserPath);
83
+ const relativeLoggerPath = relative(dirname(serverPath), context.loggerPath);
84
+ const imports = Array.from(importsByFile.entries()).map(([importPath, exports]) => `import { ${exports.join(", ")} } from '${importPath}';`).join("\n");
85
+ const allExportNames = endpoints.map(({ key }) => key);
86
+ const content = `import { HonoEndpoint } from '@geekmidas/api/hono';
87
+ import { Endpoint } from '@geekmidas/api/server';
88
+ import { ServiceDiscovery } from '@geekmidas/api/services';
89
+ import { Hono } from 'hono';
90
+ import ${context.envParserImportPattern} from '${relativeEnvParserPath}';
91
+ import ${context.loggerImportPattern} from '${relativeLoggerPath}';
92
+ ${imports}
93
+
94
+ export function createApp(app?: Hono, enableOpenApi: boolean = ${enableOpenApi}): Hono {
95
+ const honoApp = app || new Hono();
96
+
97
+ const endpoints: Endpoint<any, any, any, any, any, any, any>[] = [
98
+ ${allExportNames.join(",\n ")}
99
+ ];
100
+
101
+ const serviceDiscovery = ServiceDiscovery.getInstance(
102
+ logger,
103
+ envParser
104
+ );
105
+
106
+ // Configure OpenAPI options based on enableOpenApi flag
107
+ const openApiOptions: any = enableOpenApi ? {
108
+ docsPath: '/docs',
109
+ openApiOptions: {
110
+ title: 'API Documentation',
111
+ version: '1.0.0',
112
+ description: 'Generated API documentation'
113
+ }
114
+ } : { docsPath: false };
115
+
116
+ HonoEndpoint.addRoutes(endpoints, serviceDiscovery, honoApp, openApiOptions);
117
+
118
+ return honoApp;
119
+ }
120
+
121
+ // Default export for convenience
122
+ export default createApp;
123
+ `;
124
+ await writeFile(serverPath, content);
125
+ return serverPath;
126
+ }
127
+ generateAWSApiGatewayV1Handler(importPath, exportName, envParserPath, envParserImportPattern) {
128
+ return `import { AmazonApiGatewayV1Endpoint } from '@geekmidas/api/aws-apigateway';
129
+ import { ${exportName} } from '${importPath}';
130
+ import ${envParserImportPattern} from '${envParserPath}';
131
+
132
+ const adapter = new AmazonApiGatewayV1Endpoint(envParser, ${exportName});
133
+
134
+ export const handler = adapter.handler;
135
+ `;
136
+ }
137
+ generateAWSApiGatewayV2Handler(importPath, exportName, envParserPath, envParserImportPattern) {
138
+ return `import { AmazonApiGatewayV2Endpoint } from '@geekmidas/api/aws-apigateway';
139
+ import { ${exportName} } from '${importPath}';
140
+ import ${envParserImportPattern} from '${envParserPath}';
141
+
142
+ const adapter = new AmazonApiGatewayV2Endpoint(envParser, ${exportName});
143
+
144
+ export const handler = adapter.handler;
145
+ `;
146
+ }
147
+ generateServerHandler(importPath, exportName) {
148
+ return `import { ${exportName} } from '${importPath}';
149
+
150
+ // Server handler - implement based on your server framework
151
+ export const handler = ${exportName};
152
+ `;
153
+ }
154
+ };
155
+
156
+ //#endregion
157
+ export { EndpointGenerator };
158
+ //# sourceMappingURL=EndpointGenerator-uBA1ixUw.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EndpointGenerator-uBA1ixUw.mjs","names":["value: any","context: BuildContext","constructs: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[]","outputDir: string","options?: GeneratorOptions","routes: RouteInfo[]","routeInfo: RouteInfo","sourceFile: string","exportName: string","provider: LegacyProvider","_endpoint: Endpoint<any, any, any, any, any, any>","content: string","endpoints: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[]","enableOpenApi: boolean","importPath: string","envParserPath: string","envParserImportPattern: string"],"sources":["../src/generators/EndpointGenerator.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative } from 'node:path';\nimport { Endpoint } from '@geekmidas/api/server';\nimport type { BuildContext } from '../build/types';\nimport type { LegacyProvider, RouteInfo } from '../types';\nimport {\n ConstructGenerator,\n type GeneratedConstruct,\n type GeneratorOptions,\n} from './Generator';\n\nexport class EndpointGenerator extends ConstructGenerator<\n Endpoint<any, any, any, any, any, any>,\n RouteInfo[]\n> {\n isConstruct(value: any): value is Endpoint<any, any, any, any, any, any> {\n return Endpoint.isEndpoint(value);\n }\n\n async build(\n context: BuildContext,\n constructs: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[],\n outputDir: string,\n options?: GeneratorOptions,\n ): Promise<RouteInfo[]> {\n const provider = options?.provider || 'aws-apigatewayv2';\n const enableOpenApi = options?.enableOpenApi || false;\n const logger = console;\n const routes: RouteInfo[] = [];\n\n if (constructs.length === 0) {\n return routes;\n }\n\n if (provider === 'server') {\n // Generate single server file with all endpoints\n const serverFile = await this.generateServerFile(\n outputDir,\n constructs,\n context,\n enableOpenApi,\n );\n\n routes.push({\n path: '*',\n method: 'ALL',\n handler: relative(process.cwd(), serverFile),\n });\n\n logger.log(\n `Generated server app with ${constructs.length} endpoints${enableOpenApi ? ' (OpenAPI enabled)' : ''}`,\n );\n } else if (provider === 'aws-lambda') {\n // For aws-lambda, create routes subdirectory\n const routesDir = join(outputDir, 'routes');\n await mkdir(routesDir, { recursive: true });\n\n // Generate individual handlers for API Gateway routes\n for (const { key, construct, path } of constructs) {\n const handlerFile = await this.generateHandlerFile(\n routesDir,\n path.relative,\n key,\n 'aws-apigatewayv2',\n construct,\n context,\n );\n\n const routeInfo: RouteInfo = {\n path: construct._path,\n method: construct.method,\n handler: relative(process.cwd(), handlerFile).replace(\n /\\.ts$/,\n '.handler',\n ),\n };\n\n routes.push(routeInfo);\n logger.log(\n `Generated handler for ${routeInfo.method} ${routeInfo.path}`,\n );\n }\n } else {\n // Generate individual handler files for AWS API Gateway providers\n for (const { key, construct, path } of constructs) {\n const handlerFile = await this.generateHandlerFile(\n outputDir,\n path.relative,\n key,\n provider,\n construct,\n context,\n );\n\n const routeInfo: RouteInfo = {\n path: construct._path,\n method: construct.method,\n handler: relative(process.cwd(), handlerFile).replace(\n /\\.ts$/,\n '.handler',\n ),\n };\n\n routes.push(routeInfo);\n logger.log(\n `Generated handler for ${routeInfo.method} ${routeInfo.path}`,\n );\n }\n }\n\n return routes;\n }\n\n private async generateHandlerFile(\n outputDir: string,\n sourceFile: string,\n exportName: string,\n provider: LegacyProvider,\n _endpoint: Endpoint<any, any, any, any, any, any>,\n context: BuildContext,\n ): Promise<string> {\n const handlerFileName = `${exportName}.ts`;\n const handlerPath = join(outputDir, handlerFileName);\n\n const relativePath = relative(dirname(handlerPath), sourceFile);\n const importPath = relativePath.replace(/\\.ts$/, '.js');\n\n const relativeEnvParserPath = relative(\n dirname(handlerPath),\n context.envParserPath,\n );\n\n let content: string;\n\n switch (provider) {\n case 'aws-apigatewayv1':\n content = this.generateAWSApiGatewayV1Handler(\n importPath,\n exportName,\n relativeEnvParserPath,\n context.envParserImportPattern,\n );\n break;\n case 'aws-apigatewayv2':\n content = this.generateAWSApiGatewayV2Handler(\n importPath,\n exportName,\n relativeEnvParserPath,\n context.envParserImportPattern,\n );\n break;\n case 'server':\n content = this.generateServerHandler(importPath, exportName);\n break;\n default:\n throw new Error(`Unsupported provider: ${provider}`);\n }\n\n await writeFile(handlerPath, content);\n return handlerPath;\n }\n\n private async generateServerFile(\n outputDir: string,\n endpoints: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[],\n context: BuildContext,\n enableOpenApi: boolean,\n ): Promise<string> {\n const serverFileName = 'app.ts';\n const serverPath = join(outputDir, serverFileName);\n\n // Group imports by file\n const importsByFile = new Map<string, string[]>();\n\n for (const { path, key } of endpoints) {\n const relativePath = relative(dirname(serverPath), path.relative);\n const importPath = relativePath.replace(/\\.ts$/, '.js');\n\n if (!importsByFile.has(importPath)) {\n importsByFile.set(importPath, []);\n }\n importsByFile.get(importPath)!.push(key);\n }\n\n const relativeEnvParserPath = relative(\n dirname(serverPath),\n context.envParserPath,\n );\n const relativeLoggerPath = relative(\n dirname(serverPath),\n context.loggerPath,\n );\n\n // Generate import statements\n const imports = Array.from(importsByFile.entries())\n .map(\n ([importPath, exports]) =>\n `import { ${exports.join(', ')} } from '${importPath}';`,\n )\n .join('\\n');\n\n const allExportNames = endpoints.map(({ key }) => key);\n\n const content = `import { HonoEndpoint } from '@geekmidas/api/hono';\nimport { Endpoint } from '@geekmidas/api/server';\nimport { ServiceDiscovery } from '@geekmidas/api/services';\nimport { Hono } from 'hono';\nimport ${context.envParserImportPattern} from '${relativeEnvParserPath}';\nimport ${context.loggerImportPattern} from '${relativeLoggerPath}';\n${imports}\n\nexport function createApp(app?: Hono, enableOpenApi: boolean = ${enableOpenApi}): Hono {\n const honoApp = app || new Hono();\n \n const endpoints: Endpoint<any, any, any, any, any, any, any>[] = [\n ${allExportNames.join(',\\n ')}\n ];\n\n const serviceDiscovery = ServiceDiscovery.getInstance(\n logger,\n envParser\n );\n\n // Configure OpenAPI options based on enableOpenApi flag\n const openApiOptions: any = enableOpenApi ? {\n docsPath: '/docs',\n openApiOptions: {\n title: 'API Documentation',\n version: '1.0.0',\n description: 'Generated API documentation'\n }\n } : { docsPath: false };\n\n HonoEndpoint.addRoutes(endpoints, serviceDiscovery, honoApp, openApiOptions);\n\n return honoApp;\n}\n\n// Default export for convenience\nexport default createApp;\n`;\n\n await writeFile(serverPath, content);\n\n return serverPath;\n }\n\n private generateAWSApiGatewayV1Handler(\n importPath: string,\n exportName: string,\n envParserPath: string,\n envParserImportPattern: string,\n ): string {\n return `import { AmazonApiGatewayV1Endpoint } from '@geekmidas/api/aws-apigateway';\nimport { ${exportName} } from '${importPath}';\nimport ${envParserImportPattern} from '${envParserPath}';\n\nconst adapter = new AmazonApiGatewayV1Endpoint(envParser, ${exportName});\n\nexport const handler = adapter.handler;\n`;\n }\n\n private generateAWSApiGatewayV2Handler(\n importPath: string,\n exportName: string,\n envParserPath: string,\n envParserImportPattern: string,\n ): string {\n return `import { AmazonApiGatewayV2Endpoint } from '@geekmidas/api/aws-apigateway';\nimport { ${exportName} } from '${importPath}';\nimport ${envParserImportPattern} from '${envParserPath}';\n\nconst adapter = new AmazonApiGatewayV2Endpoint(envParser, ${exportName});\n\nexport const handler = adapter.handler;\n`;\n }\n\n private generateServerHandler(\n importPath: string,\n exportName: string,\n ): string {\n return `import { ${exportName} } from '${importPath}';\n\n// Server handler - implement based on your server framework\nexport const handler = ${exportName};\n`;\n }\n}\n"],"mappings":";;;;;;AAWA,IAAa,oBAAb,cAAuC,mBAGrC;CACA,YAAYA,OAA6D;AACvE,SAAO,SAAS,WAAW,MAAM;CAClC;CAED,MAAM,MACJC,SACAC,YACAC,WACAC,SACsB;EACtB,MAAM,WAAW,SAAS,YAAY;EACtC,MAAM,gBAAgB,SAAS,iBAAiB;EAChD,MAAM,SAAS;EACf,MAAMC,SAAsB,CAAE;AAE9B,MAAI,WAAW,WAAW,EACxB,QAAO;AAGT,MAAI,aAAa,UAAU;GAEzB,MAAM,aAAa,MAAM,KAAK,mBAC5B,WACA,YACA,SACA,cACD;AAED,UAAO,KAAK;IACV,MAAM;IACN,QAAQ;IACR,SAAS,SAAS,QAAQ,KAAK,EAAE,WAAW;GAC7C,EAAC;AAEF,UAAO,KACJ,4BAA4B,WAAW,OAAO,YAAY,gBAAgB,uBAAuB,GAAG,EACtG;EACF,WAAU,aAAa,cAAc;GAEpC,MAAM,YAAY,KAAK,WAAW,SAAS;AAC3C,SAAM,MAAM,WAAW,EAAE,WAAW,KAAM,EAAC;AAG3C,QAAK,MAAM,EAAE,KAAK,WAAW,MAAM,IAAI,YAAY;IACjD,MAAM,cAAc,MAAM,KAAK,oBAC7B,WACA,KAAK,UACL,KACA,oBACA,WACA,QACD;IAED,MAAMC,YAAuB;KAC3B,MAAM,UAAU;KAChB,QAAQ,UAAU;KAClB,SAAS,SAAS,QAAQ,KAAK,EAAE,YAAY,CAAC,QAC5C,SACA,WACD;IACF;AAED,WAAO,KAAK,UAAU;AACtB,WAAO,KACJ,wBAAwB,UAAU,OAAO,GAAG,UAAU,KAAK,EAC7D;GACF;EACF,MAEC,MAAK,MAAM,EAAE,KAAK,WAAW,MAAM,IAAI,YAAY;GACjD,MAAM,cAAc,MAAM,KAAK,oBAC7B,WACA,KAAK,UACL,KACA,UACA,WACA,QACD;GAED,MAAMA,YAAuB;IAC3B,MAAM,UAAU;IAChB,QAAQ,UAAU;IAClB,SAAS,SAAS,QAAQ,KAAK,EAAE,YAAY,CAAC,QAC5C,SACA,WACD;GACF;AAED,UAAO,KAAK,UAAU;AACtB,UAAO,KACJ,wBAAwB,UAAU,OAAO,GAAG,UAAU,KAAK,EAC7D;EACF;AAGH,SAAO;CACR;CAED,MAAc,oBACZH,WACAI,YACAC,YACAC,UACAC,WACAT,SACiB;EACjB,MAAM,mBAAmB,EAAE,WAAW;EACtC,MAAM,cAAc,KAAK,WAAW,gBAAgB;EAEpD,MAAM,eAAe,SAAS,QAAQ,YAAY,EAAE,WAAW;EAC/D,MAAM,aAAa,aAAa,QAAQ,SAAS,MAAM;EAEvD,MAAM,wBAAwB,SAC5B,QAAQ,YAAY,EACpB,QAAQ,cACT;EAED,IAAIU;AAEJ,UAAQ,UAAR;GACE,KAAK;AACH,cAAU,KAAK,+BACb,YACA,YACA,uBACA,QAAQ,uBACT;AACD;GACF,KAAK;AACH,cAAU,KAAK,+BACb,YACA,YACA,uBACA,QAAQ,uBACT;AACD;GACF,KAAK;AACH,cAAU,KAAK,sBAAsB,YAAY,WAAW;AAC5D;GACF,QACE,OAAM,IAAI,OAAO,wBAAwB,SAAS;EACrD;AAED,QAAM,UAAU,aAAa,QAAQ;AACrC,SAAO;CACR;CAED,MAAc,mBACZR,WACAS,WACAX,SACAY,eACiB;EACjB,MAAM,iBAAiB;EACvB,MAAM,aAAa,KAAK,WAAW,eAAe;EAGlD,MAAM,gCAAgB,IAAI;AAE1B,OAAK,MAAM,EAAE,MAAM,KAAK,IAAI,WAAW;GACrC,MAAM,eAAe,SAAS,QAAQ,WAAW,EAAE,KAAK,SAAS;GACjE,MAAM,aAAa,aAAa,QAAQ,SAAS,MAAM;AAEvD,QAAK,cAAc,IAAI,WAAW,CAChC,eAAc,IAAI,YAAY,CAAE,EAAC;AAEnC,iBAAc,IAAI,WAAW,CAAE,KAAK,IAAI;EACzC;EAED,MAAM,wBAAwB,SAC5B,QAAQ,WAAW,EACnB,QAAQ,cACT;EACD,MAAM,qBAAqB,SACzB,QAAQ,WAAW,EACnB,QAAQ,WACT;EAGD,MAAM,UAAU,MAAM,KAAK,cAAc,SAAS,CAAC,CAChD,IACC,CAAC,CAAC,YAAY,QAAQ,MACnB,WAAW,QAAQ,KAAK,KAAK,CAAC,WAAW,WAAW,IACxD,CACA,KAAK,KAAK;EAEb,MAAM,iBAAiB,UAAU,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI;EAEtD,MAAM,WAAW;;;;SAIZ,QAAQ,uBAAuB,SAAS,sBAAsB;SAC9D,QAAQ,oBAAoB,SAAS,mBAAmB;EAC/D,QAAQ;;iEAEuD,cAAc;;;;MAIzE,eAAe,KAAK,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BjC,QAAM,UAAU,YAAY,QAAQ;AAEpC,SAAO;CACR;CAED,AAAQ,+BACNC,YACAN,YACAO,eACAC,wBACQ;AACR,UAAQ;WACD,WAAW,WAAW,WAAW;SACnC,uBAAuB,SAAS,cAAc;;4DAEK,WAAW;;;;CAIpE;CAED,AAAQ,+BACNF,YACAN,YACAO,eACAC,wBACQ;AACR,UAAQ;WACD,WAAW,WAAW,WAAW;SACnC,uBAAuB,SAAS,cAAc;;4DAEK,WAAW;;;;CAIpE;CAED,AAAQ,sBACNF,YACAN,YACQ;AACR,UAAQ,WAAW,WAAW,WAAW,WAAW;;;yBAG/B,WAAW;;CAEjC;AACF"}
@@ -0,0 +1,58 @@
1
+ const require_chunk = require('./chunk-CsX-DzYB.cjs');
2
+ const require_Generator = require('./Generator-C3tYSTQY.cjs');
3
+ const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
4
+ const node_path = require_chunk.__toESM(require("node:path"));
5
+ const __geekmidas_api_constructs = require_chunk.__toESM(require("@geekmidas/api/constructs"));
6
+
7
+ //#region src/generators/FunctionGenerator.ts
8
+ var FunctionGenerator = class extends require_Generator.ConstructGenerator {
9
+ isConstruct(value) {
10
+ return __geekmidas_api_constructs.Function.isFunction(value);
11
+ }
12
+ async build(context, constructs, outputDir, options) {
13
+ const provider = options?.provider || "aws-lambda";
14
+ const logger = console;
15
+ const functionInfos = [];
16
+ if (constructs.length === 0 || provider !== "aws-lambda") return functionInfos;
17
+ const functionsDir = (0, node_path.join)(outputDir, "functions");
18
+ await (0, node_fs_promises.mkdir)(functionsDir, { recursive: true });
19
+ for (const { key, construct, path } of constructs) {
20
+ const handlerFile = await this.generateFunctionHandler(functionsDir, path.relative, key, context);
21
+ functionInfos.push({
22
+ name: key,
23
+ handler: (0, node_path.relative)(process.cwd(), handlerFile).replace(/\.ts$/, ".handler"),
24
+ timeout: construct.timeout
25
+ });
26
+ logger.log(`Generated function handler: ${key}`);
27
+ }
28
+ return functionInfos;
29
+ }
30
+ async generateFunctionHandler(outputDir, sourceFile, exportName, context) {
31
+ const handlerFileName = `${exportName}.ts`;
32
+ const handlerPath = (0, node_path.join)(outputDir, handlerFileName);
33
+ const relativePath = (0, node_path.relative)((0, node_path.dirname)(handlerPath), sourceFile);
34
+ const importPath = relativePath.replace(/\.ts$/, ".js");
35
+ const relativeEnvParserPath = (0, node_path.relative)((0, node_path.dirname)(handlerPath), context.envParserPath);
36
+ const relativeLoggerPath = (0, node_path.relative)((0, node_path.dirname)(handlerPath), context.loggerPath);
37
+ const content = `import { AWSLambdaFunction } from '@geekmidas/api/aws-lambda';
38
+ import { ${exportName} } from '${importPath}';
39
+ import ${context.envParserImportPattern} from '${relativeEnvParserPath}';
40
+ import ${context.loggerImportPattern} from '${relativeLoggerPath}';
41
+
42
+ const adapter = new AWSLambdaFunction(envParser, ${exportName});
43
+
44
+ export const handler = adapter.handler;
45
+ `;
46
+ await (0, node_fs_promises.writeFile)(handlerPath, content);
47
+ return handlerPath;
48
+ }
49
+ };
50
+
51
+ //#endregion
52
+ Object.defineProperty(exports, 'FunctionGenerator', {
53
+ enumerable: true,
54
+ get: function () {
55
+ return FunctionGenerator;
56
+ }
57
+ });
58
+ //# sourceMappingURL=FunctionGenerator-DN681IUn.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FunctionGenerator-DN681IUn.cjs","names":["ConstructGenerator","value: any","context: BuildContext","constructs: GeneratedConstruct<Function<any, any, any, any>>[]","outputDir: string","options?: GeneratorOptions","functionInfos: FunctionInfo[]","sourceFile: string","exportName: string"],"sources":["../src/generators/FunctionGenerator.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative } from 'node:path';\nimport { Function } from '@geekmidas/api/constructs';\nimport type { BuildContext } from '../build/types';\nimport type { FunctionInfo } from '../types';\nimport {\n ConstructGenerator,\n type GeneratedConstruct,\n type GeneratorOptions,\n} from './Generator';\n\nexport class FunctionGenerator extends ConstructGenerator<\n Function<any, any, any, any>,\n FunctionInfo[]\n> {\n isConstruct(value: any): value is Function<any, any, any, any> {\n return Function.isFunction(value);\n }\n\n async build(\n context: BuildContext,\n constructs: GeneratedConstruct<Function<any, any, any, any>>[],\n outputDir: string,\n options?: GeneratorOptions,\n ): Promise<FunctionInfo[]> {\n const provider = options?.provider || 'aws-lambda';\n const logger = console;\n const functionInfos: FunctionInfo[] = [];\n\n if (constructs.length === 0 || provider !== 'aws-lambda') {\n return functionInfos;\n }\n\n // Create functions subdirectory\n const functionsDir = join(outputDir, 'functions');\n await mkdir(functionsDir, { recursive: true });\n\n // Generate function handlers\n for (const { key, construct, path } of constructs) {\n const handlerFile = await this.generateFunctionHandler(\n functionsDir,\n path.relative,\n key,\n context,\n );\n\n functionInfos.push({\n name: key,\n handler: relative(process.cwd(), handlerFile).replace(\n /\\.ts$/,\n '.handler',\n ),\n timeout: construct.timeout,\n });\n\n logger.log(`Generated function handler: ${key}`);\n }\n\n return functionInfos;\n }\n\n private async generateFunctionHandler(\n outputDir: string,\n sourceFile: string,\n exportName: string,\n context: BuildContext,\n ): Promise<string> {\n const handlerFileName = `${exportName}.ts`;\n const handlerPath = join(outputDir, handlerFileName);\n\n const relativePath = relative(dirname(handlerPath), sourceFile);\n const importPath = relativePath.replace(/\\.ts$/, '.js');\n\n const relativeEnvParserPath = relative(\n dirname(handlerPath),\n context.envParserPath,\n );\n const relativeLoggerPath = relative(\n dirname(handlerPath),\n context.loggerPath,\n );\n\n const content = `import { AWSLambdaFunction } from '@geekmidas/api/aws-lambda';\nimport { ${exportName} } from '${importPath}';\nimport ${context.envParserImportPattern} from '${relativeEnvParserPath}';\nimport ${context.loggerImportPattern} from '${relativeLoggerPath}';\n\nconst adapter = new AWSLambdaFunction(envParser, ${exportName});\n\nexport const handler = adapter.handler;\n`;\n\n await writeFile(handlerPath, content);\n return handlerPath;\n }\n}\n"],"mappings":";;;;;;;AAWA,IAAa,oBAAb,cAAuCA,qCAGrC;CACA,YAAYC,OAAmD;AAC7D,SAAO,oCAAS,WAAW,MAAM;CAClC;CAED,MAAM,MACJC,SACAC,YACAC,WACAC,SACyB;EACzB,MAAM,WAAW,SAAS,YAAY;EACtC,MAAM,SAAS;EACf,MAAMC,gBAAgC,CAAE;AAExC,MAAI,WAAW,WAAW,KAAK,aAAa,aAC1C,QAAO;EAIT,MAAM,eAAe,oBAAK,WAAW,YAAY;AACjD,QAAM,4BAAM,cAAc,EAAE,WAAW,KAAM,EAAC;AAG9C,OAAK,MAAM,EAAE,KAAK,WAAW,MAAM,IAAI,YAAY;GACjD,MAAM,cAAc,MAAM,KAAK,wBAC7B,cACA,KAAK,UACL,KACA,QACD;AAED,iBAAc,KAAK;IACjB,MAAM;IACN,SAAS,wBAAS,QAAQ,KAAK,EAAE,YAAY,CAAC,QAC5C,SACA,WACD;IACD,SAAS,UAAU;GACpB,EAAC;AAEF,UAAO,KAAK,8BAA8B,IAAI,EAAE;EACjD;AAED,SAAO;CACR;CAED,MAAc,wBACZF,WACAG,YACAC,YACAN,SACiB;EACjB,MAAM,mBAAmB,EAAE,WAAW;EACtC,MAAM,cAAc,oBAAK,WAAW,gBAAgB;EAEpD,MAAM,eAAe,wBAAS,uBAAQ,YAAY,EAAE,WAAW;EAC/D,MAAM,aAAa,aAAa,QAAQ,SAAS,MAAM;EAEvD,MAAM,wBAAwB,wBAC5B,uBAAQ,YAAY,EACpB,QAAQ,cACT;EACD,MAAM,qBAAqB,wBACzB,uBAAQ,YAAY,EACpB,QAAQ,WACT;EAED,MAAM,WAAW;WACV,WAAW,WAAW,WAAW;SACnC,QAAQ,uBAAuB,SAAS,sBAAsB;SAC9D,QAAQ,oBAAoB,SAAS,mBAAmB;;mDAEd,WAAW;;;;AAK1D,QAAM,gCAAU,aAAa,QAAQ;AACrC,SAAO;CACR;AACF"}
@@ -0,0 +1,52 @@
1
+ import { ConstructGenerator } from "./Generator-CDt4pB3W.mjs";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { dirname, join, relative } from "node:path";
4
+ import { Function } from "@geekmidas/api/constructs";
5
+
6
+ //#region src/generators/FunctionGenerator.ts
7
+ var FunctionGenerator = class extends ConstructGenerator {
8
+ isConstruct(value) {
9
+ return Function.isFunction(value);
10
+ }
11
+ async build(context, constructs, outputDir, options) {
12
+ const provider = options?.provider || "aws-lambda";
13
+ const logger = console;
14
+ const functionInfos = [];
15
+ if (constructs.length === 0 || provider !== "aws-lambda") return functionInfos;
16
+ const functionsDir = join(outputDir, "functions");
17
+ await mkdir(functionsDir, { recursive: true });
18
+ for (const { key, construct, path } of constructs) {
19
+ const handlerFile = await this.generateFunctionHandler(functionsDir, path.relative, key, context);
20
+ functionInfos.push({
21
+ name: key,
22
+ handler: relative(process.cwd(), handlerFile).replace(/\.ts$/, ".handler"),
23
+ timeout: construct.timeout
24
+ });
25
+ logger.log(`Generated function handler: ${key}`);
26
+ }
27
+ return functionInfos;
28
+ }
29
+ async generateFunctionHandler(outputDir, sourceFile, exportName, context) {
30
+ const handlerFileName = `${exportName}.ts`;
31
+ const handlerPath = join(outputDir, handlerFileName);
32
+ const relativePath = relative(dirname(handlerPath), sourceFile);
33
+ const importPath = relativePath.replace(/\.ts$/, ".js");
34
+ const relativeEnvParserPath = relative(dirname(handlerPath), context.envParserPath);
35
+ const relativeLoggerPath = relative(dirname(handlerPath), context.loggerPath);
36
+ const content = `import { AWSLambdaFunction } from '@geekmidas/api/aws-lambda';
37
+ import { ${exportName} } from '${importPath}';
38
+ import ${context.envParserImportPattern} from '${relativeEnvParserPath}';
39
+ import ${context.loggerImportPattern} from '${relativeLoggerPath}';
40
+
41
+ const adapter = new AWSLambdaFunction(envParser, ${exportName});
42
+
43
+ export const handler = adapter.handler;
44
+ `;
45
+ await writeFile(handlerPath, content);
46
+ return handlerPath;
47
+ }
48
+ };
49
+
50
+ //#endregion
51
+ export { FunctionGenerator };
52
+ //# sourceMappingURL=FunctionGenerator-crAa-JC7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FunctionGenerator-crAa-JC7.mjs","names":["value: any","context: BuildContext","constructs: GeneratedConstruct<Function<any, any, any, any>>[]","outputDir: string","options?: GeneratorOptions","functionInfos: FunctionInfo[]","sourceFile: string","exportName: string"],"sources":["../src/generators/FunctionGenerator.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative } from 'node:path';\nimport { Function } from '@geekmidas/api/constructs';\nimport type { BuildContext } from '../build/types';\nimport type { FunctionInfo } from '../types';\nimport {\n ConstructGenerator,\n type GeneratedConstruct,\n type GeneratorOptions,\n} from './Generator';\n\nexport class FunctionGenerator extends ConstructGenerator<\n Function<any, any, any, any>,\n FunctionInfo[]\n> {\n isConstruct(value: any): value is Function<any, any, any, any> {\n return Function.isFunction(value);\n }\n\n async build(\n context: BuildContext,\n constructs: GeneratedConstruct<Function<any, any, any, any>>[],\n outputDir: string,\n options?: GeneratorOptions,\n ): Promise<FunctionInfo[]> {\n const provider = options?.provider || 'aws-lambda';\n const logger = console;\n const functionInfos: FunctionInfo[] = [];\n\n if (constructs.length === 0 || provider !== 'aws-lambda') {\n return functionInfos;\n }\n\n // Create functions subdirectory\n const functionsDir = join(outputDir, 'functions');\n await mkdir(functionsDir, { recursive: true });\n\n // Generate function handlers\n for (const { key, construct, path } of constructs) {\n const handlerFile = await this.generateFunctionHandler(\n functionsDir,\n path.relative,\n key,\n context,\n );\n\n functionInfos.push({\n name: key,\n handler: relative(process.cwd(), handlerFile).replace(\n /\\.ts$/,\n '.handler',\n ),\n timeout: construct.timeout,\n });\n\n logger.log(`Generated function handler: ${key}`);\n }\n\n return functionInfos;\n }\n\n private async generateFunctionHandler(\n outputDir: string,\n sourceFile: string,\n exportName: string,\n context: BuildContext,\n ): Promise<string> {\n const handlerFileName = `${exportName}.ts`;\n const handlerPath = join(outputDir, handlerFileName);\n\n const relativePath = relative(dirname(handlerPath), sourceFile);\n const importPath = relativePath.replace(/\\.ts$/, '.js');\n\n const relativeEnvParserPath = relative(\n dirname(handlerPath),\n context.envParserPath,\n );\n const relativeLoggerPath = relative(\n dirname(handlerPath),\n context.loggerPath,\n );\n\n const content = `import { AWSLambdaFunction } from '@geekmidas/api/aws-lambda';\nimport { ${exportName} } from '${importPath}';\nimport ${context.envParserImportPattern} from '${relativeEnvParserPath}';\nimport ${context.loggerImportPattern} from '${relativeLoggerPath}';\n\nconst adapter = new AWSLambdaFunction(envParser, ${exportName});\n\nexport const handler = adapter.handler;\n`;\n\n await writeFile(handlerPath, content);\n return handlerPath;\n }\n}\n"],"mappings":";;;;;;AAWA,IAAa,oBAAb,cAAuC,mBAGrC;CACA,YAAYA,OAAmD;AAC7D,SAAO,SAAS,WAAW,MAAM;CAClC;CAED,MAAM,MACJC,SACAC,YACAC,WACAC,SACyB;EACzB,MAAM,WAAW,SAAS,YAAY;EACtC,MAAM,SAAS;EACf,MAAMC,gBAAgC,CAAE;AAExC,MAAI,WAAW,WAAW,KAAK,aAAa,aAC1C,QAAO;EAIT,MAAM,eAAe,KAAK,WAAW,YAAY;AACjD,QAAM,MAAM,cAAc,EAAE,WAAW,KAAM,EAAC;AAG9C,OAAK,MAAM,EAAE,KAAK,WAAW,MAAM,IAAI,YAAY;GACjD,MAAM,cAAc,MAAM,KAAK,wBAC7B,cACA,KAAK,UACL,KACA,QACD;AAED,iBAAc,KAAK;IACjB,MAAM;IACN,SAAS,SAAS,QAAQ,KAAK,EAAE,YAAY,CAAC,QAC5C,SACA,WACD;IACD,SAAS,UAAU;GACpB,EAAC;AAEF,UAAO,KAAK,8BAA8B,IAAI,EAAE;EACjD;AAED,SAAO;CACR;CAED,MAAc,wBACZF,WACAG,YACAC,YACAN,SACiB;EACjB,MAAM,mBAAmB,EAAE,WAAW;EACtC,MAAM,cAAc,KAAK,WAAW,gBAAgB;EAEpD,MAAM,eAAe,SAAS,QAAQ,YAAY,EAAE,WAAW;EAC/D,MAAM,aAAa,aAAa,QAAQ,SAAS,MAAM;EAEvD,MAAM,wBAAwB,SAC5B,QAAQ,YAAY,EACpB,QAAQ,cACT;EACD,MAAM,qBAAqB,SACzB,QAAQ,YAAY,EACpB,QAAQ,WACT;EAED,MAAM,WAAW;WACV,WAAW,WAAW,WAAW;SACnC,QAAQ,uBAAuB,SAAS,sBAAsB;SAC9D,QAAQ,oBAAoB,SAAS,mBAAmB;;mDAEd,WAAW;;;;AAK1D,QAAM,UAAU,aAAa,QAAQ;AACrC,SAAO;CACR;AACF"}
@@ -0,0 +1,47 @@
1
+ const require_chunk = require('./chunk-CsX-DzYB.cjs');
2
+ const path = require_chunk.__toESM(require("path"));
3
+ const fast_glob = require_chunk.__toESM(require("fast-glob"));
4
+ const lodash_kebabcase = require_chunk.__toESM(require("lodash.kebabcase"));
5
+
6
+ //#region src/generators/Generator.ts
7
+ var ConstructGenerator = class {
8
+ static async build(context, outputDir, generator, patterns, options) {
9
+ const constructs = await generator.load(patterns);
10
+ return generator.build(context, constructs, outputDir, options);
11
+ }
12
+ async load(patterns, cwd = process.cwd()) {
13
+ const logger = console;
14
+ const globPatterns = Array.isArray(patterns) ? patterns : patterns ? [patterns] : [];
15
+ const files = fast_glob.default.stream(globPatterns, {
16
+ cwd,
17
+ absolute: true
18
+ });
19
+ const constructs = [];
20
+ for await (const f of files) try {
21
+ const file = f.toString();
22
+ const module$1 = await import(file);
23
+ for (const [key, construct] of Object.entries(module$1)) if (this.isConstruct(construct)) constructs.push({
24
+ key,
25
+ name: (0, lodash_kebabcase.default)(key),
26
+ construct,
27
+ path: {
28
+ absolute: file,
29
+ relative: (0, path.relative)(process.cwd(), file)
30
+ }
31
+ });
32
+ } catch (error) {
33
+ logger.warn(`Failed to load ${f}:`, error.message);
34
+ throw new Error("Failed to load constructs. Please check the logs for details.");
35
+ }
36
+ return constructs;
37
+ }
38
+ };
39
+
40
+ //#endregion
41
+ Object.defineProperty(exports, 'ConstructGenerator', {
42
+ enumerable: true,
43
+ get: function () {
44
+ return ConstructGenerator;
45
+ }
46
+ });
47
+ //# sourceMappingURL=Generator-C3tYSTQY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generator-C3tYSTQY.cjs","names":["context: BuildContext","outputDir: string","generator: ConstructGenerator<T, R>","patterns?: Routes","options?: GeneratorOptions","constructs: GeneratedConstruct<T>[]","module"],"sources":["../src/generators/Generator.ts"],"sourcesContent":["import { relative } from 'path';\nimport type { Construct } from '@geekmidas/api/constructs';\nimport fg from 'fast-glob';\nimport kebabCase from 'lodash.kebabcase';\nimport type { BuildContext } from '../build/types';\nimport type { LegacyProvider, Routes } from '../types';\n\nexport interface GeneratorOptions {\n provider?: LegacyProvider;\n [key: string]: any;\n}\n\nexport abstract class ConstructGenerator<T extends Construct, R = void> {\n abstract isConstruct(value: any): value is T;\n\n static async build<T extends Construct, R = void>(\n context: BuildContext,\n outputDir: string,\n generator: ConstructGenerator<T, R>,\n patterns?: Routes,\n options?: GeneratorOptions,\n ): Promise<R> {\n const constructs = await generator.load(patterns);\n return generator.build(context, constructs, outputDir, options);\n }\n\n abstract build(\n context: BuildContext,\n constructs: GeneratedConstruct<T>[],\n outputDir: string,\n options?: GeneratorOptions,\n ): Promise<R>;\n\n async load(\n patterns?: Routes,\n cwd = process.cwd(),\n ): Promise<GeneratedConstruct<T>[]> {\n const logger = console;\n\n // Normalize patterns to array\n const globPatterns = Array.isArray(patterns)\n ? patterns\n : patterns\n ? [patterns]\n : [];\n\n // Find all files\n const files = fg.stream(globPatterns, {\n cwd,\n absolute: true,\n });\n\n // Load constructs\n const constructs: GeneratedConstruct<T>[] = [];\n\n for await (const f of files) {\n try {\n const file = f.toString();\n const module = await import(file);\n\n // Check all exports for constructs\n for (const [key, construct] of Object.entries(module)) {\n if (this.isConstruct(construct)) {\n constructs.push({\n key,\n name: kebabCase(key),\n construct,\n path: {\n absolute: file,\n relative: relative(process.cwd(), file),\n },\n });\n }\n }\n } catch (error) {\n logger.warn(`Failed to load ${f}:`, (error as Error).message);\n throw new Error(\n 'Failed to load constructs. Please check the logs for details.',\n );\n }\n }\n\n return constructs;\n }\n}\n\nexport interface GeneratedConstruct<T extends Construct> {\n key: string;\n name: string;\n construct: T;\n path: {\n absolute: string;\n relative: string;\n };\n}\n"],"mappings":";;;;;;AAYA,IAAsB,qBAAtB,MAAwE;CAGtE,aAAa,MACXA,SACAC,WACAC,WACAC,UACAC,SACY;EACZ,MAAM,aAAa,MAAM,UAAU,KAAK,SAAS;AACjD,SAAO,UAAU,MAAM,SAAS,YAAY,WAAW,QAAQ;CAChE;CASD,MAAM,KACJD,UACA,MAAM,QAAQ,KAAK,EACe;EAClC,MAAM,SAAS;EAGf,MAAM,eAAe,MAAM,QAAQ,SAAS,GACxC,WACA,WACE,CAAC,QAAS,IACV,CAAE;EAGR,MAAM,QAAQ,kBAAG,OAAO,cAAc;GACpC;GACA,UAAU;EACX,EAAC;EAGF,MAAME,aAAsC,CAAE;AAE9C,aAAW,MAAM,KAAK,MACpB,KAAI;GACF,MAAM,OAAO,EAAE,UAAU;GACzB,MAAMC,WAAS,MAAM,OAAO;AAG5B,QAAK,MAAM,CAAC,KAAK,UAAU,IAAI,OAAO,QAAQA,SAAO,CACnD,KAAI,KAAK,YAAY,UAAU,CAC7B,YAAW,KAAK;IACd;IACA,MAAM,8BAAU,IAAI;IACpB;IACA,MAAM;KACJ,UAAU;KACV,UAAU,mBAAS,QAAQ,KAAK,EAAE,KAAK;IACxC;GACF,EAAC;EAGP,SAAQ,OAAO;AACd,UAAO,MAAM,iBAAiB,EAAE,IAAK,MAAgB,QAAQ;AAC7D,SAAM,IAAI,MACR;EAEH;AAGH,SAAO;CACR;AACF"}
@@ -0,0 +1,41 @@
1
+ import { relative } from "path";
2
+ import fg from "fast-glob";
3
+ import kebabCase from "lodash.kebabcase";
4
+
5
+ //#region src/generators/Generator.ts
6
+ var ConstructGenerator = class {
7
+ static async build(context, outputDir, generator, patterns, options) {
8
+ const constructs = await generator.load(patterns);
9
+ return generator.build(context, constructs, outputDir, options);
10
+ }
11
+ async load(patterns, cwd = process.cwd()) {
12
+ const logger = console;
13
+ const globPatterns = Array.isArray(patterns) ? patterns : patterns ? [patterns] : [];
14
+ const files = fg.stream(globPatterns, {
15
+ cwd,
16
+ absolute: true
17
+ });
18
+ const constructs = [];
19
+ for await (const f of files) try {
20
+ const file = f.toString();
21
+ const module = await import(file);
22
+ for (const [key, construct] of Object.entries(module)) if (this.isConstruct(construct)) constructs.push({
23
+ key,
24
+ name: kebabCase(key),
25
+ construct,
26
+ path: {
27
+ absolute: file,
28
+ relative: relative(process.cwd(), file)
29
+ }
30
+ });
31
+ } catch (error) {
32
+ logger.warn(`Failed to load ${f}:`, error.message);
33
+ throw new Error("Failed to load constructs. Please check the logs for details.");
34
+ }
35
+ return constructs;
36
+ }
37
+ };
38
+
39
+ //#endregion
40
+ export { ConstructGenerator };
41
+ //# sourceMappingURL=Generator-CDt4pB3W.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generator-CDt4pB3W.mjs","names":["context: BuildContext","outputDir: string","generator: ConstructGenerator<T, R>","patterns?: Routes","options?: GeneratorOptions","constructs: GeneratedConstruct<T>[]"],"sources":["../src/generators/Generator.ts"],"sourcesContent":["import { relative } from 'path';\nimport type { Construct } from '@geekmidas/api/constructs';\nimport fg from 'fast-glob';\nimport kebabCase from 'lodash.kebabcase';\nimport type { BuildContext } from '../build/types';\nimport type { LegacyProvider, Routes } from '../types';\n\nexport interface GeneratorOptions {\n provider?: LegacyProvider;\n [key: string]: any;\n}\n\nexport abstract class ConstructGenerator<T extends Construct, R = void> {\n abstract isConstruct(value: any): value is T;\n\n static async build<T extends Construct, R = void>(\n context: BuildContext,\n outputDir: string,\n generator: ConstructGenerator<T, R>,\n patterns?: Routes,\n options?: GeneratorOptions,\n ): Promise<R> {\n const constructs = await generator.load(patterns);\n return generator.build(context, constructs, outputDir, options);\n }\n\n abstract build(\n context: BuildContext,\n constructs: GeneratedConstruct<T>[],\n outputDir: string,\n options?: GeneratorOptions,\n ): Promise<R>;\n\n async load(\n patterns?: Routes,\n cwd = process.cwd(),\n ): Promise<GeneratedConstruct<T>[]> {\n const logger = console;\n\n // Normalize patterns to array\n const globPatterns = Array.isArray(patterns)\n ? patterns\n : patterns\n ? [patterns]\n : [];\n\n // Find all files\n const files = fg.stream(globPatterns, {\n cwd,\n absolute: true,\n });\n\n // Load constructs\n const constructs: GeneratedConstruct<T>[] = [];\n\n for await (const f of files) {\n try {\n const file = f.toString();\n const module = await import(file);\n\n // Check all exports for constructs\n for (const [key, construct] of Object.entries(module)) {\n if (this.isConstruct(construct)) {\n constructs.push({\n key,\n name: kebabCase(key),\n construct,\n path: {\n absolute: file,\n relative: relative(process.cwd(), file),\n },\n });\n }\n }\n } catch (error) {\n logger.warn(`Failed to load ${f}:`, (error as Error).message);\n throw new Error(\n 'Failed to load constructs. Please check the logs for details.',\n );\n }\n }\n\n return constructs;\n }\n}\n\nexport interface GeneratedConstruct<T extends Construct> {\n key: string;\n name: string;\n construct: T;\n path: {\n absolute: string;\n relative: string;\n };\n}\n"],"mappings":";;;;;AAYA,IAAsB,qBAAtB,MAAwE;CAGtE,aAAa,MACXA,SACAC,WACAC,WACAC,UACAC,SACY;EACZ,MAAM,aAAa,MAAM,UAAU,KAAK,SAAS;AACjD,SAAO,UAAU,MAAM,SAAS,YAAY,WAAW,QAAQ;CAChE;CASD,MAAM,KACJD,UACA,MAAM,QAAQ,KAAK,EACe;EAClC,MAAM,SAAS;EAGf,MAAM,eAAe,MAAM,QAAQ,SAAS,GACxC,WACA,WACE,CAAC,QAAS,IACV,CAAE;EAGR,MAAM,QAAQ,GAAG,OAAO,cAAc;GACpC;GACA,UAAU;EACX,EAAC;EAGF,MAAME,aAAsC,CAAE;AAE9C,aAAW,MAAM,KAAK,MACpB,KAAI;GACF,MAAM,OAAO,EAAE,UAAU;GACzB,MAAM,SAAS,MAAM,OAAO;AAG5B,QAAK,MAAM,CAAC,KAAK,UAAU,IAAI,OAAO,QAAQ,OAAO,CACnD,KAAI,KAAK,YAAY,UAAU,CAC7B,YAAW,KAAK;IACd;IACA,MAAM,UAAU,IAAI;IACpB;IACA,MAAM;KACJ,UAAU;KACV,UAAU,SAAS,QAAQ,KAAK,EAAE,KAAK;IACxC;GACF,EAAC;EAGP,SAAQ,OAAO;AACd,UAAO,MAAM,iBAAiB,EAAE,IAAK,MAAgB,QAAQ;AAC7D,SAAM,IAAI,MACR;EAEH;AAGH,SAAO;CACR;AACF"}
@@ -0,0 +1,98 @@
1
+ const require_chunk = require('../chunk-CsX-DzYB.cjs');
2
+ const require_config = require('../config-RcNESK0T.cjs');
3
+ require('../esm-Crmo4h9t.cjs');
4
+ const require_test_helpers = require('../test-helpers-ARd8GDgx.cjs');
5
+ const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
6
+ const node_path = require_chunk.__toESM(require("node:path"));
7
+ const vitest = require_chunk.__toESM(require("vitest"));
8
+
9
+ //#region src/__tests__/config.spec.ts
10
+ (0, vitest.describe)("loadConfig", () => {
11
+ let tempDir;
12
+ let originalCwd;
13
+ (0, vitest.beforeEach)(async () => {
14
+ tempDir = await require_test_helpers.createTempDir();
15
+ originalCwd = process.cwd();
16
+ process.chdir(tempDir);
17
+ });
18
+ (0, vitest.afterEach)(async () => {
19
+ process.chdir(originalCwd);
20
+ await require_test_helpers.cleanupDir(tempDir);
21
+ });
22
+ (0, vitest.it)("should load configuration from gkm.config.ts", async () => {
23
+ const configContent = `
24
+ export default {
25
+ routes: './src/endpoints/**/*.ts',
26
+ functions: './src/functions/**/*.ts',
27
+ crons: './src/crons/**/*.ts',
28
+ envParser: './src/config/env',
29
+ logger: './src/config/logger',
30
+ };
31
+ `;
32
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), configContent);
33
+ const config = await require_config.loadConfig();
34
+ (0, vitest.expect)(config).toEqual({
35
+ routes: "./src/endpoints/**/*.ts",
36
+ functions: "./src/functions/**/*.ts",
37
+ crons: "./src/crons/**/*.ts",
38
+ envParser: "./src/config/env",
39
+ logger: "./src/config/logger"
40
+ });
41
+ });
42
+ (0, vitest.it)("should load configuration from gkm.config.js", async () => {
43
+ const configContent = `
44
+ module.exports = {
45
+ routes: './api/**/*.js',
46
+ envParser: './config/environment',
47
+ logger: './config/logging',
48
+ };
49
+ `;
50
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.js"), configContent);
51
+ const config = await require_config.loadConfig();
52
+ (0, vitest.expect)(config.routes).toBe("./api/**/*.js");
53
+ (0, vitest.expect)(config.envParser).toBe("./config/environment");
54
+ (0, vitest.expect)(config.logger).toBe("./config/logging");
55
+ });
56
+ (0, vitest.it)("should handle configuration with only envParser override", async () => {
57
+ const configContent = `
58
+ export default {
59
+ envParser: './my-env#myEnvParser',
60
+ logger: './my-logger#myLogger',
61
+ };
62
+ `;
63
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), configContent);
64
+ const config = await require_config.loadConfig();
65
+ (0, vitest.expect)(config.envParser).toBe("./my-env#myEnvParser");
66
+ (0, vitest.expect)(config.logger).toBe("./my-logger#myLogger");
67
+ });
68
+ (0, vitest.it)("should handle malformed config file gracefully", async () => {
69
+ const invalidConfigContent = `
70
+ export default {
71
+ routes: './endpoints/**/*.ts'
72
+ // Missing comma - syntax error
73
+ functions: './functions/**/*.ts'
74
+ };
75
+ `;
76
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), invalidConfigContent);
77
+ await (0, vitest.expect)(require_config.loadConfig()).rejects.toThrow();
78
+ });
79
+ (0, vitest.it)("should prefer .ts config over .js config", async () => {
80
+ const jsConfigContent = `
81
+ module.exports = {
82
+ routes: './js-routes/**/*.js',
83
+ };
84
+ `;
85
+ const tsConfigContent = `
86
+ export default {
87
+ routes: './ts-routes/**/*.ts',
88
+ };
89
+ `;
90
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.js"), jsConfigContent);
91
+ await (0, node_fs_promises.writeFile)((0, node_path.join)(tempDir, "gkm.config.ts"), tsConfigContent);
92
+ const config = await require_config.loadConfig();
93
+ (0, vitest.expect)(config.routes).toBe("./ts-routes/**/*.ts");
94
+ });
95
+ });
96
+
97
+ //#endregion
98
+ //# sourceMappingURL=config.spec.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.spec.cjs","names":["tempDir: string","originalCwd: string"],"sources":["../../src/__tests__/config.spec.ts"],"sourcesContent":["import { writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { afterEach, beforeEach, describe, expect, it } from 'vitest';\nimport { loadConfig } from '../config';\nimport { cleanupDir, createTempDir } from './test-helpers';\n\ndescribe('loadConfig', () => {\n let tempDir: string;\n let originalCwd: string;\n\n beforeEach(async () => {\n tempDir = await createTempDir();\n originalCwd = process.cwd();\n process.chdir(tempDir);\n });\n\n afterEach(async () => {\n process.chdir(originalCwd);\n await cleanupDir(tempDir);\n });\n\n it('should load configuration from gkm.config.ts', async () => {\n const configContent = `\nexport default {\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './src/config/env',\n logger: './src/config/logger',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), configContent);\n\n const config = await loadConfig();\n\n expect(config).toEqual({\n routes: './src/endpoints/**/*.ts',\n functions: './src/functions/**/*.ts',\n crons: './src/crons/**/*.ts',\n envParser: './src/config/env',\n logger: './src/config/logger',\n });\n });\n\n it('should load configuration from gkm.config.js', async () => {\n const configContent = `\nmodule.exports = {\n routes: './api/**/*.js',\n envParser: './config/environment',\n logger: './config/logging',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.js'), configContent);\n\n const config = await loadConfig();\n\n expect(config.routes).toBe('./api/**/*.js');\n expect(config.envParser).toBe('./config/environment');\n expect(config.logger).toBe('./config/logging');\n });\n\n it('should handle configuration with only envParser override', async () => {\n const configContent = `\nexport default {\n envParser: './my-env#myEnvParser',\n logger: './my-logger#myLogger',\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), configContent);\n\n const config = await loadConfig();\n\n expect(config.envParser).toBe('./my-env#myEnvParser');\n expect(config.logger).toBe('./my-logger#myLogger');\n });\n\n it('should handle malformed config file gracefully', async () => {\n const invalidConfigContent = `\nexport default {\n routes: './endpoints/**/*.ts'\n // Missing comma - syntax error\n functions: './functions/**/*.ts'\n};\n`;\n await writeFile(join(tempDir, 'gkm.config.ts'), invalidConfigContent);\n\n // Should fall back to defaults when config file has syntax errors\n await expect(loadConfig()).rejects.toThrow();\n });\n\n it('should prefer .ts config over .js config', async () => {\n const jsConfigContent = `\nmodule.exports = {\n routes: './js-routes/**/*.js',\n};\n`;\n const tsConfigContent = `\nexport default {\n routes: './ts-routes/**/*.ts',\n};\n`;\n\n await writeFile(join(tempDir, 'gkm.config.js'), jsConfigContent);\n await writeFile(join(tempDir, 'gkm.config.ts'), tsConfigContent);\n\n const config = await loadConfig();\n\n expect(config.routes).toBe('./ts-routes/**/*.ts');\n });\n});\n"],"mappings":";;;;;;;;;AAMA,qBAAS,cAAc,MAAM;CAC3B,IAAIA;CACJ,IAAIC;AAEJ,wBAAW,YAAY;AACrB,YAAU,MAAM,oCAAe;AAC/B,gBAAc,QAAQ,KAAK;AAC3B,UAAQ,MAAM,QAAQ;CACvB,EAAC;AAEF,uBAAU,YAAY;AACpB,UAAQ,MAAM,YAAY;AAC1B,QAAM,gCAAW,QAAQ;CAC1B,EAAC;AAEF,gBAAG,gDAAgD,YAAY;EAC7D,MAAM,iBAAiB;;;;;;;;;AASvB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,CAAC,QAAQ;GACrB,QAAQ;GACR,WAAW;GACX,OAAO;GACP,WAAW;GACX,QAAQ;EACT,EAAC;CACH,EAAC;AAEF,gBAAG,gDAAgD,YAAY;EAC7D,MAAM,iBAAiB;;;;;;;AAOvB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,OAAO,CAAC,KAAK,gBAAgB;AAC3C,qBAAO,OAAO,UAAU,CAAC,KAAK,uBAAuB;AACrD,qBAAO,OAAO,OAAO,CAAC,KAAK,mBAAmB;CAC/C,EAAC;AAEF,gBAAG,4DAA4D,YAAY;EACzE,MAAM,iBAAiB;;;;;;AAMvB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,cAAc;EAE9D,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,UAAU,CAAC,KAAK,uBAAuB;AACrD,qBAAO,OAAO,OAAO,CAAC,KAAK,uBAAuB;CACnD,EAAC;AAEF,gBAAG,kDAAkD,YAAY;EAC/D,MAAM,wBAAwB;;;;;;;AAO9B,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,qBAAqB;AAGrE,QAAM,mBAAO,2BAAY,CAAC,CAAC,QAAQ,SAAS;CAC7C,EAAC;AAEF,gBAAG,4CAA4C,YAAY;EACzD,MAAM,mBAAmB;;;;;EAKzB,MAAM,mBAAmB;;;;;AAMzB,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,gBAAgB;AAChE,QAAM,gCAAU,oBAAK,SAAS,gBAAgB,EAAE,gBAAgB;EAEhE,MAAM,SAAS,MAAM,2BAAY;AAEjC,qBAAO,OAAO,OAAO,CAAC,KAAK,sBAAsB;CAClD,EAAC;AACH,EAAC"}
@@ -0,0 +1,97 @@
1
+ import "../esm-9eeZntth.mjs";
2
+ import { loadConfig } from "../config-CXxYmz_o.mjs";
3
+ import { cleanupDir, createTempDir } from "../test-helpers-DdVBk23F.mjs";
4
+ import { writeFile } from "node:fs/promises";
5
+ import { join } from "node:path";
6
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
7
+
8
+ //#region src/__tests__/config.spec.ts
9
+ describe("loadConfig", () => {
10
+ let tempDir;
11
+ let originalCwd;
12
+ beforeEach(async () => {
13
+ tempDir = await createTempDir();
14
+ originalCwd = process.cwd();
15
+ process.chdir(tempDir);
16
+ });
17
+ afterEach(async () => {
18
+ process.chdir(originalCwd);
19
+ await cleanupDir(tempDir);
20
+ });
21
+ it("should load configuration from gkm.config.ts", async () => {
22
+ const configContent = `
23
+ export default {
24
+ routes: './src/endpoints/**/*.ts',
25
+ functions: './src/functions/**/*.ts',
26
+ crons: './src/crons/**/*.ts',
27
+ envParser: './src/config/env',
28
+ logger: './src/config/logger',
29
+ };
30
+ `;
31
+ await writeFile(join(tempDir, "gkm.config.ts"), configContent);
32
+ const config = await loadConfig();
33
+ expect(config).toEqual({
34
+ routes: "./src/endpoints/**/*.ts",
35
+ functions: "./src/functions/**/*.ts",
36
+ crons: "./src/crons/**/*.ts",
37
+ envParser: "./src/config/env",
38
+ logger: "./src/config/logger"
39
+ });
40
+ });
41
+ it("should load configuration from gkm.config.js", async () => {
42
+ const configContent = `
43
+ module.exports = {
44
+ routes: './api/**/*.js',
45
+ envParser: './config/environment',
46
+ logger: './config/logging',
47
+ };
48
+ `;
49
+ await writeFile(join(tempDir, "gkm.config.js"), configContent);
50
+ const config = await loadConfig();
51
+ expect(config.routes).toBe("./api/**/*.js");
52
+ expect(config.envParser).toBe("./config/environment");
53
+ expect(config.logger).toBe("./config/logging");
54
+ });
55
+ it("should handle configuration with only envParser override", async () => {
56
+ const configContent = `
57
+ export default {
58
+ envParser: './my-env#myEnvParser',
59
+ logger: './my-logger#myLogger',
60
+ };
61
+ `;
62
+ await writeFile(join(tempDir, "gkm.config.ts"), configContent);
63
+ const config = await loadConfig();
64
+ expect(config.envParser).toBe("./my-env#myEnvParser");
65
+ expect(config.logger).toBe("./my-logger#myLogger");
66
+ });
67
+ it("should handle malformed config file gracefully", async () => {
68
+ const invalidConfigContent = `
69
+ export default {
70
+ routes: './endpoints/**/*.ts'
71
+ // Missing comma - syntax error
72
+ functions: './functions/**/*.ts'
73
+ };
74
+ `;
75
+ await writeFile(join(tempDir, "gkm.config.ts"), invalidConfigContent);
76
+ await expect(loadConfig()).rejects.toThrow();
77
+ });
78
+ it("should prefer .ts config over .js config", async () => {
79
+ const jsConfigContent = `
80
+ module.exports = {
81
+ routes: './js-routes/**/*.js',
82
+ };
83
+ `;
84
+ const tsConfigContent = `
85
+ export default {
86
+ routes: './ts-routes/**/*.ts',
87
+ };
88
+ `;
89
+ await writeFile(join(tempDir, "gkm.config.js"), jsConfigContent);
90
+ await writeFile(join(tempDir, "gkm.config.ts"), tsConfigContent);
91
+ const config = await loadConfig();
92
+ expect(config.routes).toBe("./ts-routes/**/*.ts");
93
+ });
94
+ });
95
+
96
+ //#endregion
97
+ //# sourceMappingURL=config.spec.mjs.map