@incloodsolutions/devkit 0.0.3 → 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 (226) hide show
  1. package/README.md +180 -41
  2. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.cjs → aws-cdk/constructs/api-gateway-v2.cjs} +2 -2
  3. package/dist/aws-cdk/constructs/api-gateway-v2.cjs.map +1 -0
  4. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.d.ts → aws-cdk/constructs/api-gateway-v2.d.cts} +2 -1
  5. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.d.cts → aws-cdk/constructs/api-gateway-v2.d.ts} +2 -1
  6. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.js → aws-cdk/constructs/api-gateway-v2.js} +2 -2
  7. package/dist/aws-cdk/constructs/api-gateway-v2.js.map +1 -0
  8. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.cjs → aws-cdk/constructs/api-gateway-websocket.cjs} +18 -6
  9. package/dist/aws-cdk/constructs/api-gateway-websocket.cjs.map +1 -0
  10. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.d.ts → aws-cdk/constructs/api-gateway-websocket.d.cts} +2 -1
  11. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.d.cts → aws-cdk/constructs/api-gateway-websocket.d.ts} +2 -1
  12. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.js → aws-cdk/constructs/api-gateway-websocket.js} +18 -6
  13. package/dist/aws-cdk/constructs/api-gateway-websocket.js.map +1 -0
  14. package/dist/{aws/cdk/constructs/api-gateway-construct.cjs → aws-cdk/constructs/api-gateway.cjs} +6 -3
  15. package/dist/aws-cdk/constructs/api-gateway.cjs.map +1 -0
  16. package/dist/{aws/cdk/constructs/api-gateway-construct.d.ts → aws-cdk/constructs/api-gateway.d.cts} +2 -1
  17. package/dist/{aws/cdk/constructs/api-gateway-construct.d.cts → aws-cdk/constructs/api-gateway.d.ts} +2 -1
  18. package/dist/{aws/cdk/constructs/api-gateway-construct.js → aws-cdk/constructs/api-gateway.js} +6 -3
  19. package/dist/aws-cdk/constructs/api-gateway.js.map +1 -0
  20. package/dist/{aws/cdk/constructs/cloudfront-construct.cjs → aws-cdk/constructs/cloudfront.cjs} +2 -2
  21. package/dist/aws-cdk/constructs/cloudfront.cjs.map +1 -0
  22. package/dist/{aws/cdk/constructs/cloudfront-construct.d.ts → aws-cdk/constructs/cloudfront.d.cts} +2 -1
  23. package/dist/{aws/cdk/constructs/cloudfront-construct.d.cts → aws-cdk/constructs/cloudfront.d.ts} +2 -1
  24. package/dist/{aws/cdk/constructs/cloudfront-construct.js → aws-cdk/constructs/cloudfront.js} +2 -2
  25. package/dist/aws-cdk/constructs/cloudfront.js.map +1 -0
  26. package/dist/{aws/cdk/constructs/cloudwatch-construct.cjs → aws-cdk/constructs/cloudwatch.cjs} +2 -2
  27. package/dist/aws-cdk/constructs/cloudwatch.cjs.map +1 -0
  28. package/dist/{aws/cdk/constructs/cloudwatch-construct.d.ts → aws-cdk/constructs/cloudwatch.d.cts} +2 -1
  29. package/dist/{aws/cdk/constructs/cloudwatch-construct.d.cts → aws-cdk/constructs/cloudwatch.d.ts} +2 -1
  30. package/dist/{aws/cdk/constructs/cloudwatch-construct.js → aws-cdk/constructs/cloudwatch.js} +2 -2
  31. package/dist/aws-cdk/constructs/cloudwatch.js.map +1 -0
  32. package/dist/{aws/cdk/constructs/dynamo-db-construct.cjs → aws-cdk/constructs/dynamo-db.cjs} +2 -2
  33. package/dist/aws-cdk/constructs/dynamo-db.cjs.map +1 -0
  34. package/dist/{aws/cdk/constructs/dynamo-db-construct.d.ts → aws-cdk/constructs/dynamo-db.d.cts} +2 -1
  35. package/dist/{aws/cdk/constructs/dynamo-db-construct.d.cts → aws-cdk/constructs/dynamo-db.d.ts} +2 -1
  36. package/dist/{aws/cdk/constructs/dynamo-db-construct.js → aws-cdk/constructs/dynamo-db.js} +2 -2
  37. package/dist/aws-cdk/constructs/dynamo-db.js.map +1 -0
  38. package/dist/{aws/cdk/constructs/event-bridge-construct.cjs → aws-cdk/constructs/event-bridge.cjs} +2 -2
  39. package/dist/aws-cdk/constructs/event-bridge.cjs.map +1 -0
  40. package/dist/{aws/cdk/constructs/event-bridge-construct.d.ts → aws-cdk/constructs/event-bridge.d.cts} +2 -1
  41. package/dist/{aws/cdk/constructs/event-bridge-construct.d.cts → aws-cdk/constructs/event-bridge.d.ts} +2 -1
  42. package/dist/{aws/cdk/constructs/event-bridge-construct.js → aws-cdk/constructs/event-bridge.js} +2 -2
  43. package/dist/aws-cdk/constructs/event-bridge.js.map +1 -0
  44. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.cjs → aws-cdk/constructs/lambda-authorizer-v2.cjs} +6 -3
  45. package/dist/aws-cdk/constructs/lambda-authorizer-v2.cjs.map +1 -0
  46. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.d.ts → aws-cdk/constructs/lambda-authorizer-v2.d.cts} +2 -1
  47. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.d.cts → aws-cdk/constructs/lambda-authorizer-v2.d.ts} +2 -1
  48. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.js → aws-cdk/constructs/lambda-authorizer-v2.js} +6 -3
  49. package/dist/aws-cdk/constructs/lambda-authorizer-v2.js.map +1 -0
  50. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.cjs → aws-cdk/constructs/lambda-authorizer.cjs} +2 -2
  51. package/dist/aws-cdk/constructs/lambda-authorizer.cjs.map +1 -0
  52. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.d.cts → aws-cdk/constructs/lambda-authorizer.d.cts} +2 -1
  53. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.d.ts → aws-cdk/constructs/lambda-authorizer.d.ts} +2 -1
  54. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.js → aws-cdk/constructs/lambda-authorizer.js} +2 -2
  55. package/dist/aws-cdk/constructs/lambda-authorizer.js.map +1 -0
  56. package/dist/{aws/cdk/constructs/lambda-layer-construct.cjs → aws-cdk/constructs/lambda-layer.cjs} +3 -6
  57. package/dist/aws-cdk/constructs/lambda-layer.cjs.map +1 -0
  58. package/dist/{aws/cdk/constructs/lambda-layer-construct.d.ts → aws-cdk/constructs/lambda-layer.d.cts} +2 -1
  59. package/dist/{aws/cdk/constructs/lambda-layer-construct.d.cts → aws-cdk/constructs/lambda-layer.d.ts} +2 -1
  60. package/dist/{aws/cdk/constructs/lambda-layer-construct.js → aws-cdk/constructs/lambda-layer.js} +3 -6
  61. package/dist/aws-cdk/constructs/lambda-layer.js.map +1 -0
  62. package/dist/{aws/cdk/constructs/lambda-construct.cjs → aws-cdk/constructs/lambda.cjs} +4 -4
  63. package/dist/aws-cdk/constructs/lambda.cjs.map +1 -0
  64. package/dist/{aws/cdk/constructs/lambda-construct.d.ts → aws-cdk/constructs/lambda.d.cts} +2 -1
  65. package/dist/{aws/cdk/constructs/lambda-construct.d.cts → aws-cdk/constructs/lambda.d.ts} +2 -1
  66. package/dist/{aws/cdk/constructs/lambda-construct.js → aws-cdk/constructs/lambda.js} +4 -4
  67. package/dist/aws-cdk/constructs/lambda.js.map +1 -0
  68. package/dist/{aws/cdk/constructs/role-policy-construct.cjs → aws-cdk/constructs/role-policy.cjs} +2 -2
  69. package/dist/aws-cdk/constructs/role-policy.cjs.map +1 -0
  70. package/dist/{aws/cdk/constructs/role-policy-construct.d.ts → aws-cdk/constructs/role-policy.d.cts} +2 -1
  71. package/dist/{aws/cdk/constructs/role-policy-construct.d.cts → aws-cdk/constructs/role-policy.d.ts} +2 -1
  72. package/dist/{aws/cdk/constructs/role-policy-construct.js → aws-cdk/constructs/role-policy.js} +2 -2
  73. package/dist/aws-cdk/constructs/role-policy.js.map +1 -0
  74. package/dist/aws-cdk/constructs/route53.cjs +79 -0
  75. package/dist/aws-cdk/constructs/route53.cjs.map +1 -0
  76. package/dist/aws-cdk/constructs/route53.d.cts +95 -0
  77. package/dist/aws-cdk/constructs/route53.d.ts +95 -0
  78. package/dist/aws-cdk/constructs/route53.js +77 -0
  79. package/dist/aws-cdk/constructs/route53.js.map +1 -0
  80. package/dist/{aws/cdk/constructs/s3-deployment-construct.cjs → aws-cdk/constructs/s3-deployment.cjs} +20 -11
  81. package/dist/aws-cdk/constructs/s3-deployment.cjs.map +1 -0
  82. package/dist/{aws/cdk/constructs/s3-deployment-construct.d.ts → aws-cdk/constructs/s3-deployment.d.cts} +2 -1
  83. package/dist/{aws/cdk/constructs/s3-deployment-construct.d.cts → aws-cdk/constructs/s3-deployment.d.ts} +2 -1
  84. package/dist/{aws/cdk/constructs/s3-deployment-construct.js → aws-cdk/constructs/s3-deployment.js} +20 -11
  85. package/dist/aws-cdk/constructs/s3-deployment.js.map +1 -0
  86. package/dist/{aws/cdk/constructs/s3-construct.cjs → aws-cdk/constructs/s3.cjs} +2 -2
  87. package/dist/aws-cdk/constructs/s3.cjs.map +1 -0
  88. package/dist/{aws/cdk/constructs/s3-construct.d.ts → aws-cdk/constructs/s3.d.cts} +2 -1
  89. package/dist/{aws/cdk/constructs/s3-construct.d.cts → aws-cdk/constructs/s3.d.ts} +2 -1
  90. package/dist/{aws/cdk/constructs/s3-construct.js → aws-cdk/constructs/s3.js} +2 -2
  91. package/dist/aws-cdk/constructs/s3.js.map +1 -0
  92. package/dist/{aws/cdk/constructs/sns-construct.cjs → aws-cdk/constructs/sns.cjs} +2 -2
  93. package/dist/aws-cdk/constructs/sns.cjs.map +1 -0
  94. package/dist/{aws/cdk/constructs/sns-construct.d.ts → aws-cdk/constructs/sns.d.cts} +2 -1
  95. package/dist/{aws/cdk/constructs/sns-construct.d.cts → aws-cdk/constructs/sns.d.ts} +2 -1
  96. package/dist/{aws/cdk/constructs/sns-construct.js → aws-cdk/constructs/sns.js} +2 -2
  97. package/dist/aws-cdk/constructs/sns.js.map +1 -0
  98. package/dist/{aws/cdk/constructs/sqs-construct.cjs → aws-cdk/constructs/sqs.cjs} +2 -2
  99. package/dist/aws-cdk/constructs/sqs.cjs.map +1 -0
  100. package/dist/{aws/cdk/constructs/sqs-construct.d.ts → aws-cdk/constructs/sqs.d.cts} +2 -1
  101. package/dist/{aws/cdk/constructs/sqs-construct.d.cts → aws-cdk/constructs/sqs.d.ts} +2 -1
  102. package/dist/{aws/cdk/constructs/sqs-construct.js → aws-cdk/constructs/sqs.js} +2 -2
  103. package/dist/aws-cdk/constructs/sqs.js.map +1 -0
  104. package/dist/{aws/cdk/constructs/vpc-construct.cjs → aws-cdk/constructs/vpc.cjs} +2 -2
  105. package/dist/aws-cdk/constructs/vpc.cjs.map +1 -0
  106. package/dist/{aws/cdk/constructs/vpc-construct.d.ts → aws-cdk/constructs/vpc.d.cts} +2 -1
  107. package/dist/{aws/cdk/constructs/vpc-construct.d.cts → aws-cdk/constructs/vpc.d.ts} +2 -1
  108. package/dist/{aws/cdk/constructs/vpc-construct.js → aws-cdk/constructs/vpc.js} +2 -2
  109. package/dist/aws-cdk/constructs/vpc.js.map +1 -0
  110. package/dist/aws-cdk/stacks/lambda-api.cjs +252 -0
  111. package/dist/aws-cdk/stacks/lambda-api.cjs.map +1 -0
  112. package/dist/aws-cdk/stacks/lambda-api.d.cts +16 -0
  113. package/dist/aws-cdk/stacks/lambda-api.d.ts +16 -0
  114. package/dist/aws-cdk/stacks/lambda-api.js +250 -0
  115. package/dist/aws-cdk/stacks/lambda-api.js.map +1 -0
  116. package/dist/aws-cdk/stacks/lambda-sns.cjs +211 -0
  117. package/dist/aws-cdk/stacks/lambda-sns.cjs.map +1 -0
  118. package/dist/aws-cdk/stacks/lambda-sns.d.cts +17 -0
  119. package/dist/aws-cdk/stacks/lambda-sns.d.ts +17 -0
  120. package/dist/aws-cdk/stacks/lambda-sns.js +209 -0
  121. package/dist/aws-cdk/stacks/lambda-sns.js.map +1 -0
  122. package/dist/aws-cdk/stacks/lambda-sqs.cjs +220 -0
  123. package/dist/aws-cdk/stacks/lambda-sqs.cjs.map +1 -0
  124. package/dist/aws-cdk/stacks/lambda-sqs.d.cts +18 -0
  125. package/dist/aws-cdk/stacks/lambda-sqs.d.ts +18 -0
  126. package/dist/aws-cdk/stacks/lambda-sqs.js +218 -0
  127. package/dist/aws-cdk/stacks/lambda-sqs.js.map +1 -0
  128. package/dist/aws-types.cjs +4 -0
  129. package/dist/aws-types.cjs.map +1 -0
  130. package/dist/aws-types.d.cts +55 -0
  131. package/dist/aws-types.d.ts +55 -0
  132. package/dist/aws-types.js +3 -0
  133. package/dist/aws-types.js.map +1 -0
  134. package/dist/{aws/cdk/constructs/index.cjs → aws.cjs} +244 -23
  135. package/dist/aws.cjs.map +1 -0
  136. package/dist/aws.d.cts +40 -0
  137. package/dist/aws.d.ts +40 -0
  138. package/dist/{aws/index.js → aws.js} +243 -26
  139. package/dist/aws.js.map +1 -0
  140. package/dist/index.cjs +242 -21
  141. package/dist/index.cjs.map +1 -1
  142. package/dist/index.d.cts +24 -18
  143. package/dist/index.d.ts +24 -18
  144. package/dist/index.js +241 -24
  145. package/dist/index.js.map +1 -1
  146. package/package.json +160 -25
  147. package/dist/aws/cdk/constructs/api-gateway-construct.cjs.map +0 -1
  148. package/dist/aws/cdk/constructs/api-gateway-construct.js.map +0 -1
  149. package/dist/aws/cdk/constructs/api-gateway-v2-construct.cjs.map +0 -1
  150. package/dist/aws/cdk/constructs/api-gateway-v2-construct.js.map +0 -1
  151. package/dist/aws/cdk/constructs/api-gateway-websocket-construct.cjs.map +0 -1
  152. package/dist/aws/cdk/constructs/api-gateway-websocket-construct.js.map +0 -1
  153. package/dist/aws/cdk/constructs/cloudfront-construct.cjs.map +0 -1
  154. package/dist/aws/cdk/constructs/cloudfront-construct.js.map +0 -1
  155. package/dist/aws/cdk/constructs/cloudwatch-construct.cjs.map +0 -1
  156. package/dist/aws/cdk/constructs/cloudwatch-construct.js.map +0 -1
  157. package/dist/aws/cdk/constructs/dynamo-db-construct.cjs.map +0 -1
  158. package/dist/aws/cdk/constructs/dynamo-db-construct.js.map +0 -1
  159. package/dist/aws/cdk/constructs/event-bridge-construct.cjs.map +0 -1
  160. package/dist/aws/cdk/constructs/event-bridge-construct.js.map +0 -1
  161. package/dist/aws/cdk/constructs/index.cjs.map +0 -1
  162. package/dist/aws/cdk/constructs/index.d.cts +0 -34
  163. package/dist/aws/cdk/constructs/index.d.ts +0 -34
  164. package/dist/aws/cdk/constructs/index.js +0 -863
  165. package/dist/aws/cdk/constructs/index.js.map +0 -1
  166. package/dist/aws/cdk/constructs/lambda-authorizer-construct.cjs.map +0 -1
  167. package/dist/aws/cdk/constructs/lambda-authorizer-construct.js.map +0 -1
  168. package/dist/aws/cdk/constructs/lambda-authorizer-v2-construct.cjs.map +0 -1
  169. package/dist/aws/cdk/constructs/lambda-authorizer-v2-construct.js.map +0 -1
  170. package/dist/aws/cdk/constructs/lambda-construct.cjs.map +0 -1
  171. package/dist/aws/cdk/constructs/lambda-construct.js.map +0 -1
  172. package/dist/aws/cdk/constructs/lambda-layer-construct.cjs.map +0 -1
  173. package/dist/aws/cdk/constructs/lambda-layer-construct.js.map +0 -1
  174. package/dist/aws/cdk/constructs/role-policy-construct.cjs.map +0 -1
  175. package/dist/aws/cdk/constructs/role-policy-construct.js.map +0 -1
  176. package/dist/aws/cdk/constructs/s3-construct.cjs.map +0 -1
  177. package/dist/aws/cdk/constructs/s3-construct.js.map +0 -1
  178. package/dist/aws/cdk/constructs/s3-deployment-construct.cjs.map +0 -1
  179. package/dist/aws/cdk/constructs/s3-deployment-construct.js.map +0 -1
  180. package/dist/aws/cdk/constructs/sns-construct.cjs.map +0 -1
  181. package/dist/aws/cdk/constructs/sns-construct.js.map +0 -1
  182. package/dist/aws/cdk/constructs/sqs-construct.cjs.map +0 -1
  183. package/dist/aws/cdk/constructs/sqs-construct.js.map +0 -1
  184. package/dist/aws/cdk/constructs/vpc-construct.cjs.map +0 -1
  185. package/dist/aws/cdk/constructs/vpc-construct.js.map +0 -1
  186. package/dist/aws/cdk/index.cjs +0 -881
  187. package/dist/aws/cdk/index.cjs.map +0 -1
  188. package/dist/aws/cdk/index.d.cts +0 -34
  189. package/dist/aws/cdk/index.d.ts +0 -34
  190. package/dist/aws/cdk/index.js +0 -863
  191. package/dist/aws/cdk/index.js.map +0 -1
  192. package/dist/aws/cli/index.cjs +0 -4
  193. package/dist/aws/cli/index.cjs.map +0 -1
  194. package/dist/aws/cli/index.d.cts +0 -2
  195. package/dist/aws/cli/index.d.ts +0 -2
  196. package/dist/aws/cli/index.js +0 -3
  197. package/dist/aws/cli/index.js.map +0 -1
  198. package/dist/aws/index.cjs +0 -881
  199. package/dist/aws/index.cjs.map +0 -1
  200. package/dist/aws/index.d.cts +0 -34
  201. package/dist/aws/index.d.ts +0 -34
  202. package/dist/aws/index.js.map +0 -1
  203. package/dist/aws/types/index.cjs +0 -4
  204. package/dist/aws/types/index.cjs.map +0 -1
  205. package/dist/aws/types/index.d.cts +0 -18
  206. package/dist/aws/types/index.d.ts +0 -18
  207. package/dist/aws/types/index.js +0 -3
  208. package/dist/aws/types/index.js.map +0 -1
  209. package/dist/lint/index.cjs +0 -4
  210. package/dist/lint/index.cjs.map +0 -1
  211. package/dist/lint/index.d.cts +0 -2
  212. package/dist/lint/index.d.ts +0 -2
  213. package/dist/lint/index.js +0 -3
  214. package/dist/lint/index.js.map +0 -1
  215. package/dist/prettier/index.cjs +0 -4
  216. package/dist/prettier/index.cjs.map +0 -1
  217. package/dist/prettier/index.d.cts +0 -2
  218. package/dist/prettier/index.d.ts +0 -2
  219. package/dist/prettier/index.js +0 -3
  220. package/dist/prettier/index.js.map +0 -1
  221. package/dist/utility/index.cjs +0 -4
  222. package/dist/utility/index.cjs.map +0 -1
  223. package/dist/utility/index.d.cts +0 -2
  224. package/dist/utility/index.d.ts +0 -2
  225. package/dist/utility/index.js +0 -3
  226. package/dist/utility/index.js.map +0 -1
@@ -0,0 +1,209 @@
1
+ import { Duration, CfnOutput, RemovalPolicy, Stack } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ import { Function, Architecture, Runtime, Code, LayerVersion } from 'aws-cdk-lib/aws-lambda';
4
+ import { detectDuplicateProperties, AppEnvironmentEnum, CustomException } from '@incloodsolutions/toolkit';
5
+ import { Topic } from 'aws-cdk-lib/aws-sns';
6
+ import { LambdaSubscription } from 'aws-cdk-lib/aws-sns-subscriptions';
7
+
8
+ var __defProp = Object.defineProperty;
9
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
+ var BaseLambdaConstruct = class extends Construct {
11
+ static {
12
+ __name(this, "BaseLambdaConstruct");
13
+ }
14
+ /** The created Lambda function instance */
15
+ function;
16
+ /**
17
+ * @param scope Parent construct
18
+ * @param id Unique construct identifier
19
+ * @param props Configuration for Lambda function
20
+ */
21
+ constructor(scope, id, props) {
22
+ super(scope, id);
23
+ const environment = {
24
+ ...props.options?.lambdaOptions?.environment,
25
+ NODE_ENV: props.stage,
26
+ NODE_OPTIONS: "--enable-source-maps",
27
+ AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1"
28
+ };
29
+ detectDuplicateProperties({ data: environment });
30
+ this.function = new Function(this, id, {
31
+ ...props?.options?.lambdaOptions,
32
+ /**
33
+ * Lambda function name
34
+ * Defaults to "<stackName>" if not provided
35
+ */
36
+ functionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,
37
+ /**
38
+ * Function description
39
+ */
40
+ description: props?.options?.lambdaOptions?.description || "A lambda function",
41
+ /**
42
+ * Entry handler for the Lambda function
43
+ */
44
+ handler: props?.options?.lambdaOptions?.handler || "lambda.handler",
45
+ /**
46
+ * Runtime environment
47
+ */
48
+ runtime: props?.options?.lambdaOptions?.runtime || Runtime.NODEJS_24_X,
49
+ /**
50
+ * Execution timeout
51
+ * - 30 seconds in production
52
+ * - 15 seconds otherwise
53
+ */
54
+ timeout: props?.options?.lambdaOptions?.timeout || Duration.seconds(
55
+ props.stage === AppEnvironmentEnum.PRODUCTION ? 30 : 15
56
+ ),
57
+ /**
58
+ * Memory allocation (in MB)
59
+ */
60
+ memorySize: props?.options?.lambdaOptions?.memorySize || 1024,
61
+ /**
62
+ * CPU architecture
63
+ */
64
+ architecture: props?.options?.lambdaOptions?.architecture || Architecture.ARM_64,
65
+ /**
66
+ * Lambda deployment package source
67
+ */
68
+ code: props?.options?.lambdaOptions?.code || Code.fromAsset("dist"),
69
+ /**
70
+ * Final merged environment variables
71
+ */
72
+ environment
73
+ });
74
+ new CfnOutput(this, "LambdaFunctionArn", {
75
+ value: this.function.functionArn
76
+ });
77
+ }
78
+ };
79
+ var BaseLambdaLayerConstruct = class extends Construct {
80
+ static {
81
+ __name(this, "BaseLambdaLayerConstruct");
82
+ }
83
+ /** Newly created Lambda Layer (null if importing existing layer) */
84
+ layer;
85
+ /** Imported Lambda Layer reference (null if creating new layer) */
86
+ existingLayer;
87
+ /**
88
+ * @param scope Parent construct
89
+ * @param id Unique construct identifier
90
+ * @param props Configuration for layer creation or import
91
+ */
92
+ constructor(scope, id, props) {
93
+ super(scope, id);
94
+ if (props?.options?.fromExistingLayerArn) {
95
+ this.existingLayer = LayerVersion.fromLayerVersionArn(
96
+ this,
97
+ `${id}-Arn`,
98
+ props?.options?.fromExistingLayerArn
99
+ );
100
+ } else if (props?.options?.fromExistingLayerAttribute) {
101
+ this.existingLayer = LayerVersion.fromLayerVersionAttributes(
102
+ this,
103
+ `${id}-Attribute`,
104
+ props?.options?.fromExistingLayerAttribute
105
+ );
106
+ } else {
107
+ this.layer = new LayerVersion(this, id, {
108
+ ...props.options?.layerOptions,
109
+ /**
110
+ * Default layer code asset
111
+ */
112
+ code: props?.options?.layerOptions?.code || Code.fromAsset("./dist-layer"),
113
+ /**
114
+ * Layer description
115
+ */
116
+ description: props?.options?.layerOptions?.description || "Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express",
117
+ /**
118
+ * Supported CPU architectures
119
+ */
120
+ compatibleArchitectures: [Architecture.ARM_64, Architecture.X86_64],
121
+ /**
122
+ * Supported runtimes
123
+ */
124
+ compatibleRuntimes: [
125
+ Runtime.NODEJS_22_X,
126
+ Runtime.NODEJS_24_X,
127
+ Runtime.NODEJS_LATEST
128
+ ]
129
+ });
130
+ }
131
+ new CfnOutput(this, "LambdaLayerArn", {
132
+ value: props.options?.fromExistingLayerArn || props.options?.fromExistingLayerAttribute ? this.existingLayer.layerVersionArn : this.layer.layerVersionArn
133
+ });
134
+ }
135
+ };
136
+ var BaseSnsConstruct = class extends Construct {
137
+ static {
138
+ __name(this, "BaseSnsConstruct");
139
+ }
140
+ /** The created SNS topic instance */
141
+ topic;
142
+ /**
143
+ * @param scope Parent construct
144
+ * @param id Unique construct identifier
145
+ * @param props Configuration for topic and subscriptions
146
+ */
147
+ constructor(scope, id, props) {
148
+ super(scope, id);
149
+ this.topic = new Topic(this, id, props.options?.topicOptions);
150
+ if (props.options?.targetFunctions?.length) {
151
+ props.options.targetFunctions.forEach((targetFunction) => {
152
+ this.topic.addSubscription(
153
+ /**
154
+ * Lambda subscription target
155
+ */
156
+ new LambdaSubscription(targetFunction)
157
+ );
158
+ });
159
+ }
160
+ this.topic.applyRemovalPolicy(RemovalPolicy.DESTROY);
161
+ new CfnOutput(this, "SnsTopicArn", {
162
+ value: this.topic.topicArn
163
+ });
164
+ }
165
+ };
166
+ var BaseLambdaSnsStack = class extends Stack {
167
+ static {
168
+ __name(this, "BaseLambdaSnsStack");
169
+ }
170
+ constructor(scope, id, props) {
171
+ super(scope, id, props);
172
+ let layers = [];
173
+ if (props?.stackOptions?.layerOptions) {
174
+ if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
175
+ throw new CustomException("Invalid layer options provided");
176
+ }
177
+ const { existingLayer } = new BaseLambdaLayerConstruct(
178
+ this,
179
+ "layer",
180
+ {
181
+ options: {
182
+ fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
183
+ }
184
+ }
185
+ );
186
+ layers.push(existingLayer);
187
+ }
188
+ const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
189
+ stage: props.stackOptions?.stage,
190
+ stackName: props.stackName,
191
+ options: {
192
+ lambdaOptions: { layers }
193
+ }
194
+ });
195
+ new BaseSnsConstruct(this, "sns", {
196
+ options: {
197
+ targetFunctions: [lambdaFunction],
198
+ topicOptions: {
199
+ ...props?.stackOptions?.topicOptions,
200
+ topicName: props?.stackOptions?.topicOptions?.topicName || props.stackName
201
+ }
202
+ }
203
+ });
204
+ }
205
+ };
206
+
207
+ export { BaseLambdaSnsStack };
208
+ //# sourceMappingURL=lambda-sns.js.map
209
+ //# sourceMappingURL=lambda-sns.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/sns-construct.ts","../../../src/aws/cdk/stacks/lambda-sns-stack.ts"],"names":["Construct","Code","Architecture","Runtime","CfnOutput"],"mappings":"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","file":"lambda-sns.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 { Function } from 'aws-cdk-lib/aws-lambda';\nimport { CfnOutput, RemovalPolicy } from 'aws-cdk-lib';\nimport { Topic, TopicProps } from 'aws-cdk-lib/aws-sns';\nimport { LambdaSubscription } from 'aws-cdk-lib/aws-sns-subscriptions';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseSnsConstruct\n *\n * Provides configuration for:\n * - SNS topic creation\n * - Lambda subscriptions\n */\ninterface ISnsConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** SNS topic configuration options */\n\t\treadonly topicOptions: TopicProps;\n\n\t\t/**\n\t\t * Lambda functions to subscribe to the topic\n\t\t *\n\t\t * Each function will receive messages published to the topic\n\t\t */\n\t\treadonly targetFunctions: Function[];\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {}\n\n/**\n * CDK construct for SNS topic with Lambda subscriptions\n *\n * Responsibilities:\n * - Creates an SNS topic with configurable options\n * - Subscribes one or more Lambda functions to the topic\n * - Applies a removal policy\n * - Exposes the topic ARN as a CloudFormation output\n */\nexport class BaseSnsConstruct extends Construct {\n\t/** The created SNS topic instance */\n\treadonly topic: Topic;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for topic and subscriptions\n\t */\n\tconstructor(scope: Construct, id: string, props: ISnsConstructProps) {\n\t\tsuper(scope, id);\n\n\t\tthis.topic = new Topic(this, id, props.options?.topicOptions);\n\n\t\t/**\n\t\t * Attach Lambda subscriptions to the topic\n\t\t */\n\t\tif (props.options?.targetFunctions?.length) {\n\t\t\tprops.options.targetFunctions.forEach((targetFunction) => {\n\t\t\t\tthis.topic.addSubscription(\n\t\t\t\t\t/**\n\t\t\t\t\t * Lambda subscription target\n\t\t\t\t\t */\n\t\t\t\t\tnew LambdaSubscription(targetFunction),\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Apply removal policy (useful for non-production environments)\n\t\t */\n\t\tthis.topic.applyRemovalPolicy(RemovalPolicy.DESTROY);\n\n\t\t/**\n\t\t * CloudFormation output exposing the topic ARN\n\t\t */\n\t\tnew CfnOutput(this, 'SnsTopicArn', {\n\t\t\tvalue: this.topic.topicArn,\n\t\t});\n\t}\n}\n","import { App, Stack } from \"aws-cdk-lib\";\n\nimport { IBaseStackProps } from \"../../types\";\nimport { BaseLambdaConstruct, BaseLambdaLayerConstruct, BaseSnsConstruct } from \"../constructs\";\nimport { CustomException } from \"@incloodsolutions/toolkit\";\nimport { ILayerVersion } from \"aws-cdk-lib/aws-lambda\";\nimport { TopicProps } from \"aws-cdk-lib/aws-sns\";\n\nexport class BaseLambdaSnsStack 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\ttopicOptions?: TopicProps;\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 BaseSnsConstruct(this, 'sns', {\n\t\t\toptions: {\n\t\t\t\ttargetFunctions: [lambdaFunction],\n\t\t\t\ttopicOptions: {\n\t\t\t\t\t...props?.stackOptions?.topicOptions,\n\t\t\t\t\ttopicName: props?.stackOptions?.topicOptions?.topicName || props.stackName,\n\t\t\t\t},\n\t\t\t}\n\t\t});\n\n\t}\n}"]}
@@ -0,0 +1,220 @@
1
+ 'use strict';
2
+
3
+ var awsCdkLib = require('aws-cdk-lib');
4
+ var constructs = require('constructs');
5
+ var awsLambda = require('aws-cdk-lib/aws-lambda');
6
+ var toolkit = require('@incloodsolutions/toolkit');
7
+ var awsSqs = require('aws-cdk-lib/aws-sqs');
8
+
9
+ var __defProp = Object.defineProperty;
10
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
11
+ var BaseLambdaConstruct = class extends constructs.Construct {
12
+ static {
13
+ __name(this, "BaseLambdaConstruct");
14
+ }
15
+ /** The created Lambda function instance */
16
+ function;
17
+ /**
18
+ * @param scope Parent construct
19
+ * @param id Unique construct identifier
20
+ * @param props Configuration for Lambda function
21
+ */
22
+ constructor(scope, id, props) {
23
+ super(scope, id);
24
+ const environment = {
25
+ ...props.options?.lambdaOptions?.environment,
26
+ NODE_ENV: props.stage,
27
+ NODE_OPTIONS: "--enable-source-maps",
28
+ AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1"
29
+ };
30
+ toolkit.detectDuplicateProperties({ data: environment });
31
+ this.function = new awsLambda.Function(this, id, {
32
+ ...props?.options?.lambdaOptions,
33
+ /**
34
+ * Lambda function name
35
+ * Defaults to "<stackName>" if not provided
36
+ */
37
+ functionName: `${props?.options?.lambdaOptions?.functionName || props?.stackName}`,
38
+ /**
39
+ * Function description
40
+ */
41
+ description: props?.options?.lambdaOptions?.description || "A lambda function",
42
+ /**
43
+ * Entry handler for the Lambda function
44
+ */
45
+ handler: props?.options?.lambdaOptions?.handler || "lambda.handler",
46
+ /**
47
+ * Runtime environment
48
+ */
49
+ runtime: props?.options?.lambdaOptions?.runtime || awsLambda.Runtime.NODEJS_24_X,
50
+ /**
51
+ * Execution timeout
52
+ * - 30 seconds in production
53
+ * - 15 seconds otherwise
54
+ */
55
+ timeout: props?.options?.lambdaOptions?.timeout || awsCdkLib.Duration.seconds(
56
+ props.stage === toolkit.AppEnvironmentEnum.PRODUCTION ? 30 : 15
57
+ ),
58
+ /**
59
+ * Memory allocation (in MB)
60
+ */
61
+ memorySize: props?.options?.lambdaOptions?.memorySize || 1024,
62
+ /**
63
+ * CPU architecture
64
+ */
65
+ architecture: props?.options?.lambdaOptions?.architecture || awsLambda.Architecture.ARM_64,
66
+ /**
67
+ * Lambda deployment package source
68
+ */
69
+ code: props?.options?.lambdaOptions?.code || awsLambda.Code.fromAsset("dist"),
70
+ /**
71
+ * Final merged environment variables
72
+ */
73
+ environment
74
+ });
75
+ new awsCdkLib.CfnOutput(this, "LambdaFunctionArn", {
76
+ value: this.function.functionArn
77
+ });
78
+ }
79
+ };
80
+ var BaseLambdaLayerConstruct = class extends constructs.Construct {
81
+ static {
82
+ __name(this, "BaseLambdaLayerConstruct");
83
+ }
84
+ /** Newly created Lambda Layer (null if importing existing layer) */
85
+ layer;
86
+ /** Imported Lambda Layer reference (null if creating new layer) */
87
+ existingLayer;
88
+ /**
89
+ * @param scope Parent construct
90
+ * @param id Unique construct identifier
91
+ * @param props Configuration for layer creation or import
92
+ */
93
+ constructor(scope, id, props) {
94
+ super(scope, id);
95
+ if (props?.options?.fromExistingLayerArn) {
96
+ this.existingLayer = awsLambda.LayerVersion.fromLayerVersionArn(
97
+ this,
98
+ `${id}-Arn`,
99
+ props?.options?.fromExistingLayerArn
100
+ );
101
+ } else if (props?.options?.fromExistingLayerAttribute) {
102
+ this.existingLayer = awsLambda.LayerVersion.fromLayerVersionAttributes(
103
+ this,
104
+ `${id}-Attribute`,
105
+ props?.options?.fromExistingLayerAttribute
106
+ );
107
+ } else {
108
+ this.layer = new awsLambda.LayerVersion(this, id, {
109
+ ...props.options?.layerOptions,
110
+ /**
111
+ * Default layer code asset
112
+ */
113
+ code: props?.options?.layerOptions?.code || awsLambda.Code.fromAsset("./dist-layer"),
114
+ /**
115
+ * Layer description
116
+ */
117
+ description: props?.options?.layerOptions?.description || "Lambda Layer written in NodeJS, NestJS, NodeJS-express, serverless-express",
118
+ /**
119
+ * Supported CPU architectures
120
+ */
121
+ compatibleArchitectures: [awsLambda.Architecture.ARM_64, awsLambda.Architecture.X86_64],
122
+ /**
123
+ * Supported runtimes
124
+ */
125
+ compatibleRuntimes: [
126
+ awsLambda.Runtime.NODEJS_22_X,
127
+ awsLambda.Runtime.NODEJS_24_X,
128
+ awsLambda.Runtime.NODEJS_LATEST
129
+ ]
130
+ });
131
+ }
132
+ new awsCdkLib.CfnOutput(this, "LambdaLayerArn", {
133
+ value: props.options?.fromExistingLayerArn || props.options?.fromExistingLayerAttribute ? this.existingLayer.layerVersionArn : this.layer.layerVersionArn
134
+ });
135
+ }
136
+ };
137
+ var BaseSqsConstruct = class extends constructs.Construct {
138
+ static {
139
+ __name(this, "BaseSqsConstruct");
140
+ }
141
+ /** The created SQS queue instance */
142
+ queue;
143
+ /**
144
+ * @param scope Parent construct
145
+ * @param id Unique construct identifier
146
+ * @param props Configuration for queue and Lambda consumers
147
+ */
148
+ constructor(scope, id, props) {
149
+ super(scope, id);
150
+ this.queue = new awsSqs.Queue(this, id, {
151
+ ...props?.options?.queueOptions,
152
+ /**
153
+ * Removal policy applied to the queue
154
+ * Defaults to DESTROY if not explicitly defined
155
+ */
156
+ removalPolicy: props?.options?.queueOptions?.removalPolicy || awsCdkLib.RemovalPolicy.DESTROY
157
+ });
158
+ if (props?.targetFunctions?.length) {
159
+ props.targetFunctions.forEach((targetFunction, index) => {
160
+ new awsLambda.EventSourceMapping(this, `${id}-eventSourceMap${index + 1}`, {
161
+ ...props?.options?.eventSourceMappingOptions,
162
+ /** Target Lambda function */
163
+ target: targetFunction,
164
+ /** Source SQS queue ARN */
165
+ eventSourceArn: this.queue.queueArn,
166
+ /**
167
+ * Retry attempts for failed batch processing
168
+ * Defaults to 3 if not explicitly defined
169
+ */
170
+ retryAttempts: props?.options?.eventSourceMappingOptions?.retryAttempts || 3
171
+ });
172
+ });
173
+ }
174
+ new awsCdkLib.CfnOutput(this, "SqsQueueArn", {
175
+ value: this.queue.queueArn
176
+ });
177
+ }
178
+ };
179
+ var BaseLambdaSqsStack = class extends awsCdkLib.Stack {
180
+ static {
181
+ __name(this, "BaseLambdaSqsStack");
182
+ }
183
+ constructor(scope, id, props) {
184
+ super(scope, id, props);
185
+ let layers = [];
186
+ if (props?.stackOptions?.layerOptions) {
187
+ if (!props.stackOptions?.layerOptions?.name || !props.stackOptions?.layerOptions?.version) {
188
+ throw new toolkit.CustomException("Invalid layer options provided");
189
+ }
190
+ const { existingLayer } = new BaseLambdaLayerConstruct(
191
+ this,
192
+ "layer",
193
+ {
194
+ options: {
195
+ fromExistingLayerArn: `arn:aws:lambda:${props.env?.region}:${props.env?.account}:layer:${props.stackOptions?.layerOptions?.name}:${props.stackOptions?.layerOptions?.version}`
196
+ }
197
+ }
198
+ );
199
+ layers.push(existingLayer);
200
+ }
201
+ const { function: lambdaFunction } = new BaseLambdaConstruct(this, "lambda", {
202
+ stage: props.stackOptions?.stage,
203
+ stackName: props.stackName,
204
+ options: {
205
+ lambdaOptions: { layers }
206
+ }
207
+ });
208
+ new BaseSqsConstruct(this, "sqs", {
209
+ targetFunctions: [lambdaFunction],
210
+ options: {
211
+ eventSourceMappingOptions: {},
212
+ queueOptions: {}
213
+ }
214
+ });
215
+ }
216
+ };
217
+
218
+ exports.BaseLambdaSqsStack = BaseLambdaSqsStack;
219
+ //# sourceMappingURL=lambda-sqs.cjs.map
220
+ //# sourceMappingURL=lambda-sqs.cjs.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","detectDuplicateProperties","Function","Runtime","Duration","AppEnvironmentEnum","Architecture","Code","CfnOutput","LayerVersion","Queue","RemovalPolicy","EventSourceMapping","Stack","CustomException"],"mappings":"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","file":"lambda-sqs.cjs","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}"]}
@@ -0,0 +1,18 @@
1
+ import { Stack, App } from 'aws-cdk-lib';
2
+ import { IBaseStackProps } from '../../aws-types.cjs';
3
+ import '@incloodsolutions/toolkit';
4
+
5
+ declare class BaseLambdaSqsStack extends Stack {
6
+ constructor(scope: App, id: string, props: IBaseStackProps<{
7
+ layerOptions?: {
8
+ name: string;
9
+ version: number;
10
+ };
11
+ lambdaOptions?: {};
12
+ apiGatewayOptions?: {
13
+ version?: 'v1' | 'v2';
14
+ };
15
+ }>);
16
+ }
17
+
18
+ export { BaseLambdaSqsStack };
@@ -0,0 +1,18 @@
1
+ import { Stack, App } from 'aws-cdk-lib';
2
+ import { IBaseStackProps } from '../../aws-types.js';
3
+ import '@incloodsolutions/toolkit';
4
+
5
+ declare class BaseLambdaSqsStack extends Stack {
6
+ constructor(scope: App, id: string, props: IBaseStackProps<{
7
+ layerOptions?: {
8
+ name: string;
9
+ version: number;
10
+ };
11
+ lambdaOptions?: {};
12
+ apiGatewayOptions?: {
13
+ version?: 'v1' | 'v2';
14
+ };
15
+ }>);
16
+ }
17
+
18
+ export { BaseLambdaSqsStack };