@incloodsolutions/devkit 0.0.3 → 0.0.4

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 (206) hide show
  1. package/README.md +150 -41
  2. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.cjs → aws-cdk/api-gateway-v2.cjs} +2 -2
  3. package/dist/aws-cdk/api-gateway-v2.cjs.map +1 -0
  4. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.d.ts → aws-cdk/api-gateway-v2.d.cts} +1 -1
  5. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.d.cts → aws-cdk/api-gateway-v2.d.ts} +1 -1
  6. package/dist/{aws/cdk/constructs/api-gateway-v2-construct.js → aws-cdk/api-gateway-v2.js} +2 -2
  7. package/dist/aws-cdk/api-gateway-v2.js.map +1 -0
  8. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.cjs → aws-cdk/api-gateway-websocket.cjs} +18 -6
  9. package/dist/aws-cdk/api-gateway-websocket.cjs.map +1 -0
  10. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.d.ts → aws-cdk/api-gateway-websocket.d.cts} +1 -1
  11. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.d.cts → aws-cdk/api-gateway-websocket.d.ts} +1 -1
  12. package/dist/{aws/cdk/constructs/api-gateway-websocket-construct.js → aws-cdk/api-gateway-websocket.js} +18 -6
  13. package/dist/aws-cdk/api-gateway-websocket.js.map +1 -0
  14. package/dist/{aws/cdk/constructs/api-gateway-construct.cjs → aws-cdk/api-gateway.cjs} +6 -3
  15. package/dist/aws-cdk/api-gateway.cjs.map +1 -0
  16. package/dist/{aws/cdk/constructs/api-gateway-construct.d.ts → aws-cdk/api-gateway.d.cts} +1 -1
  17. package/dist/{aws/cdk/constructs/api-gateway-construct.d.cts → aws-cdk/api-gateway.d.ts} +1 -1
  18. package/dist/{aws/cdk/constructs/api-gateway-construct.js → aws-cdk/api-gateway.js} +6 -3
  19. package/dist/aws-cdk/api-gateway.js.map +1 -0
  20. package/dist/{aws/cdk/constructs/cloudfront-construct.cjs → aws-cdk/cloudfront.cjs} +2 -2
  21. package/dist/aws-cdk/cloudfront.cjs.map +1 -0
  22. package/dist/{aws/cdk/constructs/cloudfront-construct.d.ts → aws-cdk/cloudfront.d.cts} +1 -1
  23. package/dist/{aws/cdk/constructs/cloudfront-construct.d.cts → aws-cdk/cloudfront.d.ts} +1 -1
  24. package/dist/{aws/cdk/constructs/cloudfront-construct.js → aws-cdk/cloudfront.js} +2 -2
  25. package/dist/aws-cdk/cloudfront.js.map +1 -0
  26. package/dist/{aws/cdk/constructs/cloudwatch-construct.cjs → aws-cdk/cloudwatch.cjs} +2 -2
  27. package/dist/aws-cdk/cloudwatch.cjs.map +1 -0
  28. package/dist/{aws/cdk/constructs/cloudwatch-construct.d.ts → aws-cdk/cloudwatch.d.cts} +1 -1
  29. package/dist/{aws/cdk/constructs/cloudwatch-construct.d.cts → aws-cdk/cloudwatch.d.ts} +1 -1
  30. package/dist/{aws/cdk/constructs/cloudwatch-construct.js → aws-cdk/cloudwatch.js} +2 -2
  31. package/dist/aws-cdk/cloudwatch.js.map +1 -0
  32. package/dist/{aws/cdk/constructs/dynamo-db-construct.cjs → aws-cdk/dynamo-db.cjs} +2 -2
  33. package/dist/aws-cdk/dynamo-db.cjs.map +1 -0
  34. package/dist/{aws/cdk/constructs/dynamo-db-construct.d.ts → aws-cdk/dynamo-db.d.cts} +1 -1
  35. package/dist/{aws/cdk/constructs/dynamo-db-construct.d.cts → aws-cdk/dynamo-db.d.ts} +1 -1
  36. package/dist/{aws/cdk/constructs/dynamo-db-construct.js → aws-cdk/dynamo-db.js} +2 -2
  37. package/dist/aws-cdk/dynamo-db.js.map +1 -0
  38. package/dist/{aws/cdk/constructs/event-bridge-construct.cjs → aws-cdk/event-bridge.cjs} +2 -2
  39. package/dist/aws-cdk/event-bridge.cjs.map +1 -0
  40. package/dist/{aws/cdk/constructs/event-bridge-construct.d.ts → aws-cdk/event-bridge.d.cts} +1 -1
  41. package/dist/{aws/cdk/constructs/event-bridge-construct.d.cts → aws-cdk/event-bridge.d.ts} +1 -1
  42. package/dist/{aws/cdk/constructs/event-bridge-construct.js → aws-cdk/event-bridge.js} +2 -2
  43. package/dist/aws-cdk/event-bridge.js.map +1 -0
  44. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.cjs → aws-cdk/lambda-authorizer-v2.cjs} +6 -3
  45. package/dist/aws-cdk/lambda-authorizer-v2.cjs.map +1 -0
  46. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.d.ts → aws-cdk/lambda-authorizer-v2.d.cts} +1 -1
  47. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.d.cts → aws-cdk/lambda-authorizer-v2.d.ts} +1 -1
  48. package/dist/{aws/cdk/constructs/lambda-authorizer-v2-construct.js → aws-cdk/lambda-authorizer-v2.js} +6 -3
  49. package/dist/aws-cdk/lambda-authorizer-v2.js.map +1 -0
  50. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.cjs → aws-cdk/lambda-authorizer.cjs} +2 -2
  51. package/dist/aws-cdk/lambda-authorizer.cjs.map +1 -0
  52. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.d.ts → aws-cdk/lambda-authorizer.d.cts} +1 -1
  53. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.d.cts → aws-cdk/lambda-authorizer.d.ts} +1 -1
  54. package/dist/{aws/cdk/constructs/lambda-authorizer-construct.js → aws-cdk/lambda-authorizer.js} +2 -2
  55. package/dist/aws-cdk/lambda-authorizer.js.map +1 -0
  56. package/dist/{aws/cdk/constructs/lambda-layer-construct.cjs → aws-cdk/lambda-layer.cjs} +3 -6
  57. package/dist/aws-cdk/lambda-layer.cjs.map +1 -0
  58. package/dist/{aws/cdk/constructs/lambda-layer-construct.d.ts → aws-cdk/lambda-layer.d.cts} +1 -1
  59. package/dist/{aws/cdk/constructs/lambda-layer-construct.d.cts → aws-cdk/lambda-layer.d.ts} +1 -1
  60. package/dist/{aws/cdk/constructs/lambda-layer-construct.js → aws-cdk/lambda-layer.js} +3 -6
  61. package/dist/aws-cdk/lambda-layer.js.map +1 -0
  62. package/dist/{aws/cdk/constructs/lambda-construct.cjs → aws-cdk/lambda.cjs} +2 -2
  63. package/dist/aws-cdk/lambda.cjs.map +1 -0
  64. package/dist/{aws/cdk/constructs/lambda-construct.d.ts → aws-cdk/lambda.d.cts} +1 -1
  65. package/dist/{aws/cdk/constructs/lambda-construct.d.cts → aws-cdk/lambda.d.ts} +1 -1
  66. package/dist/{aws/cdk/constructs/lambda-construct.js → aws-cdk/lambda.js} +2 -2
  67. package/dist/aws-cdk/lambda.js.map +1 -0
  68. package/dist/{aws/cdk/constructs/role-policy-construct.cjs → aws-cdk/role-policy.cjs} +2 -2
  69. package/dist/aws-cdk/role-policy.cjs.map +1 -0
  70. package/dist/{aws/cdk/constructs/role-policy-construct.d.ts → aws-cdk/role-policy.d.cts} +1 -1
  71. package/dist/{aws/cdk/constructs/role-policy-construct.d.cts → aws-cdk/role-policy.d.ts} +1 -1
  72. package/dist/{aws/cdk/constructs/role-policy-construct.js → aws-cdk/role-policy.js} +2 -2
  73. package/dist/aws-cdk/role-policy.js.map +1 -0
  74. package/dist/{aws/cdk/constructs/s3-deployment-construct.cjs → aws-cdk/s3-deployment.cjs} +20 -11
  75. package/dist/aws-cdk/s3-deployment.cjs.map +1 -0
  76. package/dist/{aws/cdk/constructs/s3-deployment-construct.d.ts → aws-cdk/s3-deployment.d.cts} +1 -1
  77. package/dist/{aws/cdk/constructs/s3-deployment-construct.d.cts → aws-cdk/s3-deployment.d.ts} +1 -1
  78. package/dist/{aws/cdk/constructs/s3-deployment-construct.js → aws-cdk/s3-deployment.js} +20 -11
  79. package/dist/aws-cdk/s3-deployment.js.map +1 -0
  80. package/dist/{aws/cdk/constructs/s3-construct.cjs → aws-cdk/s3.cjs} +2 -2
  81. package/dist/aws-cdk/s3.cjs.map +1 -0
  82. package/dist/{aws/cdk/constructs/s3-construct.d.ts → aws-cdk/s3.d.cts} +1 -1
  83. package/dist/{aws/cdk/constructs/s3-construct.d.cts → aws-cdk/s3.d.ts} +1 -1
  84. package/dist/{aws/cdk/constructs/s3-construct.js → aws-cdk/s3.js} +2 -2
  85. package/dist/aws-cdk/s3.js.map +1 -0
  86. package/dist/{aws/cdk/constructs/sns-construct.cjs → aws-cdk/sns.cjs} +2 -2
  87. package/dist/aws-cdk/sns.cjs.map +1 -0
  88. package/dist/{aws/cdk/constructs/sns-construct.d.ts → aws-cdk/sns.d.cts} +1 -1
  89. package/dist/{aws/cdk/constructs/sns-construct.d.cts → aws-cdk/sns.d.ts} +1 -1
  90. package/dist/{aws/cdk/constructs/sns-construct.js → aws-cdk/sns.js} +2 -2
  91. package/dist/aws-cdk/sns.js.map +1 -0
  92. package/dist/{aws/cdk/constructs/sqs-construct.cjs → aws-cdk/sqs.cjs} +2 -2
  93. package/dist/aws-cdk/sqs.cjs.map +1 -0
  94. package/dist/{aws/cdk/constructs/sqs-construct.d.ts → aws-cdk/sqs.d.cts} +1 -1
  95. package/dist/{aws/cdk/constructs/sqs-construct.d.cts → aws-cdk/sqs.d.ts} +1 -1
  96. package/dist/{aws/cdk/constructs/sqs-construct.js → aws-cdk/sqs.js} +2 -2
  97. package/dist/aws-cdk/sqs.js.map +1 -0
  98. package/dist/{aws/cdk/constructs/vpc-construct.cjs → aws-cdk/vpc.cjs} +2 -2
  99. package/dist/aws-cdk/vpc.cjs.map +1 -0
  100. package/dist/{aws/cdk/constructs/vpc-construct.d.ts → aws-cdk/vpc.d.cts} +1 -1
  101. package/dist/{aws/cdk/constructs/vpc-construct.d.cts → aws-cdk/vpc.d.ts} +1 -1
  102. package/dist/{aws/cdk/constructs/vpc-construct.js → aws-cdk/vpc.js} +2 -2
  103. package/dist/aws-cdk/vpc.js.map +1 -0
  104. package/dist/{aws/index.cjs → aws-cdk.cjs} +45 -21
  105. package/dist/aws-cdk.cjs.map +1 -0
  106. package/dist/aws-cdk.d.cts +34 -0
  107. package/dist/aws-cdk.d.ts +34 -0
  108. package/dist/{aws/cdk/constructs/index.js → aws-cdk.js} +45 -21
  109. package/dist/aws-cdk.js.map +1 -0
  110. package/dist/aws-types.cjs +4 -0
  111. package/dist/aws-types.cjs.map +1 -0
  112. package/dist/aws-types.d.cts +42 -0
  113. package/dist/aws-types.d.ts +42 -0
  114. package/dist/aws-types.js +3 -0
  115. package/dist/aws-types.js.map +1 -0
  116. package/dist/{aws/cdk/constructs/index.cjs → aws.cjs} +45 -21
  117. package/dist/aws.cjs.map +1 -0
  118. package/dist/aws.d.cts +34 -0
  119. package/dist/aws.d.ts +34 -0
  120. package/dist/{aws/index.js → aws.js} +45 -21
  121. package/dist/aws.js.map +1 -0
  122. package/dist/index.cjs +43 -19
  123. package/dist/index.cjs.map +1 -1
  124. package/dist/index.d.cts +18 -18
  125. package/dist/index.d.ts +18 -18
  126. package/dist/index.js +43 -19
  127. package/dist/index.js.map +1 -1
  128. package/package.json +180 -23
  129. package/dist/aws/cdk/constructs/api-gateway-construct.cjs.map +0 -1
  130. package/dist/aws/cdk/constructs/api-gateway-construct.js.map +0 -1
  131. package/dist/aws/cdk/constructs/api-gateway-v2-construct.cjs.map +0 -1
  132. package/dist/aws/cdk/constructs/api-gateway-v2-construct.js.map +0 -1
  133. package/dist/aws/cdk/constructs/api-gateway-websocket-construct.cjs.map +0 -1
  134. package/dist/aws/cdk/constructs/api-gateway-websocket-construct.js.map +0 -1
  135. package/dist/aws/cdk/constructs/cloudfront-construct.cjs.map +0 -1
  136. package/dist/aws/cdk/constructs/cloudfront-construct.js.map +0 -1
  137. package/dist/aws/cdk/constructs/cloudwatch-construct.cjs.map +0 -1
  138. package/dist/aws/cdk/constructs/cloudwatch-construct.js.map +0 -1
  139. package/dist/aws/cdk/constructs/dynamo-db-construct.cjs.map +0 -1
  140. package/dist/aws/cdk/constructs/dynamo-db-construct.js.map +0 -1
  141. package/dist/aws/cdk/constructs/event-bridge-construct.cjs.map +0 -1
  142. package/dist/aws/cdk/constructs/event-bridge-construct.js.map +0 -1
  143. package/dist/aws/cdk/constructs/index.cjs.map +0 -1
  144. package/dist/aws/cdk/constructs/index.d.cts +0 -34
  145. package/dist/aws/cdk/constructs/index.d.ts +0 -34
  146. package/dist/aws/cdk/constructs/index.js.map +0 -1
  147. package/dist/aws/cdk/constructs/lambda-authorizer-construct.cjs.map +0 -1
  148. package/dist/aws/cdk/constructs/lambda-authorizer-construct.js.map +0 -1
  149. package/dist/aws/cdk/constructs/lambda-authorizer-v2-construct.cjs.map +0 -1
  150. package/dist/aws/cdk/constructs/lambda-authorizer-v2-construct.js.map +0 -1
  151. package/dist/aws/cdk/constructs/lambda-construct.cjs.map +0 -1
  152. package/dist/aws/cdk/constructs/lambda-construct.js.map +0 -1
  153. package/dist/aws/cdk/constructs/lambda-layer-construct.cjs.map +0 -1
  154. package/dist/aws/cdk/constructs/lambda-layer-construct.js.map +0 -1
  155. package/dist/aws/cdk/constructs/role-policy-construct.cjs.map +0 -1
  156. package/dist/aws/cdk/constructs/role-policy-construct.js.map +0 -1
  157. package/dist/aws/cdk/constructs/s3-construct.cjs.map +0 -1
  158. package/dist/aws/cdk/constructs/s3-construct.js.map +0 -1
  159. package/dist/aws/cdk/constructs/s3-deployment-construct.cjs.map +0 -1
  160. package/dist/aws/cdk/constructs/s3-deployment-construct.js.map +0 -1
  161. package/dist/aws/cdk/constructs/sns-construct.cjs.map +0 -1
  162. package/dist/aws/cdk/constructs/sns-construct.js.map +0 -1
  163. package/dist/aws/cdk/constructs/sqs-construct.cjs.map +0 -1
  164. package/dist/aws/cdk/constructs/sqs-construct.js.map +0 -1
  165. package/dist/aws/cdk/constructs/vpc-construct.cjs.map +0 -1
  166. package/dist/aws/cdk/constructs/vpc-construct.js.map +0 -1
  167. package/dist/aws/cdk/index.cjs +0 -881
  168. package/dist/aws/cdk/index.cjs.map +0 -1
  169. package/dist/aws/cdk/index.d.cts +0 -34
  170. package/dist/aws/cdk/index.d.ts +0 -34
  171. package/dist/aws/cdk/index.js +0 -863
  172. package/dist/aws/cdk/index.js.map +0 -1
  173. package/dist/aws/cli/index.cjs +0 -4
  174. package/dist/aws/cli/index.cjs.map +0 -1
  175. package/dist/aws/cli/index.d.cts +0 -2
  176. package/dist/aws/cli/index.d.ts +0 -2
  177. package/dist/aws/cli/index.js +0 -3
  178. package/dist/aws/cli/index.js.map +0 -1
  179. package/dist/aws/index.cjs.map +0 -1
  180. package/dist/aws/index.d.cts +0 -34
  181. package/dist/aws/index.d.ts +0 -34
  182. package/dist/aws/index.js.map +0 -1
  183. package/dist/aws/types/index.cjs +0 -4
  184. package/dist/aws/types/index.cjs.map +0 -1
  185. package/dist/aws/types/index.d.cts +0 -18
  186. package/dist/aws/types/index.d.ts +0 -18
  187. package/dist/aws/types/index.js +0 -3
  188. package/dist/aws/types/index.js.map +0 -1
  189. package/dist/lint/index.cjs +0 -4
  190. package/dist/lint/index.cjs.map +0 -1
  191. package/dist/lint/index.d.cts +0 -2
  192. package/dist/lint/index.d.ts +0 -2
  193. package/dist/lint/index.js +0 -3
  194. package/dist/lint/index.js.map +0 -1
  195. package/dist/prettier/index.cjs +0 -4
  196. package/dist/prettier/index.cjs.map +0 -1
  197. package/dist/prettier/index.d.cts +0 -2
  198. package/dist/prettier/index.d.ts +0 -2
  199. package/dist/prettier/index.js +0 -3
  200. package/dist/prettier/index.js.map +0 -1
  201. package/dist/utility/index.cjs +0 -4
  202. package/dist/utility/index.cjs.map +0 -1
  203. package/dist/utility/index.d.cts +0 -2
  204. package/dist/utility/index.d.ts +0 -2
  205. package/dist/utility/index.js +0 -3
  206. package/dist/utility/index.js.map +0 -1
package/README.md CHANGED
@@ -1,58 +1,167 @@
1
1
  # @incloodsolutions/devkit
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/@incloodsolutions/devkit.svg?style=for-the-badge)](https://www.npmjs.com/package/@incloodsolutions/devkit)
4
- [![npm dm](https://img.shields.io/npm/dm/@incloodsolutions/devkit.svg?style=for-the-badge)](https://www.npmjs.com/package/@incloodsolutions/devkit)
5
- [![downloads](https://img.shields.io/npm/dt/@incloodsolutions/devkit.svg?style=for-the-badge)](https://www.npmjs.com/package/@incloodsolutions/devkit)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@incloodsolutions/devkit.svg?style=for-the-badge)](https://www.npmjs.com/package/@incloodsolutions/devkit)
6
5
  [![license](https://img.shields.io/npm/l/@incloodsolutions/devkit.svg?style=for-the-badge)](https://www.npmjs.com/package/@incloodsolutions/devkit)
7
6
 
8
- A comprehensive development toolkit for Node.js and TypeScript applications. It provides reusable development utilities, configuration helpers, AWS CDK constructs and stacks, build tooling, project scaffolding, and other resources to simplify modern application development and infrastructure management.
7
+ Opinionated **AWS CDK v2 constructs** with sensible defaults for building serverless
8
+ applications. Each construct wraps one or more `aws-cdk-lib` resources, applies defaults
9
+ (ARM64, current Node.js runtime, source maps, stage-based timeouts, CloudFormation
10
+ outputs), and exposes the underlying resource for further customisation.
11
+
12
+ > For a one-line index of every construct and type in this package (and the other
13
+ > toolkits), see [`../docs/AI-INDEX.md`](../docs/AI-INDEX.md). Every construct, its props
14
+ > interface, and the created resource fields carry inline TSDoc comments describing the
15
+ > applied defaults.
9
16
 
10
17
  ---
11
18
 
12
- ## 📦 Installation
19
+ ## Installation
13
20
 
14
21
  ```bash
15
- npm install @incloodsolutions/devkit
16
- # or
17
- yarn add @incloodsolutions/devkit
22
+ npm install @incloodsolutions/devkit aws-cdk-lib constructs
18
23
  ```
19
24
 
20
- ## 🚀 Usage
25
+ Depends on `aws-cdk-lib`, `constructs`, `esbuild`, and
26
+ [`@incloodsolutions/toolkit`](../toolkit).
27
+
28
+ > **Scope note.** Only the AWS CDK constructs and their types are currently exported. The
29
+ > `src/utility`, `src/lint`, `src/prettier`, and `src/aws/cli` folders are placeholders and
30
+ > export nothing yet, despite what older documentation suggested.
31
+
32
+ ## Common props
33
+
34
+ Every construct constructor is `new XxxConstruct(scope, id, props)`. `props` is based on
35
+ `IBaseCdkConstructProps`:
21
36
 
22
37
  ```typescript
23
- import { EnvironmentHelper } from "@incloodsolutions/devkit";
38
+ interface IBaseCdkConstructProps<TOptions = any> {
39
+ readonly stage?: AppEnvironmentType; // 'production' | 'staging' | 'qa' | ...
40
+ readonly options?: TOptions; // the service-specific options (see each construct)
41
+ readonly stackName?: string;
42
+ readonly appName?: string;
43
+ readonly enableDebug?: boolean;
44
+ }
45
+ ```
46
+
47
+ The created resource is exposed as a public readonly field (`.function`, `.api`, `.table`,
48
+ `.topic`, `.queue`, `.layer`, `.distribution`, ...).
49
+
50
+ ## Modular imports (tree-shaking)
51
+
52
+ **There is no package-root import.** `import ... from '@incloodsolutions/devkit'` does not
53
+ resolve — you must import a specific subpath. Every construct is published as its own
54
+ subpath, so a stack that uses one construct does not bundle the code for all seventeen:
24
55
 
25
- // Example usage
26
- const env = EnvironmentHelper.load();
56
+ ```typescript
57
+ import { BaseLambdaConstruct } from '@incloodsolutions/devkit/aws-cdk/lambda';
58
+ import { BaseDynamoDBConstruct } from '@incloodsolutions/devkit/aws-cdk/dynamo-db';
59
+ import type { IBaseCdkConstructProps } from '@incloodsolutions/devkit/aws-types';
27
60
  ```
28
61
 
29
- ## Features
30
-
31
- - ⚙️ Node.js development utilities
32
- - 📝 Configuration management
33
- - 🏗️ AWS CDK constructs
34
- - ☁️ Reusable AWS CDK stacks
35
- - 🛠️ Infrastructure helpers
36
- - 🔐 IAM, Route53, ACM, Lambda, API Gateway, S3 & DynamoDB utilities
37
- - 🏷️ Resource naming & tagging helpers
38
- - 📁 Project templates & scaffolding
39
- - 🧩 Build & release utilities
40
- - 🔧 Development tooling and helpers
41
- - 💙 First-class TypeScript support
42
-
43
- ## 🎯 Goals
44
-
45
- - Reduce development and infrastructure boilerplate
46
- - Standardise project structure and configuration
47
- - Promote reusable infrastructure components
48
- - Simplify AWS CDK development
49
- - Improve developer productivity
50
- - Encourage consistency across projects
51
- - Provide sensible defaults while remaining extensible
52
-
53
- ## 📚 Part of the IncloodSolutions Toolkit Ecosystem
54
-
55
- - **@incloodsolutions/toolkit** Core utilities and shared helpers
56
- - **@incloodsolutions/node-toolkit** Node.js runtime and backend utilities
57
- - **@incloodsolutions/toolkit-react** React utilities and components
58
- - **@incloodsolutions/devkit** Development tooling, configuration, AWS CDK constructs, stacks, and infrastructure utilities
62
+ | Subpath | Contents |
63
+ | ------- | -------- |
64
+ | `.../aws` · `.../aws-cdk` | all `Base*` constructs |
65
+ | `.../aws-cdk/<name>` | one construct — `api-gateway`, `api-gateway-v2`, `api-gateway-websocket`, `cloudfront`, `cloudwatch`, `dynamo-db`, `event-bridge`, `lambda`, `lambda-authorizer`, `lambda-authorizer-v2`, `lambda-layer`, `role-policy`, `s3`, `s3-deployment`, `sns`, `sqs`, `vpc` |
66
+ | `.../aws-types` | `IBaseConstruct`, `IBaseCdkConstructProps` |
67
+
68
+ Every subpath resolves ESM (`import`), CommonJS (`require`), and its own `.d.ts`.
69
+ `aws-cdk-lib` and `constructs` stay external in every bundle.
70
+
71
+ ## Constructs
72
+
73
+ | Construct | Wraps | Notable defaults |
74
+ | --------- | ----- | ---------------- |
75
+ | `BaseLambdaConstruct` | `aws-lambda.Function` | Node.js 24, ARM64, 1024 MB, `Code.fromAsset('dist')`, handler `lambda.handler`, timeout 30 s (prod) / 15 s, `--enable-source-maps`, injects `NODE_ENV` from `stage`, validates env vars for duplicates. Exposes `.function`. |
76
+ | `BaseLambdaLayerConstruct` | `aws-lambda.LayerVersion` | Create new or import via `fromExistingLayerArn` / `fromExistingLayerAttribute`. Exposes `.layer` / `.existingLayer`. |
77
+ | `BaseApiGatewayConstruct` | `aws-apigateway.RestApi` | REST API with Lambda proxy integration and permissive CORS. |
78
+ | `BaseApiGatewayV2Construct` | `aws-apigatewayv2.HttpApi` | HTTP API; takes `handlerFunctions` and `routeOptions`. Exposes `.api`. |
79
+ | `BaseApiGatewayWebSocketConstruct` | `aws-apigatewayv2.WebSocketApi` + `WebSocketStage` | Lambda route integrations for `$connect` / `$disconnect` / custom routes. |
80
+ | `BaseLambdaAuthoriserConstruct` | `aws-apigateway.TokenAuthorizer` | REST API token authorizer backed by a Lambda. |
81
+ | `BaseLambdaAuthoriserV2Construct` | `aws-apigatewayv2-authorizers.HttpLambdaAuthorizer` | HTTP API Lambda authorizer. |
82
+ | `BaseDynamoDBConstruct` | `aws-dynamodb.Table` | Create new or import (`fromExistingTableArn` / `Name` / `Attributes`); `globalSecondaryIndexes` / `localSecondaryIndexes`. Exposes `.table` / `.existingTable`. |
83
+ | `BaseS3Construct` | `aws-s3.Bucket` | Bucket with defaults. |
84
+ | `BaseS3DeploymentConstruct` | S3 `Bucket` + CloudFront `Distribution` + `BucketDeployment` | Static-site deploy; toggles `withS3Bucket` / `withCloudfront`; `bucketDeploymentOptions.sources` required. |
85
+ | `BaseCloudfrontConstruct` | `aws-cloudfront.Distribution` | Distribution with `ViewerProtocolPolicy` default. |
86
+ | `BaseCloudwatchLogGroupConstruct` | `aws-logs.LogGroup` | Log group with retention. |
87
+ | `BaseSnsConstruct` | `aws-sns.Topic` | Optional `targetFunctions` as `LambdaSubscription`. Exposes `.topic`. |
88
+ | `BaseSqsConstruct` | `aws-sqs.Queue` | Optional Lambda `EventSourceMapping`. Exposes `.queue`. |
89
+ | `BaseEventBridgeConstruct` | `aws-events.Rule` | Rule with a Lambda target. |
90
+ | `BaseVpcConstruct` | `aws-ec2.Vpc` | VPC with defaults. |
91
+ | `BaseRolePolicyConstruct` | `aws-iam.Role` + `PolicyStatement` / `ManagedPolicy` | IAM role and policy helper. |
92
+
93
+ ## Types
94
+
95
+ | Symbol | Summary |
96
+ | ------ | ------- |
97
+ | `IBaseConstruct` | extends `IBaseEnableDebug`. |
98
+ | `IBaseCdkConstructProps<TOptions>` | shared construct props (see above). |
99
+
100
+ ## Usage
101
+
102
+ ```typescript
103
+ import { Stack, StackProps } from 'aws-cdk-lib';
104
+ import { Construct } from 'constructs';
105
+ import { BaseLambdaConstruct } from '@incloodsolutions/devkit/aws-cdk/lambda';
106
+ import { BaseApiGatewayV2Construct } from '@incloodsolutions/devkit/aws-cdk/api-gateway-v2';
107
+ import { BaseDynamoDBConstruct } from '@incloodsolutions/devkit/aws-cdk/dynamo-db';
108
+
109
+ export class ApiStack extends Stack {
110
+ constructor(scope: Construct, id: string, props?: StackProps) {
111
+ super(scope, id, props);
112
+
113
+ const table = new BaseDynamoDBConstruct(this, 'Table', {
114
+ stage: 'production',
115
+ stackName: this.stackName,
116
+ options: { tableOptions: { partitionKey: { name: 'id', type: AttributeType.STRING } } },
117
+ });
118
+
119
+ const handler = new BaseLambdaConstruct(this, 'Handler', {
120
+ stage: 'production',
121
+ stackName: this.stackName,
122
+ options: { lambdaOptions: { environment: { TABLE_NAME: table.table.tableName } } },
123
+ });
124
+
125
+ table.table.grantReadWriteData(handler.function);
126
+
127
+ new BaseApiGatewayV2Construct(this, 'Api', {
128
+ stage: 'production',
129
+ stackName: this.stackName,
130
+ options: {
131
+ handlerFunctions: [handler.function],
132
+ routeOptions: [{ path: '/{proxy+}' }],
133
+ },
134
+ });
135
+ }
136
+ }
137
+ ```
138
+
139
+ ## Development
140
+
141
+ ```bash
142
+ npm install
143
+ npm run build # tsup: bundles ESM + CJS and a single dist/index.d.ts
144
+ npm run format # prettier --write (tabs, single quotes, trailing commas)
145
+ npm run lint # eslint --fix
146
+ npm test # vitest run — synthesises every construct and asserts its CloudFormation
147
+ npm run test:watch # vitest in watch mode
148
+ npm run package # build, then npm pack a tarball
149
+ ```
150
+
151
+ [`test/constructs.spec.ts`](./test/constructs.spec.ts) instantiates each `Base*` construct
152
+ in a throwaway `Stack` and checks the output with `aws-cdk-lib/assertions` (`Template`).
153
+ Nothing is deployed and no AWS credentials are used. Its header comment records the
154
+ constructs that need extra props or currently throw.
155
+ [`test/esm-bundle.spec.ts`](./test/esm-bundle.spec.ts) guards that every subpath entry is
156
+ built, loads as ESM, and keeps `aws-cdk-lib` / `constructs` external.
157
+
158
+ > The whole build is `tsup` (`dts: true`), pinned to `typescript@^6`. There is **no root
159
+ > export** and no `main`/`module`/`types` fields — every module and every construct is a
160
+ > `./*` subpath in `exports` (see [Modular imports](#modular-imports-tree-shaking)),
161
+ > configured by the `entry` map in `tsup.config.ts` and `exports` + `typesVersions` in
162
+ > `package.json`. The `index` bundle is still built as the test aggregation point but is
163
+ > not reachable by the package name.
164
+
165
+ ## License
166
+
167
+ MIT © Inclood Solutions
@@ -73,5 +73,5 @@ var BaseApiGatewayV2Construct = class extends constructs.Construct {
73
73
  };
74
74
 
75
75
  exports.BaseApiGatewayV2Construct = BaseApiGatewayV2Construct;
76
- //# sourceMappingURL=api-gateway-v2-construct.cjs.map
77
- //# sourceMappingURL=api-gateway-v2-construct.cjs.map
76
+ //# sourceMappingURL=api-gateway-v2.cjs.map
77
+ //# sourceMappingURL=api-gateway-v2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/api-gateway-v2-construct.ts"],"names":["Construct","HttpApi","CorsHttpMethod","CustomException","HttpLambdaIntegration","RemovalPolicy","CfnOutput"],"mappings":";;;;;;;;;;AAsDO,IAAM,yBAAA,GAAN,cACEA,oBAAA,CAET;AAAA,EAzDA;AAyDA,IAAA,MAAA,CAAA,IAAA,EAAA,2BAAA,CAAA;AAAA;AAAA;AAAA,EAEU,GAAA;AAAA;AAAA,EAGT,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,WAAA,CACC,KAAA,EACA,EAAA,EACA,KAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAEf,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,WAAA;AAEzB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAIC,uBAAA,CAAQ,IAAA,EAAM,EAAA,EAAI;AAAA,MAChC,GAAG,OAAO,OAAA,EAAS,cAAA;AAAA;AAAA,MAGnB,WAAA,EACC,KAAA,EAAO,OAAA,EAAS,cAAA,EAAgB,WAAA,IAChC,+BAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMD,aAAA,EAAe;AAAA,QACd,GAAG,KAAA,CAAM,OAAA,EAAS,cAAA,EAAgB,aAAA;AAAA;AAAA,QAGlC,YAAA,EACC,MAAM,OAAA,EAAS,cAAA,EAAgB,eAAe,YAAA,IAC9C,MAAA,CAAO,OAAOC,8BAAc,CAAA;AAAA;AAAA,QAG7B,YAAA,EAAc;AAAA,UACb,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,eAAA;AAAA,UACA,WAAA;AAAA,UACA,sBAAA;AAAA,UACA,kBAAA;AAAA,UACA,GAAI,KAAA,CAAM,OAAA,EAAS,cAAA,EAAgB,aAAA,EAAe,gBAAgB;AAAC;AACpE;AACD,KACA,CAAA;AAKD,IAAA,IAAI,CAAC,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAQ;AACrC,MAAA,MAAM,IAAIC,wBAAgB,yCAAyC,CAAA;AAAA,IACpE;AAKA,IAAA,IAAI,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ;AACzC,MAAA,KAAA,CAAM,gBAAA,CAAiB,OAAA,CAAQ,CAAC,WAAA,KAAgB;AAC/C,QAAA,KAAA,EAAO,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC/C,UAAA,IAAA,CAAK,IAAI,SAAA,CAAU;AAAA,YAClB,GAAG,KAAA;AAAA;AAAA;AAAA;AAAA,YAKH,WAAA,EAAa,IAAIC,iDAAA,CAAsB,QAAA,EAAU,WAAW;AAAA,WACxC,CAAA;AAAA,QACtB,CAAC,CAAA;AAAA,MACF,CAAC,CAAA;AAAA,IACF;AAKA,IAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAmBC,uBAAA,CAAc,OAAO,CAAA;AAKjD,IAAA,IAAIC,mBAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,MACnC,KAAA,EAAO,KAAK,GAAA,CAAI;AAAA,KAChB,CAAA;AAAA,EACF;AACD","file":"api-gateway-v2.cjs","sourcesContent":["import { Construct } from 'constructs';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { CfnOutput, RemovalPolicy } from 'aws-cdk-lib';\nimport { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport {\n\tAddRoutesOptions,\n\tCorsHttpMethod,\n\tHttpApi,\n\tHttpApiProps,\n} from 'aws-cdk-lib/aws-apigatewayv2';\n\nimport { CustomException } from '@incloodsolutions/toolkit';\nimport { IBaseCdkConstructProps, IBaseConstruct } from '../../types';\n\n/**\n * Properties for configuring the API Gateway v2 construct\n *\n * Extends base CDK construct props and provides configuration for:\n * - HTTP API (Api Gateway v2)\n * - Route definitions\n * - Lambda handlers\n */\ninterface IApiGatewayV2ConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** HTTP API configuration options */\n\t\treadonly gatewayOptions: HttpApiProps;\n\n\t\t/** Route definitions passed directly to `addRoutes` */\n\t\treadonly routeOptions: Partial<AddRoutesOptions>[];\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda functions used as route handlers\n\t *\n\t * Note:\n\t * Each handler is paired with each route during route creation\n\t */\n\treadonly handlerFunctions: Function[];\n}\n\n/**\n * CDK construct for creating an API Gateway v2 (HTTP API)\n *\n * Responsibilities:\n * - Creates an HTTP API with optional custom configuration\n * - Applies default CORS configuration when not provided\n * - Attaches routes with Lambda integrations\n * - Exposes API URL as a CloudFormation output\n *\n * Behaviour:\n * - Each route is registered for every provided handler function\n * - Throws if no handler functions are supplied\n */\nexport class BaseApiGatewayV2Construct\n\textends Construct\n\timplements IBaseConstruct\n{\n\t/** The created HTTP API instance */\n\treadonly api: HttpApi;\n\n\t/** Enables debug logging (if used externally) */\n\tenableDebug = false;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for API, routes, and handlers\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops: IApiGatewayV2ConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\tthis.enableDebug = props.enableDebug;\n\n\t\tthis.api = new HttpApi(this, id, {\n\t\t\t...props?.options?.gatewayOptions,\n\n\t\t\t/** Default API description if not provided */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.gatewayOptions?.description ||\n\t\t\t\t'This is an Http API using CDK',\n\n\t\t\t/**\n\t\t\t * CORS configuration\n\t\t\t * Falls back to allowing all methods and standard headers if not explicitly defined\n\t\t\t */\n\t\t\tcorsPreflight: {\n\t\t\t\t...props.options?.gatewayOptions?.corsPreflight,\n\n\t\t\t\t/** Allow all HTTP methods by default */\n\t\t\t\tallowMethods:\n\t\t\t\t\tprops.options?.gatewayOptions?.corsPreflight?.allowMethods ||\n\t\t\t\t\tObject.values(CorsHttpMethod),\n\n\t\t\t\t/** Merge default headers with user-defined headers */\n\t\t\t\tallowHeaders: [\n\t\t\t\t\t'Content-Type',\n\t\t\t\t\t'Accept',\n\t\t\t\t\t'X-Amz-Date',\n\t\t\t\t\t'Authorization',\n\t\t\t\t\t'X-Api-Key',\n\t\t\t\t\t'X-Amz-Security-Token',\n\t\t\t\t\t'X-Amz-User-Agent',\n\t\t\t\t\t...(props.options?.gatewayOptions?.corsPreflight?.allowHeaders || []),\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\n\t\t/**\n\t\t * Ensure at least one handler function is provided\n\t\t */\n\t\tif (!props?.handlerFunctions?.length) {\n\t\t\tthrow new CustomException('Construct requires atleast one function');\n\t\t}\n\n\t\t/**\n\t\t * Register routes with Lambda integrations\n\t\t */\n\t\tif (props?.options?.routeOptions?.length) {\n\t\t\tprops.handlerFunctions.forEach((handlerFunc) => {\n\t\t\t\tprops?.options?.routeOptions.forEach((route) => {\n\t\t\t\t\tthis.api.addRoutes({\n\t\t\t\t\t\t...route,\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Lambda integration for each route\n\t\t\t\t\t\t */\n\t\t\t\t\t\tintegration: new HttpLambdaIntegration('routes', handlerFunc),\n\t\t\t\t\t} as AddRoutesOptions);\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.api.applyRemovalPolicy(RemovalPolicy.DESTROY);\n\n\t\t/**\n\t\t * CloudFormation output exposing the API base URL\n\t\t */\n\t\tnew CfnOutput(this, 'ApiGatewayV2', {\n\t\t\tvalue: this.api.url,\n\t\t});\n\t}\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { Function } from 'aws-cdk-lib/aws-lambda';
3
3
  import { HttpApi, HttpApiProps, AddRoutesOptions } from 'aws-cdk-lib/aws-apigatewayv2';
4
- import { IBaseConstruct, IBaseCdkConstructProps } from '../../types/index.js';
4
+ import { IBaseConstruct, IBaseCdkConstructProps } from '../aws-types.cjs';
5
5
  import '@incloodsolutions/toolkit';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { Function } from 'aws-cdk-lib/aws-lambda';
3
3
  import { HttpApi, HttpApiProps, AddRoutesOptions } from 'aws-cdk-lib/aws-apigatewayv2';
4
- import { IBaseConstruct, IBaseCdkConstructProps } from '../../types/index.cjs';
4
+ import { IBaseConstruct, IBaseCdkConstructProps } from '../aws-types.js';
5
5
  import '@incloodsolutions/toolkit';
6
6
 
7
7
  /**
@@ -71,5 +71,5 @@ var BaseApiGatewayV2Construct = class extends Construct {
71
71
  };
72
72
 
73
73
  export { BaseApiGatewayV2Construct };
74
- //# sourceMappingURL=api-gateway-v2-construct.js.map
75
- //# sourceMappingURL=api-gateway-v2-construct.js.map
74
+ //# sourceMappingURL=api-gateway-v2.js.map
75
+ //# sourceMappingURL=api-gateway-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/api-gateway-v2-construct.ts"],"names":[],"mappings":";;;;;;;;AAsDO,IAAM,yBAAA,GAAN,cACE,SAAA,CAET;AAAA,EAzDA;AAyDA,IAAA,MAAA,CAAA,IAAA,EAAA,2BAAA,CAAA;AAAA;AAAA;AAAA,EAEU,GAAA;AAAA;AAAA,EAGT,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOd,WAAA,CACC,KAAA,EACA,EAAA,EACA,KAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAEf,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,WAAA;AAEzB,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,OAAA,CAAQ,IAAA,EAAM,EAAA,EAAI;AAAA,MAChC,GAAG,OAAO,OAAA,EAAS,cAAA;AAAA;AAAA,MAGnB,WAAA,EACC,KAAA,EAAO,OAAA,EAAS,cAAA,EAAgB,WAAA,IAChC,+BAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMD,aAAA,EAAe;AAAA,QACd,GAAG,KAAA,CAAM,OAAA,EAAS,cAAA,EAAgB,aAAA;AAAA;AAAA,QAGlC,YAAA,EACC,MAAM,OAAA,EAAS,cAAA,EAAgB,eAAe,YAAA,IAC9C,MAAA,CAAO,OAAO,cAAc,CAAA;AAAA;AAAA,QAG7B,YAAA,EAAc;AAAA,UACb,cAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA,eAAA;AAAA,UACA,WAAA;AAAA,UACA,sBAAA;AAAA,UACA,kBAAA;AAAA,UACA,GAAI,KAAA,CAAM,OAAA,EAAS,cAAA,EAAgB,aAAA,EAAe,gBAAgB;AAAC;AACpE;AACD,KACA,CAAA;AAKD,IAAA,IAAI,CAAC,KAAA,EAAO,gBAAA,EAAkB,MAAA,EAAQ;AACrC,MAAA,MAAM,IAAI,gBAAgB,yCAAyC,CAAA;AAAA,IACpE;AAKA,IAAA,IAAI,KAAA,EAAO,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ;AACzC,MAAA,KAAA,CAAM,gBAAA,CAAiB,OAAA,CAAQ,CAAC,WAAA,KAAgB;AAC/C,QAAA,KAAA,EAAO,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,CAAC,KAAA,KAAU;AAC/C,UAAA,IAAA,CAAK,IAAI,SAAA,CAAU;AAAA,YAClB,GAAG,KAAA;AAAA;AAAA;AAAA;AAAA,YAKH,WAAA,EAAa,IAAI,qBAAA,CAAsB,QAAA,EAAU,WAAW;AAAA,WACxC,CAAA;AAAA,QACtB,CAAC,CAAA;AAAA,MACF,CAAC,CAAA;AAAA,IACF;AAKA,IAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,CAAmB,aAAA,CAAc,OAAO,CAAA;AAKjD,IAAA,IAAI,SAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,MACnC,KAAA,EAAO,KAAK,GAAA,CAAI;AAAA,KAChB,CAAA;AAAA,EACF;AACD","file":"api-gateway-v2.js","sourcesContent":["import { Construct } from 'constructs';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { CfnOutput, RemovalPolicy } from 'aws-cdk-lib';\nimport { HttpLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport {\n\tAddRoutesOptions,\n\tCorsHttpMethod,\n\tHttpApi,\n\tHttpApiProps,\n} from 'aws-cdk-lib/aws-apigatewayv2';\n\nimport { CustomException } from '@incloodsolutions/toolkit';\nimport { IBaseCdkConstructProps, IBaseConstruct } from '../../types';\n\n/**\n * Properties for configuring the API Gateway v2 construct\n *\n * Extends base CDK construct props and provides configuration for:\n * - HTTP API (Api Gateway v2)\n * - Route definitions\n * - Lambda handlers\n */\ninterface IApiGatewayV2ConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** HTTP API configuration options */\n\t\treadonly gatewayOptions: HttpApiProps;\n\n\t\t/** Route definitions passed directly to `addRoutes` */\n\t\treadonly routeOptions: Partial<AddRoutesOptions>[];\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda functions used as route handlers\n\t *\n\t * Note:\n\t * Each handler is paired with each route during route creation\n\t */\n\treadonly handlerFunctions: Function[];\n}\n\n/**\n * CDK construct for creating an API Gateway v2 (HTTP API)\n *\n * Responsibilities:\n * - Creates an HTTP API with optional custom configuration\n * - Applies default CORS configuration when not provided\n * - Attaches routes with Lambda integrations\n * - Exposes API URL as a CloudFormation output\n *\n * Behaviour:\n * - Each route is registered for every provided handler function\n * - Throws if no handler functions are supplied\n */\nexport class BaseApiGatewayV2Construct\n\textends Construct\n\timplements IBaseConstruct\n{\n\t/** The created HTTP API instance */\n\treadonly api: HttpApi;\n\n\t/** Enables debug logging (if used externally) */\n\tenableDebug = false;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for API, routes, and handlers\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops: IApiGatewayV2ConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\tthis.enableDebug = props.enableDebug;\n\n\t\tthis.api = new HttpApi(this, id, {\n\t\t\t...props?.options?.gatewayOptions,\n\n\t\t\t/** Default API description if not provided */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.gatewayOptions?.description ||\n\t\t\t\t'This is an Http API using CDK',\n\n\t\t\t/**\n\t\t\t * CORS configuration\n\t\t\t * Falls back to allowing all methods and standard headers if not explicitly defined\n\t\t\t */\n\t\t\tcorsPreflight: {\n\t\t\t\t...props.options?.gatewayOptions?.corsPreflight,\n\n\t\t\t\t/** Allow all HTTP methods by default */\n\t\t\t\tallowMethods:\n\t\t\t\t\tprops.options?.gatewayOptions?.corsPreflight?.allowMethods ||\n\t\t\t\t\tObject.values(CorsHttpMethod),\n\n\t\t\t\t/** Merge default headers with user-defined headers */\n\t\t\t\tallowHeaders: [\n\t\t\t\t\t'Content-Type',\n\t\t\t\t\t'Accept',\n\t\t\t\t\t'X-Amz-Date',\n\t\t\t\t\t'Authorization',\n\t\t\t\t\t'X-Api-Key',\n\t\t\t\t\t'X-Amz-Security-Token',\n\t\t\t\t\t'X-Amz-User-Agent',\n\t\t\t\t\t...(props.options?.gatewayOptions?.corsPreflight?.allowHeaders || []),\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\n\t\t/**\n\t\t * Ensure at least one handler function is provided\n\t\t */\n\t\tif (!props?.handlerFunctions?.length) {\n\t\t\tthrow new CustomException('Construct requires atleast one function');\n\t\t}\n\n\t\t/**\n\t\t * Register routes with Lambda integrations\n\t\t */\n\t\tif (props?.options?.routeOptions?.length) {\n\t\t\tprops.handlerFunctions.forEach((handlerFunc) => {\n\t\t\t\tprops?.options?.routeOptions.forEach((route) => {\n\t\t\t\t\tthis.api.addRoutes({\n\t\t\t\t\t\t...route,\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Lambda integration for each route\n\t\t\t\t\t\t */\n\t\t\t\t\t\tintegration: new HttpLambdaIntegration('routes', handlerFunc),\n\t\t\t\t\t} as AddRoutesOptions);\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.api.applyRemovalPolicy(RemovalPolicy.DESTROY);\n\n\t\t/**\n\t\t * CloudFormation output exposing the API base URL\n\t\t */\n\t\tnew CfnOutput(this, 'ApiGatewayV2', {\n\t\t\tvalue: this.api.url,\n\t\t});\n\t}\n}\n"]}
@@ -27,27 +27,39 @@ var BaseApiGatewayWebSocketConstruct = class extends constructs.Construct {
27
27
  */
28
28
  connectRouteOptions: {
29
29
  ...props.handlers.connect?.option,
30
- integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration("connectIntegration", props.handlers.connect.function)
30
+ integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration(
31
+ "connectIntegration",
32
+ props.handlers.connect.function
33
+ )
31
34
  },
32
35
  /**
33
36
  * Route for disconnection events ($disconnect)
34
37
  */
35
38
  disconnectRouteOptions: {
36
39
  ...props.handlers.disconnect?.option,
37
- integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration("disconnectIntegration", props.handlers.disconnect.function)
40
+ integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration(
41
+ "disconnectIntegration",
42
+ props.handlers.disconnect.function
43
+ )
38
44
  },
39
45
  /**
40
46
  * Default route for unmatched messages ($default)
41
47
  */
42
48
  defaultRouteOptions: {
43
49
  ...props.handlers.default?.option,
44
- integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration("defaultIntegration", props.handlers.default.function)
50
+ integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration(
51
+ "defaultIntegration",
52
+ props.handlers.default.function
53
+ )
45
54
  }
46
55
  });
47
56
  this.socketApi.addRoute("notifications", {
48
57
  ...props.handlers.message?.option,
49
58
  /** Lambda integration for message handling */
50
- integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration("routes", props.handlers.message.function)
59
+ integration: new awsApigatewayv2Integrations.WebSocketLambdaIntegration(
60
+ "routes",
61
+ props.handlers.message.function
62
+ )
51
63
  });
52
64
  const webSocketStage = new awsApigatewayv2.WebSocketStage(this, `${id}_stage`, {
53
65
  ...props.options?.webSocketStageOptions,
@@ -61,5 +73,5 @@ var BaseApiGatewayWebSocketConstruct = class extends constructs.Construct {
61
73
  };
62
74
 
63
75
  exports.BaseApiGatewayWebSocketConstruct = BaseApiGatewayWebSocketConstruct;
64
- //# sourceMappingURL=api-gateway-websocket-construct.cjs.map
65
- //# sourceMappingURL=api-gateway-websocket-construct.cjs.map
76
+ //# sourceMappingURL=api-gateway-websocket.cjs.map
77
+ //# sourceMappingURL=api-gateway-websocket.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/api-gateway-websocket-construct.ts"],"names":["Construct","WebSocketApi","WebSocketLambdaIntegration","WebSocketStage","CfnOutput"],"mappings":";;;;;;;;;AA6EO,IAAM,gCAAA,GAAN,cAA+CA,oBAAA,CAAU;AAAA,EA7EhE;AA6EgE,IAAA,MAAA,CAAA,IAAA,EAAA,kCAAA,CAAA;AAAA;AAAA;AAAA,EAEtD,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,WAAA,CACC,KAAA,EACA,EAAA,EACA,KAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAEf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAIC,4BAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAAA,MAC3C,GAAG,MAAM,OAAA,CAAQ,mBAAA;AAAA;AAAA;AAAA;AAAA,MAKjB,mBAAA,EAAqB;AAAA,QACpB,GAAG,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,MAAA;AAAA,QAC3B,aAAa,IAAIC,sDAAA;AAAA,UAChB,oBAAA;AAAA,UACA,KAAA,CAAM,SAAS,OAAA,CAAQ;AAAA;AACxB,OACD;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAA,EAAwB;AAAA,QACvB,GAAG,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,MAAA;AAAA,QAC9B,aAAa,IAAIA,sDAAA;AAAA,UAChB,uBAAA;AAAA,UACA,KAAA,CAAM,SAAS,UAAA,CAAW;AAAA;AAC3B,OACD;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAA,EAAqB;AAAA,QACpB,GAAG,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,MAAA;AAAA,QAC3B,aAAa,IAAIA,sDAAA;AAAA,UAChB,oBAAA;AAAA,UACA,KAAA,CAAM,SAAS,OAAA,CAAQ;AAAA;AACxB;AACD,KACA,CAAA;AAKD,IAAA,IAAA,CAAK,SAAA,CAAU,SAAS,eAAA,EAAiB;AAAA,MACxC,GAAG,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,MAAA;AAAA;AAAA,MAG3B,aAAa,IAAIA,sDAAA;AAAA,QAChB,QAAA;AAAA,QACA,KAAA,CAAM,SAAS,OAAA,CAAQ;AAAA;AACxB,KACA,CAAA;AAMD,IAAA,MAAM,iBAAiB,IAAIC,8BAAA,CAAe,IAAA,EAAM,CAAA,EAAG,EAAE,CAAA,MAAA,CAAA,EAAU;AAAA,MAC9D,GAAG,MAAM,OAAA,EAAS,qBAAA;AAAA,MAClB,cAAc,IAAA,CAAK,SAAA;AAAA,MACnB,UAAA,EAAY;AAAA,KACZ,CAAA;AAKD,IAAA,IAAIC,mBAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,MACnC,OAAO,cAAA,CAAe;AAAA,KACtB,CAAA;AAAA,EACF;AACD","file":"api-gateway-websocket.cjs","sourcesContent":["import { Construct } from 'constructs';\nimport { CfnOutput } from 'aws-cdk-lib';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { WebSocketLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport {\n\tWebSocketApi,\n\tWebSocketApiProps,\n\tWebSocketRouteOptions,\n\tWebSocketStage,\n\tWebSocketStageProps,\n} from 'aws-cdk-lib/aws-apigatewayv2';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseApiGatewayWebSocketConstruct\n *\n * Provides configuration for:\n * - WebSocket API (API Gateway v2)\n * - WebSocket stage\n * - Route handlers for lifecycle events\n */\ninterface IApiGatewayWebsocketConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** WebSocket API configuration options */\n\t\treadonly webSocketApiOptions: WebSocketApiProps;\n\n\t\t/** WebSocket stage configuration options */\n\t\treadonly webSocketStageOptions: WebSocketStageProps;\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda handlers mapped to WebSocket lifecycle routes\n\t *\n\t * Includes:\n\t * - $connect\n\t * - $disconnect\n\t * - $default\n\t * - custom message route\n\t */\n\treadonly handlers: {\n\t\t/** Handler for connection establishment ($connect) */\n\t\treadonly connect: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\n\t\t/** Handler for unmatched routes ($default) */\n\t\treadonly default: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\n\t\t/** Handler for custom message route (e.g. 'notifications') */\n\t\treadonly message: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\n\t\t/** Handler for disconnection events ($disconnect) */\n\t\treadonly disconnect: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\t};\n}\n\n/**\n * CDK construct for WebSocket API Gateway\n *\n * Responsibilities:\n * - Creates a WebSocket API with lifecycle route integrations\n * - Registers a custom message route\n * - Deploys a stage with auto-deploy enabled\n * - Exposes WebSocket endpoint URL as a CloudFormation output\n */\nexport class BaseApiGatewayWebSocketConstruct extends Construct {\n\t/** The created WebSocket API instance */\n\treadonly socketApi: WebSocketApi;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for API, stage, and route handlers\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops: IApiGatewayWebsocketConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\tthis.socketApi = new WebSocketApi(this, id, {\n\t\t\t...props.options.webSocketApiOptions,\n\n\t\t\t/**\n\t\t\t * Route for connection establishment ($connect)\n\t\t\t */\n\t\t\tconnectRouteOptions: {\n\t\t\t\t...props.handlers.connect?.option,\n\t\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t\t'connectIntegration',\n\t\t\t\t\tprops.handlers.connect.function,\n\t\t\t\t),\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Route for disconnection events ($disconnect)\n\t\t\t */\n\t\t\tdisconnectRouteOptions: {\n\t\t\t\t...props.handlers.disconnect?.option,\n\t\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t\t'disconnectIntegration',\n\t\t\t\t\tprops.handlers.disconnect.function,\n\t\t\t\t),\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Default route for unmatched messages ($default)\n\t\t\t */\n\t\t\tdefaultRouteOptions: {\n\t\t\t\t...props.handlers.default?.option,\n\t\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t\t'defaultIntegration',\n\t\t\t\t\tprops.handlers.default.function,\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\n\t\t/**\n\t\t * Custom message route (e.g. \"notifications\")\n\t\t */\n\t\tthis.socketApi.addRoute('notifications', {\n\t\t\t...props.handlers.message?.option,\n\n\t\t\t/** Lambda integration for message handling */\n\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t'routes',\n\t\t\t\tprops.handlers.message.function,\n\t\t\t),\n\t\t});\n\n\t\t/**\n\t\t * WebSocket stage deployment\n\t\t * Auto-deploy ensures changes are immediately available\n\t\t */\n\t\tconst webSocketStage = new WebSocketStage(this, `${id}_stage`, {\n\t\t\t...props.options?.webSocketStageOptions,\n\t\t\twebSocketApi: this.socketApi,\n\t\t\tautoDeploy: true,\n\t\t});\n\n\t\t/**\n\t\t * CloudFormation output exposing WebSocket endpoint URL\n\t\t */\n\t\tnew CfnOutput(this, 'WebSocketURL', {\n\t\t\tvalue: webSocketStage.url,\n\t\t});\n\t}\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { Function } from 'aws-cdk-lib/aws-lambda';
3
3
  import { WebSocketApi, WebSocketApiProps, WebSocketStageProps, WebSocketRouteOptions } from 'aws-cdk-lib/aws-apigatewayv2';
4
- import { IBaseCdkConstructProps } from '../../types/index.js';
4
+ import { IBaseCdkConstructProps } from '../aws-types.cjs';
5
5
  import '@incloodsolutions/toolkit';
6
6
 
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { Function } from 'aws-cdk-lib/aws-lambda';
3
3
  import { WebSocketApi, WebSocketApiProps, WebSocketStageProps, WebSocketRouteOptions } from 'aws-cdk-lib/aws-apigatewayv2';
4
- import { IBaseCdkConstructProps } from '../../types/index.cjs';
4
+ import { IBaseCdkConstructProps } from '../aws-types.js';
5
5
  import '@incloodsolutions/toolkit';
6
6
 
7
7
  /**
@@ -25,27 +25,39 @@ var BaseApiGatewayWebSocketConstruct = class extends Construct {
25
25
  */
26
26
  connectRouteOptions: {
27
27
  ...props.handlers.connect?.option,
28
- integration: new WebSocketLambdaIntegration("connectIntegration", props.handlers.connect.function)
28
+ integration: new WebSocketLambdaIntegration(
29
+ "connectIntegration",
30
+ props.handlers.connect.function
31
+ )
29
32
  },
30
33
  /**
31
34
  * Route for disconnection events ($disconnect)
32
35
  */
33
36
  disconnectRouteOptions: {
34
37
  ...props.handlers.disconnect?.option,
35
- integration: new WebSocketLambdaIntegration("disconnectIntegration", props.handlers.disconnect.function)
38
+ integration: new WebSocketLambdaIntegration(
39
+ "disconnectIntegration",
40
+ props.handlers.disconnect.function
41
+ )
36
42
  },
37
43
  /**
38
44
  * Default route for unmatched messages ($default)
39
45
  */
40
46
  defaultRouteOptions: {
41
47
  ...props.handlers.default?.option,
42
- integration: new WebSocketLambdaIntegration("defaultIntegration", props.handlers.default.function)
48
+ integration: new WebSocketLambdaIntegration(
49
+ "defaultIntegration",
50
+ props.handlers.default.function
51
+ )
43
52
  }
44
53
  });
45
54
  this.socketApi.addRoute("notifications", {
46
55
  ...props.handlers.message?.option,
47
56
  /** Lambda integration for message handling */
48
- integration: new WebSocketLambdaIntegration("routes", props.handlers.message.function)
57
+ integration: new WebSocketLambdaIntegration(
58
+ "routes",
59
+ props.handlers.message.function
60
+ )
49
61
  });
50
62
  const webSocketStage = new WebSocketStage(this, `${id}_stage`, {
51
63
  ...props.options?.webSocketStageOptions,
@@ -59,5 +71,5 @@ var BaseApiGatewayWebSocketConstruct = class extends Construct {
59
71
  };
60
72
 
61
73
  export { BaseApiGatewayWebSocketConstruct };
62
- //# sourceMappingURL=api-gateway-websocket-construct.js.map
63
- //# sourceMappingURL=api-gateway-websocket-construct.js.map
74
+ //# sourceMappingURL=api-gateway-websocket.js.map
75
+ //# sourceMappingURL=api-gateway-websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/api-gateway-websocket-construct.ts"],"names":[],"mappings":";;;;;;;AA6EO,IAAM,gCAAA,GAAN,cAA+C,SAAA,CAAU;AAAA,EA7EhE;AA6EgE,IAAA,MAAA,CAAA,IAAA,EAAA,kCAAA,CAAA;AAAA;AAAA;AAAA,EAEtD,SAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,WAAA,CACC,KAAA,EACA,EAAA,EACA,KAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAEf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAAA,MAC3C,GAAG,MAAM,OAAA,CAAQ,mBAAA;AAAA;AAAA;AAAA;AAAA,MAKjB,mBAAA,EAAqB;AAAA,QACpB,GAAG,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,MAAA;AAAA,QAC3B,aAAa,IAAI,0BAAA;AAAA,UAChB,oBAAA;AAAA,UACA,KAAA,CAAM,SAAS,OAAA,CAAQ;AAAA;AACxB,OACD;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAA,EAAwB;AAAA,QACvB,GAAG,KAAA,CAAM,QAAA,CAAS,UAAA,EAAY,MAAA;AAAA,QAC9B,aAAa,IAAI,0BAAA;AAAA,UAChB,uBAAA;AAAA,UACA,KAAA,CAAM,SAAS,UAAA,CAAW;AAAA;AAC3B,OACD;AAAA;AAAA;AAAA;AAAA,MAKA,mBAAA,EAAqB;AAAA,QACpB,GAAG,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,MAAA;AAAA,QAC3B,aAAa,IAAI,0BAAA;AAAA,UAChB,oBAAA;AAAA,UACA,KAAA,CAAM,SAAS,OAAA,CAAQ;AAAA;AACxB;AACD,KACA,CAAA;AAKD,IAAA,IAAA,CAAK,SAAA,CAAU,SAAS,eAAA,EAAiB;AAAA,MACxC,GAAG,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,MAAA;AAAA;AAAA,MAG3B,aAAa,IAAI,0BAAA;AAAA,QAChB,QAAA;AAAA,QACA,KAAA,CAAM,SAAS,OAAA,CAAQ;AAAA;AACxB,KACA,CAAA;AAMD,IAAA,MAAM,iBAAiB,IAAI,cAAA,CAAe,IAAA,EAAM,CAAA,EAAG,EAAE,CAAA,MAAA,CAAA,EAAU;AAAA,MAC9D,GAAG,MAAM,OAAA,EAAS,qBAAA;AAAA,MAClB,cAAc,IAAA,CAAK,SAAA;AAAA,MACnB,UAAA,EAAY;AAAA,KACZ,CAAA;AAKD,IAAA,IAAI,SAAA,CAAU,MAAM,cAAA,EAAgB;AAAA,MACnC,OAAO,cAAA,CAAe;AAAA,KACtB,CAAA;AAAA,EACF;AACD","file":"api-gateway-websocket.js","sourcesContent":["import { Construct } from 'constructs';\nimport { CfnOutput } from 'aws-cdk-lib';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { WebSocketLambdaIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport {\n\tWebSocketApi,\n\tWebSocketApiProps,\n\tWebSocketRouteOptions,\n\tWebSocketStage,\n\tWebSocketStageProps,\n} from 'aws-cdk-lib/aws-apigatewayv2';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseApiGatewayWebSocketConstruct\n *\n * Provides configuration for:\n * - WebSocket API (API Gateway v2)\n * - WebSocket stage\n * - Route handlers for lifecycle events\n */\ninterface IApiGatewayWebsocketConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** WebSocket API configuration options */\n\t\treadonly webSocketApiOptions: WebSocketApiProps;\n\n\t\t/** WebSocket stage configuration options */\n\t\treadonly webSocketStageOptions: WebSocketStageProps;\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda handlers mapped to WebSocket lifecycle routes\n\t *\n\t * Includes:\n\t * - $connect\n\t * - $disconnect\n\t * - $default\n\t * - custom message route\n\t */\n\treadonly handlers: {\n\t\t/** Handler for connection establishment ($connect) */\n\t\treadonly connect: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\n\t\t/** Handler for unmatched routes ($default) */\n\t\treadonly default: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\n\t\t/** Handler for custom message route (e.g. 'notifications') */\n\t\treadonly message: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\n\t\t/** Handler for disconnection events ($disconnect) */\n\t\treadonly disconnect: {\n\t\t\toption: WebSocketRouteOptions;\n\t\t\tfunction: Function;\n\t\t};\n\t};\n}\n\n/**\n * CDK construct for WebSocket API Gateway\n *\n * Responsibilities:\n * - Creates a WebSocket API with lifecycle route integrations\n * - Registers a custom message route\n * - Deploys a stage with auto-deploy enabled\n * - Exposes WebSocket endpoint URL as a CloudFormation output\n */\nexport class BaseApiGatewayWebSocketConstruct extends Construct {\n\t/** The created WebSocket API instance */\n\treadonly socketApi: WebSocketApi;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for API, stage, and route handlers\n\t */\n\tconstructor(\n\t\tscope: Construct,\n\t\tid: string,\n\t\tprops: IApiGatewayWebsocketConstructProps,\n\t) {\n\t\tsuper(scope, id);\n\n\t\tthis.socketApi = new WebSocketApi(this, id, {\n\t\t\t...props.options.webSocketApiOptions,\n\n\t\t\t/**\n\t\t\t * Route for connection establishment ($connect)\n\t\t\t */\n\t\t\tconnectRouteOptions: {\n\t\t\t\t...props.handlers.connect?.option,\n\t\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t\t'connectIntegration',\n\t\t\t\t\tprops.handlers.connect.function,\n\t\t\t\t),\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Route for disconnection events ($disconnect)\n\t\t\t */\n\t\t\tdisconnectRouteOptions: {\n\t\t\t\t...props.handlers.disconnect?.option,\n\t\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t\t'disconnectIntegration',\n\t\t\t\t\tprops.handlers.disconnect.function,\n\t\t\t\t),\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Default route for unmatched messages ($default)\n\t\t\t */\n\t\t\tdefaultRouteOptions: {\n\t\t\t\t...props.handlers.default?.option,\n\t\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t\t'defaultIntegration',\n\t\t\t\t\tprops.handlers.default.function,\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\n\t\t/**\n\t\t * Custom message route (e.g. \"notifications\")\n\t\t */\n\t\tthis.socketApi.addRoute('notifications', {\n\t\t\t...props.handlers.message?.option,\n\n\t\t\t/** Lambda integration for message handling */\n\t\t\tintegration: new WebSocketLambdaIntegration(\n\t\t\t\t'routes',\n\t\t\t\tprops.handlers.message.function,\n\t\t\t),\n\t\t});\n\n\t\t/**\n\t\t * WebSocket stage deployment\n\t\t * Auto-deploy ensures changes are immediately available\n\t\t */\n\t\tconst webSocketStage = new WebSocketStage(this, `${id}_stage`, {\n\t\t\t...props.options?.webSocketStageOptions,\n\t\t\twebSocketApi: this.socketApi,\n\t\t\tautoDeploy: true,\n\t\t});\n\n\t\t/**\n\t\t * CloudFormation output exposing WebSocket endpoint URL\n\t\t */\n\t\tnew CfnOutput(this, 'WebSocketURL', {\n\t\t\tvalue: webSocketStage.url,\n\t\t});\n\t}\n}\n"]}
@@ -84,12 +84,15 @@ var BaseApiGatewayConstruct = class _BaseApiGatewayConstruct extends constructs.
84
84
  this.addRoutes(resource, route.children, integration, currentPath);
85
85
  }
86
86
  if (this.enableDebug) {
87
- toolkit.printLog(_BaseApiGatewayConstruct.name, `Route created: ${route.method} ${currentPath}`);
87
+ toolkit.printLog(
88
+ _BaseApiGatewayConstruct.name,
89
+ `Route created: ${route.method} ${currentPath}`
90
+ );
88
91
  }
89
92
  });
90
93
  }
91
94
  };
92
95
 
93
96
  exports.BaseApiGatewayConstruct = BaseApiGatewayConstruct;
94
- //# sourceMappingURL=api-gateway-construct.cjs.map
95
- //# sourceMappingURL=api-gateway-construct.cjs.map
97
+ //# sourceMappingURL=api-gateway.cjs.map
98
+ //# sourceMappingURL=api-gateway.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/api-gateway-construct.ts"],"names":["Construct","RestApi","Cors","Size","LambdaIntegration","RemovalPolicy","CfnOutput","printLog"],"mappings":"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","file":"api-gateway.cjs","sourcesContent":["import { Construct } from 'constructs';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { HttpMethod } from 'aws-cdk-lib/aws-apigatewayv2';\nimport { CfnOutput, RemovalPolicy, Size } from 'aws-cdk-lib';\nimport {\n\tCors,\n\tIResource,\n\tLambdaIntegration,\n\tRestApi,\n\tRestApiProps,\n} from 'aws-cdk-lib/aws-apigateway';\n\nimport { printLog } from '@incloodsolutions/toolkit';\n\nimport { IBaseCdkConstructProps, IBaseConstruct } from '../../types';\n\n/**\n * Route definition for API Gateway resources\n *\n * Supports hierarchical route structures using `children`\n */\ninterface IRouteOption {\n\t/** Path segment (e.g. 'users', 'orders') */\n\tname: string;\n\n\t/** HTTP method for the route */\n\tmethod: `${HttpMethod}`;\n\n\t/** Nested routes under this path */\n\tchildren?: IRouteOption[];\n}\n\n/**\n * Props for BaseApiGatewayConstruct\n *\n * Provides configuration for:\n * - REST API (API Gateway v1)\n * - Route definitions\n * - Lambda handler\n */\ninterface IApiGatewayConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** REST API configuration options */\n\t\treadonly gatewayOptions: RestApiProps;\n\n\t\t/** Route definitions used to build API resources */\n\t\treadonly routeOptions: IRouteOption[];\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda function handling all API routes\n\t *\n\t * Note:\n\t * A single Lambda integration is reused across all routes\n\t */\n\treadonly handlerFunction: Function;\n}\n\n/**\n * CDK construct for REST API Gateway with Lambda integration\n *\n * Responsibilities:\n * - Creates a REST API with configurable options\n * - Applies default CORS and compression settings when not provided\n * - Recursively builds API resources from route definitions\n * - Exposes API base URL as a CloudFormation output\n */\nexport class BaseApiGatewayConstruct\n\textends Construct\n\timplements IBaseConstruct\n{\n\t/** The created REST API instance */\n\treadonly api: RestApi;\n\n\t/** Enables debug logging for route creation */\n\tenableDebug = false;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for API, routes, and Lambda handler\n\t */\n\tconstructor(scope: Construct, id: string, props: IApiGatewayConstructProps) {\n\t\tsuper(scope, id);\n\n\t\tthis.enableDebug = props.enableDebug;\n\n\t\tthis.api = new RestApi(this, id, {\n\t\t\t...props?.options?.gatewayOptions,\n\n\t\t\t/** Default API description if not provided */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.gatewayOptions?.description ||\n\t\t\t\t'This is a REST API using CDK',\n\n\t\t\t/**\n\t\t\t * CORS configuration\n\t\t\t * Falls back to allowing all origins, methods, and standard headers\n\t\t\t */\n\t\t\tdefaultCorsPreflightOptions: {\n\t\t\t\t...props?.options?.gatewayOptions?.defaultCorsPreflightOptions,\n\n\t\t\t\t/** Allow all origins by default */\n\t\t\t\tallowOrigins:\n\t\t\t\t\tprops?.options?.gatewayOptions?.defaultCorsPreflightOptions\n\t\t\t\t\t\t?.allowOrigins || Cors.ALL_ORIGINS,\n\n\t\t\t\t/** Allow all HTTP methods by default */\n\t\t\t\tallowMethods:\n\t\t\t\t\tprops?.options?.gatewayOptions?.defaultCorsPreflightOptions\n\t\t\t\t\t\t?.allowMethods || Cors.ALL_METHODS,\n\n\t\t\t\t/** Merge default headers with user-defined headers */\n\t\t\t\tallowHeaders: [\n\t\t\t\t\t...props.options?.gatewayOptions?.defaultCorsPreflightOptions\n\t\t\t\t\t\t?.allowHeaders,\n\t\t\t\t\t'Content-Type',\n\t\t\t\t\t'Accept',\n\t\t\t\t\t'X-Amz-Date',\n\t\t\t\t\t'Authorization',\n\t\t\t\t\t'X-Api-Key',\n\t\t\t\t\t'X-Amz-Security-Token',\n\t\t\t\t\t'X-Amz-User-Agent',\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t/** Minimum payload size (in bytes) before compression is applied */\n\t\t\tminCompressionSize:\n\t\t\t\tprops?.options?.gatewayOptions?.minCompressionSize || Size.bytes(1),\n\t\t});\n\n\t\t/**\n\t\t * Register routes if provided\n\t\t */\n\t\tif (props?.options?.routeOptions?.length && props?.handlerFunction) {\n\t\t\tconst integration = new LambdaIntegration(props.handlerFunction);\n\n\t\t\t/**\n\t\t\t * Attach routes recursively starting from API root\n\t\t\t */\n\t\t\tthis.addRoutes(this.api.root, props.options.routeOptions, integration);\n\t\t}\n\n\t\t/**\n\t\t * Apply removal policy (useful for non-production environments)\n\t\t */\n\t\tthis.api.applyRemovalPolicy(RemovalPolicy.DESTROY);\n\n\t\t/**\n\t\t * CloudFormation output exposing API base URL\n\t\t */\n\t\tnew CfnOutput(this, 'ApiGateway', {\n\t\t\tvalue: this.api.url,\n\t\t});\n\t}\n\n\t/**\n\t * Recursively attaches routes to the API Gateway\n\t *\n\t * Behaviour:\n\t * - Creates a resource for each route segment\n\t * - Attaches method + Lambda integration\n\t * - Traverses child routes for nested paths\n\t *\n\t * @param parent Parent API resource\n\t * @param routes Route definitions\n\t * @param integration Lambda integration applied to each route\n\t * @param previousPath Accumulated path (used for debug logging)\n\t * @private\n\t */\n\tprivate addRoutes(\n\t\tparent: IResource,\n\t\troutes: IRouteOption[],\n\t\tintegration: LambdaIntegration,\n\t\tpreviousPath?: string,\n\t) {\n\t\troutes.forEach((route) => {\n\t\t\tconst currentPath = `${previousPath || ''}/${route.name}`;\n\n\t\t\tconst resource = parent.addResource(route.name);\n\n\t\t\t/** Attach HTTP method with Lambda integration */\n\t\t\tresource.addMethod(route.method, integration);\n\n\t\t\t/** Recursively process child routes */\n\t\t\tif (route?.children.length) {\n\t\t\t\tthis.addRoutes(resource, route.children, integration, currentPath);\n\t\t\t}\n\n\t\t\t/** Optional debug logging */\n\t\t\tif (this.enableDebug) {\n\t\t\t\tprintLog(\n\t\t\t\t\tBaseApiGatewayConstruct.name,\n\t\t\t\t\t`Route created: ${route.method} ${currentPath}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
@@ -2,7 +2,7 @@ import { Construct } from 'constructs';
2
2
  import { Function } from 'aws-cdk-lib/aws-lambda';
3
3
  import { HttpMethod } from 'aws-cdk-lib/aws-apigatewayv2';
4
4
  import { RestApi, RestApiProps } from 'aws-cdk-lib/aws-apigateway';
5
- import { IBaseConstruct, IBaseCdkConstructProps } from '../../types/index.js';
5
+ import { IBaseConstruct, IBaseCdkConstructProps } from '../aws-types.cjs';
6
6
  import '@incloodsolutions/toolkit';
7
7
 
8
8
  /**
@@ -2,7 +2,7 @@ import { Construct } from 'constructs';
2
2
  import { Function } from 'aws-cdk-lib/aws-lambda';
3
3
  import { HttpMethod } from 'aws-cdk-lib/aws-apigatewayv2';
4
4
  import { RestApi, RestApiProps } from 'aws-cdk-lib/aws-apigateway';
5
- import { IBaseConstruct, IBaseCdkConstructProps } from '../../types/index.cjs';
5
+ import { IBaseConstruct, IBaseCdkConstructProps } from '../aws-types.js';
6
6
  import '@incloodsolutions/toolkit';
7
7
 
8
8
  /**
@@ -82,12 +82,15 @@ var BaseApiGatewayConstruct = class _BaseApiGatewayConstruct extends Construct {
82
82
  this.addRoutes(resource, route.children, integration, currentPath);
83
83
  }
84
84
  if (this.enableDebug) {
85
- printLog(_BaseApiGatewayConstruct.name, `Route created: ${route.method} ${currentPath}`);
85
+ printLog(
86
+ _BaseApiGatewayConstruct.name,
87
+ `Route created: ${route.method} ${currentPath}`
88
+ );
86
89
  }
87
90
  });
88
91
  }
89
92
  };
90
93
 
91
94
  export { BaseApiGatewayConstruct };
92
- //# sourceMappingURL=api-gateway-construct.js.map
93
- //# sourceMappingURL=api-gateway-construct.js.map
95
+ //# sourceMappingURL=api-gateway.js.map
96
+ //# sourceMappingURL=api-gateway.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/api-gateway-construct.ts"],"names":[],"mappings":"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","file":"api-gateway.js","sourcesContent":["import { Construct } from 'constructs';\nimport { Function } from 'aws-cdk-lib/aws-lambda';\nimport { HttpMethod } from 'aws-cdk-lib/aws-apigatewayv2';\nimport { CfnOutput, RemovalPolicy, Size } from 'aws-cdk-lib';\nimport {\n\tCors,\n\tIResource,\n\tLambdaIntegration,\n\tRestApi,\n\tRestApiProps,\n} from 'aws-cdk-lib/aws-apigateway';\n\nimport { printLog } from '@incloodsolutions/toolkit';\n\nimport { IBaseCdkConstructProps, IBaseConstruct } from '../../types';\n\n/**\n * Route definition for API Gateway resources\n *\n * Supports hierarchical route structures using `children`\n */\ninterface IRouteOption {\n\t/** Path segment (e.g. 'users', 'orders') */\n\tname: string;\n\n\t/** HTTP method for the route */\n\tmethod: `${HttpMethod}`;\n\n\t/** Nested routes under this path */\n\tchildren?: IRouteOption[];\n}\n\n/**\n * Props for BaseApiGatewayConstruct\n *\n * Provides configuration for:\n * - REST API (API Gateway v1)\n * - Route definitions\n * - Lambda handler\n */\ninterface IApiGatewayConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** REST API configuration options */\n\t\treadonly gatewayOptions: RestApiProps;\n\n\t\t/** Route definitions used to build API resources */\n\t\treadonly routeOptions: IRouteOption[];\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {\n\t/**\n\t * Lambda function handling all API routes\n\t *\n\t * Note:\n\t * A single Lambda integration is reused across all routes\n\t */\n\treadonly handlerFunction: Function;\n}\n\n/**\n * CDK construct for REST API Gateway with Lambda integration\n *\n * Responsibilities:\n * - Creates a REST API with configurable options\n * - Applies default CORS and compression settings when not provided\n * - Recursively builds API resources from route definitions\n * - Exposes API base URL as a CloudFormation output\n */\nexport class BaseApiGatewayConstruct\n\textends Construct\n\timplements IBaseConstruct\n{\n\t/** The created REST API instance */\n\treadonly api: RestApi;\n\n\t/** Enables debug logging for route creation */\n\tenableDebug = false;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for API, routes, and Lambda handler\n\t */\n\tconstructor(scope: Construct, id: string, props: IApiGatewayConstructProps) {\n\t\tsuper(scope, id);\n\n\t\tthis.enableDebug = props.enableDebug;\n\n\t\tthis.api = new RestApi(this, id, {\n\t\t\t...props?.options?.gatewayOptions,\n\n\t\t\t/** Default API description if not provided */\n\t\t\tdescription:\n\t\t\t\tprops?.options?.gatewayOptions?.description ||\n\t\t\t\t'This is a REST API using CDK',\n\n\t\t\t/**\n\t\t\t * CORS configuration\n\t\t\t * Falls back to allowing all origins, methods, and standard headers\n\t\t\t */\n\t\t\tdefaultCorsPreflightOptions: {\n\t\t\t\t...props?.options?.gatewayOptions?.defaultCorsPreflightOptions,\n\n\t\t\t\t/** Allow all origins by default */\n\t\t\t\tallowOrigins:\n\t\t\t\t\tprops?.options?.gatewayOptions?.defaultCorsPreflightOptions\n\t\t\t\t\t\t?.allowOrigins || Cors.ALL_ORIGINS,\n\n\t\t\t\t/** Allow all HTTP methods by default */\n\t\t\t\tallowMethods:\n\t\t\t\t\tprops?.options?.gatewayOptions?.defaultCorsPreflightOptions\n\t\t\t\t\t\t?.allowMethods || Cors.ALL_METHODS,\n\n\t\t\t\t/** Merge default headers with user-defined headers */\n\t\t\t\tallowHeaders: [\n\t\t\t\t\t...props.options?.gatewayOptions?.defaultCorsPreflightOptions\n\t\t\t\t\t\t?.allowHeaders,\n\t\t\t\t\t'Content-Type',\n\t\t\t\t\t'Accept',\n\t\t\t\t\t'X-Amz-Date',\n\t\t\t\t\t'Authorization',\n\t\t\t\t\t'X-Api-Key',\n\t\t\t\t\t'X-Amz-Security-Token',\n\t\t\t\t\t'X-Amz-User-Agent',\n\t\t\t\t],\n\t\t\t},\n\n\t\t\t/** Minimum payload size (in bytes) before compression is applied */\n\t\t\tminCompressionSize:\n\t\t\t\tprops?.options?.gatewayOptions?.minCompressionSize || Size.bytes(1),\n\t\t});\n\n\t\t/**\n\t\t * Register routes if provided\n\t\t */\n\t\tif (props?.options?.routeOptions?.length && props?.handlerFunction) {\n\t\t\tconst integration = new LambdaIntegration(props.handlerFunction);\n\n\t\t\t/**\n\t\t\t * Attach routes recursively starting from API root\n\t\t\t */\n\t\t\tthis.addRoutes(this.api.root, props.options.routeOptions, integration);\n\t\t}\n\n\t\t/**\n\t\t * Apply removal policy (useful for non-production environments)\n\t\t */\n\t\tthis.api.applyRemovalPolicy(RemovalPolicy.DESTROY);\n\n\t\t/**\n\t\t * CloudFormation output exposing API base URL\n\t\t */\n\t\tnew CfnOutput(this, 'ApiGateway', {\n\t\t\tvalue: this.api.url,\n\t\t});\n\t}\n\n\t/**\n\t * Recursively attaches routes to the API Gateway\n\t *\n\t * Behaviour:\n\t * - Creates a resource for each route segment\n\t * - Attaches method + Lambda integration\n\t * - Traverses child routes for nested paths\n\t *\n\t * @param parent Parent API resource\n\t * @param routes Route definitions\n\t * @param integration Lambda integration applied to each route\n\t * @param previousPath Accumulated path (used for debug logging)\n\t * @private\n\t */\n\tprivate addRoutes(\n\t\tparent: IResource,\n\t\troutes: IRouteOption[],\n\t\tintegration: LambdaIntegration,\n\t\tpreviousPath?: string,\n\t) {\n\t\troutes.forEach((route) => {\n\t\t\tconst currentPath = `${previousPath || ''}/${route.name}`;\n\n\t\t\tconst resource = parent.addResource(route.name);\n\n\t\t\t/** Attach HTTP method with Lambda integration */\n\t\t\tresource.addMethod(route.method, integration);\n\n\t\t\t/** Recursively process child routes */\n\t\t\tif (route?.children.length) {\n\t\t\t\tthis.addRoutes(resource, route.children, integration, currentPath);\n\t\t\t}\n\n\t\t\t/** Optional debug logging */\n\t\t\tif (this.enableDebug) {\n\t\t\t\tprintLog(\n\t\t\t\t\tBaseApiGatewayConstruct.name,\n\t\t\t\t\t`Route created: ${route.method} ${currentPath}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"]}
@@ -64,5 +64,5 @@ var BaseCloudfrontConstruct = class extends constructs.Construct {
64
64
  };
65
65
 
66
66
  exports.BaseCloudfrontConstruct = BaseCloudfrontConstruct;
67
- //# sourceMappingURL=cloudfront-construct.cjs.map
68
- //# sourceMappingURL=cloudfront-construct.cjs.map
67
+ //# sourceMappingURL=cloudfront.cjs.map
68
+ //# sourceMappingURL=cloudfront.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/cloudfront-construct.ts"],"names":["Construct","Distribution","ViewerProtocolPolicy","Duration"],"mappings":";;;;;;;;AAgCO,IAAM,uBAAA,GAAN,cAAsCA,oBAAA,CAAU;AAAA,EAhCvD;AAgCuD,IAAA,MAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;AAAA;AAAA;AAAA,EAE7C,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,WAAA,CAAY,KAAA,EAAkB,EAAA,EAAY,KAAA,EAAkC;AAC3E,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAEf,IAAA,IAAA,CAAK,YAAA,GAAe,IAAIC,0BAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAAA,MAC9C,GAAG,MAAM,OAAA,EAAS,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMlB,eAAA,EAAiB;AAAA,QAChB,GAAG,KAAA,CAAM,OAAA,EAAS,iBAAA,EAAmB,eAAA;AAAA,QACrC,sBACC,KAAA,CAAM,OAAA,EAAS,iBAAA,EAAmB,eAAA,EAC/B,wBAAwBC,kCAAA,CAAqB;AAAA,OAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,cAAA,EAAgB;AAAA,QACf,GAAI,KAAA,CAAM,OAAA,EAAS,iBAAA,EAAmB,kBAAkB,EAAC;AAAA;AAAA,QAGzD;AAAA,UACC,UAAA,EAAY,GAAA;AAAA,UACZ,kBAAA,EAAoB,GAAA;AAAA,UACpB,gBAAA,EAAkB,aAAA;AAAA,UAClB,GAAA,EAAKC,kBAAA,CAAS,IAAA,CAAK,CAAC;AAAA,SACrB;AAAA;AAAA,QAGA;AAAA,UACC,UAAA,EAAY,GAAA;AAAA,UACZ,kBAAA,EAAoB,GAAA;AAAA,UACpB,gBAAA,EAAkB,aAAA;AAAA,UAClB,GAAA,EAAKA,kBAAA,CAAS,IAAA,CAAK,CAAC;AAAA,SACrB;AAAA;AAAA,QAGA;AAAA,UACC,UAAA,EAAY,GAAA;AAAA,UACZ,kBAAA,EAAoB,GAAA;AAAA,UACpB,gBAAA,EAAkB,aAAA;AAAA,UAClB,GAAA,EAAKA,kBAAA,CAAS,IAAA,CAAK,CAAC;AAAA;AACrB;AACD,KACA,CAAA;AAAA,EACF;AACD","file":"cloudfront.cjs","sourcesContent":["import { Construct } from 'constructs';\nimport { Duration } from 'aws-cdk-lib';\nimport {\n\tDistribution,\n\tDistributionProps,\n\tViewerProtocolPolicy,\n} from 'aws-cdk-lib/aws-cloudfront';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseCloudfrontConstruct\n *\n * Provides configuration for creating a CloudFront distribution\n * with optional overrides for default behaviour and error handling.\n */\ninterface ICloudfrontConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** Partial configuration for the CloudFront distribution */\n\t\treadonly cloudfrontOptions: Partial<DistributionProps>;\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {}\n\n/**\n * CDK construct for CloudFront distribution\n *\n * Responsibilities:\n * - Creates a CloudFront distribution with configurable options\n * - Enforces HTTPS redirection by default\n * - Adds fallback error responses for SPA routing (400, 403, 404 → index.html)\n */\nexport class BaseCloudfrontConstruct extends Construct {\n\t/** The created CloudFront distribution instance */\n\treadonly distribution: Distribution;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for CloudFront distribution\n\t */\n\tconstructor(scope: Construct, id: string, props: ICloudfrontConstructProps) {\n\t\tsuper(scope, id);\n\n\t\tthis.distribution = new Distribution(this, id, {\n\t\t\t...props.options?.cloudfrontOptions,\n\n\t\t\t/**\n\t\t\t * Default behaviour configuration\n\t\t\t * Enforces HTTPS if not explicitly defined\n\t\t\t */\n\t\t\tdefaultBehavior: {\n\t\t\t\t...props.options?.cloudfrontOptions?.defaultBehavior,\n\t\t\t\tviewerProtocolPolicy:\n\t\t\t\t\tprops.options?.cloudfrontOptions?.defaultBehavior\n\t\t\t\t\t\t?.viewerProtocolPolicy || ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Error response configuration\n\t\t\t *\n\t\t\t * Adds SPA-friendly fallbacks:\n\t\t\t * - 400, 403, 404 responses are redirected to index.html\n\t\t\t */\n\t\t\terrorResponses: [\n\t\t\t\t...(props.options?.cloudfrontOptions?.errorResponses || []),\n\n\t\t\t\t/** Handle 400 errors */\n\t\t\t\t{\n\t\t\t\t\thttpStatus: 400,\n\t\t\t\t\tresponseHttpStatus: 200,\n\t\t\t\t\tresponsePagePath: '/index.html',\n\t\t\t\t\tttl: Duration.days(1),\n\t\t\t\t},\n\n\t\t\t\t/** Handle 403 errors */\n\t\t\t\t{\n\t\t\t\t\thttpStatus: 403,\n\t\t\t\t\tresponseHttpStatus: 200,\n\t\t\t\t\tresponsePagePath: '/index.html',\n\t\t\t\t\tttl: Duration.days(1),\n\t\t\t\t},\n\n\t\t\t\t/** Handle 404 errors */\n\t\t\t\t{\n\t\t\t\t\thttpStatus: 404,\n\t\t\t\t\tresponseHttpStatus: 200,\n\t\t\t\t\tresponsePagePath: '/index.html',\n\t\t\t\t\tttl: Duration.days(1),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { Distribution, DistributionProps } from 'aws-cdk-lib/aws-cloudfront';
3
- import { IBaseCdkConstructProps } from '../../types/index.js';
3
+ import { IBaseCdkConstructProps } from '../aws-types.cjs';
4
4
  import '@incloodsolutions/toolkit';
5
5
 
6
6
  /**
@@ -1,6 +1,6 @@
1
1
  import { Construct } from 'constructs';
2
2
  import { Distribution, DistributionProps } from 'aws-cdk-lib/aws-cloudfront';
3
- import { IBaseCdkConstructProps } from '../../types/index.cjs';
3
+ import { IBaseCdkConstructProps } from '../aws-types.js';
4
4
  import '@incloodsolutions/toolkit';
5
5
 
6
6
  /**
@@ -62,5 +62,5 @@ var BaseCloudfrontConstruct = class extends Construct {
62
62
  };
63
63
 
64
64
  export { BaseCloudfrontConstruct };
65
- //# sourceMappingURL=cloudfront-construct.js.map
66
- //# sourceMappingURL=cloudfront-construct.js.map
65
+ //# sourceMappingURL=cloudfront.js.map
66
+ //# sourceMappingURL=cloudfront.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/aws/cdk/constructs/cloudfront-construct.ts"],"names":[],"mappings":";;;;;;AAgCO,IAAM,uBAAA,GAAN,cAAsC,SAAA,CAAU;AAAA,EAhCvD;AAgCuD,IAAA,MAAA,CAAA,IAAA,EAAA,yBAAA,CAAA;AAAA;AAAA;AAAA,EAE7C,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOT,WAAA,CAAY,KAAA,EAAkB,EAAA,EAAY,KAAA,EAAkC;AAC3E,IAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAEf,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAAA,MAC9C,GAAG,MAAM,OAAA,EAAS,iBAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMlB,eAAA,EAAiB;AAAA,QAChB,GAAG,KAAA,CAAM,OAAA,EAAS,iBAAA,EAAmB,eAAA;AAAA,QACrC,sBACC,KAAA,CAAM,OAAA,EAAS,iBAAA,EAAmB,eAAA,EAC/B,wBAAwB,oBAAA,CAAqB;AAAA,OAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,cAAA,EAAgB;AAAA,QACf,GAAI,KAAA,CAAM,OAAA,EAAS,iBAAA,EAAmB,kBAAkB,EAAC;AAAA;AAAA,QAGzD;AAAA,UACC,UAAA,EAAY,GAAA;AAAA,UACZ,kBAAA,EAAoB,GAAA;AAAA,UACpB,gBAAA,EAAkB,aAAA;AAAA,UAClB,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,CAAC;AAAA,SACrB;AAAA;AAAA,QAGA;AAAA,UACC,UAAA,EAAY,GAAA;AAAA,UACZ,kBAAA,EAAoB,GAAA;AAAA,UACpB,gBAAA,EAAkB,aAAA;AAAA,UAClB,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,CAAC;AAAA,SACrB;AAAA;AAAA,QAGA;AAAA,UACC,UAAA,EAAY,GAAA;AAAA,UACZ,kBAAA,EAAoB,GAAA;AAAA,UACpB,gBAAA,EAAkB,aAAA;AAAA,UAClB,GAAA,EAAK,QAAA,CAAS,IAAA,CAAK,CAAC;AAAA;AACrB;AACD,KACA,CAAA;AAAA,EACF;AACD","file":"cloudfront.js","sourcesContent":["import { Construct } from 'constructs';\nimport { Duration } from 'aws-cdk-lib';\nimport {\n\tDistribution,\n\tDistributionProps,\n\tViewerProtocolPolicy,\n} from 'aws-cdk-lib/aws-cloudfront';\n\nimport { IBaseCdkConstructProps } from '../../types';\n\n/**\n * Props for BaseCloudfrontConstruct\n *\n * Provides configuration for creating a CloudFront distribution\n * with optional overrides for default behaviour and error handling.\n */\ninterface ICloudfrontConstructProps extends Omit<\n\tIBaseCdkConstructProps<{\n\t\t/** Partial configuration for the CloudFront distribution */\n\t\treadonly cloudfrontOptions: Partial<DistributionProps>;\n\t}>,\n\t'appName' | 'stage' | 'stackName'\n> {}\n\n/**\n * CDK construct for CloudFront distribution\n *\n * Responsibilities:\n * - Creates a CloudFront distribution with configurable options\n * - Enforces HTTPS redirection by default\n * - Adds fallback error responses for SPA routing (400, 403, 404 → index.html)\n */\nexport class BaseCloudfrontConstruct extends Construct {\n\t/** The created CloudFront distribution instance */\n\treadonly distribution: Distribution;\n\n\t/**\n\t * @param scope Parent construct\n\t * @param id Unique construct identifier\n\t * @param props Configuration for CloudFront distribution\n\t */\n\tconstructor(scope: Construct, id: string, props: ICloudfrontConstructProps) {\n\t\tsuper(scope, id);\n\n\t\tthis.distribution = new Distribution(this, id, {\n\t\t\t...props.options?.cloudfrontOptions,\n\n\t\t\t/**\n\t\t\t * Default behaviour configuration\n\t\t\t * Enforces HTTPS if not explicitly defined\n\t\t\t */\n\t\t\tdefaultBehavior: {\n\t\t\t\t...props.options?.cloudfrontOptions?.defaultBehavior,\n\t\t\t\tviewerProtocolPolicy:\n\t\t\t\t\tprops.options?.cloudfrontOptions?.defaultBehavior\n\t\t\t\t\t\t?.viewerProtocolPolicy || ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Error response configuration\n\t\t\t *\n\t\t\t * Adds SPA-friendly fallbacks:\n\t\t\t * - 400, 403, 404 responses are redirected to index.html\n\t\t\t */\n\t\t\terrorResponses: [\n\t\t\t\t...(props.options?.cloudfrontOptions?.errorResponses || []),\n\n\t\t\t\t/** Handle 400 errors */\n\t\t\t\t{\n\t\t\t\t\thttpStatus: 400,\n\t\t\t\t\tresponseHttpStatus: 200,\n\t\t\t\t\tresponsePagePath: '/index.html',\n\t\t\t\t\tttl: Duration.days(1),\n\t\t\t\t},\n\n\t\t\t\t/** Handle 403 errors */\n\t\t\t\t{\n\t\t\t\t\thttpStatus: 403,\n\t\t\t\t\tresponseHttpStatus: 200,\n\t\t\t\t\tresponsePagePath: '/index.html',\n\t\t\t\t\tttl: Duration.days(1),\n\t\t\t\t},\n\n\t\t\t\t/** Handle 404 errors */\n\t\t\t\t{\n\t\t\t\t\thttpStatus: 404,\n\t\t\t\t\tresponseHttpStatus: 200,\n\t\t\t\t\tresponsePagePath: '/index.html',\n\t\t\t\t\tttl: Duration.days(1),\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\t}\n}\n"]}