@aligent/cdk-secure-rest-api 1.1.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @aligent/cdk-secure-rest-api
2
2
 
3
+ ## 1.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1720](https://github.com/aligent/cdk-constructs/pull/1720) [`2649bf8`](https://github.com/aligent/cdk-constructs/commit/2649bf833e9b8bec9261918bd013b4b71f368fe5) Thanks [@toddhainsworth](https://github.com/toddhainsworth)! - Support nested (multi-segment) route paths in the `routes` helper. Paths such as `rewards/accounts/{accountId}/redeem` now create the intermediate resources instead of throwing `ResourceSPathPartOnly` at synth time. Routes sharing a common prefix resolve idempotently.
8
+
9
+ Add a `deployOptions` prop (CDK `StageOptions`) so the deployed stage name and other stage settings can be configured. Defaults to the CDK `prod` stage when omitted.
10
+
3
11
  ## 1.1.2
4
12
 
5
13
  ### Patch Changes
package/README.md CHANGED
@@ -12,6 +12,8 @@ A CDK construct for provisioning an API Gateway REST API secured with API Key au
12
12
  - Usage plan with configurable throttle rate and burst limits
13
13
  - Configurable CORS preflight options
14
14
  - Accepts any CDK `Integration` per route (Lambda, HTTP, Mock, Step Functions, etc.)
15
+ - Supports nested, multi-segment route paths (e.g. `rewards/accounts/{accountId}/redeem`)
16
+ - Configurable deployment stage via `deployOptions` (stage name defaults to `prod`)
15
17
 
16
18
  ## Installation
17
19
 
@@ -74,6 +76,29 @@ const api = new SecureRestApi(this, 'Api', {
74
76
  });
75
77
  ```
76
78
 
79
+ ### Nested route paths
80
+
81
+ Multi-segment paths create the intermediate resources automatically. Routes
82
+ sharing a common prefix resolve to the same parent resource.
83
+
84
+ ```typescript
85
+ const api = new SecureRestApi(this, 'Api', {
86
+ apiName: 'rewards-api',
87
+ routes: [
88
+ {
89
+ path: 'rewards/accounts/{accountId}/redeem',
90
+ methods: [HttpMethod.POST],
91
+ integration: new LambdaIntegration(redeemFunction),
92
+ },
93
+ {
94
+ path: 'rewards/reversal', // reuses the shared `rewards` resource
95
+ methods: [HttpMethod.POST],
96
+ integration: new LambdaIntegration(reversalFunction),
97
+ },
98
+ ],
99
+ });
100
+ ```
101
+
77
102
  ### Custom throttling
78
103
 
79
104
  ```typescript
@@ -87,6 +112,19 @@ const api = new SecureRestApi(this, 'Api', {
87
112
  });
88
113
  ```
89
114
 
115
+ ### Custom stage name
116
+
117
+ By default the API deploys to a `prod` stage. Pass `deployOptions` to override
118
+ the stage name (or any other CDK `StageOptions`, e.g. logging or tracing).
119
+
120
+ ```typescript
121
+ const api = new SecureRestApi(this, 'Api', {
122
+ apiName: 'my-api',
123
+ deployOptions: { stageName: 'staging' },
124
+ routes: [...],
125
+ });
126
+ ```
127
+
90
128
  ### Custom CORS configuration
91
129
 
92
130
  ```typescript
@@ -119,10 +157,17 @@ Routes to register on the API. Each route requires:
119
157
 
120
158
  | Property | Type | Description |
121
159
  |----------|------|-------------|
122
- | `path` | `string` | The resource path (leading slash is stripped automatically) |
160
+ | `path` | `string` | The resource path; may be nested/multi-segment (leading slash is stripped automatically) |
123
161
  | `methods` | `HttpMethod[]` | HTTP methods to register on the resource |
124
162
  | `integration` | `Integration` | Any CDK API Gateway integration |
125
163
 
164
+ ### `deployOptions` (StageOptions)
165
+
166
+ Stage options for the API's default deployment, passed through to the underlying
167
+ CDK `RestApi`. Use `stageName` to override the deployed stage name.
168
+
169
+ Default: CDK default (`prod` stage).
170
+
126
171
  ### `throttle` (object)
127
172
 
128
173
  Throttling limits applied to the usage plan.
@@ -1,4 +1,4 @@
1
- import { ApiKey, Integration, RestApi, UsagePlan } from "aws-cdk-lib/aws-apigateway";
1
+ import { ApiKey, Integration, RestApi, StageOptions, UsagePlan } from "aws-cdk-lib/aws-apigateway";
2
2
  import { HttpMethod } from "aws-cdk-lib/aws-apigatewayv2";
3
3
  import { Construct } from "constructs";
4
4
  export interface SecureRestApiRoute {
@@ -31,6 +31,13 @@ export interface SecureRestApiProps {
31
31
  * Routes to register on the API.
32
32
  */
33
33
  routes: SecureRestApiRoute[];
34
+ /**
35
+ * Stage options for the API's default deployment.
36
+ *
37
+ * Use `stageName` to override the deployed stage name.
38
+ * @default stageName "prod" (CDK default)
39
+ */
40
+ deployOptions?: StageOptions;
34
41
  /**
35
42
  * Throttling limits for the usage plan.
36
43
  * @default { rateLimit: 100, burstLimit: 200 }
@@ -7,10 +7,11 @@ class SecureRestApi extends constructs_1.Construct {
7
7
  constructor(scope, id, props) {
8
8
  var _a, _b, _c;
9
9
  super(scope, id);
10
- const { apiName, description, corsOptions, routes, throttle = { rateLimit: 100, burstLimit: 200 }, apiKeyName, usagePlanName, } = props;
10
+ const { apiName, description, corsOptions, routes, deployOptions, throttle = { rateLimit: 100, burstLimit: 200 }, apiKeyName, usagePlanName, } = props;
11
11
  this.api = new aws_apigateway_1.RestApi(this, "Api", {
12
12
  restApiName: apiName,
13
13
  description: description !== null && description !== void 0 ? description : `REST API for ${apiName} service`,
14
+ deployOptions,
14
15
  defaultCorsPreflightOptions: {
15
16
  allowOrigins: (_a = corsOptions === null || corsOptions === void 0 ? void 0 : corsOptions.allowOrigins) !== null && _a !== void 0 ? _a : aws_apigateway_1.Cors.ALL_ORIGINS,
16
17
  allowMethods: [
@@ -26,7 +27,7 @@ class SecureRestApi extends constructs_1.Construct {
26
27
  },
27
28
  });
28
29
  for (const route of routes) {
29
- const resource = this.api.root.addResource(route.path.replace(/^\//, ""));
30
+ const resource = this.api.root.resourceForPath(route.path.replace(/^\//, ""));
30
31
  for (const method of route.methods) {
31
32
  resource.addMethod(method, route.integration, { apiKeyRequired: true });
32
33
  }
@@ -48,4 +49,4 @@ class SecureRestApi extends constructs_1.Construct {
48
49
  }
49
50
  }
50
51
  exports.SecureRestApi = SecureRestApi;
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlLXJlc3QtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlLXJlc3QtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQU9vQztBQUVwQywyQ0FBdUM7QUEyRHZDLE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBSzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7O1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUNKLE9BQU8sRUFDUCxXQUFXLEVBQ1gsV0FBVyxFQUNYLE1BQU0sRUFDTixRQUFRLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsRUFDOUMsVUFBVSxFQUNWLGFBQWEsR0FDZCxHQUFHLEtBQUssQ0FBQztRQUVWLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSx3QkFBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDbEMsV0FBVyxFQUFFLE9BQU87WUFDcEIsV0FBVyxFQUFFLFdBQVcsYUFBWCxXQUFXLGNBQVgsV0FBVyxHQUFJLGdCQUFnQixPQUFPLFVBQVU7WUFDN0QsMkJBQTJCLEVBQUU7Z0JBQzNCLFlBQVksRUFBRSxNQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxZQUFZLG1DQUFJLHFCQUFJLENBQUMsV0FBVztnQkFDM0QsWUFBWSxFQUFFO29CQUNaLEtBQUs7b0JBQ0wsU0FBUztvQkFDVCxHQUFHLENBQUMsTUFBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsaUJBQWlCLG1DQUFJLEVBQUUsQ0FBQztpQkFDMUM7Z0JBQ0QsWUFBWSxFQUFFO29CQUNaLGNBQWM7b0JBQ2QsV0FBVztvQkFDWCxHQUFHLENBQUMsTUFBQSxXQUFXLGFBQVgsV0FBVyx1QkFBWCxXQUFXLENBQUUsaUJBQWlCLG1DQUFJLEVBQUUsQ0FBQztpQkFDMUM7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzFFLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksdUJBQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3ZDLFdBQVcsRUFBRSxlQUFlLE9BQU8sVUFBVTtZQUM3QyxVQUFVLEVBQUUsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksR0FBRyxPQUFPLFVBQVU7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDBCQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNoRCxJQUFJLEVBQUUsYUFBYSxhQUFiLGFBQWEsY0FBYixhQUFhLEdBQUksR0FBRyxPQUFPLGFBQWE7WUFDOUMsV0FBVyxFQUFFLGtCQUFrQixPQUFPLFVBQVU7WUFDaEQsUUFBUTtTQUNULENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQ3pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBZTtZQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlO1NBQ2hDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUE1REQsc0NBNERDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBpS2V5LFxuICBDb3JzLFxuICBJbnRlZ3JhdGlvbixcbiAgSVJlc3RBcGksXG4gIFJlc3RBcGksXG4gIFVzYWdlUGxhbixcbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQgeyBIdHRwTWV0aG9kIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5djJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VjdXJlUmVzdEFwaVJvdXRlIHtcbiAgcGF0aDogc3RyaW5nO1xuICBtZXRob2RzOiBIdHRwTWV0aG9kW107XG4gIGludGVncmF0aW9uOiBJbnRlZ3JhdGlvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWN1cmVSZXN0QXBpUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIEFQSS5cbiAgICovXG4gIGFwaU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gZm9yIHRoZSBBUEkuXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQ09SUyBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBgYWxsb3dPcmlnaW5zYCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgKGFsbCBvcmlnaW5zKS5cbiAgICogYGFkZGl0aW9uYWxNZXRob2RzYCBhbmQgYGFkZGl0aW9uYWxIZWFkZXJzYCBhcmUgYXBwZW5kZWQgdG8gdGhlIGRlZmF1bHRzXG4gICAqIChHRVQvT1BUSU9OUyBhbmQgQ29udGVudC1UeXBlL1gtQXBpLUtleSByZXNwZWN0aXZlbHkpLlxuICAgKi9cbiAgY29yc09wdGlvbnM/OiB7XG4gICAgYWxsb3dPcmlnaW5zPzogc3RyaW5nW107XG4gICAgYWRkaXRpb25hbE1ldGhvZHM/OiBzdHJpbmdbXTtcbiAgICBhZGRpdGlvbmFsSGVhZGVycz86IHN0cmluZ1tdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSb3V0ZXMgdG8gcmVnaXN0ZXIgb24gdGhlIEFQSS5cbiAgICovXG4gIHJvdXRlczogU2VjdXJlUmVzdEFwaVJvdXRlW107XG5cbiAgLyoqXG4gICAqIFRocm90dGxpbmcgbGltaXRzIGZvciB0aGUgdXNhZ2UgcGxhbi5cbiAgICogQGRlZmF1bHQgeyByYXRlTGltaXQ6IDEwMCwgYnVyc3RMaW1pdDogMjAwIH1cbiAgICovXG4gIHRocm90dGxlPzoge1xuICAgIHJhdGVMaW1pdDogbnVtYmVyO1xuICAgIGJ1cnN0TGltaXQ6IG51bWJlcjtcbiAgfTtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCBBUEkga2V5IG5hbWUuXG4gICAqIEBkZWZhdWx0IGB7YXBpTmFtZX0tYXBpLWtleWBcbiAgICovXG4gIGFwaUtleU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgdXNhZ2UgcGxhbiBuYW1lLlxuICAgKiBAZGVmYXVsdCBge2FwaU5hbWV9LXVzYWdlLXBsYW5gXG4gICAqL1xuICB1c2FnZVBsYW5OYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgU2VjdXJlUmVzdEFwaSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBhcGk6IFJlc3RBcGk7XG4gIHB1YmxpYyByZWFkb25seSBhcGlLZXk6IEFwaUtleTtcbiAgcHVibGljIHJlYWRvbmx5IHVzYWdlUGxhbjogVXNhZ2VQbGFuO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTZWN1cmVSZXN0QXBpUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3Qge1xuICAgICAgYXBpTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgY29yc09wdGlvbnMsXG4gICAgICByb3V0ZXMsXG4gICAgICB0aHJvdHRsZSA9IHsgcmF0ZUxpbWl0OiAxMDAsIGJ1cnN0TGltaXQ6IDIwMCB9LFxuICAgICAgYXBpS2V5TmFtZSxcbiAgICAgIHVzYWdlUGxhbk5hbWUsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgdGhpcy5hcGkgPSBuZXcgUmVzdEFwaSh0aGlzLCBcIkFwaVwiLCB7XG4gICAgICByZXN0QXBpTmFtZTogYXBpTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiA/PyBgUkVTVCBBUEkgZm9yICR7YXBpTmFtZX0gc2VydmljZWAsXG4gICAgICBkZWZhdWx0Q29yc1ByZWZsaWdodE9wdGlvbnM6IHtcbiAgICAgICAgYWxsb3dPcmlnaW5zOiBjb3JzT3B0aW9ucz8uYWxsb3dPcmlnaW5zID8/IENvcnMuQUxMX09SSUdJTlMsXG4gICAgICAgIGFsbG93TWV0aG9kczogW1xuICAgICAgICAgIFwiR0VUXCIsXG4gICAgICAgICAgXCJPUFRJT05TXCIsXG4gICAgICAgICAgLi4uKGNvcnNPcHRpb25zPy5hZGRpdGlvbmFsTWV0aG9kcyA/PyBbXSksXG4gICAgICAgIF0sXG4gICAgICAgIGFsbG93SGVhZGVyczogW1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCIsXG4gICAgICAgICAgXCJYLUFwaS1LZXlcIixcbiAgICAgICAgICAuLi4oY29yc09wdGlvbnM/LmFkZGl0aW9uYWxIZWFkZXJzID8/IFtdKSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHJvdXRlcykge1xuICAgICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmFwaS5yb290LmFkZFJlc291cmNlKHJvdXRlLnBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpKTtcbiAgICAgIGZvciAoY29uc3QgbWV0aG9kIG9mIHJvdXRlLm1ldGhvZHMpIHtcbiAgICAgICAgcmVzb3VyY2UuYWRkTWV0aG9kKG1ldGhvZCwgcm91dGUuaW50ZWdyYXRpb24sIHsgYXBpS2V5UmVxdWlyZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5hcGlLZXkgPSBuZXcgQXBpS2V5KHRoaXMsIFwiQXBpS2V5XCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBgQVBJIEtleSBmb3IgJHthcGlOYW1lfSBzZXJ2aWNlYCxcbiAgICAgIGFwaUtleU5hbWU6IGFwaUtleU5hbWUgPz8gYCR7YXBpTmFtZX0tYXBpLWtleWAsXG4gICAgfSk7XG5cbiAgICB0aGlzLnVzYWdlUGxhbiA9IG5ldyBVc2FnZVBsYW4odGhpcywgXCJVc2FnZVBsYW5cIiwge1xuICAgICAgbmFtZTogdXNhZ2VQbGFuTmFtZSA/PyBgJHthcGlOYW1lfS11c2FnZS1wbGFuYCxcbiAgICAgIGRlc2NyaXB0aW9uOiBgVXNhZ2UgcGxhbiBmb3IgJHthcGlOYW1lfSBzZXJ2aWNlYCxcbiAgICAgIHRocm90dGxlLFxuICAgIH0pO1xuXG4gICAgdGhpcy51c2FnZVBsYW4uYWRkQXBpU3RhZ2Uoe1xuICAgICAgYXBpOiB0aGlzLmFwaSBhcyBJUmVzdEFwaSxcbiAgICAgIHN0YWdlOiB0aGlzLmFwaS5kZXBsb3ltZW50U3RhZ2UsXG4gICAgfSk7XG4gICAgdGhpcy51c2FnZVBsYW4uYWRkQXBpS2V5KHRoaXMuYXBpS2V5KTtcbiAgfVxufVxuIl19
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJlLXJlc3QtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2VjdXJlLXJlc3QtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQVFvQztBQUVwQywyQ0FBdUM7QUFtRXZDLE1BQWEsYUFBYyxTQUFRLHNCQUFTO0lBSzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUI7O1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxFQUNKLE9BQU8sRUFDUCxXQUFXLEVBQ1gsV0FBVyxFQUNYLE1BQU0sRUFDTixhQUFhLEVBQ2IsUUFBUSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQzlDLFVBQVUsRUFDVixhQUFhLEdBQ2QsR0FBRyxLQUFLLENBQUM7UUFFVixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksd0JBQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ2xDLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLFdBQVcsRUFBRSxXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSSxnQkFBZ0IsT0FBTyxVQUFVO1lBQzdELGFBQWE7WUFDYiwyQkFBMkIsRUFBRTtnQkFDM0IsWUFBWSxFQUFFLE1BQUEsV0FBVyxhQUFYLFdBQVcsdUJBQVgsV0FBVyxDQUFFLFlBQVksbUNBQUkscUJBQUksQ0FBQyxXQUFXO2dCQUMzRCxZQUFZLEVBQUU7b0JBQ1osS0FBSztvQkFDTCxTQUFTO29CQUNULEdBQUcsQ0FBQyxNQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxpQkFBaUIsbUNBQUksRUFBRSxDQUFDO2lCQUMxQztnQkFDRCxZQUFZLEVBQUU7b0JBQ1osY0FBYztvQkFDZCxXQUFXO29CQUNYLEdBQUcsQ0FBQyxNQUFBLFdBQVcsYUFBWCxXQUFXLHVCQUFYLFdBQVcsQ0FBRSxpQkFBaUIsbUNBQUksRUFBRSxDQUFDO2lCQUMxQzthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FDOUIsQ0FBQztZQUNGLEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDMUUsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksdUJBQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3ZDLFdBQVcsRUFBRSxlQUFlLE9BQU8sVUFBVTtZQUM3QyxVQUFVLEVBQUUsVUFBVSxhQUFWLFVBQVUsY0FBVixVQUFVLEdBQUksR0FBRyxPQUFPLFVBQVU7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLDBCQUFTLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRTtZQUNoRCxJQUFJLEVBQUUsYUFBYSxhQUFiLGFBQWEsY0FBYixhQUFhLEdBQUksR0FBRyxPQUFPLGFBQWE7WUFDOUMsV0FBVyxFQUFFLGtCQUFrQixPQUFPLFVBQVU7WUFDaEQsUUFBUTtTQUNULENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO1lBQ3pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBZTtZQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlO1NBQ2hDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUFoRUQsc0NBZ0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXBpS2V5LFxuICBDb3JzLFxuICBJbnRlZ3JhdGlvbixcbiAgSVJlc3RBcGksXG4gIFJlc3RBcGksXG4gIFN0YWdlT3B0aW9ucyxcbiAgVXNhZ2VQbGFuLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXlcIjtcbmltcG9ydCB7IEh0dHBNZXRob2QgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWFwaWdhdGV3YXl2MlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTZWN1cmVSZXN0QXBpUm91dGUge1xuICBwYXRoOiBzdHJpbmc7XG4gIG1ldGhvZHM6IEh0dHBNZXRob2RbXTtcbiAgaW50ZWdyYXRpb246IEludGVncmF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyZVJlc3RBcGlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgQVBJLlxuICAgKi9cbiAgYXBpTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBmb3IgdGhlIEFQSS5cbiAgICovXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDT1JTIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIGBhbGxvd09yaWdpbnNgIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCAoYWxsIG9yaWdpbnMpLlxuICAgKiBgYWRkaXRpb25hbE1ldGhvZHNgIGFuZCBgYWRkaXRpb25hbEhlYWRlcnNgIGFyZSBhcHBlbmRlZCB0byB0aGUgZGVmYXVsdHNcbiAgICogKEdFVC9PUFRJT05TIGFuZCBDb250ZW50LVR5cGUvWC1BcGktS2V5IHJlc3BlY3RpdmVseSkuXG4gICAqL1xuICBjb3JzT3B0aW9ucz86IHtcbiAgICBhbGxvd09yaWdpbnM/OiBzdHJpbmdbXTtcbiAgICBhZGRpdGlvbmFsTWV0aG9kcz86IHN0cmluZ1tdO1xuICAgIGFkZGl0aW9uYWxIZWFkZXJzPzogc3RyaW5nW107XG4gIH07XG5cbiAgLyoqXG4gICAqIFJvdXRlcyB0byByZWdpc3RlciBvbiB0aGUgQVBJLlxuICAgKi9cbiAgcm91dGVzOiBTZWN1cmVSZXN0QXBpUm91dGVbXTtcblxuICAvKipcbiAgICogU3RhZ2Ugb3B0aW9ucyBmb3IgdGhlIEFQSSdzIGRlZmF1bHQgZGVwbG95bWVudC5cbiAgICpcbiAgICogVXNlIGBzdGFnZU5hbWVgIHRvIG92ZXJyaWRlIHRoZSBkZXBsb3llZCBzdGFnZSBuYW1lLlxuICAgKiBAZGVmYXVsdCBzdGFnZU5hbWUgXCJwcm9kXCIgKENESyBkZWZhdWx0KVxuICAgKi9cbiAgZGVwbG95T3B0aW9ucz86IFN0YWdlT3B0aW9ucztcblxuICAvKipcbiAgICogVGhyb3R0bGluZyBsaW1pdHMgZm9yIHRoZSB1c2FnZSBwbGFuLlxuICAgKiBAZGVmYXVsdCB7IHJhdGVMaW1pdDogMTAwLCBidXJzdExpbWl0OiAyMDAgfVxuICAgKi9cbiAgdGhyb3R0bGU/OiB7XG4gICAgcmF0ZUxpbWl0OiBudW1iZXI7XG4gICAgYnVyc3RMaW1pdDogbnVtYmVyO1xuICB9O1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgZ2VuZXJhdGVkIEFQSSBrZXkgbmFtZS5cbiAgICogQGRlZmF1bHQgYHthcGlOYW1lfS1hcGkta2V5YFxuICAgKi9cbiAgYXBpS2V5TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCB1c2FnZSBwbGFuIG5hbWUuXG4gICAqIEBkZWZhdWx0IGB7YXBpTmFtZX0tdXNhZ2UtcGxhbmBcbiAgICovXG4gIHVzYWdlUGxhbk5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWN1cmVSZXN0QXBpIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwaTogUmVzdEFwaTtcbiAgcHVibGljIHJlYWRvbmx5IGFwaUtleTogQXBpS2V5O1xuICBwdWJsaWMgcmVhZG9ubHkgdXNhZ2VQbGFuOiBVc2FnZVBsYW47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNlY3VyZVJlc3RBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCB7XG4gICAgICBhcGlOYW1lLFxuICAgICAgZGVzY3JpcHRpb24sXG4gICAgICBjb3JzT3B0aW9ucyxcbiAgICAgIHJvdXRlcyxcbiAgICAgIGRlcGxveU9wdGlvbnMsXG4gICAgICB0aHJvdHRsZSA9IHsgcmF0ZUxpbWl0OiAxMDAsIGJ1cnN0TGltaXQ6IDIwMCB9LFxuICAgICAgYXBpS2V5TmFtZSxcbiAgICAgIHVzYWdlUGxhbk5hbWUsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgdGhpcy5hcGkgPSBuZXcgUmVzdEFwaSh0aGlzLCBcIkFwaVwiLCB7XG4gICAgICByZXN0QXBpTmFtZTogYXBpTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiA/PyBgUkVTVCBBUEkgZm9yICR7YXBpTmFtZX0gc2VydmljZWAsXG4gICAgICBkZXBsb3lPcHRpb25zLFxuICAgICAgZGVmYXVsdENvcnNQcmVmbGlnaHRPcHRpb25zOiB7XG4gICAgICAgIGFsbG93T3JpZ2luczogY29yc09wdGlvbnM/LmFsbG93T3JpZ2lucyA/PyBDb3JzLkFMTF9PUklHSU5TLFxuICAgICAgICBhbGxvd01ldGhvZHM6IFtcbiAgICAgICAgICBcIkdFVFwiLFxuICAgICAgICAgIFwiT1BUSU9OU1wiLFxuICAgICAgICAgIC4uLihjb3JzT3B0aW9ucz8uYWRkaXRpb25hbE1ldGhvZHMgPz8gW10pLFxuICAgICAgICBdLFxuICAgICAgICBhbGxvd0hlYWRlcnM6IFtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiLFxuICAgICAgICAgIFwiWC1BcGktS2V5XCIsXG4gICAgICAgICAgLi4uKGNvcnNPcHRpb25zPy5hZGRpdGlvbmFsSGVhZGVycyA/PyBbXSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5hcGkucm9vdC5yZXNvdXJjZUZvclBhdGgoXG4gICAgICAgIHJvdXRlLnBhdGgucmVwbGFjZSgvXlxcLy8sIFwiXCIpXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2Ygcm91dGUubWV0aG9kcykge1xuICAgICAgICByZXNvdXJjZS5hZGRNZXRob2QobWV0aG9kLCByb3V0ZS5pbnRlZ3JhdGlvbiwgeyBhcGlLZXlSZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFwaUtleSA9IG5ldyBBcGlLZXkodGhpcywgXCJBcGlLZXlcIiwge1xuICAgICAgZGVzY3JpcHRpb246IGBBUEkgS2V5IGZvciAke2FwaU5hbWV9IHNlcnZpY2VgLFxuICAgICAgYXBpS2V5TmFtZTogYXBpS2V5TmFtZSA/PyBgJHthcGlOYW1lfS1hcGkta2V5YCxcbiAgICB9KTtcblxuICAgIHRoaXMudXNhZ2VQbGFuID0gbmV3IFVzYWdlUGxhbih0aGlzLCBcIlVzYWdlUGxhblwiLCB7XG4gICAgICBuYW1lOiB1c2FnZVBsYW5OYW1lID8/IGAke2FwaU5hbWV9LXVzYWdlLXBsYW5gLFxuICAgICAgZGVzY3JpcHRpb246IGBVc2FnZSBwbGFuIGZvciAke2FwaU5hbWV9IHNlcnZpY2VgLFxuICAgICAgdGhyb3R0bGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnVzYWdlUGxhbi5hZGRBcGlTdGFnZSh7XG4gICAgICBhcGk6IHRoaXMuYXBpIGFzIElSZXN0QXBpLFxuICAgICAgc3RhZ2U6IHRoaXMuYXBpLmRlcGxveW1lbnRTdGFnZSxcbiAgICB9KTtcbiAgICB0aGlzLnVzYWdlUGxhbi5hZGRBcGlLZXkodGhpcy5hcGlLZXkpO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aligent/cdk-secure-rest-api",
3
- "version": "1.1.2",
3
+ "version": "1.2.0",
4
4
  "description": "A CDK construct for creating API Gateway REST APIs secured with API Key authentication and usage plan throttling",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/jest": "^29.5.10",
23
- "@types/node": "^24.12.4",
23
+ "@types/node": "^24.13.2",
24
24
  "aws-cdk": "^2.1124.1",
25
25
  "jest": "^29.7.0",
26
26
  "ts-jest": "^29.4.9",