@geekmidas/cli 0.1.0 → 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 (146) hide show
  1. package/README.md +63 -13
  2. package/dist/{CronGenerator-Ctl4USy4.cjs → CronGenerator-1PflEYe2.cjs} +8 -7
  3. package/dist/CronGenerator-1PflEYe2.cjs.map +1 -0
  4. package/dist/{CronGenerator-ClbRcmz_.mjs → CronGenerator-DXRfHQcV.mjs} +6 -5
  5. package/dist/CronGenerator-DXRfHQcV.mjs.map +1 -0
  6. package/dist/{EndpointGenerator-Dj7AumHi.cjs → EndpointGenerator-BbGrDiCP.cjs} +134 -34
  7. package/dist/EndpointGenerator-BbGrDiCP.cjs.map +1 -0
  8. package/dist/{EndpointGenerator-uBA1ixUw.mjs → EndpointGenerator-BmZ9BxbO.mjs} +132 -32
  9. package/dist/EndpointGenerator-BmZ9BxbO.mjs.map +1 -0
  10. package/dist/{FunctionGenerator-DN681IUn.cjs → FunctionGenerator-Clw64SwQ.cjs} +8 -7
  11. package/dist/FunctionGenerator-Clw64SwQ.cjs.map +1 -0
  12. package/dist/{FunctionGenerator-crAa-JC7.mjs → FunctionGenerator-DOEB_yPh.mjs} +6 -5
  13. package/dist/FunctionGenerator-DOEB_yPh.mjs.map +1 -0
  14. package/dist/{Generator-C3tYSTQY.cjs → Generator-CDoEXCDg.cjs} +2 -2
  15. package/dist/Generator-CDoEXCDg.cjs.map +1 -0
  16. package/dist/{Generator-CDt4pB3W.mjs → Generator-UanJW0_V.mjs} +1 -1
  17. package/dist/Generator-UanJW0_V.mjs.map +1 -0
  18. package/dist/SubscriberGenerator-BfMZCVNy.cjs +204 -0
  19. package/dist/SubscriberGenerator-BfMZCVNy.cjs.map +1 -0
  20. package/dist/SubscriberGenerator-D2u00NI3.mjs +198 -0
  21. package/dist/SubscriberGenerator-D2u00NI3.mjs.map +1 -0
  22. package/dist/build/index.cjs +10 -9
  23. package/dist/build/index.mjs +8 -7
  24. package/dist/build/manifests.cjs +1 -1
  25. package/dist/build/manifests.mjs +1 -1
  26. package/dist/build/providerResolver.cjs +1 -1
  27. package/dist/build-BBhlEjf5.cjs +89 -0
  28. package/dist/build-BBhlEjf5.cjs.map +1 -0
  29. package/dist/build-kY-lG30Q.mjs +83 -0
  30. package/dist/build-kY-lG30Q.mjs.map +1 -0
  31. package/dist/{chunk-CsX-DzYB.cjs → chunk-CUT6urMc.cjs} +0 -12
  32. package/dist/{config-RcNESK0T.cjs → config-D1EpSGk6.cjs} +2 -2
  33. package/dist/{config-RcNESK0T.cjs.map → config-D1EpSGk6.cjs.map} +1 -1
  34. package/dist/{config-CXxYmz_o.mjs → config-U-mdW-7Y.mjs} +1 -1
  35. package/dist/{config-CXxYmz_o.mjs.map → config-U-mdW-7Y.mjs.map} +1 -1
  36. package/dist/config.cjs +1 -1
  37. package/dist/config.mjs +1 -1
  38. package/dist/generators/CronGenerator.cjs +2 -2
  39. package/dist/generators/CronGenerator.mjs +2 -2
  40. package/dist/generators/EndpointGenerator.cjs +2 -2
  41. package/dist/generators/EndpointGenerator.mjs +2 -2
  42. package/dist/generators/FunctionGenerator.cjs +2 -2
  43. package/dist/generators/FunctionGenerator.mjs +2 -2
  44. package/dist/generators/Generator.cjs +1 -1
  45. package/dist/generators/Generator.mjs +1 -1
  46. package/dist/generators/SubscriberGenerator.cjs +4 -0
  47. package/dist/generators/SubscriberGenerator.mjs +4 -0
  48. package/dist/generators/index.cjs +8 -6
  49. package/dist/generators/index.mjs +6 -5
  50. package/dist/index.cjs +18 -14
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.mjs +15 -11
  53. package/dist/index.mjs.map +1 -1
  54. package/dist/{manifests-HX4z4kkz.mjs → manifests-BrJXpHrf.mjs} +5 -4
  55. package/dist/manifests-BrJXpHrf.mjs.map +1 -0
  56. package/dist/{manifests-BTtfDMX8.cjs → manifests-D0saShvH.cjs} +6 -5
  57. package/dist/manifests-D0saShvH.cjs.map +1 -0
  58. package/dist/{openapi-BivnatiC.mjs → openapi-BQx3_JbM.mjs} +4 -4
  59. package/dist/openapi-BQx3_JbM.mjs.map +1 -0
  60. package/dist/{openapi-DW-qF3oW.cjs → openapi-CMLr04cz.cjs} +6 -6
  61. package/dist/openapi-CMLr04cz.cjs.map +1 -0
  62. package/dist/{openapi-react-query-lgS7AVEz.mjs → openapi-react-query-DbrWwQzb.mjs} +3 -2
  63. package/dist/openapi-react-query-DbrWwQzb.mjs.map +1 -0
  64. package/dist/{openapi-react-query-J0BzBHhN.cjs → openapi-react-query-Dvjqx_Eo.cjs} +4 -3
  65. package/dist/openapi-react-query-Dvjqx_Eo.cjs.map +1 -0
  66. package/dist/openapi-react-query.cjs +1 -1
  67. package/dist/openapi-react-query.mjs +1 -1
  68. package/dist/openapi.cjs +4 -4
  69. package/dist/openapi.mjs +4 -4
  70. package/dist/{providerResolver-Cs-0YCaP.cjs → providerResolver-DgvzNfP4.cjs} +1 -1
  71. package/dist/{providerResolver-Cs-0YCaP.cjs.map → providerResolver-DgvzNfP4.cjs.map} +1 -1
  72. package/examples/cron-example.ts +1 -1
  73. package/examples/function-example.ts +1 -1
  74. package/examples/logger.ts +1 -1
  75. package/package.json +6 -3
  76. package/src/__tests__/openapi-react-query.spec.ts +506 -0
  77. package/src/__tests__/openapi.spec.ts +362 -0
  78. package/src/__tests__/test-helpers.ts +10 -8
  79. package/src/build/__tests__/index-new.spec.ts +41 -42
  80. package/src/build/index.ts +89 -28
  81. package/src/build/manifests.ts +4 -1
  82. package/src/build/types.ts +2 -2
  83. package/src/generators/CronGenerator.ts +3 -2
  84. package/src/generators/EndpointGenerator.ts +141 -42
  85. package/src/generators/FunctionGenerator.ts +3 -2
  86. package/src/generators/Generator.ts +1 -1
  87. package/src/generators/SubscriberGenerator.ts +271 -0
  88. package/src/generators/__tests__/CronGenerator.spec.ts +1 -1
  89. package/src/generators/__tests__/EndpointGenerator.spec.ts +33 -11
  90. package/src/generators/__tests__/FunctionGenerator.spec.ts +21 -22
  91. package/src/generators/__tests__/SubscriberGenerator.spec.ts +341 -0
  92. package/src/generators/index.ts +1 -0
  93. package/src/openapi-react-query.ts +2 -1
  94. package/src/openapi.ts +1 -1
  95. package/src/types.ts +18 -0
  96. package/dist/CronGenerator-ClbRcmz_.mjs.map +0 -1
  97. package/dist/CronGenerator-Ctl4USy4.cjs.map +0 -1
  98. package/dist/EndpointGenerator-Dj7AumHi.cjs.map +0 -1
  99. package/dist/EndpointGenerator-uBA1ixUw.mjs.map +0 -1
  100. package/dist/FunctionGenerator-DN681IUn.cjs.map +0 -1
  101. package/dist/FunctionGenerator-crAa-JC7.mjs.map +0 -1
  102. package/dist/Generator-C3tYSTQY.cjs.map +0 -1
  103. package/dist/Generator-CDt4pB3W.mjs.map +0 -1
  104. package/dist/__tests__/config.spec.cjs +0 -98
  105. package/dist/__tests__/config.spec.cjs.map +0 -1
  106. package/dist/__tests__/config.spec.mjs +0 -97
  107. package/dist/__tests__/config.spec.mjs.map +0 -1
  108. package/dist/__tests__/test-helpers.cjs +0 -14
  109. package/dist/__tests__/test-helpers.mjs +0 -4
  110. package/dist/build/__tests__/index-new.spec.cjs +0 -286
  111. package/dist/build/__tests__/index-new.spec.cjs.map +0 -1
  112. package/dist/build/__tests__/index-new.spec.mjs +0 -285
  113. package/dist/build/__tests__/index-new.spec.mjs.map +0 -1
  114. package/dist/build-BZdwxCLW.mjs +0 -64
  115. package/dist/build-BZdwxCLW.mjs.map +0 -1
  116. package/dist/build-BfQFnU5-.cjs +0 -70
  117. package/dist/build-BfQFnU5-.cjs.map +0 -1
  118. package/dist/esm-9eeZntth.mjs +0 -3777
  119. package/dist/esm-9eeZntth.mjs.map +0 -1
  120. package/dist/esm-Crmo4h9t.cjs +0 -4392
  121. package/dist/esm-Crmo4h9t.cjs.map +0 -1
  122. package/dist/esm-CsJbr7gi.mjs +0 -3
  123. package/dist/esm-w09tAC4l.cjs +0 -8
  124. package/dist/generators/__tests__/CronGenerator.spec.cjs +0 -216
  125. package/dist/generators/__tests__/CronGenerator.spec.cjs.map +0 -1
  126. package/dist/generators/__tests__/CronGenerator.spec.mjs +0 -215
  127. package/dist/generators/__tests__/CronGenerator.spec.mjs.map +0 -1
  128. package/dist/generators/__tests__/EndpointGenerator.spec.cjs +0 -182
  129. package/dist/generators/__tests__/EndpointGenerator.spec.cjs.map +0 -1
  130. package/dist/generators/__tests__/EndpointGenerator.spec.mjs +0 -181
  131. package/dist/generators/__tests__/EndpointGenerator.spec.mjs.map +0 -1
  132. package/dist/generators/__tests__/FunctionGenerator.spec.cjs +0 -152
  133. package/dist/generators/__tests__/FunctionGenerator.spec.cjs.map +0 -1
  134. package/dist/generators/__tests__/FunctionGenerator.spec.mjs +0 -151
  135. package/dist/generators/__tests__/FunctionGenerator.spec.mjs.map +0 -1
  136. package/dist/manifests-BTtfDMX8.cjs.map +0 -1
  137. package/dist/manifests-HX4z4kkz.mjs.map +0 -1
  138. package/dist/openapi-BivnatiC.mjs.map +0 -1
  139. package/dist/openapi-DW-qF3oW.cjs.map +0 -1
  140. package/dist/openapi-react-query-J0BzBHhN.cjs.map +0 -1
  141. package/dist/openapi-react-query-lgS7AVEz.mjs.map +0 -1
  142. package/dist/test-helpers-ARd8GDgx.cjs +0 -199
  143. package/dist/test-helpers-ARd8GDgx.cjs.map +0 -1
  144. package/dist/test-helpers-DdVBk23F.mjs +0 -133
  145. package/dist/test-helpers-DdVBk23F.mjs.map +0 -1
  146. /package/dist/{generators-_pY7sHy1.cjs → generators-CEKtVh81.cjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscriberGenerator-BfMZCVNy.cjs","names":["ConstructGenerator","value: any","context: BuildContext","constructs: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[]","outputDir: string","options?: GeneratorOptions","subscriberInfos: SubscriberInfo[]","sourceFile: string","exportName: string","_subscriber: Subscriber<any, any, any, any, any, any>","subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[]","exports"],"sources":["../src/generators/SubscriberGenerator.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative } from 'node:path';\nimport { Subscriber } from '@geekmidas/constructs/subscribers';\nimport type { BuildContext } from '../build/types';\nimport type { SubscriberInfo } from '../types';\nimport {\n ConstructGenerator,\n type GeneratedConstruct,\n type GeneratorOptions,\n} from './Generator';\n\nexport class SubscriberGenerator extends ConstructGenerator<\n Subscriber<any, any, any, any, any, any>,\n SubscriberInfo[]\n> {\n isConstruct(value: any): value is Subscriber<any, any, any, any, any, any> {\n return Subscriber.isSubscriber(value);\n }\n\n async build(\n context: BuildContext,\n constructs: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[],\n outputDir: string,\n options?: GeneratorOptions,\n ): Promise<SubscriberInfo[]> {\n const provider = options?.provider || 'aws-lambda';\n const logger = console;\n const subscriberInfos: SubscriberInfo[] = [];\n\n if (constructs.length === 0) {\n return subscriberInfos;\n }\n\n if (provider === 'server') {\n // Generate subscribers.ts for server-based polling\n await this.generateServerSubscribersFile(outputDir, constructs);\n\n logger.log(\n `Generated server subscribers file with ${constructs.length} subscribers (polling mode)`,\n );\n\n // Return empty array as server subscribers don't have individual handlers\n return subscriberInfos;\n }\n\n if (provider !== 'aws-lambda') {\n return subscriberInfos;\n }\n\n // Create subscribers subdirectory\n const subscribersDir = join(outputDir, 'subscribers');\n await mkdir(subscribersDir, { recursive: true });\n\n // Generate subscriber handlers\n for (const { key, construct, path } of constructs) {\n const handlerFile = await this.generateSubscriberHandler(\n subscribersDir,\n path.relative,\n key,\n construct,\n context,\n );\n\n subscriberInfos.push({\n name: key,\n handler: relative(process.cwd(), handlerFile).replace(\n /\\.ts$/,\n '.handler',\n ),\n subscribedEvents: construct.subscribedEvents || [],\n timeout: construct.timeout,\n environment: await construct.getEnvironment(),\n });\n\n logger.log(`Generated subscriber handler: ${key}`);\n }\n\n return subscriberInfos;\n }\n\n private async generateSubscriberHandler(\n outputDir: string,\n sourceFile: string,\n exportName: string,\n _subscriber: Subscriber<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 const content = `import { AWSLambdaSubscriber } from '@geekmidas/constructs/aws';\nimport { ${exportName} } from '${importPath}';\nimport ${context.envParserImportPattern} from '${relativeEnvParserPath}';\n\nconst adapter = new AWSLambdaSubscriber(envParser, ${exportName});\n\nexport const handler = adapter.handler;\n`;\n\n await writeFile(handlerPath, content);\n return handlerPath;\n }\n\n private async generateServerSubscribersFile(\n outputDir: string,\n subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[],\n ): Promise<string> {\n const subscribersFileName = 'subscribers.ts';\n const subscribersPath = join(outputDir, subscribersFileName);\n\n // Group imports by file\n const importsByFile = new Map<string, string[]>();\n\n for (const { path, key } of subscribers) {\n const relativePath = relative(dirname(subscribersPath), 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 // 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 = subscribers.map(({ key }) => key);\n\n const content = `/**\n * Generated subscribers setup\n *\n * ⚠️ WARNING: This is for LOCAL DEVELOPMENT ONLY\n * This uses event polling which is not suitable for production.\n *\n * For production, use AWS Lambda with SQS/SNS event source mappings.\n * Lambda automatically:\n * - Scales based on queue depth\n * - Handles batch processing and retries\n * - Manages dead letter queues\n * - Provides better cost optimization\n *\n * This polling implementation is useful for:\n * - Local development and testing\n * - Understanding event flow without Lambda deployment\n *\n * Supported connection strings:\n * - sqs://region/account-id/queue-name (SQS queue)\n * - sns://region/account-id/topic-name (SNS topic)\n * - rabbitmq://host:port/queue-name (RabbitMQ)\n * - basic://in-memory (In-memory for testing)\n */\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { Logger } from '@geekmidas/logger';\nimport { EventConnectionFactory, Subscriber } from '@geekmidas/events';\nimport type { EventConnection, EventSubscriber } from '@geekmidas/events';\nimport { ServiceDiscovery } from '@geekmidas/services';\n${imports}\n\nconst subscribers = [\n ${allExportNames.join(',\\n ')}\n];\n\nconst activeSubscribers: EventSubscriber<any>[] = [];\n\nexport async function setupSubscribers(\n envParser: EnvironmentParser<any>,\n logger: Logger,\n): Promise<void> {\n logger.info('Setting up subscribers in polling mode (local development)');\n\n const config = envParser.create((get) => ({\n connectionString: get('EVENT_SUBSCRIBER_CONNECTION_STRING').string().optional(),\n })).parse();\n\n if (!config.connectionString) {\n logger.warn('EVENT_SUBSCRIBER_CONNECTION_STRING not configured, skipping subscriber setup');\n return;\n }\n\n const serviceDiscovery = ServiceDiscovery.getInstance(logger, envParser);\n\n // Create connection once, outside the loop (more efficient)\n // EventConnectionFactory automatically determines the right connection type\n let connection: EventConnection;\n try {\n connection = await EventConnectionFactory.fromConnectionString(config.connectionString);\n\n const connectionType = new URL(config.connectionString).protocol.replace(':', '');\n logger.info({ connectionType }, 'Created shared event connection');\n } catch (error) {\n logger.error({ error }, 'Failed to create event connection');\n return;\n }\n\n for (const subscriber of subscribers) {\n try {\n // Create subscriber from shared connection\n const eventSubscriber = await Subscriber.fromConnection(connection);\n\n // Register services\n const services = subscriber.services.length > 0\n ? await serviceDiscovery.register(subscriber.services)\n : {};\n\n // Subscribe to events\n const subscribedEvents = subscriber.subscribedEvents || [];\n\n if (subscribedEvents.length === 0) {\n logger.warn({ subscriber: subscriber.constructor.name }, 'Subscriber has no subscribed events, skipping');\n continue;\n }\n\n await eventSubscriber.subscribe(subscribedEvents, async (event) => {\n try {\n // Process single event (batch of 1)\n await subscriber.handler({\n events: [event],\n services: services as any,\n logger: subscriber.logger,\n });\n\n logger.debug({ eventType: event.type }, 'Successfully processed event');\n } catch (error) {\n logger.error({ error, event }, 'Failed to process event');\n // Event will become visible again for retry\n }\n });\n\n activeSubscribers.push(eventSubscriber);\n\n logger.info(\n {\n events: subscribedEvents,\n },\n 'Subscriber started polling'\n );\n } catch (error) {\n logger.error({ error, subscriber: subscriber.constructor.name }, 'Failed to setup subscriber');\n }\n }\n\n // Setup graceful shutdown\n const shutdown = () => {\n logger.info('Stopping all subscribers');\n for (const eventSubscriber of activeSubscribers) {\n connection.stop();\n }\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n}\n`;\n\n await writeFile(subscribersPath, content);\n return subscribersPath;\n }\n}\n"],"mappings":";;;;;;;AAWA,IAAa,sBAAb,cAAyCA,qCAGvC;CACA,YAAYC,OAA+D;AACzE,SAAO,8CAAW,aAAa,MAAM;CACtC;CAED,MAAM,MACJC,SACAC,YACAC,WACAC,SAC2B;EAC3B,MAAM,WAAW,SAAS,YAAY;EACtC,MAAM,SAAS;EACf,MAAMC,kBAAoC,CAAE;AAE5C,MAAI,WAAW,WAAW,EACxB,QAAO;AAGT,MAAI,aAAa,UAAU;AAEzB,SAAM,KAAK,8BAA8B,WAAW,WAAW;AAE/D,UAAO,KACJ,yCAAyC,WAAW,OAAO,6BAC7D;AAGD,UAAO;EACR;AAED,MAAI,aAAa,aACf,QAAO;EAIT,MAAM,iBAAiB,oBAAK,WAAW,cAAc;AACrD,QAAM,4BAAM,gBAAgB,EAAE,WAAW,KAAM,EAAC;AAGhD,OAAK,MAAM,EAAE,KAAK,WAAW,MAAM,IAAI,YAAY;GACjD,MAAM,cAAc,MAAM,KAAK,0BAC7B,gBACA,KAAK,UACL,KACA,WACA,QACD;AAED,mBAAgB,KAAK;IACnB,MAAM;IACN,SAAS,wBAAS,QAAQ,KAAK,EAAE,YAAY,CAAC,QAC5C,SACA,WACD;IACD,kBAAkB,UAAU,oBAAoB,CAAE;IAClD,SAAS,UAAU;IACnB,aAAa,MAAM,UAAU,gBAAgB;GAC9C,EAAC;AAEF,UAAO,KAAK,gCAAgC,IAAI,EAAE;EACnD;AAED,SAAO;CACR;CAED,MAAc,0BACZF,WACAG,YACAC,YACAC,aACAP,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;EAED,MAAM,WAAW;WACV,WAAW,WAAW,WAAW;SACnC,QAAQ,uBAAuB,SAAS,sBAAsB;;qDAElB,WAAW;;;;AAK5D,QAAM,gCAAU,aAAa,QAAQ;AACrC,SAAO;CACR;CAED,MAAc,8BACZE,WACAM,aACiB;EACjB,MAAM,sBAAsB;EAC5B,MAAM,kBAAkB,oBAAK,WAAW,oBAAoB;EAG5D,MAAM,gCAAgB,IAAI;AAE1B,OAAK,MAAM,EAAE,MAAM,KAAK,IAAI,aAAa;GACvC,MAAM,eAAe,wBAAS,uBAAQ,gBAAgB,EAAE,KAAK,SAAS;GACtE,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;EAGD,MAAM,UAAU,MAAM,KAAK,cAAc,SAAS,CAAC,CAChD,IACC,CAAC,CAAC,YAAYC,UAAQ,MACnB,WAAW,UAAQ,KAAK,KAAK,CAAC,WAAW,WAAW,IACxD,CACA,KAAK,KAAK;EAEb,MAAM,iBAAiB,YAAY,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI;EAExD,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BnB,QAAQ;;;IAGN,eAAe,KAAK,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+F7B,QAAM,gCAAU,iBAAiB,QAAQ;AACzC,SAAO;CACR;AACF"}
@@ -0,0 +1,198 @@
1
+ import { ConstructGenerator } from "./Generator-UanJW0_V.mjs";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { dirname, join, relative } from "node:path";
4
+ import { Subscriber } from "@geekmidas/constructs/subscribers";
5
+
6
+ //#region src/generators/SubscriberGenerator.ts
7
+ var SubscriberGenerator = class extends ConstructGenerator {
8
+ isConstruct(value) {
9
+ return Subscriber.isSubscriber(value);
10
+ }
11
+ async build(context, constructs, outputDir, options) {
12
+ const provider = options?.provider || "aws-lambda";
13
+ const logger = console;
14
+ const subscriberInfos = [];
15
+ if (constructs.length === 0) return subscriberInfos;
16
+ if (provider === "server") {
17
+ await this.generateServerSubscribersFile(outputDir, constructs);
18
+ logger.log(`Generated server subscribers file with ${constructs.length} subscribers (polling mode)`);
19
+ return subscriberInfos;
20
+ }
21
+ if (provider !== "aws-lambda") return subscriberInfos;
22
+ const subscribersDir = join(outputDir, "subscribers");
23
+ await mkdir(subscribersDir, { recursive: true });
24
+ for (const { key, construct, path } of constructs) {
25
+ const handlerFile = await this.generateSubscriberHandler(subscribersDir, path.relative, key, construct, context);
26
+ subscriberInfos.push({
27
+ name: key,
28
+ handler: relative(process.cwd(), handlerFile).replace(/\.ts$/, ".handler"),
29
+ subscribedEvents: construct.subscribedEvents || [],
30
+ timeout: construct.timeout,
31
+ environment: await construct.getEnvironment()
32
+ });
33
+ logger.log(`Generated subscriber handler: ${key}`);
34
+ }
35
+ return subscriberInfos;
36
+ }
37
+ async generateSubscriberHandler(outputDir, sourceFile, exportName, _subscriber, context) {
38
+ const handlerFileName = `${exportName}.ts`;
39
+ const handlerPath = join(outputDir, handlerFileName);
40
+ const relativePath = relative(dirname(handlerPath), sourceFile);
41
+ const importPath = relativePath.replace(/\.ts$/, ".js");
42
+ const relativeEnvParserPath = relative(dirname(handlerPath), context.envParserPath);
43
+ const content = `import { AWSLambdaSubscriber } from '@geekmidas/constructs/aws';
44
+ import { ${exportName} } from '${importPath}';
45
+ import ${context.envParserImportPattern} from '${relativeEnvParserPath}';
46
+
47
+ const adapter = new AWSLambdaSubscriber(envParser, ${exportName});
48
+
49
+ export const handler = adapter.handler;
50
+ `;
51
+ await writeFile(handlerPath, content);
52
+ return handlerPath;
53
+ }
54
+ async generateServerSubscribersFile(outputDir, subscribers) {
55
+ const subscribersFileName = "subscribers.ts";
56
+ const subscribersPath = join(outputDir, subscribersFileName);
57
+ const importsByFile = /* @__PURE__ */ new Map();
58
+ for (const { path, key } of subscribers) {
59
+ const relativePath = relative(dirname(subscribersPath), path.relative);
60
+ const importPath = relativePath.replace(/\.ts$/, ".js");
61
+ if (!importsByFile.has(importPath)) importsByFile.set(importPath, []);
62
+ importsByFile.get(importPath).push(key);
63
+ }
64
+ const imports = Array.from(importsByFile.entries()).map(([importPath, exports]) => `import { ${exports.join(", ")} } from '${importPath}';`).join("\n");
65
+ const allExportNames = subscribers.map(({ key }) => key);
66
+ const content = `/**
67
+ * Generated subscribers setup
68
+ *
69
+ * ⚠️ WARNING: This is for LOCAL DEVELOPMENT ONLY
70
+ * This uses event polling which is not suitable for production.
71
+ *
72
+ * For production, use AWS Lambda with SQS/SNS event source mappings.
73
+ * Lambda automatically:
74
+ * - Scales based on queue depth
75
+ * - Handles batch processing and retries
76
+ * - Manages dead letter queues
77
+ * - Provides better cost optimization
78
+ *
79
+ * This polling implementation is useful for:
80
+ * - Local development and testing
81
+ * - Understanding event flow without Lambda deployment
82
+ *
83
+ * Supported connection strings:
84
+ * - sqs://region/account-id/queue-name (SQS queue)
85
+ * - sns://region/account-id/topic-name (SNS topic)
86
+ * - rabbitmq://host:port/queue-name (RabbitMQ)
87
+ * - basic://in-memory (In-memory for testing)
88
+ */
89
+ import type { EnvironmentParser } from '@geekmidas/envkit';
90
+ import type { Logger } from '@geekmidas/logger';
91
+ import { EventConnectionFactory, Subscriber } from '@geekmidas/events';
92
+ import type { EventConnection, EventSubscriber } from '@geekmidas/events';
93
+ import { ServiceDiscovery } from '@geekmidas/services';
94
+ ${imports}
95
+
96
+ const subscribers = [
97
+ ${allExportNames.join(",\n ")}
98
+ ];
99
+
100
+ const activeSubscribers: EventSubscriber<any>[] = [];
101
+
102
+ export async function setupSubscribers(
103
+ envParser: EnvironmentParser<any>,
104
+ logger: Logger,
105
+ ): Promise<void> {
106
+ logger.info('Setting up subscribers in polling mode (local development)');
107
+
108
+ const config = envParser.create((get) => ({
109
+ connectionString: get('EVENT_SUBSCRIBER_CONNECTION_STRING').string().optional(),
110
+ })).parse();
111
+
112
+ if (!config.connectionString) {
113
+ logger.warn('EVENT_SUBSCRIBER_CONNECTION_STRING not configured, skipping subscriber setup');
114
+ return;
115
+ }
116
+
117
+ const serviceDiscovery = ServiceDiscovery.getInstance(logger, envParser);
118
+
119
+ // Create connection once, outside the loop (more efficient)
120
+ // EventConnectionFactory automatically determines the right connection type
121
+ let connection: EventConnection;
122
+ try {
123
+ connection = await EventConnectionFactory.fromConnectionString(config.connectionString);
124
+
125
+ const connectionType = new URL(config.connectionString).protocol.replace(':', '');
126
+ logger.info({ connectionType }, 'Created shared event connection');
127
+ } catch (error) {
128
+ logger.error({ error }, 'Failed to create event connection');
129
+ return;
130
+ }
131
+
132
+ for (const subscriber of subscribers) {
133
+ try {
134
+ // Create subscriber from shared connection
135
+ const eventSubscriber = await Subscriber.fromConnection(connection);
136
+
137
+ // Register services
138
+ const services = subscriber.services.length > 0
139
+ ? await serviceDiscovery.register(subscriber.services)
140
+ : {};
141
+
142
+ // Subscribe to events
143
+ const subscribedEvents = subscriber.subscribedEvents || [];
144
+
145
+ if (subscribedEvents.length === 0) {
146
+ logger.warn({ subscriber: subscriber.constructor.name }, 'Subscriber has no subscribed events, skipping');
147
+ continue;
148
+ }
149
+
150
+ await eventSubscriber.subscribe(subscribedEvents, async (event) => {
151
+ try {
152
+ // Process single event (batch of 1)
153
+ await subscriber.handler({
154
+ events: [event],
155
+ services: services as any,
156
+ logger: subscriber.logger,
157
+ });
158
+
159
+ logger.debug({ eventType: event.type }, 'Successfully processed event');
160
+ } catch (error) {
161
+ logger.error({ error, event }, 'Failed to process event');
162
+ // Event will become visible again for retry
163
+ }
164
+ });
165
+
166
+ activeSubscribers.push(eventSubscriber);
167
+
168
+ logger.info(
169
+ {
170
+ events: subscribedEvents,
171
+ },
172
+ 'Subscriber started polling'
173
+ );
174
+ } catch (error) {
175
+ logger.error({ error, subscriber: subscriber.constructor.name }, 'Failed to setup subscriber');
176
+ }
177
+ }
178
+
179
+ // Setup graceful shutdown
180
+ const shutdown = () => {
181
+ logger.info('Stopping all subscribers');
182
+ for (const eventSubscriber of activeSubscribers) {
183
+ connection.stop();
184
+ }
185
+ };
186
+
187
+ process.on('SIGTERM', shutdown);
188
+ process.on('SIGINT', shutdown);
189
+ }
190
+ `;
191
+ await writeFile(subscribersPath, content);
192
+ return subscribersPath;
193
+ }
194
+ };
195
+
196
+ //#endregion
197
+ export { SubscriberGenerator };
198
+ //# sourceMappingURL=SubscriberGenerator-D2u00NI3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubscriberGenerator-D2u00NI3.mjs","names":["value: any","context: BuildContext","constructs: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[]","outputDir: string","options?: GeneratorOptions","subscriberInfos: SubscriberInfo[]","sourceFile: string","exportName: string","_subscriber: Subscriber<any, any, any, any, any, any>","subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[]"],"sources":["../src/generators/SubscriberGenerator.ts"],"sourcesContent":["import { mkdir, writeFile } from 'node:fs/promises';\nimport { dirname, join, relative } from 'node:path';\nimport { Subscriber } from '@geekmidas/constructs/subscribers';\nimport type { BuildContext } from '../build/types';\nimport type { SubscriberInfo } from '../types';\nimport {\n ConstructGenerator,\n type GeneratedConstruct,\n type GeneratorOptions,\n} from './Generator';\n\nexport class SubscriberGenerator extends ConstructGenerator<\n Subscriber<any, any, any, any, any, any>,\n SubscriberInfo[]\n> {\n isConstruct(value: any): value is Subscriber<any, any, any, any, any, any> {\n return Subscriber.isSubscriber(value);\n }\n\n async build(\n context: BuildContext,\n constructs: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[],\n outputDir: string,\n options?: GeneratorOptions,\n ): Promise<SubscriberInfo[]> {\n const provider = options?.provider || 'aws-lambda';\n const logger = console;\n const subscriberInfos: SubscriberInfo[] = [];\n\n if (constructs.length === 0) {\n return subscriberInfos;\n }\n\n if (provider === 'server') {\n // Generate subscribers.ts for server-based polling\n await this.generateServerSubscribersFile(outputDir, constructs);\n\n logger.log(\n `Generated server subscribers file with ${constructs.length} subscribers (polling mode)`,\n );\n\n // Return empty array as server subscribers don't have individual handlers\n return subscriberInfos;\n }\n\n if (provider !== 'aws-lambda') {\n return subscriberInfos;\n }\n\n // Create subscribers subdirectory\n const subscribersDir = join(outputDir, 'subscribers');\n await mkdir(subscribersDir, { recursive: true });\n\n // Generate subscriber handlers\n for (const { key, construct, path } of constructs) {\n const handlerFile = await this.generateSubscriberHandler(\n subscribersDir,\n path.relative,\n key,\n construct,\n context,\n );\n\n subscriberInfos.push({\n name: key,\n handler: relative(process.cwd(), handlerFile).replace(\n /\\.ts$/,\n '.handler',\n ),\n subscribedEvents: construct.subscribedEvents || [],\n timeout: construct.timeout,\n environment: await construct.getEnvironment(),\n });\n\n logger.log(`Generated subscriber handler: ${key}`);\n }\n\n return subscriberInfos;\n }\n\n private async generateSubscriberHandler(\n outputDir: string,\n sourceFile: string,\n exportName: string,\n _subscriber: Subscriber<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 const content = `import { AWSLambdaSubscriber } from '@geekmidas/constructs/aws';\nimport { ${exportName} } from '${importPath}';\nimport ${context.envParserImportPattern} from '${relativeEnvParserPath}';\n\nconst adapter = new AWSLambdaSubscriber(envParser, ${exportName});\n\nexport const handler = adapter.handler;\n`;\n\n await writeFile(handlerPath, content);\n return handlerPath;\n }\n\n private async generateServerSubscribersFile(\n outputDir: string,\n subscribers: GeneratedConstruct<Subscriber<any, any, any, any, any, any>>[],\n ): Promise<string> {\n const subscribersFileName = 'subscribers.ts';\n const subscribersPath = join(outputDir, subscribersFileName);\n\n // Group imports by file\n const importsByFile = new Map<string, string[]>();\n\n for (const { path, key } of subscribers) {\n const relativePath = relative(dirname(subscribersPath), 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 // 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 = subscribers.map(({ key }) => key);\n\n const content = `/**\n * Generated subscribers setup\n *\n * ⚠️ WARNING: This is for LOCAL DEVELOPMENT ONLY\n * This uses event polling which is not suitable for production.\n *\n * For production, use AWS Lambda with SQS/SNS event source mappings.\n * Lambda automatically:\n * - Scales based on queue depth\n * - Handles batch processing and retries\n * - Manages dead letter queues\n * - Provides better cost optimization\n *\n * This polling implementation is useful for:\n * - Local development and testing\n * - Understanding event flow without Lambda deployment\n *\n * Supported connection strings:\n * - sqs://region/account-id/queue-name (SQS queue)\n * - sns://region/account-id/topic-name (SNS topic)\n * - rabbitmq://host:port/queue-name (RabbitMQ)\n * - basic://in-memory (In-memory for testing)\n */\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { Logger } from '@geekmidas/logger';\nimport { EventConnectionFactory, Subscriber } from '@geekmidas/events';\nimport type { EventConnection, EventSubscriber } from '@geekmidas/events';\nimport { ServiceDiscovery } from '@geekmidas/services';\n${imports}\n\nconst subscribers = [\n ${allExportNames.join(',\\n ')}\n];\n\nconst activeSubscribers: EventSubscriber<any>[] = [];\n\nexport async function setupSubscribers(\n envParser: EnvironmentParser<any>,\n logger: Logger,\n): Promise<void> {\n logger.info('Setting up subscribers in polling mode (local development)');\n\n const config = envParser.create((get) => ({\n connectionString: get('EVENT_SUBSCRIBER_CONNECTION_STRING').string().optional(),\n })).parse();\n\n if (!config.connectionString) {\n logger.warn('EVENT_SUBSCRIBER_CONNECTION_STRING not configured, skipping subscriber setup');\n return;\n }\n\n const serviceDiscovery = ServiceDiscovery.getInstance(logger, envParser);\n\n // Create connection once, outside the loop (more efficient)\n // EventConnectionFactory automatically determines the right connection type\n let connection: EventConnection;\n try {\n connection = await EventConnectionFactory.fromConnectionString(config.connectionString);\n\n const connectionType = new URL(config.connectionString).protocol.replace(':', '');\n logger.info({ connectionType }, 'Created shared event connection');\n } catch (error) {\n logger.error({ error }, 'Failed to create event connection');\n return;\n }\n\n for (const subscriber of subscribers) {\n try {\n // Create subscriber from shared connection\n const eventSubscriber = await Subscriber.fromConnection(connection);\n\n // Register services\n const services = subscriber.services.length > 0\n ? await serviceDiscovery.register(subscriber.services)\n : {};\n\n // Subscribe to events\n const subscribedEvents = subscriber.subscribedEvents || [];\n\n if (subscribedEvents.length === 0) {\n logger.warn({ subscriber: subscriber.constructor.name }, 'Subscriber has no subscribed events, skipping');\n continue;\n }\n\n await eventSubscriber.subscribe(subscribedEvents, async (event) => {\n try {\n // Process single event (batch of 1)\n await subscriber.handler({\n events: [event],\n services: services as any,\n logger: subscriber.logger,\n });\n\n logger.debug({ eventType: event.type }, 'Successfully processed event');\n } catch (error) {\n logger.error({ error, event }, 'Failed to process event');\n // Event will become visible again for retry\n }\n });\n\n activeSubscribers.push(eventSubscriber);\n\n logger.info(\n {\n events: subscribedEvents,\n },\n 'Subscriber started polling'\n );\n } catch (error) {\n logger.error({ error, subscriber: subscriber.constructor.name }, 'Failed to setup subscriber');\n }\n }\n\n // Setup graceful shutdown\n const shutdown = () => {\n logger.info('Stopping all subscribers');\n for (const eventSubscriber of activeSubscribers) {\n connection.stop();\n }\n };\n\n process.on('SIGTERM', shutdown);\n process.on('SIGINT', shutdown);\n}\n`;\n\n await writeFile(subscribersPath, content);\n return subscribersPath;\n }\n}\n"],"mappings":";;;;;;AAWA,IAAa,sBAAb,cAAyC,mBAGvC;CACA,YAAYA,OAA+D;AACzE,SAAO,WAAW,aAAa,MAAM;CACtC;CAED,MAAM,MACJC,SACAC,YACAC,WACAC,SAC2B;EAC3B,MAAM,WAAW,SAAS,YAAY;EACtC,MAAM,SAAS;EACf,MAAMC,kBAAoC,CAAE;AAE5C,MAAI,WAAW,WAAW,EACxB,QAAO;AAGT,MAAI,aAAa,UAAU;AAEzB,SAAM,KAAK,8BAA8B,WAAW,WAAW;AAE/D,UAAO,KACJ,yCAAyC,WAAW,OAAO,6BAC7D;AAGD,UAAO;EACR;AAED,MAAI,aAAa,aACf,QAAO;EAIT,MAAM,iBAAiB,KAAK,WAAW,cAAc;AACrD,QAAM,MAAM,gBAAgB,EAAE,WAAW,KAAM,EAAC;AAGhD,OAAK,MAAM,EAAE,KAAK,WAAW,MAAM,IAAI,YAAY;GACjD,MAAM,cAAc,MAAM,KAAK,0BAC7B,gBACA,KAAK,UACL,KACA,WACA,QACD;AAED,mBAAgB,KAAK;IACnB,MAAM;IACN,SAAS,SAAS,QAAQ,KAAK,EAAE,YAAY,CAAC,QAC5C,SACA,WACD;IACD,kBAAkB,UAAU,oBAAoB,CAAE;IAClD,SAAS,UAAU;IACnB,aAAa,MAAM,UAAU,gBAAgB;GAC9C,EAAC;AAEF,UAAO,KAAK,gCAAgC,IAAI,EAAE;EACnD;AAED,SAAO;CACR;CAED,MAAc,0BACZF,WACAG,YACAC,YACAC,aACAP,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,MAAM,WAAW;WACV,WAAW,WAAW,WAAW;SACnC,QAAQ,uBAAuB,SAAS,sBAAsB;;qDAElB,WAAW;;;;AAK5D,QAAM,UAAU,aAAa,QAAQ;AACrC,SAAO;CACR;CAED,MAAc,8BACZE,WACAM,aACiB;EACjB,MAAM,sBAAsB;EAC5B,MAAM,kBAAkB,KAAK,WAAW,oBAAoB;EAG5D,MAAM,gCAAgB,IAAI;AAE1B,OAAK,MAAM,EAAE,MAAM,KAAK,IAAI,aAAa;GACvC,MAAM,eAAe,SAAS,QAAQ,gBAAgB,EAAE,KAAK,SAAS;GACtE,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;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,YAAY,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI;EAExD,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BnB,QAAQ;;;IAGN,eAAe,KAAK,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+F7B,QAAM,UAAU,iBAAiB,QAAQ;AACzC,SAAO;CACR;AACF"}
@@ -1,11 +1,12 @@
1
- require('../config-RcNESK0T.cjs');
2
- require('../Generator-C3tYSTQY.cjs');
3
- require('../CronGenerator-Ctl4USy4.cjs');
4
- require('../EndpointGenerator-Dj7AumHi.cjs');
5
- require('../FunctionGenerator-DN681IUn.cjs');
6
- require('../generators-_pY7sHy1.cjs');
7
- require('../manifests-BTtfDMX8.cjs');
8
- require('../providerResolver-Cs-0YCaP.cjs');
9
- const require_build = require('../build-BfQFnU5-.cjs');
1
+ require('../config-D1EpSGk6.cjs');
2
+ require('../Generator-CDoEXCDg.cjs');
3
+ require('../CronGenerator-1PflEYe2.cjs');
4
+ require('../EndpointGenerator-BbGrDiCP.cjs');
5
+ require('../FunctionGenerator-Clw64SwQ.cjs');
6
+ require('../SubscriberGenerator-BfMZCVNy.cjs');
7
+ require('../generators-CEKtVh81.cjs');
8
+ require('../manifests-D0saShvH.cjs');
9
+ require('../providerResolver-DgvzNfP4.cjs');
10
+ const require_build = require('../build-BBhlEjf5.cjs');
10
11
 
11
12
  exports.buildCommand = require_build.buildCommand;
@@ -1,11 +1,12 @@
1
- import "../config-CXxYmz_o.mjs";
2
- import "../Generator-CDt4pB3W.mjs";
3
- import "../CronGenerator-ClbRcmz_.mjs";
4
- import "../EndpointGenerator-uBA1ixUw.mjs";
5
- import "../FunctionGenerator-crAa-JC7.mjs";
1
+ import "../config-U-mdW-7Y.mjs";
2
+ import "../Generator-UanJW0_V.mjs";
3
+ import "../CronGenerator-DXRfHQcV.mjs";
4
+ import "../EndpointGenerator-BmZ9BxbO.mjs";
5
+ import "../FunctionGenerator-DOEB_yPh.mjs";
6
+ import "../SubscriberGenerator-D2u00NI3.mjs";
6
7
  import "../generators-CsLujGXs.mjs";
7
- import "../manifests-HX4z4kkz.mjs";
8
+ import "../manifests-BrJXpHrf.mjs";
8
9
  import "../providerResolver-B_TjNF0_.mjs";
9
- import { buildCommand } from "../build-BZdwxCLW.mjs";
10
+ import { buildCommand } from "../build-kY-lG30Q.mjs";
10
11
 
11
12
  export { buildCommand };
@@ -1,3 +1,3 @@
1
- const require_manifests = require('../manifests-BTtfDMX8.cjs');
1
+ const require_manifests = require('../manifests-D0saShvH.cjs');
2
2
 
3
3
  exports.generateManifests = require_manifests.generateManifests;
@@ -1,3 +1,3 @@
1
- import { generateManifests } from "../manifests-HX4z4kkz.mjs";
1
+ import { generateManifests } from "../manifests-BrJXpHrf.mjs";
2
2
 
3
3
  export { generateManifests };
@@ -1,4 +1,4 @@
1
- const require_providerResolver = require('../providerResolver-Cs-0YCaP.cjs');
1
+ const require_providerResolver = require('../providerResolver-DgvzNfP4.cjs');
2
2
 
3
3
  exports.getAWSServiceConfig = require_providerResolver.getAWSServiceConfig;
4
4
  exports.getServerConfig = require_providerResolver.getServerConfig;
@@ -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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"}
@@ -5,12 +5,6 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all) __defProp(target, name, {
10
- get: all[name],
11
- enumerable: true
12
- });
13
- };
14
8
  var __copyProps = (to, from, except, desc) => {
15
9
  if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
16
10
  key = keys[i];
@@ -28,12 +22,6 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
22
 
29
23
  //#endregion
30
24
 
31
- Object.defineProperty(exports, '__export', {
32
- enumerable: true,
33
- get: function () {
34
- return __export;
35
- }
36
- });
37
25
  Object.defineProperty(exports, '__toESM', {
38
26
  enumerable: true,
39
27
  get: function () {
@@ -1,4 +1,4 @@
1
- const require_chunk = require('./chunk-CsX-DzYB.cjs');
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
2
  const fs = require_chunk.__toESM(require("fs"));
3
3
  const path = require_chunk.__toESM(require("path"));
4
4
 
@@ -33,4 +33,4 @@ Object.defineProperty(exports, 'loadConfig', {
33
33
  return loadConfig;
34
34
  }
35
35
  });
36
- //# sourceMappingURL=config-RcNESK0T.cjs.map
36
+ //# sourceMappingURL=config-D1EpSGk6.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-RcNESK0T.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"}
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"}
@@ -27,4 +27,4 @@ async function loadConfig() {
27
27
 
28
28
  //#endregion
29
29
  export { loadConfig };
30
- //# sourceMappingURL=config-CXxYmz_o.mjs.map
30
+ //# sourceMappingURL=config-U-mdW-7Y.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-CXxYmz_o.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"}
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-RcNESK0T.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-CXxYmz_o.mjs";
1
+ import { loadConfig } from "./config-U-mdW-7Y.mjs";
2
2
 
3
3
  export { loadConfig };
@@ -1,4 +1,4 @@
1
- require('../Generator-C3tYSTQY.cjs');
2
- const require_CronGenerator = require('../CronGenerator-Ctl4USy4.cjs');
1
+ require('../Generator-CDoEXCDg.cjs');
2
+ const require_CronGenerator = require('../CronGenerator-1PflEYe2.cjs');
3
3
 
4
4
  exports.CronGenerator = require_CronGenerator.CronGenerator;
@@ -1,4 +1,4 @@
1
- import "../Generator-CDt4pB3W.mjs";
2
- import { CronGenerator } from "../CronGenerator-ClbRcmz_.mjs";
1
+ import "../Generator-UanJW0_V.mjs";
2
+ import { CronGenerator } from "../CronGenerator-DXRfHQcV.mjs";
3
3
 
4
4
  export { CronGenerator };