cdk-nuxt 2.19.0 → 2.20.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/README.md CHANGED
@@ -116,6 +116,11 @@ First-time setup (once per AWS account/region):
116
116
  cdk bootstrap aws://YOUR_ACCOUNT_ID/YOUR_REGION
117
117
  ```
118
118
 
119
+ > When using the [WAF via CloudFrontWafStack](docs/WAF.md) and using a different region than `us-east-1`, you also need to bootstrap `us-east-1` for the WAF resources:
120
+ > ```bash
121
+ > cdk bootstrap aws://YOUR_ACCOUNT_ID/us-east-1
122
+ > ```
123
+
119
124
  Deploy your app:
120
125
  ```bash
121
126
  node_modules/.bin/cdk-nuxt-deploy-server
@@ -184,6 +184,15 @@ class CloudFrontWebAcl extends constructs_1.Construct {
184
184
  },
185
185
  });
186
186
  }
187
+ // Custom rules (added at the end with automatically assigned priorities)
188
+ if (config.customRules && config.customRules.length > 0) {
189
+ config.customRules.forEach((customRule) => {
190
+ rules.push({
191
+ ...customRule,
192
+ priority: priority++,
193
+ });
194
+ });
195
+ }
187
196
  // Create the Web ACL
188
197
  this.webAcl = new aws_wafv2_1.CfnWebACL(this, 'WebAcl', {
189
198
  name: props.name,
@@ -210,4 +219,4 @@ class CloudFrontWebAcl extends constructs_1.Construct {
210
219
  }
211
220
  }
212
221
  exports.CloudFrontWebAcl = CloudFrontWebAcl;
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xvdWRGcm9udFdlYkFjbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNsb3VkRnJvbnRXZWJBY2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXFDO0FBQ3JDLHFEQUEwRDtBQUMxRCwyQ0FBb0U7QUFpQnBFOzs7R0FHRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFNM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sTUFBTSxHQUFHLEVBQUMsR0FBRyxtQ0FBdUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO1FBQzNDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVqQiw2REFBNkQ7UUFDN0QsSUFBSSxNQUFNLENBQUMsa0JBQWtCLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksY0FBYyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlGLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsUUFBUSxFQUFFLFFBQVEsRUFBRTtnQkFDcEIsU0FBUyxFQUFFO29CQUNQLHVCQUF1QixFQUFFO3dCQUNyQixHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU87cUJBQzVCO2lCQUNKO2dCQUNELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUM7Z0JBQ25CLGdCQUFnQixFQUFFO29CQUNkLHNCQUFzQixFQUFFLElBQUk7b0JBQzVCLHdCQUF3QixFQUFFLElBQUk7b0JBQzlCLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxh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QUU7Z0JBQ2Qsc0JBQXNCLEVBQUUsSUFBSTtnQkFDNUIsd0JBQXdCLEVBQUUsSUFBSTtnQkFDOUIsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFDLGFBQWEsUUFBUTthQUM5QztTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNLLFdBQVcsQ0FBQyxJQUFZLEVBQUUsU0FBbUI7UUFDakQsT0FBTyxJQUFJLG9CQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUM1QixJQUFJO1lBQ0osS0FBSyxFQUFFLFlBQVk7WUFDbkIsZ0JBQWdCLEVBQUUsTUFBTTtZQUN4QixTQUFTO1NBQ1osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBek5ELDRDQXlOQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uc3RydWN0fSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7Q2ZuV2ViQUNMLCBDZm5JUFNldH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXdhZnYyJztcbmltcG9ydCB7dHlwZSBXYWZDb25maWcsIERFRkFVTFRfTlVYVF9XQUZfQ09ORklHfSBmcm9tICcuL1dhZkNvbmZpZyc7XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgQ2xvdWRGcm9udFdlYkFjbCBjb25zdHJ1Y3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRGcm9udFdlYkFjbFByb3BzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBwcmVmaXggZm9yIHRoZSBXZWIgQUNMIGFuZCByZWxhdGVkIHJlc291cmNlcy5cbiAgICAgKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXQUYgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGNvbmZpZzogV2FmQ29uZmlnO1xufVxuXG4vKipcbiAqIEEgY29uc3RydWN0IHRoYXQgY3JlYXRlcyBhbiBBV1MgV0FGIFdlYiBBQ0wgZm9yIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9ucy5cbiAqIFByb3ZpZGVzIHByb3RlY3Rpb24gYWdhaW5zdCBjb21tb24gd2ViIGV4cGxvaXRzLCBib3RzLCBhbmQgRERvUyBhdHRhY2tzLlxuICovXG5leHBvcnQgY2xhc3MgQ2xvdWRGcm9udFdlYkFjbCBleHRlbmRzIENvbnN0cnVjdCB7XG4gICAgLyoqXG4gICAgICogVGhlIFdlYiBBQ0wgcmVzb3VyY2UuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHdlYkFjbDogQ2ZuV2ViQUNMO1xuXG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENsb3VkRnJvbnRXZWJBY2xQcm9wcykge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5ERUZBVUxUX05VWFRfV0FGX0NPTkZJRywgLi4ucHJvcHMuY29uZmlnfTtcbiAgICAgICAgY29uc3QgcnVsZXM6IENmbldlYkFDTC5SdWxlUHJvcGVydHlbXSA9IFtdO1xuICAgICAgICBsZXQgcHJpb3JpdHkgPSAwO1xuXG4gICAgICAgIC8vIElQIGFsbG93bGlzdCAoaGlnaGVzdCBwcmlvcml0eSAtIGJ5cGFzc2VzIGFsbCBvdGhlciBydWxlcylcbiAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkSXBBZGRyZXNzZXMgJiYgY29uZmlnLmFsbG93ZWRJcEFkZHJlc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkSXBTZXQgPSB0aGlzLmNyZWF0ZUlwU2V0KGAke3Byb3BzLm5hbWV9LWFsbG93ZWQtaXBzYCwgY29uZmlnLmFsbG93ZWRJcEFkZHJlc3Nlcyk7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQWxsb3dlZElwQWRkcmVzc2VzJyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaXBTZXRSZWZlcmVuY2VTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFybjogYWxsb3dlZElwU2V0LmF0dHJBcm4sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb246IHthbGxvdzoge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1BbGxvd2VkSXBzYCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJUCBibG9ja2xpc3RcbiAgICAgICAgaWYgKGNvbmZpZy5ibG9ja2VkSXBBZGRyZXNzZXMgJiYgY29uZmlnLmJsb2NrZWRJcEFkZHJlc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBibG9ja2VkSXBTZXQgPSB0aGlzLmNyZWF0ZUlwU2V0KGAke3Byb3BzLm5hbWV9LWJsb2NrZWQtaXBzYCwgY29uZmlnLmJsb2NrZWRJcEFkZHJlc3Nlcyk7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQmxvY2tlZElwQWRkcmVzc2VzJyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaXBTZXRSZWZlcmVuY2VTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFybjogYmxvY2tlZElwU2V0LmF0dHJBcm4sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb246IHtibG9jazoge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1CbG9ja2VkSXBzYCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZW8tYmxvY2tpbmdcbiAgICAgICAgaWYgKGNvbmZpZy5ibG9ja2VkQ291bnRyaWVzICYmIGNvbmZpZy5ibG9ja2VkQ291bnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdHZW9CbG9ja2luZycsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGdlb01hdGNoU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q29kZXM6IGNvbmZpZy5ibG9ja2VkQ291bnRyaWVzLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7YmxvY2s6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9R2VvQmxvY2tpbmdgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJhdGUgbGltaXRpbmcgKEREb1MgcHJvdGVjdGlvbilcbiAgICAgICAgaWYgKGNvbmZpZy5yYXRlTGltaXQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdSYXRlTGltaXRpbmcnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICByYXRlQmFzZWRTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0OiBjb25maWcucmF0ZUxpbWl0LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlS2V5VHlwZTogJ0lQJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge2Jsb2NrOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fVJhdGVMaW1pdGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBDb21tb24gUnVsZSBTZXRcbiAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVDb21tb25SdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0NvbW1vblJ1bGVTZXQnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb246IHtub25lOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUNvbW1vblJ1bGVTZXRgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFXUyBNYW5hZ2VkIFJ1bGVzIC0gS25vd24gQmFkIElucHV0c1xuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUtub3duQmFkSW5wdXRzUnVsZVNldCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0tub3duQmFkSW5wdXRzUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0tub3duQmFkSW5wdXRzUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9S25vd25CYWRJbnB1dHNgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFXUyBNYW5hZ2VkIFJ1bGVzIC0gQW5vbnltb3VzIElQIExpc3RcbiAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVBbm9ueW1vdXNJcFJ1bGVTZXQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNBbm9ueW1vdXNJcExpc3QnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lOiAnQVdTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNBbm9ueW1vdXNJcExpc3QnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb246IHtub25lOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUFub255bW91c0lwTGlzdGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBBbWF6b24gSVAgUmVwdXRhdGlvbiBMaXN0XG4gICAgICAgIGlmIChjb25maWcuZW5hYmxlQW1hem9uSXBSZXB1dGF0aW9uUnVsZVNldCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0FtYXpvbklwUmVwdXRhdGlvbkxpc3QnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lOiAnQVdTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNBbWF6b25JcFJlcHV0YXRpb25MaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG92ZXJyaWRlQWN0aW9uOiB7bm9uZToge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1BbWF6b25JcFJlcHV0YXRpb25gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFXUyBNYW5hZ2VkIFJ1bGVzIC0gQm90IENvbnRyb2xcbiAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVCb3RDb250cm9sUnVsZVNldCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0JvdENvbnRyb2xSdWxlU2V0JyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFJ1bGVHcm91cFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQm90Q29udHJvbFJ1bGVTZXQnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb246IHtub25lOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUJvdENvbnRyb2xgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgV2ViIEFDTFxuICAgICAgICB0aGlzLndlYkFjbCA9IG5ldyBDZm5XZWJBQ0wodGhpcywgJ1dlYkFjbCcsIHtcbiAgICAgICAgICAgIG5hbWU6IHByb3BzLm5hbWUsXG4gICAgICAgICAgICBzY29wZTogJ0NMT1VERlJPTlQnLFxuICAgICAgICAgICAgZGVmYXVsdEFjdGlvbjoge2FsbG93OiB7fX0sXG4gICAgICAgICAgICBydWxlcyxcbiAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1XZWJBY2xgLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBJUCBzZXQgZm9yIFdBRiBydWxlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUlwU2V0KG5hbWU6IHN0cmluZywgYWRkcmVzc2VzOiBzdHJpbmdbXSk6IENmbklQU2V0IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDZm5JUFNldCh0aGlzLCBuYW1lLCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgc2NvcGU6ICdDTE9VREZST05UJyxcbiAgICAgICAgICAgIGlwQWRkcmVzc1ZlcnNpb246ICdJUFY0JyxcbiAgICAgICAgICAgIGFkZHJlc3NlcyxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4iXX0=
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xvdWRGcm9udFdlYkFjbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIkNsb3VkRnJvbnRXZWJBY2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXFDO0FBQ3JDLHFEQUEwRDtBQUMxRCwyQ0FBb0U7QUFpQnBFOzs7R0FHRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7SUFNM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLE1BQU0sTUFBTSxHQUFHLEVBQUMsR0FBRyxtQ0FBdUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBNkIsRUFBRSxDQUFDO1FBQzNDLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztRQUVqQiw2REFBNkQ7UUFDN0QsSUFBSSxNQUFNLENBQUMsa0JBQWtCLElBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksY0FBYyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlGLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1AsSUFBSSxFQUFFLG9CQUFvQjtnQkFDMUIsUUFBUSxFQUFFLFFBQVEsRUFBRTtnQkFDcEIsU0FBUyxFQUFFO29CQUNQLHVCQUF1QixFQUFFO3dCQUNyQixHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU87cUJBQzVCO2lCQUNKO2dCQUNELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUM7Z0JBQ25CLGdCQUFnQixFQUFFO29CQUNkLHNCQUFzQixFQUFFLElBQUk7b0JBQzVCLHdCQUF3QixFQUFFLElBQUk7b0JBQzlCLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxh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LFFBQVEsRUFBRSxRQUFRLEVBQUU7aUJBQ0csQ0FBQyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUkscUJBQVMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1lBQ3hDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixLQUFLLEVBQUUsWUFBWTtZQUNuQixhQUFhLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFDO1lBQzFCLEtBQUs7WUFDTCxnQkFBZ0IsRUFBRTtnQkFDZCxzQkFBc0IsRUFBRSxJQUFJO2dCQUM1Qix3QkFBd0IsRUFBRSxJQUFJO2dCQUM5QixVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUMsYUFBYSxRQUFRO2FBQzlDO1NBQ0osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ssV0FBVyxDQUFDLElBQVksRUFBRSxTQUFtQjtRQUNqRCxPQUFPLElBQUksb0JBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzVCLElBQUk7WUFDSixLQUFLLEVBQUUsWUFBWTtZQUNuQixnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLFNBQVM7U0FDWixDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0o7QUFuT0QsNENBbU9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHtDZm5XZWJBQ0wsIENmbklQU2V0fSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInO1xuaW1wb3J0IHt0eXBlIFdhZkNvbmZpZywgREVGQVVMVF9OVVhUX1dBRl9DT05GSUd9IGZyb20gJy4vV2FmQ29uZmlnJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDbG91ZEZyb250V2ViQWNsIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbG91ZEZyb250V2ViQWNsUHJvcHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIHByZWZpeCBmb3IgdGhlIFdlYiBBQ0wgYW5kIHJlbGF0ZWQgcmVzb3VyY2VzLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFdBRiBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29uZmlnOiBXYWZDb25maWc7XG59XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIGFuIEFXUyBXQUYgV2ViIEFDTCBmb3IgQ2xvdWRGcm9udCBkaXN0cmlidXRpb25zLlxuICogUHJvdmlkZXMgcHJvdGVjdGlvbiBhZ2FpbnN0IGNvbW1vbiB3ZWIgZXhwbG9pdHMsIGJvdHMsIGFuZCBERG9TIGF0dGFja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZEZyb250V2ViQWNsIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgV2ViIEFDTCByZXNvdXJjZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgd2ViQWNsOiBDZm5XZWJBQ0w7XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2xvdWRGcm9udFdlYkFjbFByb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAgICAgY29uc3QgY29uZmlnID0gey4uLkRFRkFVTFRfTlVYVF9XQUZfQ09ORklHLCAuLi5wcm9wcy5jb25maWd9O1xuICAgICAgICBjb25zdCBydWxlczogQ2ZuV2ViQUNMLlJ1bGVQcm9wZXJ0eVtdID0gW107XG4gICAgICAgIGxldCBwcmlvcml0eSA9IDA7XG5cbiAgICAgICAgLy8gSVAgYWxsb3dsaXN0IChoaWdoZXN0IHByaW9yaXR5IC0gYnlwYXNzZXMgYWxsIG90aGVyIHJ1bGVzKVxuICAgICAgICBpZiAoY29uZmlnLmFsbG93ZWRJcEFkZHJlc3NlcyAmJiBjb25maWcuYWxsb3dlZElwQWRkcmVzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRJcFNldCA9IHRoaXMuY3JlYXRlSXBTZXQoYCR7cHJvcHMubmFtZX0tYWxsb3dlZC1pcHNgLCBjb25maWcuYWxsb3dlZElwQWRkcmVzc2VzKTtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBbGxvd2VkSXBBZGRyZXNzZXMnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBpcFNldFJlZmVyZW5jZVN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJuOiBhbGxvd2VkSXBTZXQuYXR0ckFybixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge2FsbG93OiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUFsbG93ZWRJcHNgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElQIGJsb2NrbGlzdFxuICAgICAgICBpZiAoY29uZmlnLmJsb2NrZWRJcEFkZHJlc3NlcyAmJiBjb25maWcuYmxvY2tlZElwQWRkcmVzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2NrZWRJcFNldCA9IHRoaXMuY3JlYXRlSXBTZXQoYCR7cHJvcHMubmFtZX0tYmxvY2tlZC1pcHNgLCBjb25maWcuYmxvY2tlZElwQWRkcmVzc2VzKTtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdCbG9ja2VkSXBBZGRyZXNzZXMnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBpcFNldFJlZmVyZW5jZVN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJuOiBibG9ja2VkSXBTZXQuYXR0ckFybixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFjdGlvbjoge2Jsb2NrOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUJsb2NrZWRJcHNgLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlby1ibG9ja2luZ1xuICAgICAgICBpZiAoY29uZmlnLmJsb2NrZWRDb3VudHJpZXMgJiYgY29uZmlnLmJsb2NrZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0dlb0Jsb2NraW5nJyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvTWF0Y2hTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlDb2RlczogY29uZmlnLmJsb2NrZWRDb3VudHJpZXMsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhY3Rpb246IHtibG9jazoge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1HZW9CbG9ja2luZ2AsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmF0ZSBsaW1pdGluZyAoRERvUyBwcm90ZWN0aW9uKVxuICAgICAgICBpZiAoY29uZmlnLnJhdGVMaW1pdCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ1JhdGVMaW1pdGluZycsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHJhdGVCYXNlZFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQ6IGNvbmZpZy5yYXRlTGltaXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVLZXlUeXBlOiAnSVAnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB7YmxvY2s6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9UmF0ZUxpbWl0YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBV1MgTWFuYWdlZCBSdWxlcyAtIENvbW1vbiBSdWxlIFNldFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUNvbW1vblJ1bGVTZXQpIHtcbiAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNDb21tb25SdWxlU2V0JyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFJ1bGVHcm91cFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQ29tbW9uUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9Q29tbW9uUnVsZVNldGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBLbm93biBCYWQgSW5wdXRzXG4gICAgICAgIGlmIChjb25maWcuZW5hYmxlS25vd25CYWRJbnB1dHNSdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzS25vd25CYWRJbnB1dHNSdWxlU2V0JyxcbiAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICBzdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWFuYWdlZFJ1bGVHcm91cFN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZTogJ0FXUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzS25vd25CYWRJbnB1dHNSdWxlU2V0JyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG92ZXJyaWRlQWN0aW9uOiB7bm9uZToge319LFxuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlDb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2xvdWRXYXRjaE1ldHJpY3NFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNOYW1lOiBgJHtjb25maWcubWV0cmljc1ByZWZpeH1Lbm93bkJhZElucHV0c2AsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBBbm9ueW1vdXMgSVAgTGlzdFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUFub255bW91c0lwUnVsZVNldCkge1xuICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0Fub255bW91c0lwTGlzdCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0Fub255bW91c0lwTGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9QW5vbnltb3VzSXBMaXN0YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBV1MgTWFuYWdlZCBSdWxlcyAtIEFtYXpvbiBJUCBSZXB1dGF0aW9uIExpc3RcbiAgICAgICAgaWYgKGNvbmZpZy5lbmFibGVBbWF6b25JcFJlcHV0YXRpb25SdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQW1hem9uSXBSZXB1dGF0aW9uTGlzdCcsXG4gICAgICAgICAgICAgICAgcHJpb3JpdHk6IHByaW9yaXR5KyssXG4gICAgICAgICAgICAgICAgc3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIG1hbmFnZWRSdWxlR3JvdXBTdGF0ZW1lbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWU6ICdBV1MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ0FXU01hbmFnZWRSdWxlc0FtYXpvbklwUmVwdXRhdGlvbkxpc3QnLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3ZlcnJpZGVBY3Rpb246IHtub25lOiB7fX0sXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eUNvbmZpZzoge1xuICAgICAgICAgICAgICAgICAgICBzYW1wbGVkUmVxdWVzdHNFbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGAke2NvbmZpZy5tZXRyaWNzUHJlZml4fUFtYXpvbklwUmVwdXRhdGlvbmAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQVdTIE1hbmFnZWQgUnVsZXMgLSBCb3QgQ29udHJvbFxuICAgICAgICBpZiAoY29uZmlnLmVuYWJsZUJvdENvbnRyb2xSdWxlU2V0KSB7XG4gICAgICAgICAgICBydWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQVdTTWFuYWdlZFJ1bGVzQm90Q29udHJvbFJ1bGVTZXQnLFxuICAgICAgICAgICAgICAgIHByaW9yaXR5OiBwcmlvcml0eSsrLFxuICAgICAgICAgICAgICAgIHN0YXRlbWVudDoge1xuICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkUnVsZUdyb3VwU3RhdGVtZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JOYW1lOiAnQVdTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdBV1NNYW5hZ2VkUnVsZXNCb3RDb250cm9sUnVsZVNldCcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdmVycmlkZUFjdGlvbjoge25vbmU6IHt9fSxcbiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9Qm90Q29udHJvbGAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3VzdG9tIHJ1bGVzIChhZGRlZCBhdCB0aGUgZW5kIHdpdGggYXV0b21hdGljYWxseSBhc3NpZ25lZCBwcmlvcml0aWVzKVxuICAgICAgICBpZiAoY29uZmlnLmN1c3RvbVJ1bGVzICYmIGNvbmZpZy5jdXN0b21SdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25maWcuY3VzdG9tUnVsZXMuZm9yRWFjaCgoY3VzdG9tUnVsZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAuLi5jdXN0b21SdWxlLFxuICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogcHJpb3JpdHkrKyxcbiAgICAgICAgICAgICAgICB9IGFzIENmbldlYkFDTC5SdWxlUHJvcGVydHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIFdlYiBBQ0xcbiAgICAgICAgdGhpcy53ZWJBY2wgPSBuZXcgQ2ZuV2ViQUNMKHRoaXMsICdXZWJBY2wnLCB7XG4gICAgICAgICAgICBuYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgICAgICAgc2NvcGU6ICdDTE9VREZST05UJyxcbiAgICAgICAgICAgIGRlZmF1bHRBY3Rpb246IHthbGxvdzoge319LFxuICAgICAgICAgICAgcnVsZXMsXG4gICAgICAgICAgICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICAgICAgICAgICAgc2FtcGxlZFJlcXVlc3RzRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjbG91ZFdhdGNoTWV0cmljc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbWV0cmljTmFtZTogYCR7Y29uZmlnLm1ldHJpY3NQcmVmaXh9V2ViQWNsYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gSVAgc2V0IGZvciBXQUYgcnVsZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVJcFNldChuYW1lOiBzdHJpbmcsIGFkZHJlc3Nlczogc3RyaW5nW10pOiBDZm5JUFNldCB7XG4gICAgICAgIHJldHVybiBuZXcgQ2ZuSVBTZXQodGhpcywgbmFtZSwge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHNjb3BlOiAnQ0xPVURGUk9OVCcsXG4gICAgICAgICAgICBpcEFkZHJlc3NWZXJzaW9uOiAnSVBWNCcsXG4gICAgICAgICAgICBhZGRyZXNzZXMsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuIl19
@@ -213,6 +213,16 @@ export class CloudFrontWebAcl extends Construct {
213
213
  });
214
214
  }
215
215
 
216
+ // Custom rules (added at the end with automatically assigned priorities)
217
+ if (config.customRules && config.customRules.length > 0) {
218
+ config.customRules.forEach((customRule) => {
219
+ rules.push({
220
+ ...customRule,
221
+ priority: priority++,
222
+ } as CfnWebACL.RuleProperty);
223
+ });
224
+ }
225
+
216
226
  // Create the Web ACL
217
227
  this.webAcl = new CfnWebACL(this, 'WebAcl', {
218
228
  name: props.name,
@@ -63,6 +63,34 @@ export interface WafConfig {
63
63
  * @default 'WafMetrics'
64
64
  */
65
65
  readonly metricsPrefix?: string;
66
+ /**
67
+ * Custom WAF rules to add at the end of the rule set.
68
+ * These rules will be appended after all built-in managed rules.
69
+ *
70
+ * Note: Do not set the `priority` field - it will be automatically assigned.
71
+ *
72
+ * Example:
73
+ * ```typescript
74
+ * customRules: [{
75
+ * name: 'BlockSpecificUserAgent',
76
+ * statement: {
77
+ * byteMatchStatement: {
78
+ * searchString: 'BadBot',
79
+ * fieldToMatch: { singleHeader: { name: 'user-agent' } },
80
+ * textTransformations: [{ priority: 0, type: 'LOWERCASE' }],
81
+ * positionalConstraint: 'CONTAINS'
82
+ * }
83
+ * },
84
+ * action: { block: {} },
85
+ * visibilityConfig: {
86
+ * sampledRequestsEnabled: true,
87
+ * cloudWatchMetricsEnabled: true,
88
+ * metricName: 'BlockSpecificUserAgent'
89
+ * }
90
+ * }]
91
+ * ```
92
+ */
93
+ readonly customRules?: Omit<import('aws-cdk-lib/aws-wafv2').CfnWebACL.RuleProperty, 'priority'>[];
66
94
  }
67
95
  /**
68
96
  * Default configuration for WAF optimized for Nuxt applications.
@@ -13,4 +13,4 @@ exports.DEFAULT_NUXT_WAF_CONFIG = {
13
13
  rateLimit: 2000,
14
14
  metricsPrefix: 'WafMetrics',
15
15
  };
16
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2FmQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiV2FmQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZFQTs7R0FFRztBQUNVLFFBQUEsdUJBQXVCLEdBQXVCO0lBQ3ZELG1CQUFtQixFQUFFLElBQUk7SUFDekIsMkJBQTJCLEVBQUUsSUFBSTtJQUNqQyx3QkFBd0IsRUFBRSxLQUFLO0lBQy9CLCtCQUErQixFQUFFLElBQUk7SUFDckMsdUJBQXVCLEVBQUUsS0FBSztJQUM5QixTQUFTLEVBQUUsSUFBSTtJQUNmLGFBQWEsRUFBRSxZQUFZO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQVdTIFdBRiBXZWIgQUNMLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhZkNvbmZpZyB7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBBV1MgbWFuYWdlZCBydWxlIGZvciBjb21tb24gZXhwbG9pdHMgKFNRTCBpbmplY3Rpb24sIFhTUywgZXRjLikuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIGNvbnRhaW5zIHJ1bGVzIHRoYXQgYmxvY2sgcmVxdWVzdCBwYXR0ZXJucyBhc3NvY2lhdGVkIHdpdGggZXhwbG9pdGF0aW9uXG4gICAgICogb2YgdnVsbmVyYWJpbGl0aWVzIHNwZWNpZmljIHRvIHdlYiBhcHBsaWNhdGlvbnMuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUNvbW1vblJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3Iga25vd24gYmFkIGlucHV0cy5cbiAgICAgKiBUaGlzIHJ1bGUgZ3JvdXAgY29udGFpbnMgcnVsZXMgdG8gYmxvY2sgcmVxdWVzdCBwYXR0ZXJucyBrbm93biB0byBiZSBpbnZhbGlkXG4gICAgICogYW5kIGFzc29jaWF0ZWQgd2l0aCBleHBsb2l0YXRpb24gb3IgZGlzY292ZXJ5IG9mIHZ1bG5lcmFiaWxpdGllcy5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlS25vd25CYWRJbnB1dHNSdWxlU2V0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIEFXUyBtYW5hZ2VkIHJ1bGUgZm9yIGFub255bW91cyBJUCBhZGRyZXNzZXMuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIGNvbnRhaW5zIHJ1bGVzIHRvIGJsb2NrIHJlcXVlc3RzIGZyb20gc2VydmljZXMgdGhhdCBhbGxvd1xuICAgICAqIG9iZnVzY2F0aW9uIG9mIHZpZXdlciBpZGVudGl0eSAoVlBOcywgcHJveGllcywgVG9yIG5vZGVzLCBob3N0aW5nIHByb3ZpZGVycykuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBbm9ueW1vdXNJcFJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3IgQW1hem9uIElQIHJlcHV0YXRpb24gbGlzdC5cbiAgICAgKiBUaGlzIHJ1bGUgZ3JvdXAgY29udGFpbnMgcnVsZXMgYmFzZWQgb24gQW1hem9uIHRocmVhdCBpbnRlbGxpZ2VuY2UuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUFtYXpvbklwUmVwdXRhdGlvblJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3IgYm90IGNvbnRyb2wuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIHByb3ZpZGVzIHByb3RlY3Rpb24gYWdhaW5zdCBhdXRvbWF0ZWQgYm90cy5cbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgcGFpZCBmZWF0dXJlIHdpdGggYWRkaXRpb25hbCBjb3N0cy5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUJvdENvbnRyb2xSdWxlU2V0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIGZyb20gYSBzaW5nbGUgSVAgd2l0aGluIGEgNS1taW51dGUgcGVyaW9kXG4gICAgICogdG8gcHJvdGVjdCBhZ2FpbnN0IEREb1MgYXR0YWNrcy5cbiAgICAgKiBDYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyBpdCB0byBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZGVmYXVsdCAyMDAwXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmF0ZUxpbWl0PzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgY291bnRyeSBjb2RlcyAoSVNPIDMxNjYtMSBhbHBoYS0yKSB0byBibG9jay5cbiAgICAgKiBFeGFtcGxlOiBbJ0NOJywgJ1JVJywgJ0tQJ11cbiAgICAgKi9cbiAgICByZWFkb25seSBibG9ja2VkQ291bnRyaWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gSVAgYWRkcmVzc2VzIG9yIENJRFIgcmFuZ2VzIHRvIGJsb2NrLlxuICAgICAqIEV4YW1wbGU6IFsnMTkyLjAuMi4wLzI0JywgJzE5OC41MS4xMDAuNDIvMzInXVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJsb2NrZWRJcEFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIElQIGFkZHJlc3NlcyBvciBDSURSIHJhbmdlcyB0byBhbGxvdyAoYnlwYXNzIGFsbCBydWxlcykuXG4gICAgICogRXhhbXBsZTogWycyMDMuMC4xMTMuMC8yNCddXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dlZElwQWRkcmVzc2VzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBDbG91ZFdhdGNoIG1ldHJpY3MgbmFtZSBwcmVmaXggZm9yIHRoZSBXQUYuXG4gICAgICogQGRlZmF1bHQgJ1dhZk1ldHJpY3MnXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWV0cmljc1ByZWZpeD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIFdBRiBvcHRpbWl6ZWQgZm9yIE51eHQgYXBwbGljYXRpb25zLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9OVVhUX1dBRl9DT05GSUc6IFBhcnRpYWw8V2FmQ29uZmlnPiA9IHtcbiAgICBlbmFibGVDb21tb25SdWxlU2V0OiB0cnVlLFxuICAgIGVuYWJsZUtub3duQmFkSW5wdXRzUnVsZVNldDogdHJ1ZSxcbiAgICBlbmFibGVBbm9ueW1vdXNJcFJ1bGVTZXQ6IGZhbHNlLFxuICAgIGVuYWJsZUFtYXpvbklwUmVwdXRhdGlvblJ1bGVTZXQ6IHRydWUsXG4gICAgZW5hYmxlQm90Q29udHJvbFJ1bGVTZXQ6IGZhbHNlLFxuICAgIHJhdGVMaW1pdDogMjAwMCxcbiAgICBtZXRyaWNzUHJlZml4OiAnV2FmTWV0cmljcycsXG59O1xuXG4iXX0=
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2FmQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiV2FmQ29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBHQTs7R0FFRztBQUNVLFFBQUEsdUJBQXVCLEdBQXVCO0lBQ3ZELG1CQUFtQixFQUFFLElBQUk7SUFDekIsMkJBQTJCLEVBQUUsSUFBSTtJQUNqQyx3QkFBd0IsRUFBRSxLQUFLO0lBQy9CLCtCQUErQixFQUFFLElBQUk7SUFDckMsdUJBQXVCLEVBQUUsS0FBSztJQUM5QixTQUFTLEVBQUUsSUFBSTtJQUNmLGFBQWEsRUFBRSxZQUFZO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgQVdTIFdBRiBXZWIgQUNMLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhZkNvbmZpZyB7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBBV1MgbWFuYWdlZCBydWxlIGZvciBjb21tb24gZXhwbG9pdHMgKFNRTCBpbmplY3Rpb24sIFhTUywgZXRjLikuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIGNvbnRhaW5zIHJ1bGVzIHRoYXQgYmxvY2sgcmVxdWVzdCBwYXR0ZXJucyBhc3NvY2lhdGVkIHdpdGggZXhwbG9pdGF0aW9uXG4gICAgICogb2YgdnVsbmVyYWJpbGl0aWVzIHNwZWNpZmljIHRvIHdlYiBhcHBsaWNhdGlvbnMuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUNvbW1vblJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3Iga25vd24gYmFkIGlucHV0cy5cbiAgICAgKiBUaGlzIHJ1bGUgZ3JvdXAgY29udGFpbnMgcnVsZXMgdG8gYmxvY2sgcmVxdWVzdCBwYXR0ZXJucyBrbm93biB0byBiZSBpbnZhbGlkXG4gICAgICogYW5kIGFzc29jaWF0ZWQgd2l0aCBleHBsb2l0YXRpb24gb3IgZGlzY292ZXJ5IG9mIHZ1bG5lcmFiaWxpdGllcy5cbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW5hYmxlS25vd25CYWRJbnB1dHNSdWxlU2V0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIEFXUyBtYW5hZ2VkIHJ1bGUgZm9yIGFub255bW91cyBJUCBhZGRyZXNzZXMuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIGNvbnRhaW5zIHJ1bGVzIHRvIGJsb2NrIHJlcXVlc3RzIGZyb20gc2VydmljZXMgdGhhdCBhbGxvd1xuICAgICAqIG9iZnVzY2F0aW9uIG9mIHZpZXdlciBpZGVudGl0eSAoVlBOcywgcHJveGllcywgVG9yIG5vZGVzLCBob3N0aW5nIHByb3ZpZGVycykuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICByZWFkb25seSBlbmFibGVBbm9ueW1vdXNJcFJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3IgQW1hem9uIElQIHJlcHV0YXRpb24gbGlzdC5cbiAgICAgKiBUaGlzIHJ1bGUgZ3JvdXAgY29udGFpbnMgcnVsZXMgYmFzZWQgb24gQW1hem9uIHRocmVhdCBpbnRlbGxpZ2VuY2UuXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUFtYXpvbklwUmVwdXRhdGlvblJ1bGVTZXQ/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBlbmFibGUgQVdTIG1hbmFnZWQgcnVsZSBmb3IgYm90IGNvbnRyb2wuXG4gICAgICogVGhpcyBydWxlIGdyb3VwIHByb3ZpZGVzIHByb3RlY3Rpb24gYWdhaW5zdCBhdXRvbWF0ZWQgYm90cy5cbiAgICAgKiBOb3RlOiBUaGlzIGlzIGEgcGFpZCBmZWF0dXJlIHdpdGggYWRkaXRpb25hbCBjb3N0cy5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGVuYWJsZUJvdENvbnRyb2xSdWxlU2V0PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIGZyb20gYSBzaW5nbGUgSVAgd2l0aGluIGEgNS1taW51dGUgcGVyaW9kXG4gICAgICogdG8gcHJvdGVjdCBhZ2FpbnN0IEREb1MgYXR0YWNrcy5cbiAgICAgKiBDYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyBpdCB0byBgdW5kZWZpbmVkYC5cbiAgICAgKiBAZGVmYXVsdCAyMDAwXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmF0ZUxpbWl0PzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgY291bnRyeSBjb2RlcyAoSVNPIDMxNjYtMSBhbHBoYS0yKSB0byBibG9jay5cbiAgICAgKiBFeGFtcGxlOiBbJ0NOJywgJ1JVJywgJ0tQJ11cbiAgICAgKi9cbiAgICByZWFkb25seSBibG9ja2VkQ291bnRyaWVzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gSVAgYWRkcmVzc2VzIG9yIENJRFIgcmFuZ2VzIHRvIGJsb2NrLlxuICAgICAqIEV4YW1wbGU6IFsnMTkyLjAuMi4wLzI0JywgJzE5OC41MS4xMDAuNDIvMzInXVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJsb2NrZWRJcEFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIElQIGFkZHJlc3NlcyBvciBDSURSIHJhbmdlcyB0byBhbGxvdyAoYnlwYXNzIGFsbCBydWxlcykuXG4gICAgICogRXhhbXBsZTogWycyMDMuMC4xMTMuMC8yNCddXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWxsb3dlZElwQWRkcmVzc2VzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBDbG91ZFdhdGNoIG1ldHJpY3MgbmFtZSBwcmVmaXggZm9yIHRoZSBXQUYuXG4gICAgICogQGRlZmF1bHQgJ1dhZk1ldHJpY3MnXG4gICAgICovXG4gICAgcmVhZG9ubHkgbWV0cmljc1ByZWZpeD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBXQUYgcnVsZXMgdG8gYWRkIGF0IHRoZSBlbmQgb2YgdGhlIHJ1bGUgc2V0LlxuICAgICAqIFRoZXNlIHJ1bGVzIHdpbGwgYmUgYXBwZW5kZWQgYWZ0ZXIgYWxsIGJ1aWx0LWluIG1hbmFnZWQgcnVsZXMuXG4gICAgICpcbiAgICAgKiBOb3RlOiBEbyBub3Qgc2V0IHRoZSBgcHJpb3JpdHlgIGZpZWxkIC0gaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFzc2lnbmVkLlxuICAgICAqXG4gICAgICogRXhhbXBsZTpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY3VzdG9tUnVsZXM6IFt7XG4gICAgICogICBuYW1lOiAnQmxvY2tTcGVjaWZpY1VzZXJBZ2VudCcsXG4gICAgICogICBzdGF0ZW1lbnQ6IHtcbiAgICAgKiAgICAgYnl0ZU1hdGNoU3RhdGVtZW50OiB7XG4gICAgICogICAgICAgc2VhcmNoU3RyaW5nOiAnQmFkQm90JyxcbiAgICAgKiAgICAgICBmaWVsZFRvTWF0Y2g6IHsgc2luZ2xlSGVhZGVyOiB7IG5hbWU6ICd1c2VyLWFnZW50JyB9IH0sXG4gICAgICogICAgICAgdGV4dFRyYW5zZm9ybWF0aW9uczogW3sgcHJpb3JpdHk6IDAsIHR5cGU6ICdMT1dFUkNBU0UnIH1dLFxuICAgICAqICAgICAgIHBvc2l0aW9uYWxDb25zdHJhaW50OiAnQ09OVEFJTlMnXG4gICAgICogICAgIH1cbiAgICAgKiAgIH0sXG4gICAgICogICBhY3Rpb246IHsgYmxvY2s6IHt9IH0sXG4gICAgICogICB2aXNpYmlsaXR5Q29uZmlnOiB7XG4gICAgICogICAgIHNhbXBsZWRSZXF1ZXN0c0VuYWJsZWQ6IHRydWUsXG4gICAgICogICAgIGNsb3VkV2F0Y2hNZXRyaWNzRW5hYmxlZDogdHJ1ZSxcbiAgICAgKiAgICAgbWV0cmljTmFtZTogJ0Jsb2NrU3BlY2lmaWNVc2VyQWdlbnQnXG4gICAgICogICB9XG4gICAgICogfV1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICByZWFkb25seSBjdXN0b21SdWxlcz86IE9taXQ8aW1wb3J0KCdhd3MtY2RrLWxpYi9hd3Mtd2FmdjInKS5DZm5XZWJBQ0wuUnVsZVByb3BlcnR5LCAncHJpb3JpdHknPltdO1xufVxuXG4vKipcbiAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IgV0FGIG9wdGltaXplZCBmb3IgTnV4dCBhcHBsaWNhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX05VWFRfV0FGX0NPTkZJRzogUGFydGlhbDxXYWZDb25maWc+ID0ge1xuICAgIGVuYWJsZUNvbW1vblJ1bGVTZXQ6IHRydWUsXG4gICAgZW5hYmxlS25vd25CYWRJbnB1dHNSdWxlU2V0OiB0cnVlLFxuICAgIGVuYWJsZUFub255bW91c0lwUnVsZVNldDogZmFsc2UsXG4gICAgZW5hYmxlQW1hem9uSXBSZXB1dGF0aW9uUnVsZVNldDogdHJ1ZSxcbiAgICBlbmFibGVCb3RDb250cm9sUnVsZVNldDogZmFsc2UsXG4gICAgcmF0ZUxpbWl0OiAyMDAwLFxuICAgIG1ldHJpY3NQcmVmaXg6ICdXYWZNZXRyaWNzJyxcbn07XG5cbiJdfQ==
@@ -73,6 +73,35 @@ export interface WafConfig {
73
73
  * @default 'WafMetrics'
74
74
  */
75
75
  readonly metricsPrefix?: string;
76
+
77
+ /**
78
+ * Custom WAF rules to add at the end of the rule set.
79
+ * These rules will be appended after all built-in managed rules.
80
+ *
81
+ * Note: Do not set the `priority` field - it will be automatically assigned.
82
+ *
83
+ * Example:
84
+ * ```typescript
85
+ * customRules: [{
86
+ * name: 'BlockSpecificUserAgent',
87
+ * statement: {
88
+ * byteMatchStatement: {
89
+ * searchString: 'BadBot',
90
+ * fieldToMatch: { singleHeader: { name: 'user-agent' } },
91
+ * textTransformations: [{ priority: 0, type: 'LOWERCASE' }],
92
+ * positionalConstraint: 'CONTAINS'
93
+ * }
94
+ * },
95
+ * action: { block: {} },
96
+ * visibilityConfig: {
97
+ * sampledRequestsEnabled: true,
98
+ * cloudWatchMetricsEnabled: true,
99
+ * metricName: 'BlockSpecificUserAgent'
100
+ * }
101
+ * }]
102
+ * ```
103
+ */
104
+ readonly customRules?: Omit<import('aws-cdk-lib/aws-wafv2').CfnWebACL.RuleProperty, 'priority'>[];
76
105
  }
77
106
 
78
107
  /**
@@ -1,15 +1,44 @@
1
1
  #!/usr/bin/env node
2
2
  import {NuxtServerAppStack, type NuxtServerAppStackProps, App, CloudFrontWafStack} from "cdk-nuxt";
3
3
 
4
+ const accountId = 'XXXXXXXX';
5
+ const project = 'my-project';
6
+ const service = 'nuxt-app';
7
+ const environment = 'dev';
8
+
9
+ // The tags to apply to all stack resources.
10
+ // Modify as needed for analytics and cost allocation.
11
+ const tags = {
12
+ project: project,
13
+ service: service,
14
+ environment: environment
15
+ };
16
+
4
17
  const app = new App();
5
18
 
19
+ // Optional: Create a separate WAF stack in us-east-1 (required for CloudFront WAF)
20
+ // Uncomment the following lines to enable WAF protection:
21
+ /*
22
+ const wafStack = new CloudFrontWafStack(app, `${project}-${service}-${environment}-waf-stack`, {
23
+ name: `${project}-${service}-${environment}-waf`,
24
+ config: {
25
+ // Add WAF configuration as needed
26
+ // See https://github.com/ferdinandfrank/cdk-nuxt/blob/main/docs/WAF.md
27
+ },
28
+ env: {
29
+ account: accountId
30
+ },
31
+ tags: tags
32
+ });
33
+ */
34
+
6
35
  const appStackProps: NuxtServerAppStackProps = {
7
36
  /**
8
37
  * The AWS environment (account/region) where this stack will be deployed.
9
38
  */
10
39
  env: {
11
40
  // The ID of your AWS account on which to deploy the stack.
12
- account: 'XXXXXXXX',
41
+ account: accountId,
13
42
 
14
43
  // The AWS region where to deploy the Nuxt app.
15
44
  region: 'eu-central-1'
@@ -19,19 +48,19 @@ const appStackProps: NuxtServerAppStackProps = {
19
48
  * A string identifier for the project the Nuxt app is part of.
20
49
  * A project might have multiple different services.
21
50
  */
22
- project: 'my-project',
51
+ project: project,
23
52
 
24
53
  /**
25
54
  * A string identifier for the project's service the Nuxt app is created for.
26
55
  * This can be seen as the name of the Nuxt app.
27
56
  */
28
- service: 'nuxt-app',
57
+ service: service,
29
58
 
30
59
  /**
31
60
  * A string to identify the environment of the Nuxt app. This enables us
32
61
  * to deploy multiple different environments of the same Nuxt app, e.g., production and development.
33
62
  */
34
- environment: 'dev',
63
+ environment: environment,
35
64
 
36
65
  /**
37
66
  * The domain (without the protocol) at which the Nuxt app shall be publicly available.
@@ -195,34 +224,15 @@ const appStackProps: NuxtServerAppStackProps = {
195
224
  /**
196
225
  * The ARN of an existing AWS WAF Web ACL to associate with the CloudFront distribution.
197
226
  * This should be used with a separate CloudFrontWafStack deployed in us-east-1.
198
- * If you want to use a preconfigured WAF, create a separate stack as shown below and pass its ARN here.
227
+ * If you want to use a preconfigured WAF, create a separate stack as shown above and pass its ARN here.
199
228
  */
200
229
  webAclArn: undefined,
230
+ // webAclArn: wafStack.webAclArn, // Uncomment this line if using the WAF stack created above
201
231
 
202
232
  /**
203
233
  * Stack tags that will be applied to all the taggable resources and the stack itself.
204
234
  */
205
- tags: {
206
- service: 'nuxt-app'
207
- },
235
+ tags: tags
208
236
  };
209
237
 
210
- // Optional: Create a separate WAF stack in us-east-1 (required for CloudFront WAF)
211
- // Uncomment the following lines to enable WAF protection:
212
- /*
213
- const wafStack = new CloudFrontWafStack(app, `${appStackProps.project}-${appStackProps.service}-${appStackProps.environment}-waf-stack`, {
214
- name: `${appStackProps.project}-${appStackProps.service}-${appStackProps.environment}-waf`,
215
- config: {
216
- // Add WAF configuration as needed
217
- // See https://github.com/ferdinandfrank/cdk-nuxt/blob/main/docs/WAF.md
218
- },
219
- env: {
220
- account: appStackProps.env.account,
221
- },
222
- });
223
-
224
- // Attach the WAF Web ACL ARN to the app stack
225
- appStackProps.webAclArn = wafStack.webAclArn;
226
- */
227
-
228
- new NuxtServerAppStack(app, `${appStackProps.project}-${appStackProps.service}-${appStackProps.environment}-stack`, appStackProps);
238
+ new NuxtServerAppStack(app, `${project}-${service}-${environment}-stack`, appStackProps);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdk-nuxt",
3
- "version": "2.19.0",
3
+ "version": "2.20.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",