@incloodsolutions/devkit 0.0.4 → 0.0.5

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 (182) hide show
  1. package/README.md +40 -10
  2. package/dist/aws-cdk/constructs/api-gateway-v2.cjs.map +1 -0
  3. package/dist/aws-cdk/{api-gateway-v2.d.cts → constructs/api-gateway-v2.d.cts} +2 -1
  4. package/dist/aws-cdk/{api-gateway-v2.d.ts → constructs/api-gateway-v2.d.ts} +2 -1
  5. package/dist/aws-cdk/constructs/api-gateway-v2.js.map +1 -0
  6. package/dist/aws-cdk/constructs/api-gateway-websocket.cjs.map +1 -0
  7. package/dist/aws-cdk/{api-gateway-websocket.d.cts → constructs/api-gateway-websocket.d.cts} +2 -1
  8. package/dist/aws-cdk/{api-gateway-websocket.d.ts → constructs/api-gateway-websocket.d.ts} +2 -1
  9. package/dist/aws-cdk/constructs/api-gateway-websocket.js.map +1 -0
  10. package/dist/aws-cdk/constructs/api-gateway.cjs.map +1 -0
  11. package/dist/aws-cdk/{api-gateway.d.cts → constructs/api-gateway.d.cts} +2 -1
  12. package/dist/aws-cdk/{api-gateway.d.ts → constructs/api-gateway.d.ts} +2 -1
  13. package/dist/aws-cdk/constructs/api-gateway.js.map +1 -0
  14. package/dist/aws-cdk/constructs/cloudfront.cjs.map +1 -0
  15. package/dist/aws-cdk/{cloudfront.d.cts → constructs/cloudfront.d.cts} +2 -1
  16. package/dist/aws-cdk/{cloudfront.d.ts → constructs/cloudfront.d.ts} +2 -1
  17. package/dist/aws-cdk/constructs/cloudfront.js.map +1 -0
  18. package/dist/aws-cdk/constructs/cloudwatch.cjs.map +1 -0
  19. package/dist/aws-cdk/{cloudwatch.d.cts → constructs/cloudwatch.d.cts} +2 -1
  20. package/dist/aws-cdk/{cloudwatch.d.ts → constructs/cloudwatch.d.ts} +2 -1
  21. package/dist/aws-cdk/constructs/cloudwatch.js.map +1 -0
  22. package/dist/aws-cdk/constructs/dynamo-db.cjs.map +1 -0
  23. package/dist/aws-cdk/{dynamo-db.d.cts → constructs/dynamo-db.d.cts} +2 -1
  24. package/dist/aws-cdk/{dynamo-db.d.ts → constructs/dynamo-db.d.ts} +2 -1
  25. package/dist/aws-cdk/constructs/dynamo-db.js.map +1 -0
  26. package/dist/aws-cdk/constructs/event-bridge.cjs.map +1 -0
  27. package/dist/aws-cdk/{event-bridge.d.cts → constructs/event-bridge.d.cts} +2 -1
  28. package/dist/aws-cdk/{event-bridge.d.ts → constructs/event-bridge.d.ts} +2 -1
  29. package/dist/aws-cdk/constructs/event-bridge.js.map +1 -0
  30. package/dist/aws-cdk/constructs/lambda-authorizer-v2.cjs.map +1 -0
  31. package/dist/aws-cdk/{lambda-authorizer-v2.d.cts → constructs/lambda-authorizer-v2.d.cts} +2 -1
  32. package/dist/aws-cdk/{lambda-authorizer-v2.d.ts → constructs/lambda-authorizer-v2.d.ts} +2 -1
  33. package/dist/aws-cdk/constructs/lambda-authorizer-v2.js.map +1 -0
  34. package/dist/aws-cdk/constructs/lambda-authorizer.cjs.map +1 -0
  35. package/dist/aws-cdk/{lambda-authorizer.d.cts → constructs/lambda-authorizer.d.cts} +2 -1
  36. package/dist/aws-cdk/{lambda-authorizer.d.ts → constructs/lambda-authorizer.d.ts} +2 -1
  37. package/dist/aws-cdk/constructs/lambda-authorizer.js.map +1 -0
  38. package/dist/aws-cdk/constructs/lambda-layer.cjs.map +1 -0
  39. package/dist/aws-cdk/{lambda-layer.d.cts → constructs/lambda-layer.d.cts} +2 -1
  40. package/dist/aws-cdk/{lambda-layer.d.ts → constructs/lambda-layer.d.ts} +2 -1
  41. package/dist/aws-cdk/constructs/lambda-layer.js.map +1 -0
  42. package/dist/aws-cdk/{lambda.cjs → constructs/lambda.cjs} +2 -2
  43. package/dist/aws-cdk/constructs/lambda.cjs.map +1 -0
  44. package/dist/aws-cdk/{lambda.d.cts → constructs/lambda.d.cts} +2 -1
  45. package/dist/aws-cdk/{lambda.d.ts → constructs/lambda.d.ts} +2 -1
  46. package/dist/aws-cdk/{lambda.js → constructs/lambda.js} +2 -2
  47. package/dist/aws-cdk/constructs/lambda.js.map +1 -0
  48. package/dist/aws-cdk/constructs/role-policy.cjs.map +1 -0
  49. package/dist/aws-cdk/{role-policy.d.cts → constructs/role-policy.d.cts} +2 -1
  50. package/dist/aws-cdk/{role-policy.d.ts → constructs/role-policy.d.ts} +2 -1
  51. package/dist/aws-cdk/constructs/role-policy.js.map +1 -0
  52. package/dist/aws-cdk/constructs/route53.cjs +79 -0
  53. package/dist/aws-cdk/constructs/route53.cjs.map +1 -0
  54. package/dist/aws-cdk/constructs/route53.d.cts +95 -0
  55. package/dist/aws-cdk/constructs/route53.d.ts +95 -0
  56. package/dist/aws-cdk/constructs/route53.js +77 -0
  57. package/dist/aws-cdk/constructs/route53.js.map +1 -0
  58. package/dist/aws-cdk/constructs/s3-deployment.cjs.map +1 -0
  59. package/dist/aws-cdk/{s3-deployment.d.cts → constructs/s3-deployment.d.cts} +2 -1
  60. package/dist/aws-cdk/{s3-deployment.d.ts → constructs/s3-deployment.d.ts} +2 -1
  61. package/dist/aws-cdk/constructs/s3-deployment.js.map +1 -0
  62. package/dist/aws-cdk/constructs/s3.cjs.map +1 -0
  63. package/dist/aws-cdk/{s3.d.cts → constructs/s3.d.cts} +2 -1
  64. package/dist/aws-cdk/{s3.d.ts → constructs/s3.d.ts} +2 -1
  65. package/dist/aws-cdk/constructs/s3.js.map +1 -0
  66. package/dist/aws-cdk/constructs/sns.cjs.map +1 -0
  67. package/dist/aws-cdk/{sns.d.cts → constructs/sns.d.cts} +2 -1
  68. package/dist/aws-cdk/{sns.d.ts → constructs/sns.d.ts} +2 -1
  69. package/dist/aws-cdk/constructs/sns.js.map +1 -0
  70. package/dist/aws-cdk/constructs/sqs.cjs.map +1 -0
  71. package/dist/aws-cdk/{sqs.d.cts → constructs/sqs.d.cts} +2 -1
  72. package/dist/aws-cdk/{sqs.d.ts → constructs/sqs.d.ts} +2 -1
  73. package/dist/aws-cdk/constructs/sqs.js.map +1 -0
  74. package/dist/aws-cdk/constructs/vpc.cjs.map +1 -0
  75. package/dist/aws-cdk/{vpc.d.cts → constructs/vpc.d.cts} +2 -1
  76. package/dist/aws-cdk/{vpc.d.ts → constructs/vpc.d.ts} +2 -1
  77. package/dist/aws-cdk/constructs/vpc.js.map +1 -0
  78. package/dist/aws-cdk/stacks/lambda-api.cjs +252 -0
  79. package/dist/aws-cdk/stacks/lambda-api.cjs.map +1 -0
  80. package/dist/aws-cdk/stacks/lambda-api.d.cts +16 -0
  81. package/dist/aws-cdk/stacks/lambda-api.d.ts +16 -0
  82. package/dist/aws-cdk/stacks/lambda-api.js +250 -0
  83. package/dist/aws-cdk/stacks/lambda-api.js.map +1 -0
  84. package/dist/aws-cdk/stacks/lambda-sns.cjs +211 -0
  85. package/dist/aws-cdk/stacks/lambda-sns.cjs.map +1 -0
  86. package/dist/aws-cdk/stacks/lambda-sns.d.cts +17 -0
  87. package/dist/aws-cdk/stacks/lambda-sns.d.ts +17 -0
  88. package/dist/aws-cdk/stacks/lambda-sns.js +209 -0
  89. package/dist/aws-cdk/stacks/lambda-sns.js.map +1 -0
  90. package/dist/aws-cdk/stacks/lambda-sqs.cjs +220 -0
  91. package/dist/aws-cdk/stacks/lambda-sqs.cjs.map +1 -0
  92. package/dist/aws-cdk/stacks/lambda-sqs.d.cts +18 -0
  93. package/dist/aws-cdk/stacks/lambda-sqs.d.ts +18 -0
  94. package/dist/aws-cdk/stacks/lambda-sqs.js +218 -0
  95. package/dist/aws-cdk/stacks/lambda-sqs.js.map +1 -0
  96. package/dist/aws-types.d.cts +14 -1
  97. package/dist/aws-types.d.ts +14 -1
  98. package/dist/aws.cjs +199 -2
  99. package/dist/aws.cjs.map +1 -1
  100. package/dist/aws.d.cts +25 -19
  101. package/dist/aws.d.ts +25 -19
  102. package/dist/aws.js +198 -5
  103. package/dist/aws.js.map +1 -1
  104. package/dist/index.cjs +199 -2
  105. package/dist/index.cjs.map +1 -1
  106. package/dist/index.d.cts +24 -18
  107. package/dist/index.d.ts +24 -18
  108. package/dist/index.js +198 -5
  109. package/dist/index.js.map +1 -1
  110. package/package.json +130 -152
  111. package/dist/aws-cdk/api-gateway-v2.cjs.map +0 -1
  112. package/dist/aws-cdk/api-gateway-v2.js.map +0 -1
  113. package/dist/aws-cdk/api-gateway-websocket.cjs.map +0 -1
  114. package/dist/aws-cdk/api-gateway-websocket.js.map +0 -1
  115. package/dist/aws-cdk/api-gateway.cjs.map +0 -1
  116. package/dist/aws-cdk/api-gateway.js.map +0 -1
  117. package/dist/aws-cdk/cloudfront.cjs.map +0 -1
  118. package/dist/aws-cdk/cloudfront.js.map +0 -1
  119. package/dist/aws-cdk/cloudwatch.cjs.map +0 -1
  120. package/dist/aws-cdk/cloudwatch.js.map +0 -1
  121. package/dist/aws-cdk/dynamo-db.cjs.map +0 -1
  122. package/dist/aws-cdk/dynamo-db.js.map +0 -1
  123. package/dist/aws-cdk/event-bridge.cjs.map +0 -1
  124. package/dist/aws-cdk/event-bridge.js.map +0 -1
  125. package/dist/aws-cdk/lambda-authorizer-v2.cjs.map +0 -1
  126. package/dist/aws-cdk/lambda-authorizer-v2.js.map +0 -1
  127. package/dist/aws-cdk/lambda-authorizer.cjs.map +0 -1
  128. package/dist/aws-cdk/lambda-authorizer.js.map +0 -1
  129. package/dist/aws-cdk/lambda-layer.cjs.map +0 -1
  130. package/dist/aws-cdk/lambda-layer.js.map +0 -1
  131. package/dist/aws-cdk/lambda.cjs.map +0 -1
  132. package/dist/aws-cdk/lambda.js.map +0 -1
  133. package/dist/aws-cdk/role-policy.cjs.map +0 -1
  134. package/dist/aws-cdk/role-policy.js.map +0 -1
  135. package/dist/aws-cdk/s3-deployment.cjs.map +0 -1
  136. package/dist/aws-cdk/s3-deployment.js.map +0 -1
  137. package/dist/aws-cdk/s3.cjs.map +0 -1
  138. package/dist/aws-cdk/s3.js.map +0 -1
  139. package/dist/aws-cdk/sns.cjs.map +0 -1
  140. package/dist/aws-cdk/sns.js.map +0 -1
  141. package/dist/aws-cdk/sqs.cjs.map +0 -1
  142. package/dist/aws-cdk/sqs.js.map +0 -1
  143. package/dist/aws-cdk/vpc.cjs.map +0 -1
  144. package/dist/aws-cdk/vpc.js.map +0 -1
  145. package/dist/aws-cdk.cjs +0 -905
  146. package/dist/aws-cdk.cjs.map +0 -1
  147. package/dist/aws-cdk.d.cts +0 -34
  148. package/dist/aws-cdk.d.ts +0 -34
  149. package/dist/aws-cdk.js +0 -887
  150. package/dist/aws-cdk.js.map +0 -1
  151. /package/dist/aws-cdk/{api-gateway-v2.cjs → constructs/api-gateway-v2.cjs} +0 -0
  152. /package/dist/aws-cdk/{api-gateway-v2.js → constructs/api-gateway-v2.js} +0 -0
  153. /package/dist/aws-cdk/{api-gateway-websocket.cjs → constructs/api-gateway-websocket.cjs} +0 -0
  154. /package/dist/aws-cdk/{api-gateway-websocket.js → constructs/api-gateway-websocket.js} +0 -0
  155. /package/dist/aws-cdk/{api-gateway.cjs → constructs/api-gateway.cjs} +0 -0
  156. /package/dist/aws-cdk/{api-gateway.js → constructs/api-gateway.js} +0 -0
  157. /package/dist/aws-cdk/{cloudfront.cjs → constructs/cloudfront.cjs} +0 -0
  158. /package/dist/aws-cdk/{cloudfront.js → constructs/cloudfront.js} +0 -0
  159. /package/dist/aws-cdk/{cloudwatch.cjs → constructs/cloudwatch.cjs} +0 -0
  160. /package/dist/aws-cdk/{cloudwatch.js → constructs/cloudwatch.js} +0 -0
  161. /package/dist/aws-cdk/{dynamo-db.cjs → constructs/dynamo-db.cjs} +0 -0
  162. /package/dist/aws-cdk/{dynamo-db.js → constructs/dynamo-db.js} +0 -0
  163. /package/dist/aws-cdk/{event-bridge.cjs → constructs/event-bridge.cjs} +0 -0
  164. /package/dist/aws-cdk/{event-bridge.js → constructs/event-bridge.js} +0 -0
  165. /package/dist/aws-cdk/{lambda-authorizer-v2.cjs → constructs/lambda-authorizer-v2.cjs} +0 -0
  166. /package/dist/aws-cdk/{lambda-authorizer-v2.js → constructs/lambda-authorizer-v2.js} +0 -0
  167. /package/dist/aws-cdk/{lambda-authorizer.cjs → constructs/lambda-authorizer.cjs} +0 -0
  168. /package/dist/aws-cdk/{lambda-authorizer.js → constructs/lambda-authorizer.js} +0 -0
  169. /package/dist/aws-cdk/{lambda-layer.cjs → constructs/lambda-layer.cjs} +0 -0
  170. /package/dist/aws-cdk/{lambda-layer.js → constructs/lambda-layer.js} +0 -0
  171. /package/dist/aws-cdk/{role-policy.cjs → constructs/role-policy.cjs} +0 -0
  172. /package/dist/aws-cdk/{role-policy.js → constructs/role-policy.js} +0 -0
  173. /package/dist/aws-cdk/{s3-deployment.cjs → constructs/s3-deployment.cjs} +0 -0
  174. /package/dist/aws-cdk/{s3-deployment.js → constructs/s3-deployment.js} +0 -0
  175. /package/dist/aws-cdk/{s3.cjs → constructs/s3.cjs} +0 -0
  176. /package/dist/aws-cdk/{s3.js → constructs/s3.js} +0 -0
  177. /package/dist/aws-cdk/{sns.cjs → constructs/sns.cjs} +0 -0
  178. /package/dist/aws-cdk/{sns.js → constructs/sns.js} +0 -0
  179. /package/dist/aws-cdk/{sqs.cjs → constructs/sqs.cjs} +0 -0
  180. /package/dist/aws-cdk/{sqs.js → constructs/sqs.js} +0 -0
  181. /package/dist/aws-cdk/{vpc.cjs → constructs/vpc.cjs} +0 -0
  182. /package/dist/aws-cdk/{vpc.js → constructs/vpc.js} +0 -0
@@ -0,0 +1,218 @@
1
+ import { Duration, CfnOutput, RemovalPolicy, Stack } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ import { Function, Architecture, Runtime, Code, LayerVersion, EventSourceMapping } from 'aws-cdk-lib/aws-lambda';
4
+ import { detectDuplicateProperties, AppEnvironmentEnum, CustomException } from '@incloodsolutions/toolkit';
5
+ import { Queue } from 'aws-cdk-lib/aws-sqs';
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var BaseLambdaConstruct = class extends Construct {
10
+ static {
11
+ __name(this, "BaseLambdaConstruct");
12
+ }
13
+ /** The created Lambda function instance */
14
+ function;
15
+ /**
16
+ * @param scope Parent construct
17
+ * @param id Unique construct identifier
18
+ * @param props Configuration for Lambda function
19
+ */
20
+ constructor(scope, id, props) {
21
+ super(scope, id);
22
+ const environment = {
23
+ ...props.options?.lambdaOptions?.environment,
24
+ NODE_ENV: props.stage,
25
+ NODE_OPTIONS: "--enable-source-maps",
26
+ AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1"
27
+ };
28
+ detectDuplicateProperties({ data: environment });
29
+ this.function = new Function(this, id, {
30
+ ...props?.options?.lambdaOptions,
31
+ /**
32
+ * Lambda function name
33
+ * Defaults to "<stackName>" if not provided
34
+ */
35
+ functionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,
36
+ /**
37
+ * Function description
38
+ */
39
+ description: props?.options?.lambdaOptions?.description || "A lambda function",
40
+ /**
41
+ * Entry handler for the Lambda function
42
+ */
43
+ handler: props?.options?.lambdaOptions?.handler || "lambda.handler",
44
+ /**
45
+ * Runtime environment
46
+ */
47
+ runtime: props?.options?.lambdaOptions?.runtime || Runtime.NODEJS_24_X,
48
+ /**
49
+ * Execution timeout
50
+ * - 30 seconds in production
51
+ * - 15 seconds otherwise
52
+ */
53
+ timeout: props?.options?.lambdaOptions?.timeout || Duration.seconds(
54
+ props.stage === AppEnvironmentEnum.PRODUCTION ? 30 : 15
55
+ ),
56
+ /**
57
+ * Memory allocation (in MB)
58
+ */
59
+ memorySize: props?.options?.lambdaOptions?.memorySize || 1024,
60
+ /**
61
+ * CPU architecture
62
+ */
63
+ architecture: props?.options?.lambdaOptions?.architecture || Architecture.ARM_64,
64
+ /**
65
+ * Lambda deployment package source
66
+ */
67
+ code: props?.options?.lambdaOptions?.code || Code.fromAsset("dist"),
68
+ /**
69
+ * Final merged environment variables
70
+ */
71
+ environment
72
+ });
73
+ new CfnOutput(this, "LambdaFunctionArn", {
74
+ value: this.function.functionArn
75
+ });
76
+ }
77
+ };
78
+ var BaseLambdaLayerConstruct = class extends Construct {
79
+ static {
80
+ __name(this, "BaseLambdaLayerConstruct");
81
+ }
82
+ /** Newly created Lambda Layer (null if importing existing layer) */
83
+ layer;
84
+ /** Imported Lambda Layer reference (null if creating new layer) */
85
+ existingLayer;
86
+ /**
87
+ * @param scope Parent construct
88
+ * @param id Unique construct identifier
89
+ * @param props Configuration for layer creation or import
90
+ */
91
+ constructor(scope, id, props) {
92
+ super(scope, id);
93
+ if (props?.options?.fromExistingLayerArn) {
94
+ this.existingLayer = LayerVersion.fromLayerVersionArn(
95
+ this,
96
+ `${id}-Arn`,
97
+ props?.options?.fromExistingLayerArn
98
+ );
99
+ } else if (props?.options?.fromExistingLayerAttribute) {
100
+ this.existingLayer = LayerVersion.fromLayerVersionAttributes(
101
+ this,
102
+ `${id}-Attribute`,
103
+ props?.options?.fromExistingLayerAttribute
104
+ );
105
+ } else {
106
+ this.layer = new LayerVersion(this, id, {
107
+ ...props.options?.layerOptions,
108
+ /**
109
+ * Default layer code asset
110
+ */
111
+ code: props?.options?.layerOptions?.code || Code.fromAsset("./dist-layer"),
112
+ /**
113
+ * Layer description
114
+ */
115
+ description: props?.options?.layerOptions?.description || "Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express",
116
+ /**
117
+ * Supported CPU architectures
118
+ */
119
+ compatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],
120
+ /**
121
+ * Supported runtimes
122
+ */
123
+ compatibleRuntimes: [
124
+ Runtime.NODEJS_22_X,
125
+ Runtime.NODEJS_24_X,
126
+ Runtime.NODEJS_LATEST
127
+ ]
128
+ });
129
+ }
130
+ new CfnOutput(this, "LambdaLayerArn", {
131
+ value: props.options?.fromExistingLayerArn || props.options?.fromExistingLayerAttribute ? this.existingLayer.layerVersionArn : this.layer.layerVersionArn
132
+ });
133
+ }
134
+ };
135
+ var BaseSqsConstruct = class extends Construct {
136
+ static {
137
+ __name(this, "BaseSqsConstruct");
138
+ }
139
+ /** The created SQS queue instance */
140
+ queue;
141
+ /**
142
+ * @param scope Parent construct
143
+ * @param id Unique construct identifier
144
+ * @param props Configuration for queue and Lambda consumers
145
+ */
146
+ constructor(scope, id, props) {
147
+ super(scope, id);
148
+ this.queue = new Queue(this, id, {
149
+ ...props?.options?.queueOptions,
150
+ /**
151
+ * Removal policy applied to the queue
152
+ * Defaults to DESTROY if not explicitly defined
153
+ */
154
+ removalPolicy: props?.options?.queueOptions?.removalPolicy || RemovalPolicy.DESTROY
155
+ });
156
+ if (props?.targetFunctions?.length) {
157
+ props.targetFunctions.forEach((targetFunction, index) => {
158
+ new EventSourceMapping(this, `${id}-eventSourceMap${index + 1}`, {
159
+ ...props?.options?.eventSourceMappingOptions,
160
+ /** Target Lambda function */
161
+ target: targetFunction,
162
+ /** Source SQS queue ARN */
163
+ eventSourceArn: this.queue.queueArn,
164
+ /**
165
+ * Retry attempts for failed batch processing
166
+ * Defaults to 3 if not explicitly defined
167
+ */
168
+ retryAttempts: props?.options?.eventSourceMappingOptions?.retryAttempts || 3
169
+ });
170
+ });
171
+ }
172
+ new CfnOutput(this, "SqsQueueArn", {
173
+ value: this.queue.queueArn
174
+ });
175
+ }
176
+ };
177
+ var BaseLambdaSqsStack = class extends Stack {
178
+ static {
179
+ __name(this, "BaseLambdaSqsStack");
180
+ }
181
+ constructor(scope, id, props) {
182
+ super(scope, id, props);
183
+ let layers = [];
184
+ if (props?.stackOptions?.layerOptions) {
185
+ if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
186
+ throw new CustomException("Invalid layer options provided");
187
+ }
188
+ const { existingLayer } = new BaseLambdaLayerConstruct(
189
+ this,
190
+ "layer",
191
+ {
192
+ options: {
193
+ fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
194
+ }
195
+ }
196
+ );
197
+ layers.push(existingLayer);
198
+ }
199
+ const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
200
+ stage: props.stackOptions?.stage,
201
+ stackName: props.stackName,
202
+ options: {
203
+ lambdaOptions: { layers }
204
+ }
205
+ });
206
+ new BaseSqsConstruct(this, "sqs", {
207
+ targetFunctions: [lambdaFunction],
208
+ options: {
209
+ eventSourceMappingOptions: {},
210
+ queueOptions: {}
211
+ }
212
+ });
213
+ }
214
+ };
215
+
216
+ export { BaseLambdaSqsStack };
217
+ //# sourceMappingURL=lambda-sqs.js.map
218
+ //# sourceMappingURL=lambda-sqs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/aws/cdk/constructs/lambda-construct.ts","../../../src/aws/cdk/constructs/lambda-layer-construct.ts","../../../src/aws/cdk/constructs/sqs-construct.ts","../../../src/aws/cdk/stacks/lambda-sqs-stack.ts"],"names":["Construct","Code","Architecture","Runtime","CfnOutput"],"mappings":";;;;;;;;AAwCO,IAAM,mBAAA,GAAN,cAAkC,SAAA,CAAU;AAAA,EAxCnD;AAwCmD,IAAA,MAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AAAA;AAAA;AAAA,EAEzC,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,WAAA,CAAY,KAAA,EAAkB,EAAA,EAAY,KAAA,EAA8B;AACvE,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAUf,IAAA,MAAM,WAAA,GAAc;AAAA,MACnB,GAAG,KAAA,CAAM,OAAA,EAAS,aAAA,EAAe,WAAA;AAAA,MACjC,UAAU,KAAA,CAAM,KAAA;AAAA,MAChB,YAAA,EAAc,sBAAA;AAAA,MACd,mCAAA,EAAqC;AAAA,KACtC;AAKA,IAAA,yBAAA,CAA0B,EAAE,IAAA,EAAM,WAAA,EAAa,CAAA;AAE/C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAA,EAAM,EAAA,EAAI;AAAA,MACtC,GAAG,OAAO,OAAA,EAAS,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMnB,cAAc,CAAA,EAAG,KAAA,EAAO,SAAS,aAAA,EAAe,YAAA,IAAgB,OAAO,SAAS,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA,MAKhF,WAAA,EACC,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,WAAA,IAAe,mBAAA;AAAA;AAAA;AAAA;AAAA,MAK/C,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,OAAA,IAAW,gBAAA;AAAA;AAAA;AAAA;AAAA,MAKnD,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,WAAW,OAAA,CAAQ,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAO3D,OAAA,EACC,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,WAC/B,QAAA,CAAS,OAAA;AAAA,QACR,KAAA,CAAM,KAAA,KAAU,kBAAA,CAAmB,UAAA,GAAa,EAAA,GAAK;AAAA,OACtD;AAAA;AAAA;AAAA;AAAA,MAKD,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,UAAA,IAAc,IAAA;AAAA;AAAA;AAAA;AAAA,MAKzD,YAAA,EACC,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,gBAAgB,YAAA,CAAa,MAAA;AAAA;AAAA;AAAA;AAAA,MAK7D,MAAM,KAAA,EAAO,OAAA,EAAS,eAAe,IAAA,IAAQ,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,MAKlE;AAAA,KACA,CAAA;AAKD,IAAA,IAAI,SAAA,CAAU,MAAM,mBAAA,EAAqB;AAAA,MACxC,KAAA,EAAO,KAAK,QAAA,CAAS;AAAA,KACrB,CAAA;AAAA,EACF;AACD,CAAA;ACnFO,IAAM,wBAAA,GAAN,cAAuCA,SAAAA,CAAU;AAAA,EAtDxD;AAsDwD,IAAA,MAAA,CAAA,IAAA,EAAA,0BAAA,CAAA;AAAA;AAAA;AAAA,EAE9C,KAAA;AAAA;AAAA,EAGA,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,WAAA,CACC,KAAA,EACA,EAAA,EACA,KAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAKf,IAAA,IAAI,KAAA,EAAO,SAAS,oBAAA,EAAsB;AACzC,MAAA,IAAA,CAAK,gBAAgB,YAAA,CAAa,mBAAA;AAAA,QACjC,IAAA;AAAA,QACA,GAAG,EAAE,CAAA,IAAA,CAAA;AAAA,QACL,OAAO,OAAA,EAAS;AAAA,OACjB;AAAA,IAKD,CAAA,MAAA,IAAW,KAAA,EAAO,OAAA,EAAS,0BAAA,EAA4B;AACtD,MAAA,IAAA,CAAK,gBAAgB,YAAA,CAAa,0BAAA;AAAA,QACjC,IAAA;AAAA,QACA,GAAG,EAAE,CAAA,UAAA,CAAA;AAAA,QACL,OAAO,OAAA,EAAS;AAAA,OACjB;AAAA,IAKD,CAAA,MAAO;AACN,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAAA,QACvC,GAAG,MAAM,OAAA,EAAS,YAAA;AAAA;AAAA;AAAA;AAAA,QAKlB,MACC,KAAA,EAAO,OAAA,EAAS,cAAc,IAAA,IAAQC,IAAAA,CAAK,UAAU,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA,QAKpE,WAAA,EACC,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,WAAA,IAC9B,4EAAA;AAAA;AAAA;AAAA;AAAA,QAKD,uBAAA,EAAyB,CAACC,YAAAA,CAAa,MAAA,EAAQA,aAAa,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,QAKlE,kBAAA,EAAoB;AAAA,UACnBC,OAAAA,CAAQ,WAAA;AAAA,UACRA,OAAAA,CAAQ,WAAA;AAAA,UACRA,OAAAA,CAAQ;AAAA;AACT,OACqB,CAAA;AAAA,IACvB;AAMA,IAAA,IAAIC,SAAAA,CAAU,MAAM,gBAAA,EAAkB;AAAA,MACrC,KAAA,EACC,KAAA,CAAM,OAAA,EAAS,oBAAA,IACf,KAAA,CAAM,OAAA,EAAS,0BAAA,GACZ,IAAA,CAAK,aAAA,CAAc,eAAA,GACnB,IAAA,CAAK,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACF;AACD,CAAA;ACxFO,IAAM,gBAAA,GAAN,cAA+BJ,SAAAA,CAAU;AAAA,EArDhD;AAqDgD,IAAA,MAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AAAA;AAAA;AAAA,EAEtC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,WAAA,CAAY,KAAA,EAAkB,EAAA,EAAY,KAAA,EAA2B;AACpE,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAEf,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAA,EAAM,EAAA,EAAI;AAAA,MAChC,GAAG,OAAO,OAAA,EAAS,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMnB,aAAA,EACC,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,iBAAiB,aAAA,CAAc;AAAA,KAC9D,CAAA;AAKD,IAAA,IAAI,KAAA,EAAO,iBAAiB,MAAA,EAAQ;AACnC,MAAA,KAAA,CAAM,eAAA,CAAgB,OAAA,CAAQ,CAAC,cAAA,EAAgB,KAAA,KAAU;AACxD,QAAA,IAAI,mBAAmB,IAAA,EAAM,CAAA,EAAG,EAAE,CAAA,eAAA,EAAkB,KAAA,GAAQ,CAAC,CAAA,CAAA,EAAI;AAAA,UAChE,GAAG,OAAO,OAAA,EAAS,yBAAA;AAAA;AAAA,UAGnB,MAAA,EAAQ,cAAA;AAAA;AAAA,UAGR,cAAA,EAAgB,KAAK,KAAA,CAAM,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAM3B,aAAA,EACC,KAAA,EAAO,OAAA,EAAS,yBAAA,EAA2B,aAAA,IAAiB;AAAA,SAC7D,CAAA;AAAA,MACF,CAAC,CAAA;AAAA,IACF;AAKA,IAAA,IAAII,SAAAA,CAAU,MAAM,aAAA,EAAe;AAAA,MAClC,KAAA,EAAO,KAAK,KAAA,CAAM;AAAA,KAClB,CAAA;AAAA,EACF;AACD,CAAA;ACpGO,IAAM,kBAAA,GAAN,cAAiC,KAAA,CAAM;AAAA,EAP9C;AAO8C,IAAA,MAAA,CAAA,IAAA,EAAA,oBAAA,CAAA;AAAA;AAAA,EAC7C,WAAA,CAAY,KAAA,EAAY,EAAA,EAAY,KAAA,EAShC;AACH,IAAA,KAAA,CAAM,KAAA,EAAO,IAAI,KAAK,CAAA;AACtB,IAAA,IAAI,SAA0B,EAAC;AAE/B,IAAA,IAAI,KAAA,EAAO,cAAc,YAAA,EAAc;AACtC,MAAA,IAAI,CAAC,MAAM,YAAA,EAAc,YAAA,EAAc,QAAQ,CAAC,KAAA,CAAM,YAAA,EAAc,YAAA,EAAc,OAAA,EAAS;AAC1F,QAAA,MAAM,IAAI,gBAAgB,gCAAgC,CAAA;AAAA,MAC3D;AACA,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,IAAI,wBAAA;AAAA,QAC7B,IAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,UACC,OAAA,EAAS;AAAA,YACR,sBAAsB,CAAA,eAAA,EAAkB,KAAA,CAAM,KAAK,MAAM,CAAA,CAAA,EAAI,MAAM,GAAA,EAAK,OAAO,CAAA,OAAA,EAAU,KAAA,CAAM,cAAc,YAAA,EAAc,IAAI,IAAI,KAAA,CAAM,YAAA,EAAc,cAAc,OAAO,CAAA;AAAA;AAC7K;AACD,OACD;AACA,MAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,cAAA,KAAmB,IAAI,mBAAA,CAAoB,MAAM,QAAA,EAAU;AAAA,MAC5E,KAAA,EAAO,MAAM,YAAA,EAAc,KAAA;AAAA,MAC3B,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,OAAA,EAAS;AAAA,QACR,aAAA,EAAe,EAAE,MAAA;AAAO;AACzB,KACA,CAAA;AAED,IAAA,IAAI,gBAAA,CAAiB,MAAM,KAAA,EAAO;AAAA,MACjC,eAAA,EAAiB,CAAC,cAAc,CAAA;AAAA,MAChC,OAAA,EAAS;AAAA,QACR,2BAA2B,EAAC;AAAA,QAC5B,cAAc;AAAC;AAChB,KACA,CAAA;AAAA,EAEF;AACD","file":"lambda-sqs.js","sourcesContent":["import { Construct } from 'constructs';\nimport { CfnOutput, Duration } from 'aws-cdk-lib';\nimport {\n\tArchitecture,\n\tCode,\n\tFunction,\n\tFunctionProps,\n\tRuntime,\n} from 'aws-cdk-lib/aws-lambda';\n\nimport {\n\tdetectDuplicateProperties,\n\tAppEnvironmentEnum,\n} from '@incloodsolutions/toolkit';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseLambdaConstruct\n *\n * Provides configuration for creating a Lambda function\n * with optional overrides for runtime, memory, timeout, and environment.\n */\ninterface ILambdaConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** Partial Lambda configuration options */\n\t\treadonly lambdaOptions: Partial<FunctionProps>;\n\t}>,\n\t'appName'\n> {}\n\n/**\n * CDK construct for AWS Lambda function\n *\n * Responsibilities:\n * - Creates a Lambda function with sensible defaults\n * - Merges and validates environment variables\n * - Applies stage-based configuration (e.g. timeout)\n * - Exposes the function ARN as a CloudFormation output\n */\nexport class BaseLambdaConstruct extends Construct {\n\t/** The created Lambda function instance */\n\treadonly function: Function;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for Lambda function\n\t */\n\tconstructor(scope: Construct, id: string, props: ILambdaConstructProps) {\n\t\tsuper(scope, id);\n\n\t\t/**\n\t\t * Environment variables for the Lambda function\n\t\t *\n\t\t * Includes:\n\t\t * - User-defined variables\n\t\t * - NODE_ENV derived from stage\n\t\t * - Node.js runtime optimisations\n\t\t */\n\t\tconst environment = {\n\t\t\t...props.options?.lambdaOptions?.environment,\n\t\t\tNODE_ENV: props.stage,\n\t\t\tNODE_OPTIONS: '--enable-source-maps',\n\t\t\tAWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',\n\t\t};\n\n\t\t/**\n\t\t * Validate environment variables for duplicate keys\n\t\t */\n\t\tdetectDuplicateProperties({ data: environment });\n\n\t\tthis.function = new Function(this, id, {\n\t\t\t...props?.options?.lambdaOptions,\n\n\t\t\t/**\n\t\t\t * Lambda function name\n\t\t\t * Defaults to \"<stackName>\" if not provided\n\t\t\t */\n\t\t\tfunctionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,\n\n\t\t\t/**\n\t\t\t * Function description\n\t\t\t */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.lambdaOptions?.description || 'A lambda function',\n\n\t\t\t/**\n\t\t\t * Entry handler for the Lambda function\n\t\t\t */\n\t\t\thandler: props?.options?.lambdaOptions?.handler || 'lambda.handler',\n\n\t\t\t/**\n\t\t\t * Runtime environment\n\t\t\t */\n\t\t\truntime: props?.options?.lambdaOptions?.runtime || Runtime.NODEJS_24_X,\n\n\t\t\t/**\n\t\t\t * Execution timeout\n\t\t\t * - 30 seconds in production\n\t\t\t * - 15 seconds otherwise\n\t\t\t */\n\t\t\ttimeout:\n\t\t\t\tprops?.options?.lambdaOptions?.timeout ||\n\t\t\t\tDuration.seconds(\n\t\t\t\t\tprops.stage === AppEnvironmentEnum.PRODUCTION ? 30 : 15,\n\t\t\t\t),\n\n\t\t\t/**\n\t\t\t * Memory allocation (in MB)\n\t\t\t */\n\t\t\tmemorySize: props?.options?.lambdaOptions?.memorySize || 1024,\n\n\t\t\t/**\n\t\t\t * CPU architecture\n\t\t\t */\n\t\t\tarchitecture:\n\t\t\t\tprops?.options?.lambdaOptions?.architecture || Architecture.ARM_64,\n\n\t\t\t/**\n\t\t\t * Lambda deployment package source\n\t\t\t */\n\t\t\tcode: props?.options?.lambdaOptions?.code || Code.fromAsset('dist'),\n\n\t\t\t/**\n\t\t\t * Final merged environment variables\n\t\t\t */\n\t\t\tenvironment,\n\t\t});\n\n\t\t/**\n\t\t * CloudFormation output exposing the Lambda function ARN\n\t\t */\n\t\tnew CfnOutput(this, 'LambdaFunctionArn', {\n\t\t\tvalue: this.function.functionArn,\n\t\t});\n\t}\n}\n","import { Construct } from 'constructs';\nimport { CfnOutput } from 'aws-cdk-lib';\nimport {\n\tArchitecture,\n\tCode,\n\tILayerVersion,\n\tLayerVersion,\n\tLayerVersionProps,\n\tRuntime,\n} from 'aws-cdk-lib/aws-lambda';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseLambdaLayerConstruct\n *\n * Provides configuration for:\n * - Creating a new Lambda Layer\n * - Importing an existing layer by ARN or attributes\n */\ninterface ILambdaLayerConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/**\n\t\t * Configuration for creating a new Lambda layer\n\t\t *\n\t\t * Note:\n\t\t * - `layerVersionName` is required\n\t\t * - `compatibleArchitectures` is managed internally\n\t\t */\n\t\treadonly layerOptions?: Partial<\n\t\t\tOmit<LayerVersionProps, 'layerVersionName' | 'compatibleArchitectures'>\n\t\t> &\n\t\t\tRequired<Pick<LayerVersionProps, 'layerVersionName'>>;\n\n\t\t/** Import an existing layer by ARN */\n\t\treadonly fromExistingLayerArn?: string;\n\n\t\t/** Import an existing layer using attributes */\n\t\treadonly fromExistingLayerAttribute?: {\n\t\t\treadonly layerVersionArn: string;\n\t\t\treadonly compatibleRuntimes?: Runtime[];\n\t\t};\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {}\n\n/**\n * CDK construct for Lambda Layer\n *\n * Responsibilities:\n * - Creates a new Lambda layer or imports an existing one\n * - Applies default runtime and architecture compatibility\n * - Exposes the layer ARN as a CloudFormation output\n */\nexport class BaseLambdaLayerConstruct extends Construct {\n\t/** Newly created Lambda Layer (null if importing existing layer) */\n\treadonly layer: LayerVersion;\n\n\t/** Imported Lambda Layer reference (null if creating new layer) */\n\treadonly existingLayer: ILayerVersion;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for layer creation or import\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops?: ILambdaLayerConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\t/**\n\t\t * Import layer by ARN\n\t\t */\n\t\tif (props?.options?.fromExistingLayerArn) {\n\t\t\tthis.existingLayer = LayerVersion.fromLayerVersionArn(\n\t\t\t\tthis,\n\t\t\t\t`${id}-Arn`,\n\t\t\t\tprops?.options?.fromExistingLayerArn,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Import layer using attributes\n\t\t\t */\n\t\t} else if (props?.options?.fromExistingLayerAttribute) {\n\t\t\tthis.existingLayer = LayerVersion.fromLayerVersionAttributes(\n\t\t\t\tthis,\n\t\t\t\t`${id}-Attribute`,\n\t\t\t\tprops?.options?.fromExistingLayerAttribute,\n\t\t\t);\n\n\t\t\t/**\n\t\t\t * Create new Lambda layer\n\t\t\t */\n\t\t} else {\n\t\t\tthis.layer = new LayerVersion(this, id, {\n\t\t\t\t...props.options?.layerOptions,\n\n\t\t\t\t/**\n\t\t\t\t * Default layer code asset\n\t\t\t\t */\n\t\t\t\tcode:\n\t\t\t\t\tprops?.options?.layerOptions?.code || Code.fromAsset('./dist-layer'),\n\n\t\t\t\t/**\n\t\t\t\t * Layer description\n\t\t\t\t */\n\t\t\t\tdescription:\n\t\t\t\t\tprops?.options?.layerOptions?.description ||\n\t\t\t\t\t'Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express',\n\n\t\t\t\t/**\n\t\t\t\t * Supported CPU architectures\n\t\t\t\t */\n\t\t\t\tcompatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],\n\n\t\t\t\t/**\n\t\t\t\t * Supported runtimes\n\t\t\t\t */\n\t\t\t\tcompatibleRuntimes: [\n\t\t\t\t\tRuntime.NODEJS_22_X,\n\t\t\t\t\tRuntime.NODEJS_24_X,\n\t\t\t\t\tRuntime.NODEJS_LATEST,\n\t\t\t\t],\n\t\t\t} as LayerVersionProps);\n\t\t}\n\n\t\t/**\n\t\t * CloudFormation output exposing the layer ARN\n\t\t * Resolves to either created or imported layer\n\t\t */\n\t\tnew CfnOutput(this, 'LambdaLayerArn', {\n\t\t\tvalue:\n\t\t\t\tprops.options?.fromExistingLayerArn ||\n\t\t\t\tprops.options?.fromExistingLayerAttribute\n\t\t\t\t\t? this.existingLayer.layerVersionArn\n\t\t\t\t\t: this.layer.layerVersionArn,\n\t\t});\n\t}\n}\n","import { Construct } from 'constructs';\nimport { CfnOutput, RemovalPolicy } from 'aws-cdk-lib';\nimport { Queue, QueueProps } from 'aws-cdk-lib/aws-sqs';\nimport {\n\tEventSourceMapping,\n\tEventSourceMappingProps,\n\tFunction,\n} from 'aws-cdk-lib/aws-lambda';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseSqsConstruct\n *\n * Provides configuration for:\n * - SQS queue creation\n * - Lambda event source mappings\n */\ninterface ISqsConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** Configuration options for the SQS queue */\n\t\treadonly queueOptions?: QueueProps;\n\n\t\t/**\n\t\t * Configuration for Lambda event source mapping\n\t\t *\n\t\t * Note:\n\t\t * `eventSourceArn` and `target` are managed internally\n\t\t */\n\t\treadonly eventSourceMappingOptions?: Omit<\n\t\t\tEventSourceMappingProps,\n\t\t\t'eventSourceArn' | 'target'\n\t\t>;\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda functions to be triggered by SQS messages\n\t *\n\t * Each function will be connected via an event source mapping\n\t */\n\treadonly targetFunctions?: Function[];\n}\n\n/**\n * CDK construct for SQS queue with Lambda integration\n *\n * Responsibilities:\n * - Creates an SQS queue with configurable options\n * - Attaches one or more Lambda consumers via event source mappings\n * - Applies default retry behaviour\n * - Exposes the queue ARN as a CloudFormation output\n */\nexport class BaseSqsConstruct extends Construct {\n\t/** The created SQS queue instance */\n\treadonly queue: Queue;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for queue and Lambda consumers\n\t */\n\tconstructor(scope: Construct, id: string, props: ISqsConstructProps) {\n\t\tsuper(scope, id);\n\n\t\tthis.queue = new Queue(this, id, {\n\t\t\t...props?.options?.queueOptions,\n\n\t\t\t/**\n\t\t\t * Removal policy applied to the queue\n\t\t\t * Defaults to DESTROY if not explicitly defined\n\t\t\t */\n\t\t\tremovalPolicy:\n\t\t\t\tprops?.options?.queueOptions?.removalPolicy || RemovalPolicy.DESTROY,\n\t\t});\n\n\t\t/**\n\t\t * Attach Lambda event source mappings for queue consumption\n\t\t */\n\t\tif (props?.targetFunctions?.length) {\n\t\t\tprops.targetFunctions.forEach((targetFunction, index) => {\n\t\t\t\tnew EventSourceMapping(this, `${id}-eventSourceMap${index + 1}`, {\n\t\t\t\t\t...props?.options?.eventSourceMappingOptions,\n\n\t\t\t\t\t/** Target Lambda function */\n\t\t\t\t\ttarget: targetFunction,\n\n\t\t\t\t\t/** Source SQS queue ARN */\n\t\t\t\t\teventSourceArn: this.queue.queueArn,\n\n\t\t\t\t\t/**\n\t\t\t\t\t * Retry attempts for failed batch processing\n\t\t\t\t\t * Defaults to 3 if not explicitly defined\n\t\t\t\t\t */\n\t\t\t\t\tretryAttempts:\n\t\t\t\t\t\tprops?.options?.eventSourceMappingOptions?.retryAttempts || 3,\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * CloudFormation output exposing the SQS queue ARN\n\t\t */\n\t\tnew CfnOutput(this, 'SqsQueueArn', {\n\t\t\tvalue: this.queue.queueArn,\n\t\t});\n\t}\n}\n","import { App, Stack } from \"aws-cdk-lib\";\n\nimport { IBaseStackProps } from \"../../types\";\nimport { BaseLambdaConstruct, BaseLambdaLayerConstruct, BaseSqsConstruct } from \"../constructs\";\nimport { CustomException } from \"@incloodsolutions/toolkit\";\nimport { ILayerVersion } from \"aws-cdk-lib/aws-lambda\";\n\nexport class BaseLambdaSqsStack extends Stack {\n\tconstructor(scope: App, id: string, props: IBaseStackProps<{\n\t\tlayerOptions?: {\n\t\t\tname: string;\n\t\t\tversion: number;\n\t\t};\n\t\tlambdaOptions?: {};\n\t\tapiGatewayOptions?: {\n\t\t\tversion?: 'v1' | 'v2';\n\t\t};\n\t}>) {\n\t\tsuper(scope, id, props);\n\t\tlet layers: ILayerVersion[] = [];\n\n\t\tif (props?.stackOptions?.layerOptions) {\n\t\t\tif (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {\n\t\t\t\tthrow new CustomException(\"Invalid layer options provided\");\n\t\t\t}\n\t\t\tconst { existingLayer } = new BaseLambdaLayerConstruct(\n\t\t\t\tthis,\n\t\t\t\t'layer',\n\t\t\t\t{\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tfromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tlayers.push(existingLayer);\n\t\t}\n\n\t\tconst { function: lambdaFunction } = new BaseLambdaConstruct(this, 'lambda', {\n\t\t\tstage: props.stackOptions?.stage,\n\t\t\tstackName: props.stackName,\n\t\t\toptions: {\n\t\t\t\tlambdaOptions: { layers },\n\t\t\t},\n\t\t});\n\n\t\tnew BaseSqsConstruct(this, 'sqs', {\n\t\t\ttargetFunctions: [lambdaFunction],\n\t\t\toptions: {\n\t\t\t\teventSourceMappingOptions: {},\n\t\t\t\tqueueOptions: {}\n\t\t\t}\n\t\t});\n\n\t}\n}"]}
@@ -1,4 +1,5 @@
1
1
  import { IBaseEnableDebug, ObjectType, AppEnvironmentType } from '@incloodsolutions/toolkit';
2
+ import { StackProps } from 'aws-cdk-lib';
2
3
 
3
4
  /**
4
5
  * @packageDocumentation
@@ -38,5 +39,17 @@ interface IBaseCdkConstructProps<TOptions extends ObjectType = any> extends Read
38
39
  /** Application name, used by some constructs to derive resource names. */
39
40
  readonly appName?: string;
40
41
  }
42
+ /**
43
+ * The common configuration shape accepted by every `Base*` CDK stack in this package.
44
+ */
45
+ interface IBaseStackProps<TStackOptions extends ObjectType = any> extends StackProps {
46
+ readonly stackOptions: {
47
+ /**
48
+ * Deployment stage/environment. Some constructs use it to pick defaults
49
+ * (e.g. a longer Lambda timeout in `'production'`) and to set `NODE_ENV`.
50
+ */
51
+ readonly stage?: AppEnvironmentType;
52
+ } & TStackOptions & Readonly<Partial<IBaseEnableDebug>>;
53
+ }
41
54
 
42
- export type { IBaseCdkConstructProps, IBaseConstruct };
55
+ export type { IBaseCdkConstructProps, IBaseConstruct, IBaseStackProps };
@@ -1,4 +1,5 @@
1
1
  import { IBaseEnableDebug, ObjectType, AppEnvironmentType } from '@incloodsolutions/toolkit';
2
+ import { StackProps } from 'aws-cdk-lib';
2
3
 
3
4
  /**
4
5
  * @packageDocumentation
@@ -38,5 +39,17 @@ interface IBaseCdkConstructProps<TOptions extends ObjectType = any> extends Read
38
39
  /** Application name, used by some constructs to derive resource names. */
39
40
  readonly appName?: string;
40
41
  }
42
+ /**
43
+ * The common configuration shape accepted by every `Base*` CDK stack in this package.
44
+ */
45
+ interface IBaseStackProps<TStackOptions extends ObjectType = any> extends StackProps {
46
+ readonly stackOptions: {
47
+ /**
48
+ * Deployment stage/environment. Some constructs use it to pick defaults
49
+ * (e.g. a longer Lambda timeout in `'production'`) and to set `NODE_ENV`.
50
+ */
51
+ readonly stage?: AppEnvironmentType;
52
+ } & TStackOptions & Readonly<Partial<IBaseEnableDebug>>;
53
+ }
41
54
 
42
- export type { IBaseCdkConstructProps, IBaseConstruct };
55
+ export type { IBaseCdkConstructProps, IBaseConstruct, IBaseStackProps };
package/dist/aws.cjs CHANGED
@@ -14,6 +14,7 @@ var awsEventsTargets = require('aws-cdk-lib/aws-events-targets');
14
14
  var awsApigatewayv2Authorizers = require('aws-cdk-lib/aws-apigatewayv2-authorizers');
15
15
  var awsLambda = require('aws-cdk-lib/aws-lambda');
16
16
  var awsIam = require('aws-cdk-lib/aws-iam');
17
+ var awsRoute53 = require('aws-cdk-lib/aws-route53');
17
18
  var awsS3 = require('aws-cdk-lib/aws-s3');
18
19
  var awsCloudfrontOrigins = require('aws-cdk-lib/aws-cloudfront-origins');
19
20
  var awsS3Deployment = require('aws-cdk-lib/aws-s3-deployment');
@@ -544,9 +545,9 @@ var BaseLambdaConstruct = class extends constructs.Construct {
544
545
  ...props?.options?.lambdaOptions,
545
546
  /**
546
547
  * Lambda function name
547
- * Defaults to "<stackName>-handler" if not provided
548
+ * Defaults to "<stackName>" if not provided
548
549
  */
549
- functionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}-handler`,
550
+ functionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,
550
551
  /**
551
552
  * Function description
552
553
  */
@@ -687,6 +688,72 @@ var BaseRolePolicyConstruct = class extends constructs.Construct {
687
688
  });
688
689
  }
689
690
  };
691
+ var BaseRoute53Construct = class extends constructs.Construct {
692
+ static {
693
+ __name(this, "BaseRoute53Construct");
694
+ }
695
+ /** The hosted zone this construct created, imported, or looked up */
696
+ hostedZone;
697
+ /**
698
+ * @param scope Parent construct
699
+ * @param id Unique construct identifier
700
+ * @param props Configuration for the hosted zone and its records
701
+ */
702
+ constructor(scope, id, props) {
703
+ super(scope, id);
704
+ const options = props?.options ?? {};
705
+ if (options.hostedZoneOptions) {
706
+ this.hostedZone = new awsRoute53.HostedZone(
707
+ this,
708
+ `${id}-HostedZone`,
709
+ options.hostedZoneOptions
710
+ );
711
+ } else if (options.fromExistingHostedZoneAttributes) {
712
+ this.hostedZone = awsRoute53.HostedZone.fromHostedZoneAttributes(
713
+ this,
714
+ `${id}-HostedZone`,
715
+ options.fromExistingHostedZoneAttributes
716
+ );
717
+ } else if (options.fromLookupOptions) {
718
+ this.hostedZone = awsRoute53.HostedZone.fromLookup(
719
+ this,
720
+ `${id}-HostedZone`,
721
+ options.fromLookupOptions
722
+ );
723
+ } else {
724
+ throw new toolkit.CustomException(
725
+ "BaseRoute53Construct requires one of hostedZoneOptions, fromExistingHostedZoneAttributes, or fromLookupOptions"
726
+ );
727
+ }
728
+ options.aRecords?.forEach((record, index) => {
729
+ new awsRoute53.ARecord(this, `${id}-ARecord-${index}`, {
730
+ ...record,
731
+ zone: this.hostedZone
732
+ });
733
+ });
734
+ options.aaaaRecords?.forEach((record, index) => {
735
+ new awsRoute53.AaaaRecord(this, `${id}-AaaaRecord-${index}`, {
736
+ ...record,
737
+ zone: this.hostedZone
738
+ });
739
+ });
740
+ options.cnameRecords?.forEach((record, index) => {
741
+ new awsRoute53.CnameRecord(this, `${id}-CnameRecord-${index}`, {
742
+ ...record,
743
+ zone: this.hostedZone
744
+ });
745
+ });
746
+ options.txtRecords?.forEach((record, index) => {
747
+ new awsRoute53.TxtRecord(this, `${id}-TxtRecord-${index}`, {
748
+ ...record,
749
+ zone: this.hostedZone
750
+ });
751
+ });
752
+ new awsCdkLib.CfnOutput(this, "Route53HostedZoneId", {
753
+ value: this.hostedZone.hostedZoneId
754
+ });
755
+ }
756
+ };
690
757
  var BaseS3Construct = class extends constructs.Construct {
691
758
  static {
692
759
  __name(this, "BaseS3Construct");
@@ -883,6 +950,132 @@ var BaseVpcConstruct = class extends constructs.Construct {
883
950
  });
884
951
  }
885
952
  };
953
+ var BaseLambdaApiStack = class extends awsCdkLib.Stack {
954
+ static {
955
+ __name(this, "BaseLambdaApiStack");
956
+ }
957
+ constructor(scope, id, props) {
958
+ super(scope, id, props);
959
+ let layers = [];
960
+ if (props?.stackOptions?.layerOptions) {
961
+ if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
962
+ throw new toolkit.CustomException("Invalid layer options provided! Both layer 'name' and 'version' are required.");
963
+ }
964
+ const { existingLayer } = new BaseLambdaLayerConstruct(
965
+ this,
966
+ "layer",
967
+ {
968
+ options: {
969
+ fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
970
+ }
971
+ }
972
+ );
973
+ layers.push(existingLayer);
974
+ }
975
+ const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
976
+ stage: props.stackOptions?.stage,
977
+ stackName: props.stackName,
978
+ options: {
979
+ lambdaOptions: { layers }
980
+ }
981
+ });
982
+ new BaseApiGatewayV2Construct(this, "apiGateway", {
983
+ handlerFunctions: [lambdaFunction],
984
+ options: {
985
+ gatewayOptions: {
986
+ apiName: props.stackName,
987
+ corsPreflight: {
988
+ allowOrigins: ["*"]
989
+ }
990
+ },
991
+ routeOptions: [
992
+ {
993
+ path: "/{proxy+}",
994
+ methods: [awsApigatewayv2.HttpMethod.ANY]
995
+ }
996
+ ]
997
+ }
998
+ });
999
+ }
1000
+ };
1001
+ var BaseLambdaSqsStack = class extends awsCdkLib.Stack {
1002
+ static {
1003
+ __name(this, "BaseLambdaSqsStack");
1004
+ }
1005
+ constructor(scope, id, props) {
1006
+ super(scope, id, props);
1007
+ let layers = [];
1008
+ if (props?.stackOptions?.layerOptions) {
1009
+ if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
1010
+ throw new toolkit.CustomException("Invalid layer options provided");
1011
+ }
1012
+ const { existingLayer } = new BaseLambdaLayerConstruct(
1013
+ this,
1014
+ "layer",
1015
+ {
1016
+ options: {
1017
+ fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
1018
+ }
1019
+ }
1020
+ );
1021
+ layers.push(existingLayer);
1022
+ }
1023
+ const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
1024
+ stage: props.stackOptions?.stage,
1025
+ stackName: props.stackName,
1026
+ options: {
1027
+ lambdaOptions: { layers }
1028
+ }
1029
+ });
1030
+ new BaseSqsConstruct(this, "sqs", {
1031
+ targetFunctions: [lambdaFunction],
1032
+ options: {
1033
+ eventSourceMappingOptions: {},
1034
+ queueOptions: {}
1035
+ }
1036
+ });
1037
+ }
1038
+ };
1039
+ var BaseLambdaSnsStack = class extends awsCdkLib.Stack {
1040
+ static {
1041
+ __name(this, "BaseLambdaSnsStack");
1042
+ }
1043
+ constructor(scope, id, props) {
1044
+ super(scope, id, props);
1045
+ let layers = [];
1046
+ if (props?.stackOptions?.layerOptions) {
1047
+ if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
1048
+ throw new toolkit.CustomException("Invalid layer options provided");
1049
+ }
1050
+ const { existingLayer } = new BaseLambdaLayerConstruct(
1051
+ this,
1052
+ "layer",
1053
+ {
1054
+ options: {
1055
+ fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
1056
+ }
1057
+ }
1058
+ );
1059
+ layers.push(existingLayer);
1060
+ }
1061
+ const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
1062
+ stage: props.stackOptions?.stage,
1063
+ stackName: props.stackName,
1064
+ options: {
1065
+ lambdaOptions: { layers }
1066
+ }
1067
+ });
1068
+ new BaseSnsConstruct(this, "sns", {
1069
+ options: {
1070
+ targetFunctions: [lambdaFunction],
1071
+ topicOptions: {
1072
+ ...props?.stackOptions?.topicOptions,
1073
+ topicName: props?.stackOptions?.topicOptions?.topicName || props.stackName
1074
+ }
1075
+ }
1076
+ });
1077
+ }
1078
+ };
886
1079
 
887
1080
  exports.BaseApiGatewayConstruct = BaseApiGatewayConstruct;
888
1081
  exports.BaseApiGatewayV2Construct = BaseApiGatewayV2Construct;
@@ -891,11 +1084,15 @@ exports.BaseCloudfrontConstruct = BaseCloudfrontConstruct;
891
1084
  exports.BaseCloudwatchLogGroupConstruct = BaseCloudwatchLogGroupConstruct;
892
1085
  exports.BaseDynamoDBConstruct = BaseDynamoDBConstruct;
893
1086
  exports.BaseEventBridgeConstruct = BaseEventBridgeConstruct;
1087
+ exports.BaseLambdaApiStack = BaseLambdaApiStack;
894
1088
  exports.BaseLambdaAuthoriserConstruct = BaseLambdaAuthoriserConstruct;
895
1089
  exports.BaseLambdaAuthoriserV2Construct = BaseLambdaAuthoriserV2Construct;
896
1090
  exports.BaseLambdaConstruct = BaseLambdaConstruct;
897
1091
  exports.BaseLambdaLayerConstruct = BaseLambdaLayerConstruct;
1092
+ exports.BaseLambdaSnsStack = BaseLambdaSnsStack;
1093
+ exports.BaseLambdaSqsStack = BaseLambdaSqsStack;
898
1094
  exports.BaseRolePolicyConstruct = BaseRolePolicyConstruct;
1095
+ exports.BaseRoute53Construct = BaseRoute53Construct;
899
1096
  exports.BaseS3Construct = BaseS3Construct;
900
1097
  exports.BaseS3DeploymentConstruct = BaseS3DeploymentConstruct;
901
1098
  exports.BaseSnsConstruct = BaseSnsConstruct;