@geekmidas/constructs 3.0.14 → 4.0.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 (123) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/AWSScheduledFunction-COv8bB1v.d.mts +117 -0
  3. package/dist/AWSScheduledFunction-COv8bB1v.d.mts.map +1 -0
  4. package/dist/AWSScheduledFunction-D-55GfwL.mjs +243 -0
  5. package/dist/AWSScheduledFunction-D-55GfwL.mjs.map +1 -0
  6. package/dist/AWSScheduledFunction-D9uCAd76.d.cts +117 -0
  7. package/dist/AWSScheduledFunction-D9uCAd76.d.cts.map +1 -0
  8. package/dist/AWSScheduledFunction-sWwZC9hg.cjs +255 -0
  9. package/dist/AWSScheduledFunction-sWwZC9hg.cjs.map +1 -0
  10. package/dist/{Construct-DXfLPGwg.cjs → Construct-B14miJ6P.cjs} +42 -5
  11. package/dist/{Construct-DXfLPGwg.cjs.map → Construct-B14miJ6P.cjs.map} +1 -1
  12. package/dist/{Construct-CXqvzglu.d.cts → Construct-cjIs74Gb.d.cts} +1 -1
  13. package/dist/{Construct-CXqvzglu.d.cts.map → Construct-cjIs74Gb.d.cts.map} +1 -1
  14. package/dist/{Endpoint-NvjIednd.d.mts → Endpoint-C_qxza6z.d.mts} +5 -5
  15. package/dist/{Endpoint-NvjIednd.d.mts.map → Endpoint-C_qxza6z.d.mts.map} +1 -1
  16. package/dist/{Endpoint-CE7qHX5S.d.cts → Endpoint-D5SChIsU.d.cts} +4 -4
  17. package/dist/{Endpoint-CE7qHX5S.d.cts.map → Endpoint-D5SChIsU.d.cts.map} +1 -1
  18. package/dist/{HonoEndpointAdaptor-DyYv0IoU.mjs → HonoEndpointAdaptor-CWYBGVFQ.mjs} +5 -4
  19. package/dist/{HonoEndpointAdaptor-DyYv0IoU.mjs.map → HonoEndpointAdaptor-CWYBGVFQ.mjs.map} +1 -1
  20. package/dist/{HonoEndpointAdaptor-DFdgCwYU.cjs → HonoEndpointAdaptor-C_2jaZ4k.cjs} +18 -17
  21. package/dist/{HonoEndpointAdaptor-DFdgCwYU.cjs.map → HonoEndpointAdaptor-C_2jaZ4k.cjs.map} +1 -1
  22. package/dist/{Subscriber-Tft61-YG.d.mts → Subscriber-C0v9iOrI.d.mts} +2 -2
  23. package/dist/{Subscriber-Tft61-YG.d.mts.map → Subscriber-C0v9iOrI.d.mts.map} +1 -1
  24. package/dist/{Subscriber-D8WkA8np.d.cts → Subscriber-C6YXAmTp.d.cts} +3 -3
  25. package/dist/{Subscriber-D8WkA8np.d.cts.map → Subscriber-C6YXAmTp.d.cts.map} +1 -1
  26. package/dist/adaptors/aws.cjs +15 -214
  27. package/dist/adaptors/aws.cjs.map +1 -1
  28. package/dist/adaptors/aws.d.cts +11 -66
  29. package/dist/adaptors/aws.d.cts.map +1 -1
  30. package/dist/adaptors/aws.d.mts +10 -65
  31. package/dist/adaptors/aws.d.mts.map +1 -1
  32. package/dist/adaptors/aws.mjs +8 -207
  33. package/dist/adaptors/aws.mjs.map +1 -1
  34. package/dist/adaptors/hono.cjs +6 -5
  35. package/dist/adaptors/hono.d.cts +4 -4
  36. package/dist/adaptors/hono.d.cts.map +1 -1
  37. package/dist/adaptors/hono.d.mts +3 -3
  38. package/dist/adaptors/hono.d.mts.map +1 -1
  39. package/dist/adaptors/hono.mjs +5 -4
  40. package/dist/adaptors/testing.cjs +15 -15
  41. package/dist/adaptors/testing.cjs.map +1 -1
  42. package/dist/adaptors/testing.d.cts +6 -6
  43. package/dist/adaptors/testing.d.mts +5 -5
  44. package/dist/adaptors/testing.mjs +5 -4
  45. package/dist/adaptors/testing.mjs.map +1 -1
  46. package/dist/crons/index.cjs +7 -5
  47. package/dist/crons/index.cjs.map +1 -1
  48. package/dist/crons/index.d.cts +6 -22
  49. package/dist/crons/index.d.cts.map +1 -1
  50. package/dist/crons/index.d.mts +4 -20
  51. package/dist/crons/index.d.mts.map +1 -1
  52. package/dist/crons/index.mjs +4 -2
  53. package/dist/crons/index.mjs.map +1 -1
  54. package/dist/endpoints/index.cjs +8 -8
  55. package/dist/endpoints/index.d.cts +5 -5
  56. package/dist/endpoints/index.d.mts +4 -4
  57. package/dist/endpoints/index.mjs +3 -2
  58. package/dist/endpoints/index.mjs.map +1 -1
  59. package/dist/functions/index.cjs +2 -2
  60. package/dist/functions/index.d.cts +2 -2
  61. package/dist/functions/index.d.mts +1 -1
  62. package/dist/functions/index.mjs +1 -1
  63. package/dist/{functions-GmSHFbpr.mjs → functions-C9QhxXoP.mjs} +1637 -1637
  64. package/dist/functions-C9QhxXoP.mjs.map +1 -0
  65. package/dist/{functions-CX21wstW.cjs → functions-cL1XwEHW.cjs} +1641 -1642
  66. package/dist/functions-cL1XwEHW.cjs.map +1 -0
  67. package/dist/{index-Cq4fz8uM.d.mts → index-C0XoazSK.d.mts} +34 -33
  68. package/dist/index-C0XoazSK.d.mts.map +1 -0
  69. package/dist/{index-CzIMpK-e.d.cts → index-Cg0m0uBN.d.cts} +36 -35
  70. package/dist/index-Cg0m0uBN.d.cts.map +1 -0
  71. package/dist/index.cjs +1 -1
  72. package/dist/index.d.cts +3 -3
  73. package/dist/index.d.mts +2 -2
  74. package/dist/{lazyAccessors-5h-aWohM.mjs → lazyAccessors-Bnq67EHR.mjs} +3 -42
  75. package/dist/lazyAccessors-Bnq67EHR.mjs.map +1 -0
  76. package/dist/{lazyAccessors-zNy6P6Cg.cjs → lazyAccessors-DGqzwC-j.cjs} +10 -62
  77. package/dist/lazyAccessors-DGqzwC-j.cjs.map +1 -0
  78. package/dist/{processAudits-B_a9bDPs.cjs → processAudits-BmjKsnF7.cjs} +3 -3
  79. package/dist/{processAudits-B_a9bDPs.cjs.map → processAudits-BmjKsnF7.cjs.map} +1 -1
  80. package/dist/{processAudits-B0PbJf1Z.mjs → processAudits-ySnizdMG.mjs} +1 -1
  81. package/dist/{processAudits-B0PbJf1Z.mjs.map → processAudits-ySnizdMG.mjs.map} +1 -1
  82. package/dist/publisher-BrFOF847.mjs +41 -0
  83. package/dist/publisher-BrFOF847.mjs.map +1 -0
  84. package/dist/publisher-lFQleddL.cjs +53 -0
  85. package/dist/publisher-lFQleddL.cjs.map +1 -0
  86. package/dist/subscribers/index.cjs +2 -3
  87. package/dist/subscribers/index.cjs.map +1 -1
  88. package/dist/subscribers/index.d.cts +2 -2
  89. package/dist/subscribers/index.d.mts +1 -1
  90. package/dist/{telemetry-COvVBKBM.d.mts → telemetry-3vdxGn4q.d.mts} +1 -1
  91. package/dist/{telemetry-Bt0vK4ma.d.cts.map → telemetry-3vdxGn4q.d.mts.map} +1 -1
  92. package/dist/{telemetry-Bt0vK4ma.d.cts → telemetry-Dqx-D3F7.d.cts} +1 -1
  93. package/dist/{telemetry-COvVBKBM.d.mts.map → telemetry-Dqx-D3F7.d.cts.map} +1 -1
  94. package/dist/{types-B8YlI4cx.d.cts → types-BDNGr7pv.d.mts} +1 -1
  95. package/dist/{types-B8YlI4cx.d.cts.map → types-BDNGr7pv.d.mts.map} +1 -1
  96. package/dist/{types-BA3eK4xj.d.mts → types-BdAaYDvd.d.cts} +1 -1
  97. package/dist/{types-BA3eK4xj.d.mts.map → types-BdAaYDvd.d.cts.map} +1 -1
  98. package/dist/types.d.cts +1 -1
  99. package/dist/types.d.mts +1 -1
  100. package/package.json +9 -24
  101. package/src/adaptors/aws.ts +1 -0
  102. package/src/crons/AWSScheduledFunction.ts +73 -0
  103. package/src/crons/__tests__/AWSScheduledFunction.spec.ts +152 -0
  104. package/src/crons/index.ts +1 -0
  105. package/src/endpoints/HonoEndpointAdaptor.ts +0 -1
  106. package/tsdown.config.ts +0 -1
  107. package/dist/adaptors/trpc.cjs +0 -65
  108. package/dist/adaptors/trpc.cjs.map +0 -1
  109. package/dist/adaptors/trpc.d.cts +0 -85
  110. package/dist/adaptors/trpc.d.cts.map +0 -1
  111. package/dist/adaptors/trpc.d.mts +0 -85
  112. package/dist/adaptors/trpc.d.mts.map +0 -1
  113. package/dist/adaptors/trpc.mjs +0 -63
  114. package/dist/adaptors/trpc.mjs.map +0 -1
  115. package/dist/chunk-DWy1uDak.cjs +0 -39
  116. package/dist/functions-CX21wstW.cjs.map +0 -1
  117. package/dist/functions-GmSHFbpr.mjs.map +0 -1
  118. package/dist/index-Cq4fz8uM.d.mts.map +0 -1
  119. package/dist/index-CzIMpK-e.d.cts.map +0 -1
  120. package/dist/lazyAccessors-5h-aWohM.mjs.map +0 -1
  121. package/dist/lazyAccessors-zNy6P6Cg.cjs.map +0 -1
  122. package/src/adaptors/__tests__/trpc.spec.ts +0 -220
  123. package/src/adaptors/trpc.ts +0 -192
package/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # @geekmidas/constructs
2
2
 
3
+ ## 4.0.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#5](https://github.com/geekmidas/toolbox/pull/5) [`811d740`](https://github.com/geekmidas/toolbox/commit/811d740ae3875d59ad1b0dc50261266963c8cb76) Thanks [@geekmidas](https://github.com/geekmidas)! - Move the tRPC and Middy service integrations from `@geekmidas/constructs` to `@geekmidas/services`, where they belong — they depend only on `@geekmidas/services`, not on any construct.
8
+ - ✨ **`@geekmidas/constructs`:** the `@geekmidas/constructs/trpc` and `@geekmidas/constructs/middy` entry points are removed (they were only just added). Import from `@geekmidas/services/trpc` and `@geekmidas/services/middy` instead. (`@trpc/server` is no longer a peer dependency of `@geekmidas/constructs`.)
9
+ - ✨ **`@geekmidas/services`:** adds `/trpc` (`createServicesMiddleware`, `createRequestContextMiddleware`) and `/middy` (`requestContext`, `addServices`, `withServices`, `EventServices`) exports.
10
+
11
+ The Middy middlewares were also tightened:
12
+ - `requestContext` / `withServices` now require an explicit `logger` (no `ConsoleLogger` default) and are generic over `TLogger extends Logger`, so a custom logger type is preserved.
13
+ - `addServices` / `withServices` now require an `envParser` (no implicit `process.env` default).
14
+ - 🐛 Resolved services are attached to `event.services` (matching the `Function`/`Cron` constructs).
15
+
16
+ ### Patch Changes
17
+
18
+ - Updated dependencies [[`811d740`](https://github.com/geekmidas/toolbox/commit/811d740ae3875d59ad1b0dc50261266963c8cb76)]:
19
+ - @geekmidas/services@1.1.0
20
+ - @geekmidas/rate-limit@3.0.0
21
+
22
+ ## 3.1.0
23
+
24
+ ### Minor Changes
25
+
26
+ - ✨ [#4](https://github.com/geekmidas/toolbox/pull/4) [`07093f5`](https://github.com/geekmidas/toolbox/commit/07093f5f911bf1ee48e53275da3cce398cc78ff6) Thanks [@geekmidas](https://github.com/geekmidas)! - Add `@geekmidas/constructs/middy` — Middy middlewares that bring request context and service discovery to standalone Lambda handlers:
27
+ - `requestContext(options?)` establishes a request context so `serviceContext.getLogger()` / `getRequestId()` / `getRequestStartTime()` work inside the handler and any service it calls.
28
+ - 🐛 `addServices([...], options?)` resolves services via `ServiceDiscovery` and attaches the typed record to `event.services` (pair with `requestContext`, or use `withServices`, if your services read `serviceContext`).
29
+ - `withServices([...], options?)` bundles both in a single `.use(...)`.
30
+
31
+ Also exports an `EventServices<T>` helper type for typing the handler's event.
32
+
33
+ ### Patch Changes
34
+
35
+ - ✨ [#4](https://github.com/geekmidas/toolbox/pull/4) [`a20be2f`](https://github.com/geekmidas/toolbox/commit/a20be2faa4795600358904b751fa947d3cbb4c45) Thanks [@geekmidas](https://github.com/geekmidas)! - Add and export `AWSScheduledFunction` from `@geekmidas/constructs/crons` (and `/aws`). The CLI's cron handler generator already imported this adaptor, but it was never implemented, so generated cron handlers failed to load. `AWSScheduledFunction` wraps a `Cron` (which extends `Function`) and reuses the Lambda function execution pipeline, including the `runWithRequestContext` wrapper that powers request-scoped logging.
36
+
3
37
  ## 3.0.14
4
38
 
5
39
  ### Patch Changes
@@ -0,0 +1,117 @@
1
+ import { Function, FunctionHandler } from "./index-C0XoazSK.mjs";
2
+ import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
3
+ import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
4
+ import { EnvironmentParser } from "@geekmidas/envkit";
5
+ import { EventPublisher } from "@geekmidas/events";
6
+ import { Logger } from "@geekmidas/logger";
7
+ import { ComposableStandardSchema, InferComposableStandardSchema, InferStandardSchema } from "@geekmidas/schema";
8
+ import { StandardSchemaV1 } from "@standard-schema/spec";
9
+ import { Handler } from "aws-lambda";
10
+
11
+ //#region src/functions/FunctionExecutionWrapper.d.ts
12
+ declare abstract class FunctionExecutionWrapper<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
13
+ protected envParser: EnvironmentParser<{}>;
14
+ protected readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
15
+ constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
16
+ protected _logger?: TLogger;
17
+ get logger(): TLogger;
18
+ get serviceDiscovery(): ServiceDiscovery<ServiceRecord<TServices>>;
19
+ getServices(): Promise<ServiceRecord<TServices>>;
20
+ getDatabase(): Promise<TDatabase | undefined>;
21
+ /**
22
+ * Get the audit storage service if configured.
23
+ * Returns undefined if no auditor storage is configured.
24
+ */
25
+ getAuditStorage(): Promise<TAuditStorage | undefined>;
26
+ /**
27
+ * Create an auditor instance for the function.
28
+ * Returns undefined if no auditor storage is configured.
29
+ */
30
+ createAuditor(): Promise<Auditor<TAuditAction> | undefined>;
31
+ /**
32
+ * Execute handler with audit transaction support.
33
+ * If the audit storage has a database (via getDatabase()), wraps execution
34
+ * in a transaction so audits are atomic with handler's database operations.
35
+ *
36
+ * @param handler - The handler function to execute (receives auditor and db)
37
+ * @returns The handler result
38
+ */
39
+ executeWithAudit<T>(handler: (ctx: {
40
+ auditor?: Auditor<TAuditAction>;
41
+ db?: TDatabase;
42
+ }) => Promise<T>): Promise<T>;
43
+ getFunctionInput<TEvent>(event: TEvent): Promise<InferComposableStandardSchema<TInput>>;
44
+ publishEvents(response: InferStandardSchema<TOutSchema>): Promise<void>;
45
+ parseComposableStandardSchema<T extends ComposableStandardSchema>(data: unknown, schema: T): Promise<InferComposableStandardSchema<T>>;
46
+ }
47
+ //# sourceMappingURL=FunctionExecutionWrapper.d.ts.map
48
+ //#endregion
49
+ //#region src/functions/AWSLambdaFunction.d.ts
50
+ type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
51
+ declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
52
+ readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
53
+ constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
54
+ private error;
55
+ private baseInput;
56
+ private input;
57
+ private loggerMiddleware;
58
+ private services;
59
+ private database;
60
+ private auditor;
61
+ private events;
62
+ private _handler;
63
+ get handler(): AWSLambdaHandler;
64
+ }
65
+ //# sourceMappingURL=AWSLambdaFunction.d.ts.map
66
+ //#endregion
67
+ //#region src/crons/Cron.d.ts
68
+ declare class Cron<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string> extends Function<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, undefined, string, TDatabase, TDatabaseServiceName, AuditableAction<string, unknown>, FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>> {
69
+ protected _schedule?: ScheduleExpression | undefined;
70
+ static isCron(obj: any): obj is Cron<any, any, any, any>;
71
+ constructor(fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>, timeout?: number, _schedule?: ScheduleExpression | undefined, input?: TInput, outputSchema?: OutSchema, services?: TServices, logger?: TLogger, publisherService?: Service<TEventPublisherServiceName, TEventPublisher>, events?: any[], memorySize?: number, databaseService?: Service<TDatabaseServiceName, TDatabase>);
72
+ get schedule(): ScheduleExpression | undefined;
73
+ }
74
+ type RateExpression = `rate(${string})`;
75
+ type CronMinute = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | `${number},${number}` | string;
76
+ type CronHour = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | `${number},${number}` | string;
77
+ type CronDay = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | `${number},${number}` | string;
78
+ type CronMonth = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | 'JAN' | 'FEB' | 'MAR' | 'APR' | 'MAY' | 'JUN' | 'JUL' | 'AUG' | 'SEP' | 'OCT' | 'NOV' | 'DEC' | string;
79
+ type CronWeekday = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | 'SUN' | 'MON' | 'TUE' | 'WED' | 'THU' | 'FRI' | 'SAT' | `${string}-${string}` | string;
80
+ type CronExpression = `cron(${CronMinute} ${CronHour} ${CronDay} ${CronMonth} ${CronWeekday})`;
81
+ type ScheduleExpression = RateExpression | CronExpression;
82
+ //#endregion
83
+ //#region src/crons/AWSScheduledFunction.d.ts
84
+ /**
85
+ * AWS Lambda adaptor for {@link Cron} constructs.
86
+ *
87
+ * A `Cron` is a {@link import('../functions').Function} that is invoked on a
88
+ * schedule (an EventBridge rule) rather than by an API request. Because of
89
+ * that, the runtime execution pipeline is identical to a regular Lambda
90
+ * function: input parsing, service/database/auditor wiring, event publishing,
91
+ * error handling, and the `runWithRequestContext` wrapper that powers
92
+ * request-scoped logging via `serviceContext.getLogger()`.
93
+ *
94
+ * This adaptor therefore reuses {@link AWSLambdaFunction} wholesale and only
95
+ * narrows the constructor to accept a `Cron`. The schedule expression itself
96
+ * (`cron.schedule`) is **deploy-time** infrastructure consumed by the CLI to
97
+ * provision the EventBridge rule — it is not needed at runtime.
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * import { AWSScheduledFunction } from '@geekmidas/constructs/crons';
102
+ * import { cancelPastBookings } from '../../../src/crons/cancelPastBookings.js';
103
+ * import { envParser } from '../../../src/env';
104
+ *
105
+ * const adapter = new AWSScheduledFunction(envParser, cancelPastBookings);
106
+ *
107
+ * export const handler = adapter.handler;
108
+ * ```
109
+ */
110
+ declare class AWSScheduledFunction<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TOutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string> extends AWSLambdaFunction<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, undefined, string, TDatabase, TDatabaseServiceName> {
111
+ constructor(envParser: EnvironmentParser<{}>, cron: Cron<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>);
112
+ }
113
+ //# sourceMappingURL=AWSScheduledFunction.d.ts.map
114
+
115
+ //#endregion
116
+ export { AWSLambdaFunction, AWSScheduledFunction, Cron, CronExpression, RateExpression, ScheduleExpression };
117
+ //# sourceMappingURL=AWSScheduledFunction-COv8bB1v.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSScheduledFunction-COv8bB1v.d.mts","names":[],"sources":["../src/functions/FunctionExecutionWrapper.ts","../src/functions/AWSLambdaFunction.ts","../src/crons/Cron.ts","../src/crons/AWSScheduledFunction.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ import { FunctionBuilder } from "./functions-C9QhxXoP.mjs";
2
+ import { publishEvents } from "./publisher-BrFOF847.mjs";
3
+ import { wrapError } from "@geekmidas/errors";
4
+ import { ServiceDiscovery, runWithRequestContext } from "@geekmidas/services";
5
+ import middy from "@middy/core";
6
+ import { DefaultAuditor } from "@geekmidas/audit";
7
+ import { withAuditableTransaction } from "@geekmidas/audit/kysely";
8
+
9
+ //#region src/functions/FunctionExecutionWrapper.ts
10
+ var FunctionExecutionWrapper = class {
11
+ constructor(envParser, fn) {
12
+ this.envParser = envParser;
13
+ this.fn = fn;
14
+ }
15
+ _logger;
16
+ get logger() {
17
+ return this._logger || this.fn.logger;
18
+ }
19
+ get serviceDiscovery() {
20
+ const serviceDiscovery = ServiceDiscovery.getInstance(this.envParser);
21
+ return serviceDiscovery;
22
+ }
23
+ getServices() {
24
+ return this.serviceDiscovery.register(this.fn.services);
25
+ }
26
+ async getDatabase() {
27
+ if (!this.fn.databaseService) return void 0;
28
+ const services = await this.serviceDiscovery.register([this.fn.databaseService]);
29
+ return services[this.fn.databaseService.serviceName];
30
+ }
31
+ /**
32
+ * Get the audit storage service if configured.
33
+ * Returns undefined if no auditor storage is configured.
34
+ */
35
+ async getAuditStorage() {
36
+ if (!this.fn.auditorStorageService) return void 0;
37
+ const services = await this.serviceDiscovery.register([this.fn.auditorStorageService]);
38
+ return services[this.fn.auditorStorageService.serviceName];
39
+ }
40
+ /**
41
+ * Create an auditor instance for the function.
42
+ * Returns undefined if no auditor storage is configured.
43
+ */
44
+ async createAuditor() {
45
+ const storage = await this.getAuditStorage();
46
+ if (!storage) return void 0;
47
+ return new DefaultAuditor({
48
+ actor: {
49
+ id: "system",
50
+ type: "system"
51
+ },
52
+ storage,
53
+ metadata: { function: this.fn.type }
54
+ });
55
+ }
56
+ /**
57
+ * Execute handler with audit transaction support.
58
+ * If the audit storage has a database (via getDatabase()), wraps execution
59
+ * in a transaction so audits are atomic with handler's database operations.
60
+ *
61
+ * @param handler - The handler function to execute (receives auditor and db)
62
+ * @returns The handler result
63
+ */
64
+ async executeWithAudit(handler) {
65
+ const auditor = await this.createAuditor();
66
+ const storage = await this.getAuditStorage();
67
+ if (!auditor || !storage) {
68
+ const db$1 = await this.getDatabase();
69
+ return handler({ db: db$1 });
70
+ }
71
+ const storageDb = storage.getDatabase?.();
72
+ const databaseServiceName = this.fn.databaseService?.serviceName;
73
+ const auditDbServiceName = this.fn.auditorStorageService?.serviceName;
74
+ if (storageDb && databaseServiceName && auditDbServiceName) return withAuditableTransaction(storageDb, auditor, async (trx) => {
75
+ const response$1 = await handler({
76
+ auditor,
77
+ db: trx
78
+ });
79
+ return response$1;
80
+ });
81
+ const db = await this.getDatabase();
82
+ const response = await handler({
83
+ auditor,
84
+ db
85
+ });
86
+ await auditor.flush();
87
+ return response;
88
+ }
89
+ async getFunctionInput(event) {
90
+ const parsedInput = await FunctionBuilder.parseComposableStandardSchema(event, this.fn.input);
91
+ return parsedInput;
92
+ }
93
+ async publishEvents(response) {
94
+ await publishEvents(this.logger, this.serviceDiscovery, this.fn.events, response, this.fn.publisherService);
95
+ }
96
+ async parseComposableStandardSchema(data, schema) {
97
+ return FunctionBuilder.parseComposableStandardSchema(data, schema);
98
+ }
99
+ };
100
+
101
+ //#endregion
102
+ //#region src/functions/AWSLambdaFunction.ts
103
+ var AWSLambdaFunction = class extends FunctionExecutionWrapper {
104
+ constructor(envParser, fn) {
105
+ super(envParser, fn);
106
+ this.fn = fn;
107
+ }
108
+ error() {
109
+ return { onError: (req) => {
110
+ const logger = req.event?.logger || this.fn.logger;
111
+ logger.error(req.error || {}, "Error processing function");
112
+ throw wrapError(req.error);
113
+ } };
114
+ }
115
+ baseInput() {
116
+ return { before: (_req) => {} };
117
+ }
118
+ input() {
119
+ return { before: async (req) => {
120
+ try {
121
+ if (this.fn.input) {
122
+ const parsedInput = await FunctionBuilder.parseComposableStandardSchema(req.event, this.fn.input);
123
+ req.event.parsedInput = parsedInput;
124
+ } else req.event.parsedInput = req.event;
125
+ } catch (error) {
126
+ this.logger.error({
127
+ error,
128
+ event: req.event
129
+ }, "Failed to parse input");
130
+ throw error;
131
+ }
132
+ } };
133
+ }
134
+ loggerMiddleware() {
135
+ return { before: (req) => {
136
+ this._logger = this.fn.logger.child({
137
+ fn: {
138
+ name: req.context.functionName,
139
+ version: req.context.functionVersion,
140
+ memory: req.context.memoryLimitInMB
141
+ },
142
+ req: { id: req.context.awsRequestId }
143
+ });
144
+ req.event.logger = this._logger;
145
+ } };
146
+ }
147
+ services() {
148
+ return { before: async (req) => {
149
+ req.event.services = await this.getServices();
150
+ } };
151
+ }
152
+ database() {
153
+ return { before: async (req) => {
154
+ req.event.db = await this.getDatabase();
155
+ } };
156
+ }
157
+ auditor() {
158
+ return {
159
+ before: async (req) => {
160
+ req.event.auditor = await this.createAuditor();
161
+ },
162
+ after: async (req) => {
163
+ if (req.event.auditor) {
164
+ const records = req.event.auditor.getRecords();
165
+ if (records.length > 0) {
166
+ this.logger.debug({ auditCount: records.length }, "Flushing function audits");
167
+ await req.event.auditor.flush();
168
+ }
169
+ }
170
+ }
171
+ };
172
+ }
173
+ events() {
174
+ return { after: async (req) => {
175
+ const response = req.response || void 0;
176
+ await this.publishEvents(response);
177
+ } };
178
+ }
179
+ async _handler(event) {
180
+ const result = await this.fn.fn({
181
+ input: event.parsedInput,
182
+ services: event.services,
183
+ logger: event.logger,
184
+ db: event.db,
185
+ auditor: event.auditor
186
+ });
187
+ const output = await this.fn.parseOutput(result);
188
+ return output;
189
+ }
190
+ get handler() {
191
+ const handler = this._handler.bind(this);
192
+ const chain = middy(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.database()).use(this.auditor()).use(this.input()).use(this.events());
193
+ const wrappedHandler = async (event, context) => {
194
+ const startTime = Date.now();
195
+ const requestId = context.awsRequestId;
196
+ const logger = this.fn.logger.child({ requestId });
197
+ return runWithRequestContext({
198
+ logger,
199
+ requestId,
200
+ startTime
201
+ }, () => chain(event, context));
202
+ };
203
+ return wrappedHandler;
204
+ }
205
+ };
206
+
207
+ //#endregion
208
+ //#region src/crons/AWSScheduledFunction.ts
209
+ /**
210
+ * AWS Lambda adaptor for {@link Cron} constructs.
211
+ *
212
+ * A `Cron` is a {@link import('../functions').Function} that is invoked on a
213
+ * schedule (an EventBridge rule) rather than by an API request. Because of
214
+ * that, the runtime execution pipeline is identical to a regular Lambda
215
+ * function: input parsing, service/database/auditor wiring, event publishing,
216
+ * error handling, and the `runWithRequestContext` wrapper that powers
217
+ * request-scoped logging via `serviceContext.getLogger()`.
218
+ *
219
+ * This adaptor therefore reuses {@link AWSLambdaFunction} wholesale and only
220
+ * narrows the constructor to accept a `Cron`. The schedule expression itself
221
+ * (`cron.schedule`) is **deploy-time** infrastructure consumed by the CLI to
222
+ * provision the EventBridge rule — it is not needed at runtime.
223
+ *
224
+ * @example
225
+ * ```typescript
226
+ * import { AWSScheduledFunction } from '@geekmidas/constructs/crons';
227
+ * import { cancelPastBookings } from '../../../src/crons/cancelPastBookings.js';
228
+ * import { envParser } from '../../../src/env';
229
+ *
230
+ * const adapter = new AWSScheduledFunction(envParser, cancelPastBookings);
231
+ *
232
+ * export const handler = adapter.handler;
233
+ * ```
234
+ */
235
+ var AWSScheduledFunction = class extends AWSLambdaFunction {
236
+ constructor(envParser, cron) {
237
+ super(envParser, cron);
238
+ }
239
+ };
240
+
241
+ //#endregion
242
+ export { AWSLambdaFunction, AWSScheduledFunction };
243
+ //# sourceMappingURL=AWSScheduledFunction-D-55GfwL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSScheduledFunction-D-55GfwL.mjs","names":["envParser: EnvironmentParser<{}>","fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>","handler: (ctx: {\n\t\t\tauditor?: Auditor<TAuditAction>;\n\t\t\tdb?: TDatabase;\n\t\t}) => Promise<T>","db","response","event: TEvent","response: InferStandardSchema<TOutSchema>","data: unknown","schema: T","envParser: EnvironmentParser<{}>","fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>","event: FunctionEvent<\n\t\t\tTEvent,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTDatabase,\n\t\t\tTAuditAction\n\t\t>","event: unknown","context: Context","envParser: EnvironmentParser<{}>","cron: Cron<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>"],"sources":["../src/functions/FunctionExecutionWrapper.ts","../src/functions/AWSLambdaFunction.ts","../src/crons/AWSScheduledFunction.ts"],"sourcesContent":["import type { AuditableAction, Auditor, AuditStorage } from '@geekmidas/audit';\nimport { DefaultAuditor } from '@geekmidas/audit';\nimport { withAuditableTransaction } from '@geekmidas/audit/kysely';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n\tComposableStandardSchema,\n\tInferComposableStandardSchema,\n\tInferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { publishEvents } from '../publisher';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nexport abstract class FunctionExecutionWrapper<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> {\n\tconstructor(\n\t\tprotected envParser: EnvironmentParser<{}>,\n\t\tprotected readonly fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>,\n\t) {}\n\n\tprotected _logger?: TLogger;\n\n\tget logger(): TLogger {\n\t\treturn this._logger || this.fn.logger;\n\t}\n\n\tget serviceDiscovery(): ServiceDiscovery<ServiceRecord<TServices>> {\n\t\tconst serviceDiscovery = ServiceDiscovery.getInstance<\n\t\t\tServiceRecord<TServices>\n\t\t>(this.envParser);\n\n\t\treturn serviceDiscovery;\n\t}\n\n\tgetServices(): Promise<ServiceRecord<TServices>> {\n\t\treturn this.serviceDiscovery.register(this.fn.services);\n\t}\n\n\tasync getDatabase(): Promise<TDatabase | undefined> {\n\t\tif (!this.fn.databaseService) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst services = await this.serviceDiscovery.register([\n\t\t\tthis.fn.databaseService,\n\t\t]);\n\n\t\treturn services[\n\t\t\tthis.fn.databaseService.serviceName as keyof typeof services\n\t\t] as TDatabase;\n\t}\n\n\t/**\n\t * Get the audit storage service if configured.\n\t * Returns undefined if no auditor storage is configured.\n\t */\n\tasync getAuditStorage(): Promise<TAuditStorage | undefined> {\n\t\tif (!this.fn.auditorStorageService) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst services = await this.serviceDiscovery.register([\n\t\t\tthis.fn.auditorStorageService,\n\t\t]);\n\n\t\treturn services[\n\t\t\tthis.fn.auditorStorageService.serviceName as keyof typeof services\n\t\t] as TAuditStorage;\n\t}\n\n\t/**\n\t * Create an auditor instance for the function.\n\t * Returns undefined if no auditor storage is configured.\n\t */\n\tasync createAuditor(): Promise<Auditor<TAuditAction> | undefined> {\n\t\tconst storage = await this.getAuditStorage();\n\t\tif (!storage) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn new DefaultAuditor<TAuditAction>({\n\t\t\tactor: { id: 'system', type: 'system' },\n\t\t\tstorage: storage as AuditStorage,\n\t\t\tmetadata: {\n\t\t\t\tfunction: this.fn.type,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Execute handler with audit transaction support.\n\t * If the audit storage has a database (via getDatabase()), wraps execution\n\t * in a transaction so audits are atomic with handler's database operations.\n\t *\n\t * @param handler - The handler function to execute (receives auditor and db)\n\t * @returns The handler result\n\t */\n\tasync executeWithAudit<T>(\n\t\thandler: (ctx: {\n\t\t\tauditor?: Auditor<TAuditAction>;\n\t\t\tdb?: TDatabase;\n\t\t}) => Promise<T>,\n\t): Promise<T> {\n\t\tconst auditor = await this.createAuditor();\n\t\tconst storage = await this.getAuditStorage();\n\n\t\t// No audit context - just run handler with regular db\n\t\tif (!auditor || !storage) {\n\t\t\tconst db = await this.getDatabase();\n\t\t\treturn handler({ db });\n\t\t}\n\n\t\t// Check if storage has a database and db service names match\n\t\tconst storageDb = (storage as AuditStorage).getDatabase?.();\n\t\tconst databaseServiceName = this.fn.databaseService?.serviceName;\n\t\tconst auditDbServiceName = this.fn.auditorStorageService?.serviceName;\n\n\t\t// If the audit storage has a database and we're using the same database service\n\t\t// (or the audit storage provides the database), use transactional execution\n\t\tif (storageDb && databaseServiceName && auditDbServiceName) {\n\t\t\treturn withAuditableTransaction(\n\t\t\t\tstorageDb as any,\n\t\t\t\tauditor as any,\n\t\t\t\tasync (trx) => {\n\t\t\t\t\t// Use transaction as db\n\t\t\t\t\tconst response = await handler({\n\t\t\t\t\t\tauditor,\n\t\t\t\t\t\tdb: trx as TDatabase,\n\t\t\t\t\t});\n\t\t\t\t\t// Audits are flushed by withAuditableTransaction before commit\n\t\t\t\t\treturn response;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// No database on storage or service names don't match - run handler and flush audits after\n\t\tconst db = await this.getDatabase();\n\t\tconst response = await handler({ auditor, db });\n\n\t\t// Flush audits (no transaction)\n\t\tawait auditor.flush();\n\n\t\treturn response;\n\t}\n\n\tasync getFunctionInput<TEvent>(\n\t\tevent: TEvent,\n\t): Promise<InferComposableStandardSchema<TInput>> {\n\t\tconst parsedInput = await FunctionBuilder.parseComposableStandardSchema(\n\t\t\tevent,\n\t\t\tthis.fn.input,\n\t\t);\n\n\t\treturn parsedInput as InferComposableStandardSchema<TInput>;\n\t}\n\n\tasync publishEvents(response: InferStandardSchema<TOutSchema>) {\n\t\tawait publishEvents(\n\t\t\tthis.logger,\n\t\t\tthis.serviceDiscovery,\n\t\t\tthis.fn.events,\n\t\t\tresponse,\n\t\t\tthis.fn.publisherService,\n\t\t);\n\t}\n\n\tasync parseComposableStandardSchema<T extends ComposableStandardSchema>(\n\t\tdata: unknown,\n\t\tschema: T,\n\t): Promise<InferComposableStandardSchema<T>> {\n\t\treturn FunctionBuilder.parseComposableStandardSchema(data, schema);\n\t}\n}\n","import type { AuditableAction, Auditor, AuditStorage } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n\tComposableStandardSchema,\n\tInferComposableStandardSchema,\n\tInferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { runWithRequestContext } from '@geekmidas/services';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n\tTEvent,\n\tTResult\n>;\n\ntype FunctionEvent<\n\tTEvent,\n\tTInput extends ComposableStandardSchema | undefined,\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTDatabase = undefined,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> = TEvent & {\n\tparsedInput: InferComposableStandardSchema<TInput>;\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n\tdb: TDatabase | undefined;\n\tauditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n\tTEvent,\n\tTInput extends ComposableStandardSchema | undefined,\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined,\n\tTDatabase = undefined,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> = MiddlewareObj<\n\tFunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n\tInferComposableStandardSchema<TOutSchema>,\n\tError,\n\tContext\n>;\n\nexport class AWSLambdaFunction<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> extends FunctionExecutionWrapper<\n\tTInput,\n\tTOutSchema,\n\tTServices,\n\tTLogger,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tTAuditStorage,\n\tTAuditStorageServiceName,\n\tTDatabase,\n\tTDatabaseServiceName,\n\tTAuditAction\n> {\n\tconstructor(\n\t\tenvParser: EnvironmentParser<{}>,\n\t\toverride readonly fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>,\n\t) {\n\t\tsuper(envParser, fn);\n\t}\n\n\tprivate error<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tonError: (req) => {\n\t\t\t\tconst logger = req.event?.logger || this.fn.logger;\n\t\t\t\tlogger.error(req.error || {}, 'Error processing function');\n\n\t\t\t\t// Re-throw the wrapped error to let Lambda handle it\n\t\t\t\tthrow wrapError(req.error);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate baseInput<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: (_req) => {},\n\t\t};\n\t}\n\n\tprivate input<\n\t\tTEvent extends { input: InferComposableStandardSchema<TInput> },\n\t>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\ttry {\n\t\t\t\t\t// Parse input if schema is provided\n\t\t\t\t\tif (this.fn.input) {\n\t\t\t\t\t\tconst parsedInput =\n\t\t\t\t\t\t\tawait FunctionBuilder.parseComposableStandardSchema(\n\t\t\t\t\t\t\t\treq.event,\n\t\t\t\t\t\t\t\tthis.fn.input,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\treq.event.parsedInput =\n\t\t\t\t\t\t\tparsedInput as InferComposableStandardSchema<TInput>;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// If no schema, pass the event as-is\n\t\t\t\t\t\treq.event.parsedInput = req.event as any;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t{ error, event: req.event },\n\t\t\t\t\t\t'Failed to parse input',\n\t\t\t\t\t);\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate loggerMiddleware<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: (req) => {\n\t\t\t\tthis._logger = this.fn.logger.child({\n\t\t\t\t\tfn: {\n\t\t\t\t\t\tname: req.context.functionName,\n\t\t\t\t\t\tversion: req.context.functionVersion,\n\t\t\t\t\t\tmemory: req.context.memoryLimitInMB,\n\t\t\t\t\t},\n\t\t\t\t\treq: {\n\t\t\t\t\t\tid: req.context.awsRequestId,\n\t\t\t\t\t},\n\t\t\t\t}) as TLogger;\n\n\t\t\t\treq.event.logger = this._logger;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate services<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.services = await this.getServices();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate database<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.db = await this.getDatabase();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate auditor<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.auditor = await this.createAuditor();\n\t\t\t},\n\t\t\tafter: async (req) => {\n\t\t\t\t// Flush any pending audits after successful execution\n\t\t\t\tif (req.event.auditor) {\n\t\t\t\t\tconst records = req.event.auditor.getRecords();\n\t\t\t\t\tif (records.length > 0) {\n\t\t\t\t\t\tthis.logger.debug(\n\t\t\t\t\t\t\t{ auditCount: records.length },\n\t\t\t\t\t\t\t'Flushing function audits',\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait req.event.auditor.flush();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate events<TEvent>(): Middleware<\n\t\tTEvent,\n\t\tTInput,\n\t\tTServices,\n\t\tTLogger,\n\t\tTOutSchema,\n\t\tTDatabase,\n\t\tTAuditAction\n\t> {\n\t\treturn {\n\t\t\tafter: async (req) => {\n\t\t\t\tconst response = (req.response ||\n\t\t\t\t\tundefined) as InferStandardSchema<TOutSchema>;\n\t\t\t\tawait this.publishEvents(response);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate async _handler<TEvent>(\n\t\tevent: FunctionEvent<\n\t\t\tTEvent,\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTDatabase,\n\t\t\tTAuditAction\n\t\t>,\n\t) {\n\t\t// Execute the function with the parsed context\n\t\tconst result = await this.fn.fn({\n\t\t\tinput: event.parsedInput,\n\t\t\tservices: event.services,\n\t\t\tlogger: event.logger,\n\t\t\tdb: event.db,\n\t\t\tauditor: event.auditor,\n\t\t} as any);\n\n\t\t// Parse output if schema is provided\n\t\tconst output = await this.fn.parseOutput(result);\n\n\t\treturn output;\n\t}\n\n\tget handler(): AWSLambdaHandler {\n\t\tconst handler = this._handler.bind(this);\n\n\t\t// Apply middleware in order\n\t\tconst chain = middy(handler)\n\t\t\t.use(this.loggerMiddleware())\n\t\t\t.use(this.baseInput())\n\t\t\t.use(this.error())\n\t\t\t.use(this.services())\n\t\t\t.use(this.database())\n\t\t\t.use(this.auditor())\n\t\t\t.use(this.input())\n\t\t\t.use(this.events());\n\n\t\t// Wrap entire Middy chain in request context for service access\n\t\tconst wrappedHandler = async (event: unknown, context: Context) => {\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = context.awsRequestId;\n\t\t\tconst logger = this.fn.logger.child({ requestId }) as TLogger;\n\n\t\t\treturn runWithRequestContext({ logger, requestId, startTime }, () =>\n\t\t\t\tchain(event as Parameters<typeof chain>[0], context),\n\t\t\t);\n\t\t};\n\n\t\treturn wrappedHandler as unknown as AWSLambdaHandler;\n\t}\n}\n","import type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { ComposableStandardSchema } from '@geekmidas/schema';\nimport type { Service } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { AWSLambdaFunction } from '../functions/AWSLambdaFunction';\nimport type { Cron } from './Cron';\n\n/**\n * AWS Lambda adaptor for {@link Cron} constructs.\n *\n * A `Cron` is a {@link import('../functions').Function} that is invoked on a\n * schedule (an EventBridge rule) rather than by an API request. Because of\n * that, the runtime execution pipeline is identical to a regular Lambda\n * function: input parsing, service/database/auditor wiring, event publishing,\n * error handling, and the `runWithRequestContext` wrapper that powers\n * request-scoped logging via `serviceContext.getLogger()`.\n *\n * This adaptor therefore reuses {@link AWSLambdaFunction} wholesale and only\n * narrows the constructor to accept a `Cron`. The schedule expression itself\n * (`cron.schedule`) is **deploy-time** infrastructure consumed by the CLI to\n * provision the EventBridge rule — it is not needed at runtime.\n *\n * @example\n * ```typescript\n * import { AWSScheduledFunction } from '@geekmidas/constructs/crons';\n * import { cancelPastBookings } from '../../../src/crons/cancelPastBookings.js';\n * import { envParser } from '../../../src/env';\n *\n * const adapter = new AWSScheduledFunction(envParser, cancelPastBookings);\n *\n * export const handler = adapter.handler;\n * ```\n */\nexport class AWSScheduledFunction<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> extends AWSLambdaFunction<\n\tTInput,\n\tTOutSchema,\n\tTServices,\n\tTLogger,\n\tTEventPublisher,\n\tTEventPublisherServiceName,\n\tundefined,\n\tstring,\n\tTDatabase,\n\tTDatabaseServiceName\n> {\n\t// biome-ignore lint/complexity/noUselessConstructor: narrows the inherited `Function` parameter to `Cron` for a clearer public API\n\tconstructor(\n\t\tenvParser: EnvironmentParser<{}>,\n\t\tcron: Cron<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t) {\n\t\tsuper(envParser, cron);\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { Function, FunctionHandler } from "./index-Cg0m0uBN.cjs";
2
+ import { EnvironmentParser } from "@geekmidas/envkit";
3
+ import { EventPublisher } from "@geekmidas/events";
4
+ import { Logger } from "@geekmidas/logger";
5
+ import { ComposableStandardSchema, InferComposableStandardSchema, InferStandardSchema } from "@geekmidas/schema";
6
+ import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
7
+ import { StandardSchemaV1 } from "@standard-schema/spec";
8
+ import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
9
+ import { Handler } from "aws-lambda";
10
+
11
+ //#region src/functions/FunctionExecutionWrapper.d.ts
12
+ declare abstract class FunctionExecutionWrapper<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
13
+ protected envParser: EnvironmentParser<{}>;
14
+ protected readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
15
+ constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
16
+ protected _logger?: TLogger;
17
+ get logger(): TLogger;
18
+ get serviceDiscovery(): ServiceDiscovery<ServiceRecord<TServices>>;
19
+ getServices(): Promise<ServiceRecord<TServices>>;
20
+ getDatabase(): Promise<TDatabase | undefined>;
21
+ /**
22
+ * Get the audit storage service if configured.
23
+ * Returns undefined if no auditor storage is configured.
24
+ */
25
+ getAuditStorage(): Promise<TAuditStorage | undefined>;
26
+ /**
27
+ * Create an auditor instance for the function.
28
+ * Returns undefined if no auditor storage is configured.
29
+ */
30
+ createAuditor(): Promise<Auditor<TAuditAction> | undefined>;
31
+ /**
32
+ * Execute handler with audit transaction support.
33
+ * If the audit storage has a database (via getDatabase()), wraps execution
34
+ * in a transaction so audits are atomic with handler's database operations.
35
+ *
36
+ * @param handler - The handler function to execute (receives auditor and db)
37
+ * @returns The handler result
38
+ */
39
+ executeWithAudit<T>(handler: (ctx: {
40
+ auditor?: Auditor<TAuditAction>;
41
+ db?: TDatabase;
42
+ }) => Promise<T>): Promise<T>;
43
+ getFunctionInput<TEvent>(event: TEvent): Promise<InferComposableStandardSchema<TInput>>;
44
+ publishEvents(response: InferStandardSchema<TOutSchema>): Promise<void>;
45
+ parseComposableStandardSchema<T extends ComposableStandardSchema>(data: unknown, schema: T): Promise<InferComposableStandardSchema<T>>;
46
+ }
47
+ //# sourceMappingURL=FunctionExecutionWrapper.d.ts.map
48
+ //#endregion
49
+ //#region src/functions/AWSLambdaFunction.d.ts
50
+ type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
51
+ declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
52
+ readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
53
+ constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
54
+ private error;
55
+ private baseInput;
56
+ private input;
57
+ private loggerMiddleware;
58
+ private services;
59
+ private database;
60
+ private auditor;
61
+ private events;
62
+ private _handler;
63
+ get handler(): AWSLambdaHandler;
64
+ }
65
+ //# sourceMappingURL=AWSLambdaFunction.d.ts.map
66
+ //#endregion
67
+ //#region src/crons/Cron.d.ts
68
+ declare class Cron<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string> extends Function<TInput, TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, undefined, string, TDatabase, TDatabaseServiceName, AuditableAction<string, unknown>, FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>> {
69
+ protected _schedule?: ScheduleExpression | undefined;
70
+ static isCron(obj: any): obj is Cron<any, any, any, any>;
71
+ constructor(fn: FunctionHandler<TInput, TServices, TLogger, OutSchema, TDatabase>, timeout?: number, _schedule?: ScheduleExpression | undefined, input?: TInput, outputSchema?: OutSchema, services?: TServices, logger?: TLogger, publisherService?: Service<TEventPublisherServiceName, TEventPublisher>, events?: any[], memorySize?: number, databaseService?: Service<TDatabaseServiceName, TDatabase>);
72
+ get schedule(): ScheduleExpression | undefined;
73
+ }
74
+ type RateExpression = `rate(${string})`;
75
+ type CronMinute = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | `${number},${number}` | string;
76
+ type CronHour = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | `${number},${number}` | string;
77
+ type CronDay = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | `${number},${number}` | string;
78
+ type CronMonth = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | 'JAN' | 'FEB' | 'MAR' | 'APR' | 'MAY' | 'JUN' | 'JUL' | 'AUG' | 'SEP' | 'OCT' | 'NOV' | 'DEC' | string;
79
+ type CronWeekday = '*' | number | `${number}` | `${number}-${number}` | `${number}/${number}` | `*/${number}` | 'SUN' | 'MON' | 'TUE' | 'WED' | 'THU' | 'FRI' | 'SAT' | `${string}-${string}` | string;
80
+ type CronExpression = `cron(${CronMinute} ${CronHour} ${CronDay} ${CronMonth} ${CronWeekday})`;
81
+ type ScheduleExpression = RateExpression | CronExpression;
82
+ //#endregion
83
+ //#region src/crons/AWSScheduledFunction.d.ts
84
+ /**
85
+ * AWS Lambda adaptor for {@link Cron} constructs.
86
+ *
87
+ * A `Cron` is a {@link import('../functions').Function} that is invoked on a
88
+ * schedule (an EventBridge rule) rather than by an API request. Because of
89
+ * that, the runtime execution pipeline is identical to a regular Lambda
90
+ * function: input parsing, service/database/auditor wiring, event publishing,
91
+ * error handling, and the `runWithRequestContext` wrapper that powers
92
+ * request-scoped logging via `serviceContext.getLogger()`.
93
+ *
94
+ * This adaptor therefore reuses {@link AWSLambdaFunction} wholesale and only
95
+ * narrows the constructor to accept a `Cron`. The schedule expression itself
96
+ * (`cron.schedule`) is **deploy-time** infrastructure consumed by the CLI to
97
+ * provision the EventBridge rule — it is not needed at runtime.
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * import { AWSScheduledFunction } from '@geekmidas/constructs/crons';
102
+ * import { cancelPastBookings } from '../../../src/crons/cancelPastBookings.js';
103
+ * import { envParser } from '../../../src/env';
104
+ *
105
+ * const adapter = new AWSScheduledFunction(envParser, cancelPastBookings);
106
+ *
107
+ * export const handler = adapter.handler;
108
+ * ```
109
+ */
110
+ declare class AWSScheduledFunction<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TOutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string> extends AWSLambdaFunction<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, undefined, string, TDatabase, TDatabaseServiceName> {
111
+ constructor(envParser: EnvironmentParser<{}>, cron: Cron<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TDatabase, TDatabaseServiceName>);
112
+ }
113
+ //# sourceMappingURL=AWSScheduledFunction.d.ts.map
114
+
115
+ //#endregion
116
+ export { AWSLambdaFunction, AWSScheduledFunction, Cron, CronExpression, RateExpression, ScheduleExpression };
117
+ //# sourceMappingURL=AWSScheduledFunction-D9uCAd76.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AWSScheduledFunction-D9uCAd76.d.cts","names":[],"sources":["../src/functions/FunctionExecutionWrapper.ts","../src/functions/AWSLambdaFunction.ts","../src/crons/Cron.ts","../src/crons/AWSScheduledFunction.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;uBAqBsB,wCACN,qEACI,4DACD,gCACF,SAAS,gCACD,uHAEF,kLAID,mCAAmC;uBAMlC;yBACE,SACtB,QACA,WACA,SACA,YACA,iBACA,4BACA,eACA,0BACA,WACA,sBACA,cACA,gBACC,QACA,WACA,SACA,YACA,WACA,eACA;EArCkB,WAAA,CAAA,SAAA,EAiBC,iBAjBuB,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,EAkBrB,QAlBqB,CAmB3C,MAnB2C,EAoB3C,SApB2C,EAqB3C,OArB2C,EAsB3C,UAtB2C,EAuB3C,eAvB2C,EAwB3C,0BAxB2C,EAyB3C,aAzB2C,EA0B3C,wBA1B2C,EA2B3C,SA3B2C,EA4B3C,oBA5B2C,EA6B3C,YA7B2C,EA8B3C,eA9B2C,CA+B1C,MA/B0C,EAgC1C,SAhC0C,EAiC1C,OAjC0C,EAkC1C,UAlC0C,EAmC1C,SAnC0C,EAoC1C,aApC0C,EAqC1C,YArC0C,CAAA,CAAA;EAAA,UAAA,OAAA,CAAA,EA0CzB,OA1CyB;EAAA,IAC9B,MAAA,CAAA,CAAA,EA2CD,OA3CC;EAAwB,IACpB,gBAAA,CAAA,CAAA,EA8CK,gBA9CL,CA8CsB,aA9CtB,CA8CoC,SA9CpC,CAAA,CAAA;EAAgB,WACjB,CAAA,CAAA,EAqDH,OArDG,CAqDK,aArDL,CAqDmB,SArDnB,CAAA,CAAA;EAAO,WACT,CAAA,CAAA,EAwDK,OAxDL,CAwDa,SAxDb,GAAA,SAAA,CAAA;EAAM;;;;EAOc,eAAoB,CAAA,CAAA,EAmE/B,OAnE+B,CAmEvB,aAnEuB,GAAA,SAAA,CAAA;EAAe;;;;EAU9D,aACP,CAAA,CAAA,EA0EqB,OA1ErB,CA0E6B,OA1E7B,CA0EqC,YA1ErC,CAAA,GAAA,SAAA,CAAA;EAAU;;;;;;;;EASH,gBACN,CAAA,CAAA,CAAA,CAAA,OAAA,EAAA,CAAA,GAAA,EAAA;IACA,OAAA,CAAA,EAwFS,OAxFT,CAwFiB,YAxFjB,CAAA;IACA,EAAA,CAAA,EAwFI,SAxFJ;EAAU,CAAA,EACV,GAwFI,OAxFJ,CAwFY,CAxFZ,CAAA,CAAA,EAyFA,OAzFA,CAyFQ,CAzFR,CAAA;EAAS,gBACT,CAAA,MAAA,CAAA,CAAA,KAAA,EAoIK,MApIL,CAAA,EAqIA,OArIA,CAqIQ,6BArIR,CAqIsC,MArItC,CAAA,CAAA;EAAa,aACb,CAAA,QAAA,EA6I2B,mBA7I3B,CA6I+C,UA7I/C,CAAA,CAAA,EA6I0D,OA7I1D,CAAA,IAAA,CAAA;EAAY,6BAPb,CAAA,UA8J4C,wBA9J5C,CAAA,CAAA,IAAA,EAAA,OAAA,EAAA,MAAA,EAgKO,CAhKP,CAAA,EAiKC,OAjKD,CAiKS,6BAjKT,CAiKuC,CAjKvC,CAAA,CAAA;;;;;KChCS,gDAAgD,QAC3D,QACA;ADAqB,cCuCT,iBDvCiC,CAAA,eCwC9B,wBDxC8B,GAAA,SAAA,GAAA,SAAA,EAAA,mBCyC1B,gBDzC0B,GAAA,SAAA,GAAA,SAAA,EAAA,kBC0C3B,OD1C2B,EAAA,GAAA,EAAA,EAAA,gBC2C7B,MD3C6B,GC2CpB,MD3CoB,EAAA,wBC4CrB,cD5CqB,CAAA,GAAA,CAAA,GAAA,SAAA,GAAA,SAAA,EAAA,mCAAA,MAAA,GAAA,MAAA,EAAA,sBC8CvB,YD9CuB,GAAA,SAAA,GAAA,SAAA,EAAA,iCAAA,MAAA,GAAA,MAAA,EAAA,YAAA,SAAA,EAAA,6BAAA,MAAA,GAAA,MAAA,EAAA,qBCkDxB,eDlDwB,CAAA,MAAA,EAAA,OAAA,CAAA,GCkDW,eDlDX,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,SCsDpC,wBDtDoC,CCuD7C,MDvD6C,ECwD7C,UDxD6C,ECyD7C,SDzD6C,EC0D7C,OD1D6C,EC2D7C,eD3D6C,EC4D7C,0BD5D6C,EC6D7C,aD7D6C,EC8D7C,wBD9D6C,EC+D7C,SD/D6C,ECgE7C,oBDhE6C,ECiE7C,YDjE6C,CAAA,CAAA;EAAA,SAAA,EAAA,ECqEtB,QDrEsB,CCsE3C,MDtE2C,ECuE3C,SDvE2C,ECwE3C,ODxE2C,ECyE3C,UDzE2C,EC0E3C,eD1E2C,EC2E3C,0BD3E2C,EC4E3C,aD5E2C,EC6E3C,wBD7E2C,EC8E3C,SD9E2C,EC+E3C,oBD/E2C,ECgF3C,YDhF2C,ECiF3C,eDjF2C,CCkF1C,MDlF0C,ECmF1C,SDnF0C,ECoF1C,ODpF0C,ECqF1C,UDrF0C,ECsF1C,SDtF0C,ECuF1C,aDvF0C,ECwF1C,YDxF0C,CAAA,CAAA;EAAA,WAC9B,CAAA,SAAA,ECmEH,iBDnEG,CAAA,CAAA,CAAA,CAAA,EAAA,EAAA,ECoEQ,QDpER,CCqEb,MDrEa,ECsEb,SDtEa,ECuEb,ODvEa,ECwEb,UDxEa,ECyEb,eDzEa,EC0Eb,0BD1Ea,EC2Eb,aD3Ea,EC4Eb,wBD5Ea,EC6Eb,SD7Ea,EC8Eb,oBD9Ea,EC+Eb,YD/Ea,ECgFb,eDhFa,CCiFZ,MDjFY,ECkFZ,SDlFY,ECmFZ,ODnFY,ECoFZ,UDpFY,ECqFZ,SDrFY,ECsFZ,aDtFY,ECuFZ,YDvFY,CAAA,CAAA;EAAwB,QACpB,KAAA;EAAgB,QACjB,SAAA;EAAO,QACT,KAAA;EAAM,QAAG,gBAAA;EAAM,QACP,QAAA;EAAc,QAEhB,QAAA;EAAY,QAIb,OAAA;EAAe,QAAoB,MAAA;EAAe,QAMjD,QAAA;EAAiB,IAErC,OAAA,CAAA,CAAA,ECwRa,gBDxRb;;;;;cE9BU,oBACG,oEACG,gCACF,SAAS,0BACP,kEACM,8KAIf,SACT,QACA,WACA,SACA,WACA,iBACA,+CAGA,WACA,sBACA,kCACA,gBAAgB,QAAQ,WAAW,SAAS,WAAW;wBAahC;kCAXS;kBAS3B,gBAAgB,QAAQ,WAAW,SAAS,WAAW,0CAErC,wCACd,uBACO,sBACL,oBACD,4BACU,QAAQ,4BAA4B,yEAGrC,QAAQ,sBAAsB;EF/B5B,IAAA,QAAA,CAAA,CAAA,EEiDL,kBFjD6B,GAAA,SAAA;;AAC9B,KEqDJ,cAAA,GFrDI,QAAA,MAAA,GAAA;KEuDX,UAAA,GFtDe,GAAA,GAAA,MAAA,GAAA,GAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,KAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,MAAA;KEgEf,QAAA,GF/Dc,GAAA,GAAA,MAAA,GAAA,GAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,KAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,MAAA;KEyEd,OAAA,GFxEY,GAAA,GAAA,MAAA,GAAA,GAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,KAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,MAAA;KEkFZ,SAAA,GFlFqB,GAAA,GAAA,MAAA,GAAA,GAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,KAAA,MAAA,EAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,MAAA;KEuGrB,WAAA,GFtGoB,GAAA,GAAA,MAAA,GAAA,GAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,KAAA,MAAA,EAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,GAAA,GAAA,MAAA,IAAA,MAAA,EAAA,GAAA,MAAA;AAEF,KEqHX,cAAA,GFrHW,QEsHd,UFtHc,IEsHA,QFtHA,IEsHY,OFtHZ,IEsHuB,SFtHvB,IEsHoC,WFtHpC,GAAA;AAID,KEoHV,kBAAA,GAAqB,cFpHX,GEoH4B,cFpH5B;;;;;;AAXtB;;;;;;;;;;;;;;;;;;;;;;;AA+BI,cGjBS,oBHiBT,CAAA,eGhBY,wBHgBZ,GAAA,SAAA,GAAA,SAAA,EAAA,kBGfe,OHef,EAAA,GAAA,EAAA,EAAA,gBGda,MHcb,GGdsB,MHctB,EAAA,mBGbgB,gBHahB,GAAA,SAAA,GAAA,SAAA,EAAA,wBGZqB,cHYrB,CAAA,GAAA,CAAA,GAAA,SAAA,GAAA,SAAA,EAAA,mCAAA,MAAA,GAAA,MAAA,EAAA,YAAA,SAAA,EAAA,6BAAA,MAAA,GAAA,MAAA,CAAA,SGRM,iBHQN,CGPH,MHOG,EGNH,UHMG,EGLH,SHKG,EGJH,OHIG,EGHH,eHGG,EGFH,0BHEG,EAAA,SAAA,EAAA,MAAA,EGCH,SHDG,EGEH,oBHFG,CAAA,CAAA;EAAM,WACN,CAAA,SAAA,EGKS,iBHLT,CAAA,CAAA,CAAA,CAAA,EAAA,IAAA,EGMI,IHNJ,CGOD,MHPC,EGQD,SHRC,EGSD,OHTC,EGUD,UHVC,EGWD,eHXC,EGYD,0BHZC,EGaD,SHbC,EGcD,oBHdC,CAAA"}