@geekmidas/cli 0.0.26 → 0.2.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 (121) hide show
  1. package/FUNCTION_CRON_SUPPORT.md +266 -0
  2. package/README.md +84 -17
  3. package/dist/CronGenerator-1PflEYe2.cjs +60 -0
  4. package/dist/CronGenerator-1PflEYe2.cjs.map +1 -0
  5. package/dist/CronGenerator-DXRfHQcV.mjs +54 -0
  6. package/dist/CronGenerator-DXRfHQcV.mjs.map +1 -0
  7. package/dist/EndpointGenerator-BbGrDiCP.cjs +264 -0
  8. package/dist/EndpointGenerator-BbGrDiCP.cjs.map +1 -0
  9. package/dist/EndpointGenerator-BmZ9BxbO.mjs +258 -0
  10. package/dist/EndpointGenerator-BmZ9BxbO.mjs.map +1 -0
  11. package/dist/FunctionGenerator-Clw64SwQ.cjs +59 -0
  12. package/dist/FunctionGenerator-Clw64SwQ.cjs.map +1 -0
  13. package/dist/FunctionGenerator-DOEB_yPh.mjs +53 -0
  14. package/dist/FunctionGenerator-DOEB_yPh.mjs.map +1 -0
  15. package/dist/Generator-CDoEXCDg.cjs +47 -0
  16. package/dist/Generator-CDoEXCDg.cjs.map +1 -0
  17. package/dist/Generator-UanJW0_V.mjs +41 -0
  18. package/dist/Generator-UanJW0_V.mjs.map +1 -0
  19. package/dist/SubscriberGenerator-BfMZCVNy.cjs +204 -0
  20. package/dist/SubscriberGenerator-BfMZCVNy.cjs.map +1 -0
  21. package/dist/SubscriberGenerator-D2u00NI3.mjs +198 -0
  22. package/dist/SubscriberGenerator-D2u00NI3.mjs.map +1 -0
  23. package/dist/build/index.cjs +12 -0
  24. package/dist/build/index.mjs +12 -0
  25. package/dist/build/manifests.cjs +3 -0
  26. package/dist/build/manifests.mjs +3 -0
  27. package/dist/build/providerResolver.cjs +5 -0
  28. package/dist/build/providerResolver.mjs +3 -0
  29. package/dist/build/types.cjs +0 -0
  30. package/dist/build/types.mjs +0 -0
  31. package/dist/build-BBhlEjf5.cjs +89 -0
  32. package/dist/build-BBhlEjf5.cjs.map +1 -0
  33. package/dist/build-kY-lG30Q.mjs +83 -0
  34. package/dist/build-kY-lG30Q.mjs.map +1 -0
  35. package/dist/config-D1EpSGk6.cjs +36 -0
  36. package/dist/config-D1EpSGk6.cjs.map +1 -0
  37. package/dist/config-U-mdW-7Y.mjs +30 -0
  38. package/dist/config-U-mdW-7Y.mjs.map +1 -0
  39. package/dist/config.cjs +1 -1
  40. package/dist/config.mjs +1 -1
  41. package/dist/generators/CronGenerator.cjs +4 -0
  42. package/dist/generators/CronGenerator.mjs +4 -0
  43. package/dist/generators/EndpointGenerator.cjs +4 -0
  44. package/dist/generators/EndpointGenerator.mjs +4 -0
  45. package/dist/generators/FunctionGenerator.cjs +4 -0
  46. package/dist/generators/FunctionGenerator.mjs +4 -0
  47. package/dist/generators/Generator.cjs +3 -0
  48. package/dist/generators/Generator.mjs +3 -0
  49. package/dist/generators/SubscriberGenerator.cjs +4 -0
  50. package/dist/generators/SubscriberGenerator.mjs +4 -0
  51. package/dist/generators/index.cjs +12 -0
  52. package/dist/generators/index.mjs +8 -0
  53. package/dist/generators-CEKtVh81.cjs +0 -0
  54. package/dist/generators-CsLujGXs.mjs +0 -0
  55. package/dist/index.cjs +71 -25
  56. package/dist/index.cjs.map +1 -0
  57. package/dist/index.mjs +71 -25
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/manifests-BrJXpHrf.mjs +21 -0
  60. package/dist/manifests-BrJXpHrf.mjs.map +1 -0
  61. package/dist/manifests-D0saShvH.cjs +27 -0
  62. package/dist/manifests-D0saShvH.cjs.map +1 -0
  63. package/dist/{openapi-CksVdkh2.mjs → openapi-BQx3_JbM.mjs} +8 -6
  64. package/dist/openapi-BQx3_JbM.mjs.map +1 -0
  65. package/dist/{openapi-D4QQJUPY.cjs → openapi-CMLr04cz.cjs} +9 -7
  66. package/dist/openapi-CMLr04cz.cjs.map +1 -0
  67. package/dist/{openapi-react-query-DpT3XHFC.mjs → openapi-react-query-DbrWwQzb.mjs} +5 -3
  68. package/dist/openapi-react-query-DbrWwQzb.mjs.map +1 -0
  69. package/dist/{openapi-react-query-C1JLYUOs.cjs → openapi-react-query-Dvjqx_Eo.cjs} +5 -3
  70. package/dist/openapi-react-query-Dvjqx_Eo.cjs.map +1 -0
  71. package/dist/openapi-react-query.cjs +1 -1
  72. package/dist/openapi-react-query.mjs +1 -1
  73. package/dist/openapi.cjs +4 -3
  74. package/dist/openapi.mjs +4 -3
  75. package/dist/providerResolver-B_TjNF0_.mjs +96 -0
  76. package/dist/providerResolver-B_TjNF0_.mjs.map +1 -0
  77. package/dist/providerResolver-DgvzNfP4.cjs +114 -0
  78. package/dist/providerResolver-DgvzNfP4.cjs.map +1 -0
  79. package/examples/cron-example.ts +45 -0
  80. package/examples/function-example.ts +40 -0
  81. package/examples/gkm.config.json +22 -0
  82. package/examples/gkm.minimal.config.json +7 -0
  83. package/examples/gkm.production.config.json +27 -0
  84. package/examples/logger.ts +1 -1
  85. package/package.json +38 -14
  86. package/src/__tests__/config.spec.ts +110 -0
  87. package/src/__tests__/openapi-react-query.spec.ts +506 -0
  88. package/src/__tests__/openapi.spec.ts +362 -0
  89. package/src/__tests__/test-helpers.ts +180 -0
  90. package/src/build/__tests__/index-new.spec.ts +577 -0
  91. package/src/build/index.ts +197 -0
  92. package/src/build/manifests.ts +35 -0
  93. package/src/build/providerResolver.ts +184 -0
  94. package/src/build/types.ts +37 -0
  95. package/src/config.ts +14 -6
  96. package/src/generators/CronGenerator.ts +98 -0
  97. package/src/generators/EndpointGenerator.ts +389 -0
  98. package/src/generators/FunctionGenerator.ts +97 -0
  99. package/src/generators/Generator.ts +95 -0
  100. package/src/generators/SubscriberGenerator.ts +271 -0
  101. package/src/generators/__tests__/CronGenerator.spec.ts +445 -0
  102. package/src/generators/__tests__/EndpointGenerator.spec.ts +394 -0
  103. package/src/generators/__tests__/FunctionGenerator.spec.ts +256 -0
  104. package/src/generators/__tests__/SubscriberGenerator.spec.ts +341 -0
  105. package/src/generators/index.ts +9 -0
  106. package/src/index.ts +57 -22
  107. package/src/openapi-react-query.ts +2 -1
  108. package/src/openapi.ts +5 -4
  109. package/src/types.ts +91 -2
  110. package/dist/build-BTggTCYL.cjs +0 -176
  111. package/dist/build-Ca4P6_lY.mjs +0 -170
  112. package/dist/build.cjs +0 -5
  113. package/dist/build.mjs +0 -5
  114. package/dist/config-BNqUMsvc.cjs +0 -24
  115. package/dist/config-BciAdY6_.mjs +0 -18
  116. package/dist/loadEndpoints-BBIavB9h.cjs +0 -37
  117. package/dist/loadEndpoints-DAZ53Og2.mjs +0 -31
  118. package/dist/loadEndpoints.cjs +0 -3
  119. package/dist/loadEndpoints.mjs +0 -3
  120. package/src/build.ts +0 -305
  121. package/src/loadEndpoints.ts +0 -48
@@ -0,0 +1,3 @@
1
+ const require_manifests = require('../manifests-D0saShvH.cjs');
2
+
3
+ exports.generateManifests = require_manifests.generateManifests;
@@ -0,0 +1,3 @@
1
+ import { generateManifests } from "../manifests-BrJXpHrf.mjs";
2
+
3
+ export { generateManifests };
@@ -0,0 +1,5 @@
1
+ const require_providerResolver = require('../providerResolver-DgvzNfP4.cjs');
2
+
3
+ exports.getAWSServiceConfig = require_providerResolver.getAWSServiceConfig;
4
+ exports.getServerConfig = require_providerResolver.getServerConfig;
5
+ exports.resolveProviders = require_providerResolver.resolveProviders;
@@ -0,0 +1,3 @@
1
+ import { getAWSServiceConfig, getServerConfig, resolveProviders } from "../providerResolver-B_TjNF0_.mjs";
2
+
3
+ export { getAWSServiceConfig, getServerConfig, resolveProviders };
File without changes
File without changes
@@ -0,0 +1,89 @@
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
+ const require_config = require('./config-D1EpSGk6.cjs');
3
+ const require_CronGenerator = require('./CronGenerator-1PflEYe2.cjs');
4
+ const require_EndpointGenerator = require('./EndpointGenerator-BbGrDiCP.cjs');
5
+ const require_FunctionGenerator = require('./FunctionGenerator-Clw64SwQ.cjs');
6
+ const require_SubscriberGenerator = require('./SubscriberGenerator-BfMZCVNy.cjs');
7
+ const require_manifests = require('./manifests-D0saShvH.cjs');
8
+ const require_providerResolver = require('./providerResolver-DgvzNfP4.cjs');
9
+ const node_fs_promises = require_chunk.__toESM(require("node:fs/promises"));
10
+ const node_path = require_chunk.__toESM(require("node:path"));
11
+
12
+ //#region src/build/index.ts
13
+ const logger = console;
14
+ async function buildCommand(options) {
15
+ const config = await require_config.loadConfig();
16
+ const resolved = require_providerResolver.resolveProviders(config, options);
17
+ logger.log(`Building with providers: ${resolved.providers.join(", ")}`);
18
+ logger.log(`Loading routes from: ${config.routes}`);
19
+ if (config.functions) logger.log(`Loading functions from: ${config.functions}`);
20
+ if (config.crons) logger.log(`Loading crons from: ${config.crons}`);
21
+ if (config.subscribers) logger.log(`Loading subscribers from: ${config.subscribers}`);
22
+ logger.log(`Using envParser: ${config.envParser}`);
23
+ const [envParserPath, envParserName] = config.envParser.split("#");
24
+ const envParserImportPattern = !envParserName ? "envParser" : envParserName === "envParser" ? "{ envParser }" : `{ ${envParserName} as envParser }`;
25
+ const [loggerPath, loggerName] = config.logger.split("#");
26
+ const loggerImportPattern = !loggerName ? "logger" : loggerName === "logger" ? "{ logger }" : `{ ${loggerName} as logger }`;
27
+ const buildContext = {
28
+ envParserPath,
29
+ envParserImportPattern,
30
+ loggerPath,
31
+ loggerImportPattern
32
+ };
33
+ const endpointGenerator = new require_EndpointGenerator.EndpointGenerator();
34
+ const functionGenerator = new require_FunctionGenerator.FunctionGenerator();
35
+ const cronGenerator = new require_CronGenerator.CronGenerator();
36
+ const subscriberGenerator = new require_SubscriberGenerator.SubscriberGenerator();
37
+ const [allEndpoints, allFunctions, allCrons, allSubscribers] = await Promise.all([
38
+ endpointGenerator.load(config.routes),
39
+ config.functions ? functionGenerator.load(config.functions) : [],
40
+ config.crons ? cronGenerator.load(config.crons) : [],
41
+ config.subscribers ? subscriberGenerator.load(config.subscribers) : []
42
+ ]);
43
+ logger.log(`Found ${allEndpoints.length} endpoints`);
44
+ logger.log(`Found ${allFunctions.length} functions`);
45
+ logger.log(`Found ${allCrons.length} crons`);
46
+ logger.log(`Found ${allSubscribers.length} subscribers`);
47
+ if (allEndpoints.length === 0 && allFunctions.length === 0 && allCrons.length === 0 && allSubscribers.length === 0) {
48
+ logger.log("No endpoints, functions, crons, or subscribers found to process");
49
+ return;
50
+ }
51
+ const rootOutputDir = (0, node_path.join)(process.cwd(), ".gkm");
52
+ await (0, node_fs_promises.mkdir)(rootOutputDir, { recursive: true });
53
+ const allBuildResults = await Promise.all(resolved.providers.map((provider) => buildForProvider(provider, buildContext, endpointGenerator, functionGenerator, cronGenerator, subscriberGenerator, allEndpoints, allFunctions, allCrons, allSubscribers, resolved.enableOpenApi)));
54
+ const aggregatedRoutes = allBuildResults.flatMap((result) => result.routes);
55
+ const aggregatedFunctions = allBuildResults.flatMap((result) => result.functions);
56
+ const aggregatedCrons = allBuildResults.flatMap((result) => result.crons);
57
+ const aggregatedSubscribers = allBuildResults.flatMap((result) => result.subscribers);
58
+ await require_manifests.generateManifests(rootOutputDir, aggregatedRoutes, aggregatedFunctions, aggregatedCrons, aggregatedSubscribers);
59
+ }
60
+ async function buildForProvider(provider, context, endpointGenerator, functionGenerator, cronGenerator, subscriberGenerator, endpoints, functions, crons, subscribers, enableOpenApi) {
61
+ const outputDir = (0, node_path.join)(process.cwd(), ".gkm", provider);
62
+ await (0, node_fs_promises.mkdir)(outputDir, { recursive: true });
63
+ logger.log(`\nGenerating handlers for provider: ${provider}`);
64
+ const [routes, functionInfos, cronInfos, subscriberInfos] = await Promise.all([
65
+ endpointGenerator.build(context, endpoints, outputDir, {
66
+ provider,
67
+ enableOpenApi
68
+ }),
69
+ functionGenerator.build(context, functions, outputDir, { provider }),
70
+ cronGenerator.build(context, crons, outputDir, { provider }),
71
+ subscriberGenerator.build(context, subscribers, outputDir, { provider })
72
+ ]);
73
+ logger.log(`Generated ${routes.length} routes, ${functionInfos.length} functions, ${cronInfos.length} crons, ${subscriberInfos.length} subscribers for ${provider}`);
74
+ return {
75
+ routes,
76
+ functions: functionInfos,
77
+ crons: cronInfos,
78
+ subscribers: subscriberInfos
79
+ };
80
+ }
81
+
82
+ //#endregion
83
+ Object.defineProperty(exports, 'buildCommand', {
84
+ enumerable: true,
85
+ get: function () {
86
+ return buildCommand;
87
+ }
88
+ });
89
+ //# sourceMappingURL=build-BBhlEjf5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-BBhlEjf5.cjs","names":["options: BuildOptions","buildContext: BuildContext","EndpointGenerator","FunctionGenerator","CronGenerator","SubscriberGenerator","provider: LegacyProvider","context: BuildContext","endpointGenerator: EndpointGenerator","functionGenerator: FunctionGenerator","cronGenerator: CronGenerator","subscriberGenerator: SubscriberGenerator","endpoints: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[]","functions: GeneratedConstruct<Function<any, any, any, any>>[]","crons: GeneratedConstruct<Cron<any, any, any, any>>[]","subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[]","enableOpenApi: boolean"],"sources":["../src/build/index.ts"],"sourcesContent":["import { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Cron } from '@geekmidas/constructs/crons';\nimport type { Endpoint } from '@geekmidas/constructs/endpoints';\nimport type { Function } from '@geekmidas/constructs/functions';\nimport type { Subscriber } from '@geekmidas/constructs/subscribers';\nimport { loadConfig } from '../config';\nimport {\n CronGenerator,\n EndpointGenerator,\n FunctionGenerator,\n type GeneratedConstruct,\n SubscriberGenerator,\n} from '../generators';\nimport type {\n BuildOptions,\n CronInfo,\n FunctionInfo,\n LegacyProvider,\n RouteInfo,\n SubscriberInfo,\n} from '../types';\nimport { generateManifests } from './manifests';\nimport { resolveProviders } from './providerResolver';\nimport type { BuildContext } from './types';\n\nconst logger = console;\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n const config = await loadConfig();\n\n // Resolve providers from new config format\n const resolved = resolveProviders(config, options);\n\n logger.log(`Building with providers: ${resolved.providers.join(', ')}`);\n logger.log(`Loading routes from: ${config.routes}`);\n if (config.functions) {\n logger.log(`Loading functions from: ${config.functions}`);\n }\n if (config.crons) {\n logger.log(`Loading crons from: ${config.crons}`);\n }\n if (config.subscribers) {\n logger.log(`Loading subscribers from: ${config.subscribers}`);\n }\n logger.log(`Using envParser: ${config.envParser}`);\n\n // Parse envParser configuration\n const [envParserPath, envParserName] = config.envParser.split('#');\n const envParserImportPattern = !envParserName\n ? 'envParser'\n : envParserName === 'envParser'\n ? '{ envParser }'\n : `{ ${envParserName} as envParser }`;\n\n // Parse logger configuration\n const [loggerPath, loggerName] = config.logger.split('#');\n const loggerImportPattern = !loggerName\n ? 'logger'\n : loggerName === 'logger'\n ? '{ logger }'\n : `{ ${loggerName} as logger }`;\n\n const buildContext: BuildContext = {\n envParserPath,\n envParserImportPattern,\n loggerPath,\n loggerImportPattern,\n };\n\n // Initialize generators\n const endpointGenerator = new EndpointGenerator();\n const functionGenerator = new FunctionGenerator();\n const cronGenerator = new CronGenerator();\n const subscriberGenerator = new SubscriberGenerator();\n\n // Load all constructs in parallel\n const [allEndpoints, allFunctions, allCrons, allSubscribers] =\n await Promise.all([\n endpointGenerator.load(config.routes),\n config.functions ? functionGenerator.load(config.functions) : [],\n config.crons ? cronGenerator.load(config.crons) : [],\n config.subscribers ? subscriberGenerator.load(config.subscribers) : [],\n ]);\n\n logger.log(`Found ${allEndpoints.length} endpoints`);\n logger.log(`Found ${allFunctions.length} functions`);\n logger.log(`Found ${allCrons.length} crons`);\n logger.log(`Found ${allSubscribers.length} subscribers`);\n\n if (\n allEndpoints.length === 0 &&\n allFunctions.length === 0 &&\n allCrons.length === 0 &&\n allSubscribers.length === 0\n ) {\n logger.log(\n 'No endpoints, functions, crons, or subscribers found to process',\n );\n return;\n }\n\n // Ensure .gkm directory exists\n const rootOutputDir = join(process.cwd(), '.gkm');\n await mkdir(rootOutputDir, { recursive: true });\n\n // Collect all build results from each provider\n const allBuildResults = await Promise.all(\n resolved.providers.map((provider) =>\n buildForProvider(\n provider,\n buildContext,\n endpointGenerator,\n functionGenerator,\n cronGenerator,\n subscriberGenerator,\n allEndpoints,\n allFunctions,\n allCrons,\n allSubscribers,\n resolved.enableOpenApi,\n ),\n ),\n );\n\n // Aggregate all routes, functions, crons, and subscribers from all providers\n const aggregatedRoutes = allBuildResults.flatMap((result) => result.routes);\n const aggregatedFunctions = allBuildResults.flatMap(\n (result) => result.functions,\n );\n const aggregatedCrons = allBuildResults.flatMap((result) => result.crons);\n const aggregatedSubscribers = allBuildResults.flatMap(\n (result) => result.subscribers,\n );\n\n // Generate single manifest at root .gkm directory\n await generateManifests(\n rootOutputDir,\n aggregatedRoutes,\n aggregatedFunctions,\n aggregatedCrons,\n aggregatedSubscribers,\n );\n}\n\ninterface BuildResult {\n routes: RouteInfo[];\n functions: FunctionInfo[];\n crons: CronInfo[];\n subscribers: SubscriberInfo[];\n}\n\nasync function buildForProvider(\n provider: LegacyProvider,\n context: BuildContext,\n endpointGenerator: EndpointGenerator,\n functionGenerator: FunctionGenerator,\n cronGenerator: CronGenerator,\n subscriberGenerator: SubscriberGenerator,\n endpoints: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[],\n functions: GeneratedConstruct<Function<any, any, any, any>>[],\n crons: GeneratedConstruct<Cron<any, any, any, any>>[],\n subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[],\n enableOpenApi: boolean,\n): Promise<BuildResult> {\n const outputDir = join(process.cwd(), '.gkm', provider);\n\n // Ensure output directory exists\n await mkdir(outputDir, { recursive: true });\n\n logger.log(`\\nGenerating handlers for provider: ${provider}`);\n\n // Build all constructs in parallel\n const [routes, functionInfos, cronInfos, subscriberInfos] = await Promise.all(\n [\n endpointGenerator.build(context, endpoints, outputDir, {\n provider,\n enableOpenApi,\n }),\n functionGenerator.build(context, functions, outputDir, { provider }),\n cronGenerator.build(context, crons, outputDir, { provider }),\n subscriberGenerator.build(context, subscribers, outputDir, { provider }),\n ],\n );\n\n logger.log(\n `Generated ${routes.length} routes, ${functionInfos.length} functions, ${cronInfos.length} crons, ${subscriberInfos.length} subscribers for ${provider}`,\n );\n\n // Return build results instead of generating manifest here\n return {\n routes,\n functions: functionInfos,\n crons: cronInfos,\n subscribers: subscriberInfos,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { loadConfig } from "./config-U-mdW-7Y.mjs";
2
+ import { CronGenerator } from "./CronGenerator-DXRfHQcV.mjs";
3
+ import { EndpointGenerator } from "./EndpointGenerator-BmZ9BxbO.mjs";
4
+ import { FunctionGenerator } from "./FunctionGenerator-DOEB_yPh.mjs";
5
+ import { SubscriberGenerator } from "./SubscriberGenerator-D2u00NI3.mjs";
6
+ import { generateManifests } from "./manifests-BrJXpHrf.mjs";
7
+ import { resolveProviders } from "./providerResolver-B_TjNF0_.mjs";
8
+ import { mkdir } from "node:fs/promises";
9
+ import { join } from "node:path";
10
+
11
+ //#region src/build/index.ts
12
+ const logger = console;
13
+ async function buildCommand(options) {
14
+ const config = await loadConfig();
15
+ const resolved = resolveProviders(config, options);
16
+ logger.log(`Building with providers: ${resolved.providers.join(", ")}`);
17
+ logger.log(`Loading routes from: ${config.routes}`);
18
+ if (config.functions) logger.log(`Loading functions from: ${config.functions}`);
19
+ if (config.crons) logger.log(`Loading crons from: ${config.crons}`);
20
+ if (config.subscribers) logger.log(`Loading subscribers from: ${config.subscribers}`);
21
+ logger.log(`Using envParser: ${config.envParser}`);
22
+ const [envParserPath, envParserName] = config.envParser.split("#");
23
+ const envParserImportPattern = !envParserName ? "envParser" : envParserName === "envParser" ? "{ envParser }" : `{ ${envParserName} as envParser }`;
24
+ const [loggerPath, loggerName] = config.logger.split("#");
25
+ const loggerImportPattern = !loggerName ? "logger" : loggerName === "logger" ? "{ logger }" : `{ ${loggerName} as logger }`;
26
+ const buildContext = {
27
+ envParserPath,
28
+ envParserImportPattern,
29
+ loggerPath,
30
+ loggerImportPattern
31
+ };
32
+ const endpointGenerator = new EndpointGenerator();
33
+ const functionGenerator = new FunctionGenerator();
34
+ const cronGenerator = new CronGenerator();
35
+ const subscriberGenerator = new SubscriberGenerator();
36
+ const [allEndpoints, allFunctions, allCrons, allSubscribers] = await Promise.all([
37
+ endpointGenerator.load(config.routes),
38
+ config.functions ? functionGenerator.load(config.functions) : [],
39
+ config.crons ? cronGenerator.load(config.crons) : [],
40
+ config.subscribers ? subscriberGenerator.load(config.subscribers) : []
41
+ ]);
42
+ logger.log(`Found ${allEndpoints.length} endpoints`);
43
+ logger.log(`Found ${allFunctions.length} functions`);
44
+ logger.log(`Found ${allCrons.length} crons`);
45
+ logger.log(`Found ${allSubscribers.length} subscribers`);
46
+ if (allEndpoints.length === 0 && allFunctions.length === 0 && allCrons.length === 0 && allSubscribers.length === 0) {
47
+ logger.log("No endpoints, functions, crons, or subscribers found to process");
48
+ return;
49
+ }
50
+ const rootOutputDir = join(process.cwd(), ".gkm");
51
+ await mkdir(rootOutputDir, { recursive: true });
52
+ const allBuildResults = await Promise.all(resolved.providers.map((provider) => buildForProvider(provider, buildContext, endpointGenerator, functionGenerator, cronGenerator, subscriberGenerator, allEndpoints, allFunctions, allCrons, allSubscribers, resolved.enableOpenApi)));
53
+ const aggregatedRoutes = allBuildResults.flatMap((result) => result.routes);
54
+ const aggregatedFunctions = allBuildResults.flatMap((result) => result.functions);
55
+ const aggregatedCrons = allBuildResults.flatMap((result) => result.crons);
56
+ const aggregatedSubscribers = allBuildResults.flatMap((result) => result.subscribers);
57
+ await generateManifests(rootOutputDir, aggregatedRoutes, aggregatedFunctions, aggregatedCrons, aggregatedSubscribers);
58
+ }
59
+ async function buildForProvider(provider, context, endpointGenerator, functionGenerator, cronGenerator, subscriberGenerator, endpoints, functions, crons, subscribers, enableOpenApi) {
60
+ const outputDir = join(process.cwd(), ".gkm", provider);
61
+ await mkdir(outputDir, { recursive: true });
62
+ logger.log(`\nGenerating handlers for provider: ${provider}`);
63
+ const [routes, functionInfos, cronInfos, subscriberInfos] = await Promise.all([
64
+ endpointGenerator.build(context, endpoints, outputDir, {
65
+ provider,
66
+ enableOpenApi
67
+ }),
68
+ functionGenerator.build(context, functions, outputDir, { provider }),
69
+ cronGenerator.build(context, crons, outputDir, { provider }),
70
+ subscriberGenerator.build(context, subscribers, outputDir, { provider })
71
+ ]);
72
+ logger.log(`Generated ${routes.length} routes, ${functionInfos.length} functions, ${cronInfos.length} crons, ${subscriberInfos.length} subscribers for ${provider}`);
73
+ return {
74
+ routes,
75
+ functions: functionInfos,
76
+ crons: cronInfos,
77
+ subscribers: subscriberInfos
78
+ };
79
+ }
80
+
81
+ //#endregion
82
+ export { buildCommand };
83
+ //# sourceMappingURL=build-kY-lG30Q.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-kY-lG30Q.mjs","names":["options: BuildOptions","buildContext: BuildContext","provider: LegacyProvider","context: BuildContext","endpointGenerator: EndpointGenerator","functionGenerator: FunctionGenerator","cronGenerator: CronGenerator","subscriberGenerator: SubscriberGenerator","endpoints: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[]","functions: GeneratedConstruct<Function<any, any, any, any>>[]","crons: GeneratedConstruct<Cron<any, any, any, any>>[]","subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[]","enableOpenApi: boolean"],"sources":["../src/build/index.ts"],"sourcesContent":["import { mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Cron } from '@geekmidas/constructs/crons';\nimport type { Endpoint } from '@geekmidas/constructs/endpoints';\nimport type { Function } from '@geekmidas/constructs/functions';\nimport type { Subscriber } from '@geekmidas/constructs/subscribers';\nimport { loadConfig } from '../config';\nimport {\n CronGenerator,\n EndpointGenerator,\n FunctionGenerator,\n type GeneratedConstruct,\n SubscriberGenerator,\n} from '../generators';\nimport type {\n BuildOptions,\n CronInfo,\n FunctionInfo,\n LegacyProvider,\n RouteInfo,\n SubscriberInfo,\n} from '../types';\nimport { generateManifests } from './manifests';\nimport { resolveProviders } from './providerResolver';\nimport type { BuildContext } from './types';\n\nconst logger = console;\n\nexport async function buildCommand(options: BuildOptions): Promise<void> {\n const config = await loadConfig();\n\n // Resolve providers from new config format\n const resolved = resolveProviders(config, options);\n\n logger.log(`Building with providers: ${resolved.providers.join(', ')}`);\n logger.log(`Loading routes from: ${config.routes}`);\n if (config.functions) {\n logger.log(`Loading functions from: ${config.functions}`);\n }\n if (config.crons) {\n logger.log(`Loading crons from: ${config.crons}`);\n }\n if (config.subscribers) {\n logger.log(`Loading subscribers from: ${config.subscribers}`);\n }\n logger.log(`Using envParser: ${config.envParser}`);\n\n // Parse envParser configuration\n const [envParserPath, envParserName] = config.envParser.split('#');\n const envParserImportPattern = !envParserName\n ? 'envParser'\n : envParserName === 'envParser'\n ? '{ envParser }'\n : `{ ${envParserName} as envParser }`;\n\n // Parse logger configuration\n const [loggerPath, loggerName] = config.logger.split('#');\n const loggerImportPattern = !loggerName\n ? 'logger'\n : loggerName === 'logger'\n ? '{ logger }'\n : `{ ${loggerName} as logger }`;\n\n const buildContext: BuildContext = {\n envParserPath,\n envParserImportPattern,\n loggerPath,\n loggerImportPattern,\n };\n\n // Initialize generators\n const endpointGenerator = new EndpointGenerator();\n const functionGenerator = new FunctionGenerator();\n const cronGenerator = new CronGenerator();\n const subscriberGenerator = new SubscriberGenerator();\n\n // Load all constructs in parallel\n const [allEndpoints, allFunctions, allCrons, allSubscribers] =\n await Promise.all([\n endpointGenerator.load(config.routes),\n config.functions ? functionGenerator.load(config.functions) : [],\n config.crons ? cronGenerator.load(config.crons) : [],\n config.subscribers ? subscriberGenerator.load(config.subscribers) : [],\n ]);\n\n logger.log(`Found ${allEndpoints.length} endpoints`);\n logger.log(`Found ${allFunctions.length} functions`);\n logger.log(`Found ${allCrons.length} crons`);\n logger.log(`Found ${allSubscribers.length} subscribers`);\n\n if (\n allEndpoints.length === 0 &&\n allFunctions.length === 0 &&\n allCrons.length === 0 &&\n allSubscribers.length === 0\n ) {\n logger.log(\n 'No endpoints, functions, crons, or subscribers found to process',\n );\n return;\n }\n\n // Ensure .gkm directory exists\n const rootOutputDir = join(process.cwd(), '.gkm');\n await mkdir(rootOutputDir, { recursive: true });\n\n // Collect all build results from each provider\n const allBuildResults = await Promise.all(\n resolved.providers.map((provider) =>\n buildForProvider(\n provider,\n buildContext,\n endpointGenerator,\n functionGenerator,\n cronGenerator,\n subscriberGenerator,\n allEndpoints,\n allFunctions,\n allCrons,\n allSubscribers,\n resolved.enableOpenApi,\n ),\n ),\n );\n\n // Aggregate all routes, functions, crons, and subscribers from all providers\n const aggregatedRoutes = allBuildResults.flatMap((result) => result.routes);\n const aggregatedFunctions = allBuildResults.flatMap(\n (result) => result.functions,\n );\n const aggregatedCrons = allBuildResults.flatMap((result) => result.crons);\n const aggregatedSubscribers = allBuildResults.flatMap(\n (result) => result.subscribers,\n );\n\n // Generate single manifest at root .gkm directory\n await generateManifests(\n rootOutputDir,\n aggregatedRoutes,\n aggregatedFunctions,\n aggregatedCrons,\n aggregatedSubscribers,\n );\n}\n\ninterface BuildResult {\n routes: RouteInfo[];\n functions: FunctionInfo[];\n crons: CronInfo[];\n subscribers: SubscriberInfo[];\n}\n\nasync function buildForProvider(\n provider: LegacyProvider,\n context: BuildContext,\n endpointGenerator: EndpointGenerator,\n functionGenerator: FunctionGenerator,\n cronGenerator: CronGenerator,\n subscriberGenerator: SubscriberGenerator,\n endpoints: GeneratedConstruct<Endpoint<any, any, any, any, any, any>>[],\n functions: GeneratedConstruct<Function<any, any, any, any>>[],\n crons: GeneratedConstruct<Cron<any, any, any, any>>[],\n subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[],\n enableOpenApi: boolean,\n): Promise<BuildResult> {\n const outputDir = join(process.cwd(), '.gkm', provider);\n\n // Ensure output directory exists\n await mkdir(outputDir, { recursive: true });\n\n logger.log(`\\nGenerating handlers for provider: ${provider}`);\n\n // Build all constructs in parallel\n const [routes, functionInfos, cronInfos, subscriberInfos] = await Promise.all(\n [\n endpointGenerator.build(context, endpoints, outputDir, {\n provider,\n enableOpenApi,\n }),\n functionGenerator.build(context, functions, outputDir, { provider }),\n cronGenerator.build(context, crons, outputDir, { provider }),\n subscriberGenerator.build(context, subscribers, outputDir, { provider }),\n ],\n );\n\n logger.log(\n `Generated ${routes.length} routes, ${functionInfos.length} functions, ${cronInfos.length} crons, ${subscriberInfos.length} subscribers for ${provider}`,\n );\n\n // Return build results instead of generating manifest here\n return {\n routes,\n functions: functionInfos,\n crons: cronInfos,\n subscribers: subscriberInfos,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
+ const fs = require_chunk.__toESM(require("fs"));
3
+ const path = require_chunk.__toESM(require("path"));
4
+
5
+ //#region src/config.ts
6
+ async function loadConfig() {
7
+ const files = [
8
+ "gkm.config.json",
9
+ "gkm.config.ts",
10
+ "gkm.config.js"
11
+ ];
12
+ let configPath = "";
13
+ for (const file of files) {
14
+ const path$1 = (0, path.join)(process.cwd(), file);
15
+ if ((0, fs.existsSync)(path$1)) {
16
+ configPath = path$1;
17
+ break;
18
+ }
19
+ }
20
+ if (!configPath) throw new Error("Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.");
21
+ try {
22
+ const config = await import(configPath);
23
+ return config.default;
24
+ } catch (error) {
25
+ throw new Error(`Failed to load gkm.config.json: ${error.message}`);
26
+ }
27
+ }
28
+
29
+ //#endregion
30
+ Object.defineProperty(exports, 'loadConfig', {
31
+ enumerable: true,
32
+ get: function () {
33
+ return loadConfig;
34
+ }
35
+ });
36
+ //# sourceMappingURL=config-D1EpSGk6.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-D1EpSGk6.cjs","names":["path"],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join } from 'path';\nimport type { GkmConfig } from './types.ts';\n\nexport async function loadConfig(): Promise<GkmConfig> {\n const files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n let configPath = '';\n\n for (const file of files) {\n const path = join(process.cwd(), file);\n if (existsSync(path)) {\n configPath = path;\n break;\n }\n }\n\n if (!configPath) {\n throw new Error(\n 'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n );\n }\n\n try {\n const config = await import(configPath);\n return config.default;\n } catch (error) {\n throw new Error(\n `Failed to load gkm.config.json: ${(error as Error).message}`,\n );\n }\n}\n"],"mappings":";;;;;AAIA,eAAsB,aAAiC;CACrD,MAAM,QAAQ;EAAC;EAAmB;EAAiB;CAAgB;CACnE,IAAI,aAAa;AAEjB,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAMA,SAAO,eAAK,QAAQ,KAAK,EAAE,KAAK;AACtC,MAAI,mBAAWA,OAAK,EAAE;AACpB,gBAAaA;AACb;EACD;CACF;AAED,MAAK,WACH,OAAM,IAAI,MACR;AAIJ,KAAI;EACF,MAAM,SAAS,MAAM,OAAO;AAC5B,SAAO,OAAO;CACf,SAAQ,OAAO;AACd,QAAM,IAAI,OACP,kCAAmC,MAAgB,QAAQ;CAE/D;AACF"}
@@ -0,0 +1,30 @@
1
+ import { existsSync } from "fs";
2
+ import { join } from "path";
3
+
4
+ //#region src/config.ts
5
+ async function loadConfig() {
6
+ const files = [
7
+ "gkm.config.json",
8
+ "gkm.config.ts",
9
+ "gkm.config.js"
10
+ ];
11
+ let configPath = "";
12
+ for (const file of files) {
13
+ const path = join(process.cwd(), file);
14
+ if (existsSync(path)) {
15
+ configPath = path;
16
+ break;
17
+ }
18
+ }
19
+ if (!configPath) throw new Error("Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.");
20
+ try {
21
+ const config = await import(configPath);
22
+ return config.default;
23
+ } catch (error) {
24
+ throw new Error(`Failed to load gkm.config.json: ${error.message}`);
25
+ }
26
+ }
27
+
28
+ //#endregion
29
+ export { loadConfig };
30
+ //# sourceMappingURL=config-U-mdW-7Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-U-mdW-7Y.mjs","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join } from 'path';\nimport type { GkmConfig } from './types.ts';\n\nexport async function loadConfig(): Promise<GkmConfig> {\n const files = ['gkm.config.json', 'gkm.config.ts', 'gkm.config.js'];\n let configPath = '';\n\n for (const file of files) {\n const path = join(process.cwd(), file);\n if (existsSync(path)) {\n configPath = path;\n break;\n }\n }\n\n if (!configPath) {\n throw new Error(\n 'Configuration file not found. Please create gkm.config.json, gkm.config.ts, or gkm.config.js in the project root.',\n );\n }\n\n try {\n const config = await import(configPath);\n return config.default;\n } catch (error) {\n throw new Error(\n `Failed to load gkm.config.json: ${(error as Error).message}`,\n );\n }\n}\n"],"mappings":";;;;AAIA,eAAsB,aAAiC;CACrD,MAAM,QAAQ;EAAC;EAAmB;EAAiB;CAAgB;CACnE,IAAI,aAAa;AAEjB,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,OAAO,KAAK,QAAQ,KAAK,EAAE,KAAK;AACtC,MAAI,WAAW,KAAK,EAAE;AACpB,gBAAa;AACb;EACD;CACF;AAED,MAAK,WACH,OAAM,IAAI,MACR;AAIJ,KAAI;EACF,MAAM,SAAS,MAAM,OAAO;AAC5B,SAAO,OAAO;CACf,SAAQ,OAAO;AACd,QAAM,IAAI,OACP,kCAAmC,MAAgB,QAAQ;CAE/D;AACF"}
package/dist/config.cjs CHANGED
@@ -1,3 +1,3 @@
1
- const require_config = require('./config-BNqUMsvc.cjs');
1
+ const require_config = require('./config-D1EpSGk6.cjs');
2
2
 
3
3
  exports.loadConfig = require_config.loadConfig;
package/dist/config.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { loadConfig } from "./config-BciAdY6_.mjs";
1
+ import { loadConfig } from "./config-U-mdW-7Y.mjs";
2
2
 
3
3
  export { loadConfig };
@@ -0,0 +1,4 @@
1
+ require('../Generator-CDoEXCDg.cjs');
2
+ const require_CronGenerator = require('../CronGenerator-1PflEYe2.cjs');
3
+
4
+ exports.CronGenerator = require_CronGenerator.CronGenerator;
@@ -0,0 +1,4 @@
1
+ import "../Generator-UanJW0_V.mjs";
2
+ import { CronGenerator } from "../CronGenerator-DXRfHQcV.mjs";
3
+
4
+ export { CronGenerator };
@@ -0,0 +1,4 @@
1
+ require('../Generator-CDoEXCDg.cjs');
2
+ const require_EndpointGenerator = require('../EndpointGenerator-BbGrDiCP.cjs');
3
+
4
+ exports.EndpointGenerator = require_EndpointGenerator.EndpointGenerator;
@@ -0,0 +1,4 @@
1
+ import "../Generator-UanJW0_V.mjs";
2
+ import { EndpointGenerator } from "../EndpointGenerator-BmZ9BxbO.mjs";
3
+
4
+ export { EndpointGenerator };
@@ -0,0 +1,4 @@
1
+ require('../Generator-CDoEXCDg.cjs');
2
+ const require_FunctionGenerator = require('../FunctionGenerator-Clw64SwQ.cjs');
3
+
4
+ exports.FunctionGenerator = require_FunctionGenerator.FunctionGenerator;
@@ -0,0 +1,4 @@
1
+ import "../Generator-UanJW0_V.mjs";
2
+ import { FunctionGenerator } from "../FunctionGenerator-DOEB_yPh.mjs";
3
+
4
+ export { FunctionGenerator };
@@ -0,0 +1,3 @@
1
+ const require_Generator = require('../Generator-CDoEXCDg.cjs');
2
+
3
+ exports.ConstructGenerator = require_Generator.ConstructGenerator;
@@ -0,0 +1,3 @@
1
+ import { ConstructGenerator } from "../Generator-UanJW0_V.mjs";
2
+
3
+ export { ConstructGenerator };
@@ -0,0 +1,4 @@
1
+ require('../Generator-CDoEXCDg.cjs');
2
+ const require_SubscriberGenerator = require('../SubscriberGenerator-BfMZCVNy.cjs');
3
+
4
+ exports.SubscriberGenerator = require_SubscriberGenerator.SubscriberGenerator;
@@ -0,0 +1,4 @@
1
+ import "../Generator-UanJW0_V.mjs";
2
+ import { SubscriberGenerator } from "../SubscriberGenerator-D2u00NI3.mjs";
3
+
4
+ export { SubscriberGenerator };
@@ -0,0 +1,12 @@
1
+ const require_Generator = require('../Generator-CDoEXCDg.cjs');
2
+ const require_CronGenerator = require('../CronGenerator-1PflEYe2.cjs');
3
+ const require_EndpointGenerator = require('../EndpointGenerator-BbGrDiCP.cjs');
4
+ const require_FunctionGenerator = require('../FunctionGenerator-Clw64SwQ.cjs');
5
+ const require_SubscriberGenerator = require('../SubscriberGenerator-BfMZCVNy.cjs');
6
+ require('../generators-CEKtVh81.cjs');
7
+
8
+ exports.ConstructGenerator = require_Generator.ConstructGenerator;
9
+ exports.CronGenerator = require_CronGenerator.CronGenerator;
10
+ exports.EndpointGenerator = require_EndpointGenerator.EndpointGenerator;
11
+ exports.FunctionGenerator = require_FunctionGenerator.FunctionGenerator;
12
+ exports.SubscriberGenerator = require_SubscriberGenerator.SubscriberGenerator;
@@ -0,0 +1,8 @@
1
+ import { ConstructGenerator } from "../Generator-UanJW0_V.mjs";
2
+ import { CronGenerator } from "../CronGenerator-DXRfHQcV.mjs";
3
+ import { EndpointGenerator } from "../EndpointGenerator-BmZ9BxbO.mjs";
4
+ import { FunctionGenerator } from "../FunctionGenerator-DOEB_yPh.mjs";
5
+ import { SubscriberGenerator } from "../SubscriberGenerator-D2u00NI3.mjs";
6
+ import "../generators-CsLujGXs.mjs";
7
+
8
+ export { ConstructGenerator, CronGenerator, EndpointGenerator, FunctionGenerator, SubscriberGenerator };
File without changes
File without changes
package/dist/index.cjs CHANGED
@@ -1,42 +1,75 @@
1
1
  #!/usr/bin/env -S npx tsx
2
2
  const require_chunk = require('./chunk-CUT6urMc.cjs');
3
- require('./config-BNqUMsvc.cjs');
4
- require('./loadEndpoints-BBIavB9h.cjs');
5
- const require_build = require('./build-BTggTCYL.cjs');
6
- const require_openapi_react_query = require('./openapi-react-query-C1JLYUOs.cjs');
7
- const require_openapi = require('./openapi-D4QQJUPY.cjs');
3
+ require('./config-D1EpSGk6.cjs');
4
+ require('./Generator-CDoEXCDg.cjs');
5
+ require('./CronGenerator-1PflEYe2.cjs');
6
+ require('./EndpointGenerator-BbGrDiCP.cjs');
7
+ require('./FunctionGenerator-Clw64SwQ.cjs');
8
+ require('./SubscriberGenerator-BfMZCVNy.cjs');
9
+ require('./generators-CEKtVh81.cjs');
10
+ require('./manifests-D0saShvH.cjs');
11
+ require('./providerResolver-DgvzNfP4.cjs');
12
+ const require_build = require('./build-BBhlEjf5.cjs');
13
+ const require_openapi_react_query = require('./openapi-react-query-Dvjqx_Eo.cjs');
14
+ const require_openapi = require('./openapi-CMLr04cz.cjs');
8
15
  const commander = require_chunk.__toESM(require("commander"));
9
16
 
10
17
  //#region package.json
11
18
  var name = "@geekmidas/cli";
12
- var version = "0.0.26";
19
+ var version = "0.2.0";
13
20
  var private$1 = false;
14
21
  var type = "module";
22
+ var exports$1 = {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.mjs",
26
+ "require": "./dist/index.cjs"
27
+ },
28
+ "./openapi": {
29
+ "types": "./dist/openapi.d.ts",
30
+ "import": "./dist/openapi.mjs",
31
+ "require": "./dist/openapi.cjs"
32
+ },
33
+ "./openapi-react-query": {
34
+ "types": "./dist/openapi-react-query.d.ts",
35
+ "import": "./dist/openapi-react-query.mjs",
36
+ "require": "./dist/openapi-react-query.cjs"
37
+ }
38
+ };
15
39
  var bin = { "gkm": "./dist/index.cjs" };
16
- var publishConfig = {
17
- "registry": "https://registry.npmjs.org/",
18
- "access": "public"
40
+ var scripts = {
41
+ "ts": "tsc --noEmit --skipLibCheck src/**/*.ts",
42
+ "test": "vitest",
43
+ "test:once": "vitest run",
44
+ "test:coverage": "vitest run --coverage"
19
45
  };
20
46
  var dependencies = {
21
- "commander": "~14.0.0",
22
- "lodash.get": "~4.4.2",
23
- "lodash.set": "~4.3.2",
24
- "fast-glob": "~3.3.3"
47
+ "@apidevtools/swagger-parser": "^10.1.0",
48
+ "@geekmidas/constructs": "workspace:*",
49
+ "@geekmidas/schema": "workspace:*",
50
+ "@geekmidas/envkit": "workspace:*",
51
+ "commander": "^12.1.0",
52
+ "fast-glob": "^3.3.2",
53
+ "lodash.kebabcase": "^4.1.1",
54
+ "openapi-typescript": "^7.4.2"
25
55
  };
26
- var peerDependencies = { "@geekmidas/api": "workspace:*" };
27
56
  var devDependencies = {
28
- "@types/lodash.get": "~4.4.9",
29
- "@types/lodash.set": "~4.3.9"
57
+ "@types/lodash.kebabcase": "^4.1.9",
58
+ "@geekmidas/testkit": "workspace:*",
59
+ "typescript": "^5.8.2",
60
+ "vitest": "^3.2.4",
61
+ "@geekmidas/logger": "workspace:*",
62
+ "zod": "^3.23.8"
30
63
  };
31
64
  var package_default = {
32
65
  name,
33
66
  version,
34
67
  private: private$1,
35
68
  type,
69
+ exports: exports$1,
36
70
  bin,
37
- publishConfig,
71
+ scripts,
38
72
  dependencies,
39
- peerDependencies,
40
73
  devDependencies
41
74
  };
42
75
 
@@ -44,15 +77,27 @@ var package_default = {
44
77
  //#region src/index.ts
45
78
  const program = new commander.Command();
46
79
  program.name("gkm").description("GeekMidas backend framework CLI").version(package_default.version).option("--cwd <path>", "Change working directory");
47
- program.command("build").description("Build API handlers from endpoints").option("--providers <providers>", "Target providers for generated handlers (comma-separated)", "aws-apigatewayv1").option("--enable-openapi", "Enable OpenAPI documentation generation for server builds").action(async (options) => {
80
+ program.command("build").description("Build handlers from endpoints, functions, and crons").option("--provider <provider>", "Target provider for generated handlers (aws, server)").option("--providers <providers>", "[DEPRECATED] Use --provider instead. Target providers for generated handlers (comma-separated)").option("--enable-openapi", "Enable OpenAPI documentation generation for server builds").action(async (options) => {
48
81
  try {
49
82
  const globalOptions = program.opts();
50
83
  if (globalOptions.cwd) process.chdir(globalOptions.cwd);
51
- const providerList = [...new Set(options.providers.split(",").map((p) => p.trim()))];
52
- await require_build.buildCommand({
53
- providers: providerList,
54
- enableOpenApi: options.enableOpenapi || false
55
- });
84
+ if (options.provider) {
85
+ if (!["aws", "server"].includes(options.provider)) {
86
+ console.error(`Invalid provider: ${options.provider}. Must be 'aws' or 'server'.`);
87
+ process.exit(1);
88
+ }
89
+ await require_build.buildCommand({
90
+ provider: options.provider,
91
+ enableOpenApi: options.enableOpenapi || false
92
+ });
93
+ } else if (options.providers) {
94
+ console.warn("⚠️ --providers flag is deprecated. Use --provider instead.");
95
+ const providerList = [...new Set(options.providers.split(",").map((p) => p.trim()))];
96
+ await require_build.buildCommand({
97
+ providers: providerList,
98
+ enableOpenApi: options.enableOpenapi || false
99
+ });
100
+ } else await require_build.buildCommand({ enableOpenApi: options.enableOpenapi || false });
56
101
  } catch (error) {
57
102
  console.error("Build failed:", error.message);
58
103
  process.exit(1);
@@ -95,4 +140,5 @@ program.command("generate:react-query").description("Generate React Query hooks
95
140
  });
96
141
  program.parse();
97
142
 
98
- //#endregion
143
+ //#endregion
144
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["Command","pkg","options: {\n provider?: string;\n providers?: string;\n enableOpenapi?: boolean;\n }","options: { output?: string }","options: { input?: string; output?: string; name?: string }"],"sources":["../package.json","../src/index.ts"],"sourcesContent":["{\n \"name\": \"@geekmidas/cli\",\n \"version\": \"0.2.0\",\n \"private\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./openapi\": {\n \"types\": \"./dist/openapi.d.ts\",\n \"import\": \"./dist/openapi.mjs\",\n \"require\": \"./dist/openapi.cjs\"\n },\n \"./openapi-react-query\": {\n \"types\": \"./dist/openapi-react-query.d.ts\",\n \"import\": \"./dist/openapi-react-query.mjs\",\n \"require\": \"./dist/openapi-react-query.cjs\"\n }\n },\n \"bin\": {\n \"gkm\": \"./dist/index.cjs\"\n },\n \"scripts\": {\n \"ts\": \"tsc --noEmit --skipLibCheck src/**/*.ts\",\n \"test\": \"vitest\",\n \"test:once\": \"vitest run\",\n \"test:coverage\": \"vitest run --coverage\"\n },\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^10.1.0\",\n \"@geekmidas/constructs\": \"workspace:*\",\n \"@geekmidas/schema\": \"workspace:*\",\n \"@geekmidas/envkit\": \"workspace:*\",\n \"commander\": \"^12.1.0\",\n \"fast-glob\": \"^3.3.2\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"openapi-typescript\": \"^7.4.2\"\n },\n \"devDependencies\": {\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@geekmidas/testkit\": \"workspace:*\",\n \"typescript\": \"^5.8.2\",\n \"vitest\": \"^3.2.4\",\n \"@geekmidas/logger\": \"workspace:*\",\n \"zod\": \"^3.23.8\"\n }\n}\n","#!/usr/bin/env -S npx tsx\n\nimport { Command } from 'commander';\nimport pkg from '../package.json' assert { type: 'json' };\nimport { buildCommand } from './build/index.ts';\nimport { generateReactQueryCommand } from './openapi-react-query.ts';\nimport { openapiCommand } from './openapi.ts';\nimport type { LegacyProvider, MainProvider } from './types.ts';\n\nconst program = new Command();\n\nprogram\n .name('gkm')\n .description('GeekMidas backend framework CLI')\n .version(pkg.version)\n .option('--cwd <path>', 'Change working directory');\n\nprogram\n .command('build')\n .description('Build handlers from endpoints, functions, and crons')\n .option(\n '--provider <provider>',\n 'Target provider for generated handlers (aws, server)',\n )\n .option(\n '--providers <providers>',\n '[DEPRECATED] Use --provider instead. Target providers for generated handlers (comma-separated)',\n )\n .option(\n '--enable-openapi',\n 'Enable OpenAPI documentation generation for server builds',\n )\n .action(\n async (options: {\n provider?: string;\n providers?: string;\n enableOpenapi?: boolean;\n }) => {\n try {\n const globalOptions = program.opts();\n if (globalOptions.cwd) {\n process.chdir(globalOptions.cwd);\n }\n\n // Handle new single provider option\n if (options.provider) {\n if (!['aws', 'server'].includes(options.provider)) {\n console.error(\n `Invalid provider: ${options.provider}. Must be 'aws' or 'server'.`,\n );\n process.exit(1);\n }\n await buildCommand({\n provider: options.provider as MainProvider,\n enableOpenApi: options.enableOpenapi || false,\n });\n }\n // Handle legacy providers option\n else if (options.providers) {\n console.warn(\n '⚠️ --providers flag is deprecated. Use --provider instead.',\n );\n const providerList = [\n ...new Set(options.providers.split(',').map((p) => p.trim())),\n ] as LegacyProvider[];\n await buildCommand({\n providers: providerList,\n enableOpenApi: options.enableOpenapi || false,\n });\n }\n // Default to config-driven build\n else {\n await buildCommand({\n enableOpenApi: options.enableOpenapi || false,\n });\n }\n } catch (error) {\n console.error('Build failed:', (error as Error).message);\n process.exit(1);\n }\n },\n );\n\nprogram\n .command('cron')\n .description('Manage cron jobs')\n .action(() => {\n const globalOptions = program.opts();\n if (globalOptions.cwd) {\n process.chdir(globalOptions.cwd);\n }\n process.stdout.write('Cron management - coming soon\\n');\n });\n\nprogram\n .command('function')\n .description('Manage serverless functions')\n .action(() => {\n const globalOptions = program.opts();\n if (globalOptions.cwd) {\n process.chdir(globalOptions.cwd);\n }\n process.stdout.write('Serverless function management - coming soon\\n');\n });\n\nprogram\n .command('api')\n .description('Manage REST API endpoints')\n .action(() => {\n const globalOptions = program.opts();\n if (globalOptions.cwd) {\n process.chdir(globalOptions.cwd);\n }\n process.stdout.write('REST API management - coming soon\\n');\n });\n\nprogram\n .command('openapi')\n .description('Generate OpenAPI 3.0 specification from endpoints')\n .option(\n '--output <path>',\n 'Output file path for the OpenAPI spec',\n 'openapi.json',\n )\n .action(async (options: { output?: string }) => {\n try {\n const globalOptions = program.opts();\n if (globalOptions.cwd) {\n process.chdir(globalOptions.cwd);\n }\n await openapiCommand(options);\n } catch (error) {\n console.error('OpenAPI generation failed:', (error as Error).message);\n process.exit(1);\n }\n });\n\nprogram\n .command('generate:react-query')\n .description('Generate React Query hooks from OpenAPI specification')\n .option('--input <path>', 'Input OpenAPI spec file path', 'openapi.json')\n .option(\n '--output <path>',\n 'Output file path for generated hooks',\n 'src/api/hooks.ts',\n )\n .option('--name <name>', 'API name prefix for generated code', 'API')\n .action(\n async (options: { input?: string; output?: string; name?: string }) => {\n try {\n const globalOptions = program.opts();\n if (globalOptions.cwd) {\n process.chdir(globalOptions.cwd);\n }\n await generateReactQueryCommand(options);\n } catch (error) {\n console.error(\n 'React Query generation failed:',\n (error as Error).message,\n );\n process.exit(1);\n }\n },\n );\n\nprogram.parse();\n"],"mappings":"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"}