@aligent/cdk-aspects 0.3.0 → 0.4.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,23 @@
1
1
  # @aligent/cdk-aspects
2
2
 
3
+ ## 0.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1627](https://github.com/aligent/cdk-constructs/pull/1627) [`a53bad0`](https://github.com/aligent/cdk-constructs/commit/a53bad0c3b8156ec3b57476b4007cdb854785ba6) Thanks [@kai-nguyen-aligent](https://github.com/kai-nguyen-aligent)! - Add new ResourcePrefixAspect
8
+
9
+ ## 0.3.2
10
+
11
+ ### Patch Changes
12
+
13
+ - [#1606](https://github.com/aligent/cdk-constructs/pull/1606) [`0e35d91`](https://github.com/aligent/cdk-constructs/commit/0e35d91ab5244d90625ebe19d943694af875a422) Thanks [@porhkz](https://github.com/porhkz)! - Update repository URLs in package.json to match npm provenance expectations
14
+
15
+ ## 0.3.1
16
+
17
+ ### Patch Changes
18
+
19
+ - [#1601](https://github.com/aligent/cdk-constructs/pull/1601) [`1488e90`](https://github.com/aligent/cdk-constructs/commit/1488e90d7f468f7646142a9968a3d4e06389b358) Thanks [@porhkz](https://github.com/porhkz)! - Fix badges on readmes
20
+
3
21
  ## 0.3.0
4
22
 
5
23
  ### Minor Changes
package/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export * from "./lib/defaults/nodejs-function";
3
3
  export * from "./lib/defaults/step-functions";
4
4
  export * from "./lib/lambda-sfn-versioning";
5
5
  export * from "./lib/microservice-checks";
6
+ export * from "./lib/resource-prefix";
package/index.js CHANGED
@@ -19,4 +19,5 @@ __exportStar(require("./lib/defaults/nodejs-function"), exports);
19
19
  __exportStar(require("./lib/defaults/step-functions"), exports);
20
20
  __exportStar(require("./lib/lambda-sfn-versioning"), exports);
21
21
  __exportStar(require("./lib/microservice-checks"), exports);
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBQXlDO0FBQ3pDLGlFQUErQztBQUMvQyxnRUFBOEM7QUFDOUMsOERBQTRDO0FBQzVDLDREQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2xpYi9kZWZhdWx0cy9sb2ctZ3JvdXBcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9kZWZhdWx0cy9ub2RlanMtZnVuY3Rpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9kZWZhdWx0cy9zdGVwLWZ1bmN0aW9uc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL2xhbWJkYS1zZm4tdmVyc2lvbmluZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliL21pY3Jvc2VydmljZS1jaGVja3NcIjtcbiJdfQ==
22
+ __exportStar(require("./lib/resource-prefix"), exports);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkRBQXlDO0FBQ3pDLGlFQUErQztBQUMvQyxnRUFBOEM7QUFDOUMsOERBQTRDO0FBQzVDLDREQUEwQztBQUMxQyx3REFBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9saWIvZGVmYXVsdHMvbG9nLWdyb3VwXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvZGVmYXVsdHMvbm9kZWpzLWZ1bmN0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvZGVmYXVsdHMvc3RlcC1mdW5jdGlvbnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9sYW1iZGEtc2ZuLXZlcnNpb25pbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xpYi9taWNyb3NlcnZpY2UtY2hlY2tzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saWIvcmVzb3VyY2UtcHJlZml4XCI7XG4iXX0=
@@ -0,0 +1,68 @@
1
+ import { IAspect } from "aws-cdk-lib";
2
+ import { IConstruct } from "constructs";
3
+ export interface ResourcePrefixAspectProps {
4
+ /**
5
+ * The prefix to apply to all resource names.
6
+ * e.g. 'myapp-prod' → 'myapp-prod-orders'
7
+ */
8
+ prefix: string;
9
+ /**
10
+ * Resource types to skip entirely.
11
+ * e.g. ['AWS::IAM::Role'] to leave IAM role names untouched.
12
+ * @default []
13
+ */
14
+ exclude?: string[];
15
+ }
16
+ /**
17
+ * CDK Aspect that automatically prefixes physical resource names across AWS resources.
18
+ *
19
+ * @remarks
20
+ * **Critical Implementation Notes:**
21
+ *
22
+ * 1. **Stage Synthesis Boundaries**:
23
+ * - CDK `Stage` constructs create synthesis boundaries that prevent App-level aspects
24
+ * from traversing into them
25
+ * - This aspect MUST be applied to each Stage individually, not to the App
26
+ * - Example: `Aspects.of(stage).add(new ResourcePrefixAspect({...}))`
27
+ *
28
+ * 2. **Property Name Casing**:
29
+ * - CloudFormation properties use PascalCase (e.g., `FunctionName`, `BucketName`)
30
+ * - Using camelCase (e.g., `functionName`) will cause errors with versioning aspects
31
+ * - When using `addPropertyOverride()`, always use the exact CloudFormation property name
32
+ *
33
+ * 3. **Aspect Priority with Versioning**:
34
+ * - When combining with LambdaAndStepFunctionVersioningAspect, apply this aspect BEFORE versioning
35
+ * - Use CDK's priority system: `Aspects.of(stage).add(prefixAspect, { priority: 100 })`
36
+ * - Then: `Aspects.of(stage).add(versioningAspect, { priority: 200 })`
37
+ * - Lower priority numbers run first
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * // Correct usage with staging
42
+ * const stage = new ApplicationStage(app, 'prod');
43
+ * Aspects.of(stage).add(new ResourcePrefixAspect({ prefix: 'myapp' }), { priority: 100 });
44
+ * Aspects.of(stage).add(new LambdaAndStepFunctionVersioningAspect(), { priority: 200 });
45
+ * ```
46
+ */
47
+ export declare class ResourcePrefixAspect implements IAspect {
48
+ private readonly prefix;
49
+ private readonly exclude;
50
+ constructor(props: ResourcePrefixAspectProps);
51
+ visit(node: IConstruct): void;
52
+ private isAlreadyPrefixed;
53
+ private deriveNameFromLogicalId;
54
+ /**
55
+ * Builds the prefixed name, handling special cases for specific resource types.
56
+ *
57
+ * @param baseName - The base resource name (without prefix)
58
+ * @param cfnResourceType - The CloudFormation resource type
59
+ * @param cfnProperties - The CloudFormation resource properties
60
+ * @returns The final prefixed name with any special case handling applied
61
+ */
62
+ private buildPrefixedName;
63
+ /**
64
+ * Validates resource-specific naming requirements that AWS enforces.
65
+ * Throws synthesis errors for violations.
66
+ */
67
+ private validateResourceName;
68
+ }
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourcePrefixAspect = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ /**
6
+ * Maps CloudFormation resource types to their name property and AWS length limits.
7
+ * Sources: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
8
+ */
9
+ const RESOURCE_CONFIG = {
10
+ // Compute
11
+ "AWS::Lambda::Function": { cfnName: "FunctionName", maxLength: 64 },
12
+ // Storage
13
+ "AWS::S3::Bucket": { cfnName: "BucketName", maxLength: 63 },
14
+ "AWS::DynamoDB::Table": { cfnName: "TableName", maxLength: 255 },
15
+ "AWS::DynamoDB::GlobalTable": { cfnName: "TableName", maxLength: 255 },
16
+ // Messaging
17
+ "AWS::SQS::Queue": { cfnName: "QueueName", maxLength: 80 },
18
+ "AWS::SNS::Topic": { cfnName: "TopicName", maxLength: 256 },
19
+ // Eventing & Orchestration
20
+ "AWS::Events::EventBus": { cfnName: "Name", maxLength: 256 },
21
+ "AWS::Events::Rule": { cfnName: "Name", maxLength: 64 },
22
+ "AWS::Events::Connection": { cfnName: "Name", maxLength: 64 },
23
+ "AWS::Pipes::Pipe": { cfnName: "Name", maxLength: 64 },
24
+ "AWS::StepFunctions::StateMachine": {
25
+ cfnName: "StateMachineName",
26
+ maxLength: 80,
27
+ },
28
+ "AWS::StepFunctions::Activity": { cfnName: "Name", maxLength: 80 },
29
+ "AWS::Scheduler::Schedule": { cfnName: "Name", maxLength: 64 },
30
+ "AWS::Scheduler::ScheduleGroup": { cfnName: "Name", maxLength: 64 },
31
+ // API
32
+ "AWS::ApiGateway::RestApi": { cfnName: "Name", maxLength: 128 },
33
+ "AWS::ApiGateway::UsagePlan": { cfnName: "UsagePlanName", maxLength: 128 },
34
+ "AWS::ApiGateway::ApiKey": { cfnName: "Name", maxLength: 128 },
35
+ "AWS::ApiGatewayV2::Api": { cfnName: "Name", maxLength: 128 },
36
+ "AWS::ApiGatewayV2::Authorizer": { cfnName: "Name", maxLength: 128 },
37
+ // Secrets & Config
38
+ "AWS::SecretsManager::Secret": { cfnName: "Name", maxLength: 512 },
39
+ "AWS::SSM::Parameter": { cfnName: "Name", maxLength: 2048 },
40
+ "AWS::AppConfig::Application": { cfnName: "Name", maxLength: 64 },
41
+ "AWS::AppConfig::Environment": { cfnName: "Name", maxLength: 64 },
42
+ // Notifications
43
+ "AWS::Notifications::NotificationConfiguration": {
44
+ cfnName: "Name",
45
+ maxLength: 64,
46
+ },
47
+ // Observability
48
+ "AWS::Logs::LogGroup": { cfnName: "LogGroupName", maxLength: 512 },
49
+ "AWS::CloudWatch::Alarm": { cfnName: "AlarmName", maxLength: 255 },
50
+ // IAM
51
+ "AWS::IAM::Role": { cfnName: "RoleName", maxLength: 64 },
52
+ };
53
+ /**
54
+ * CDK Aspect that automatically prefixes physical resource names across AWS resources.
55
+ *
56
+ * @remarks
57
+ * **Critical Implementation Notes:**
58
+ *
59
+ * 1. **Stage Synthesis Boundaries**:
60
+ * - CDK `Stage` constructs create synthesis boundaries that prevent App-level aspects
61
+ * from traversing into them
62
+ * - This aspect MUST be applied to each Stage individually, not to the App
63
+ * - Example: `Aspects.of(stage).add(new ResourcePrefixAspect({...}))`
64
+ *
65
+ * 2. **Property Name Casing**:
66
+ * - CloudFormation properties use PascalCase (e.g., `FunctionName`, `BucketName`)
67
+ * - Using camelCase (e.g., `functionName`) will cause errors with versioning aspects
68
+ * - When using `addPropertyOverride()`, always use the exact CloudFormation property name
69
+ *
70
+ * 3. **Aspect Priority with Versioning**:
71
+ * - When combining with LambdaAndStepFunctionVersioningAspect, apply this aspect BEFORE versioning
72
+ * - Use CDK's priority system: `Aspects.of(stage).add(prefixAspect, { priority: 100 })`
73
+ * - Then: `Aspects.of(stage).add(versioningAspect, { priority: 200 })`
74
+ * - Lower priority numbers run first
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Correct usage with staging
79
+ * const stage = new ApplicationStage(app, 'prod');
80
+ * Aspects.of(stage).add(new ResourcePrefixAspect({ prefix: 'myapp' }), { priority: 100 });
81
+ * Aspects.of(stage).add(new LambdaAndStepFunctionVersioningAspect(), { priority: 200 });
82
+ * ```
83
+ */
84
+ class ResourcePrefixAspect {
85
+ constructor(props) {
86
+ var _a;
87
+ if (!props.prefix || !/^[a-z0-9-]+$/.test(props.prefix))
88
+ throw new Error(`ResourcePrefixAspect: prefix must contain only lowercase alphanumeric characters and hyphens, got "${props.prefix}"`);
89
+ this.prefix = props.prefix;
90
+ this.exclude = new Set((_a = props.exclude) !== null && _a !== void 0 ? _a : []);
91
+ }
92
+ visit(node) {
93
+ var _a, _b;
94
+ if (!(node instanceof aws_cdk_lib_1.CfnResource))
95
+ return;
96
+ const resourceType = node.cfnResourceType;
97
+ const config = RESOURCE_CONFIG[resourceType];
98
+ if (!config || this.exclude.has(resourceType)) {
99
+ return;
100
+ }
101
+ const { cfnName, maxLength } = config;
102
+ const cfnProperties = (_b = (_a = node._cfnProperties) !== null && _a !== void 0 ? _a : node.cfnProperties) !== null && _b !== void 0 ? _b : {};
103
+ // Get any explicitly set name, or derive one from the logical ID
104
+ const existingName = typeof cfnProperties[cfnName] === "string"
105
+ ? cfnProperties[cfnName]
106
+ : undefined;
107
+ const baseName = existingName !== null && existingName !== void 0 ? existingName : this.deriveNameFromLogicalId(node);
108
+ if (this.isAlreadyPrefixed(baseName)) {
109
+ return;
110
+ }
111
+ const finalName = this.buildPrefixedName(baseName, resourceType, cfnProperties);
112
+ const hasError = this.validateResourceName(finalName, resourceType, maxLength, node);
113
+ if (hasError)
114
+ return;
115
+ node.addPropertyOverride(cfnName, finalName);
116
+ }
117
+ isAlreadyPrefixed(name) {
118
+ return (name.startsWith(`${this.prefix}-`) || name.startsWith(`/${this.prefix}/`));
119
+ }
120
+ deriveNameFromLogicalId(node) {
121
+ const logicalId = aws_cdk_lib_1.Stack.of(node).getLogicalId(node);
122
+ return logicalId
123
+ .replace(/[^a-zA-Z0-9]+/g, "-") // non-alphanumeric → dash
124
+ .replace(/^-+|-+$/g, ""); // trim leading/trailing dashes
125
+ }
126
+ /**
127
+ * Builds the prefixed name, handling special cases for specific resource types.
128
+ *
129
+ * @param baseName - The base resource name (without prefix)
130
+ * @param cfnResourceType - The CloudFormation resource type
131
+ * @param cfnProperties - The CloudFormation resource properties
132
+ * @returns The final prefixed name with any special case handling applied
133
+ */
134
+ buildPrefixedName(baseName, cfnResourceType, cfnProperties) {
135
+ // Special case: FIFO queues must end with .fifo suffix
136
+ if (cfnResourceType === "AWS::SQS::Queue" &&
137
+ cfnProperties.fifoQueue === true &&
138
+ !baseName.endsWith(".fifo")) {
139
+ return `${this.prefix}-${baseName}.fifo`;
140
+ }
141
+ // Special case: FIFO topics must end with .fifo suffix
142
+ if (cfnResourceType === "AWS::SNS::Topic" &&
143
+ cfnProperties.fifoTopic === true &&
144
+ !baseName.endsWith(".fifo")) {
145
+ return `${this.prefix}-${baseName}.fifo`;
146
+ }
147
+ // Special case: SSM parameter names use path-style prefix
148
+ if (cfnResourceType === "AWS::SSM::Parameter") {
149
+ return `/${this.prefix}/${baseName}`;
150
+ }
151
+ // Special case: S3 bucket name be lowercase only
152
+ if (cfnResourceType === "AWS::S3::Bucket") {
153
+ return `${this.prefix}-${baseName}`.toLowerCase();
154
+ }
155
+ // Default: simple prefix
156
+ return `${this.prefix}-${baseName}`;
157
+ }
158
+ /**
159
+ * Validates resource-specific naming requirements that AWS enforces.
160
+ * Throws synthesis errors for violations.
161
+ */
162
+ validateResourceName(name, cfnResourceType, maxLength, node) {
163
+ let hasError = false;
164
+ // S3 bucket names cannot contain underscores
165
+ if (cfnResourceType === "AWS::S3::Bucket") {
166
+ if (name !== name.toLowerCase()) {
167
+ aws_cdk_lib_1.Annotations.of(node).addError(`[ResourcePrefixAspect] S3 bucket name "${name}" contains uppercase letters. ` +
168
+ `Bucket names must be lowercase only.`);
169
+ hasError = true;
170
+ }
171
+ if (name.includes("_")) {
172
+ aws_cdk_lib_1.Annotations.of(node).addError(`[ResourcePrefixAspect] S3 bucket name "${name}" contains underscores. ` +
173
+ `Bucket names cannot contain underscores. Use hyphens instead.`);
174
+ hasError = true;
175
+ }
176
+ }
177
+ if (name.length > maxLength) {
178
+ aws_cdk_lib_1.Annotations.of(node).addError(`[ResourcePrefixAspect] "${name}" (${name.length} chars) exceeds the ` +
179
+ `maximum allowed length of ${maxLength} for ${cfnResourceType}. ` +
180
+ `Shorten the resource base name or your prefix ("${this.prefix}").`);
181
+ hasError = true;
182
+ }
183
+ return hasError;
184
+ }
185
+ }
186
+ exports.ResourcePrefixAspect = ResourcePrefixAspect;
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicmVzb3VyY2UtcHJlZml4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RTtBQWdDdkU7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQXVDO0lBQzFELFVBQVU7SUFDVix1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUVuRSxVQUFVO0lBQ1YsaUJBQWlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7SUFDM0Qsc0JBQXNCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFDaEUsNEJBQTRCLEVBQUUsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUU7SUFFdEUsWUFBWTtJQUNaLGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFO0lBQzFELGlCQUFpQixFQUFFLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFO0lBRTNELDJCQUEyQjtJQUMzQix1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRTtJQUM1RCxtQkFBbUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUN2RCx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUM3RCxrQkFBa0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRTtJQUN0RCxrQ0FBa0MsRUFBRTtRQUNsQyxPQUFPLEVBQUUsa0JBQWtCO1FBQzNCLFNBQVMsRUFBRSxFQUFFO0tB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aEIsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXJCLDZDQUE2QztRQUM3QyxJQUFJLGVBQWUsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQzFDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQzNCLDBDQUEwQyxJQUFJLGdDQUFnQztvQkFDNUUsc0NBQXNDLENBQ3pDLENBQUM7Z0JBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNsQixDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FDM0IsMENBQTBDLElBQUksMEJBQTBCO29CQUN0RSwrREFBK0QsQ0FDbEUsQ0FBQztnQkFDRixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1lBQzVCLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FDM0IsMkJBQTJCLElBQUksTUFBTSxJQUFJLENBQUMsTUFBTSxzQkFBc0I7Z0JBQ3BFLDZCQUE2QixTQUFTLFFBQVEsZUFBZSxJQUFJO2dCQUNqRSxtREFBbUQsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUN0RSxDQUFDO1lBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNsQixDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBL0pELG9EQStKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBDZm5SZXNvdXJjZSwgSUFzcGVjdCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5pbnRlcmZhY2UgUmVzb3VyY2VOYW1lQ29uZmlnIHtcbiAgLyoqIFRoZSBDbG91ZEZvcm1hdGlvbiBwcm9wZXJ0eSB0aGF0IGhvbGRzIHRoZSByZXNvdXJjZSdzIHBoeXNpY2FsIG5hbWUgKi9cbiAgY2ZuTmFtZTogc3RyaW5nO1xuICAvKiogTWF4aW11bSBhbGxvd2VkIGNoYXJhY3RlciBsZW5ndGggZm9yIHRoaXMgcmVzb3VyY2UgdHlwZSAqL1xuICBtYXhMZW5ndGg6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFeHRlbnNpb24gdHlwZSB0byBhY2Nlc3MgaW50ZXJuYWwgQ2xvdWRGb3JtYXRpb24gcHJvcGVydGllcyBvbiBDZm5SZXNvdXJjZS5cbiAqXG4gKiBDREsgZG9lcyBub3QgcHJvdmlkZSBhIHB1YmxpYyBBUEkgdG8gcmVhZCByYXcgQ2xvdWRGb3JtYXRpb24gcHJvcGVydGllcyB0aGF0IGhhdmVcbiAqIGJlZW4gc2V0IG9uIGEgQ2ZuUmVzb3VyY2UuIFRoZSBwcm9wZXJ0aWVzIGBfY2ZuUHJvcGVydGllc2AgYW5kIGBjZm5Qcm9wZXJ0aWVzYCBhcmVcbiAqIHByb3RlY3RlZCBhbmQgb25seSBhY2Nlc3NpYmxlIHdpdGhpbiB0aGUgQ2ZuUmVzb3VyY2UgY2xhc3MgaGllcmFyY2h5LlxuICpcbiAqIFdlIGludmVzdGlnYXRlZCB1c2luZyBDREsncyBwdWJsaWMgQVBJcywgYnV0IHRoZXJlIGlzIG5vIHB1YmxpYyBtZXRob2QgdG8gcmV0cmlldmVcbiAqIHRoZSByYXcgcHJvcGVydHkgdmFsdWVzIHRoYXQgaGF2ZSBiZWVuIHNldCAoZS5nLiwgdmlhIGNvbnN0cnVjdG9yIHByb3BzIG9yIGFkZFByb3BlcnR5T3ZlcnJpZGUpLlxuICogVGhlIG9ubHkgcHVibGljIEFQSXMgYXJlIGZvciB3cml0aW5nIChhZGRQcm9wZXJ0eU92ZXJyaWRlLCBhZGRQcm9wZXJ0eURlbGV0aW9uT3ZlcnJpZGUpIG9yXG4gKiBnZXR0aW5nIGF0dHJpYnV0ZSByZWZlcmVuY2VzIChnZXRBdHQpLCBub3QgZm9yIHJlYWRpbmcgbGl0ZXJhbCBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogVGhpcyB0eXBlIGFzc2VydGlvbiBpcyBzYWZlIGJlY2F1c2U6XG4gKiAtIFdlIG9ubHkgcmVhZCB0aGVzZSBwcm9wZXJ0aWVzLCBuZXZlciBtb2RpZnkgdGhlbVxuICogLSBXZSBuZWVkIHRvIGNoZWNrIGlmIGEgdXNlciBleHBsaWNpdGx5IHNldCBhIG5hbWUgcHJvcGVydHkgYmVmb3JlIGFwcGx5aW5nIG91ciBwcmVmaXhcbiAqIC0gVGhlIHByb3BlcnRpZXMgZXhpc3QgYXQgcnVudGltZSBhbmQgYXJlIHBhcnQgb2YgQ0RLJ3MgaW50ZXJuYWwgaW1wbGVtZW50YXRpb25cbiAqL1xudHlwZSBDZm5SZXNvdXJjZVdpdGhQcm9wcyA9IENmblJlc291cmNlICYge1xuICByZWFkb25seSBfY2ZuUHJvcGVydGllcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSBjZm5Qcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG4vKipcbiAqIE1hcHMgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgdHlwZXMgdG8gdGhlaXIgbmFtZSBwcm9wZXJ0eSBhbmQgQVdTIGxlbmd0aCBsaW1pdHMuXG4gKiBTb3VyY2VzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtdGVtcGxhdGUtcmVzb3VyY2UtdHlwZS1yZWYuaHRtbFxuICovXG5jb25zdCBSRVNPVVJDRV9DT05GSUc6IFJlY29yZDxzdHJpbmcsIFJlc291cmNlTmFtZUNvbmZpZz4gPSB7XG4gIC8vIENvbXB1dGVcbiAgXCJBV1M6OkxhbWJkYTo6RnVuY3Rpb25cIjogeyBjZm5OYW1lOiBcIkZ1bmN0aW9uTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gU3RvcmFnZVxuICBcIkFXUzo6UzM6OkJ1Y2tldFwiOiB7IGNmbk5hbWU6IFwiQnVja2V0TmFtZVwiLCBtYXhMZW5ndGg6IDYzIH0sXG4gIFwiQVdTOjpEeW5hbW9EQjo6VGFibGVcIjogeyBjZm5OYW1lOiBcIlRhYmxlTmFtZVwiLCBtYXhMZW5ndGg6IDI1NSB9LFxuICBcIkFXUzo6RHluYW1vREI6Okdsb2JhbFRhYmxlXCI6IHsgY2ZuTmFtZTogXCJUYWJsZU5hbWVcIiwgbWF4TGVuZ3RoOiAyNTUgfSxcblxuICAvLyBNZXNzYWdpbmdcbiAgXCJBV1M6OlNRUzo6UXVldWVcIjogeyBjZm5OYW1lOiBcIlF1ZXVlTmFtZVwiLCBtYXhMZW5ndGg6IDgwIH0sXG4gIFwiQVdTOjpTTlM6OlRvcGljXCI6IHsgY2ZuTmFtZTogXCJUb3BpY05hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcblxuICAvLyBFdmVudGluZyAmIE9yY2hlc3RyYXRpb25cbiAgXCJBV1M6OkV2ZW50czo6RXZlbnRCdXNcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAyNTYgfSxcbiAgXCJBV1M6OkV2ZW50czo6UnVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpFdmVudHM6OkNvbm5lY3Rpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6UGlwZXM6OlBpcGVcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lXCI6IHtcbiAgICBjZm5OYW1lOiBcIlN0YXRlTWFjaGluZU5hbWVcIixcbiAgICBtYXhMZW5ndGg6IDgwLFxuICB9LFxuICBcIkFXUzo6U3RlcEZ1bmN0aW9uczo6QWN0aXZpdHlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA4MCB9LFxuICBcIkFXUzo6U2NoZWR1bGVyOjpTY2hlZHVsZVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG4gIFwiQVdTOjpTY2hlZHVsZXI6OlNjaGVkdWxlR3JvdXBcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuXG4gIC8vIEFQSVxuICBcIkFXUzo6QXBpR2F0ZXdheTo6UmVzdEFwaVwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDEyOCB9LFxuICBcIkFXUzo6QXBpR2F0ZXdheTo6VXNhZ2VQbGFuXCI6IHsgY2ZuTmFtZTogXCJVc2FnZVBsYW5OYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5OjpBcGlLZXlcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcbiAgXCJBV1M6OkFwaUdhdGV3YXlWMjo6QXBpXCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogMTI4IH0sXG4gIFwiQVdTOjpBcGlHYXRld2F5VjI6OkF1dGhvcml6ZXJcIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiAxMjggfSxcblxuICAvLyBTZWNyZXRzICYgQ29uZmlnXG4gIFwiQVdTOjpTZWNyZXRzTWFuYWdlcjo6U2VjcmV0XCI6IHsgY2ZuTmFtZTogXCJOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpTU006OlBhcmFtZXRlclwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDIwNDggfSxcbiAgXCJBV1M6OkFwcENvbmZpZzo6QXBwbGljYXRpb25cIjogeyBjZm5OYW1lOiBcIk5hbWVcIiwgbWF4TGVuZ3RoOiA2NCB9LFxuICBcIkFXUzo6QXBwQ29uZmlnOjpFbnZpcm9ubWVudFwiOiB7IGNmbk5hbWU6IFwiTmFtZVwiLCBtYXhMZW5ndGg6IDY0IH0sXG5cbiAgLy8gTm90aWZpY2F0aW9uc1xuICBcIkFXUzo6Tm90aWZpY2F0aW9uczo6Tm90aWZpY2F0aW9uQ29uZmlndXJhdGlvblwiOiB7XG4gICAgY2ZuTmFtZTogXCJOYW1lXCIsXG4gICAgbWF4TGVuZ3RoOiA2NCxcbiAgfSxcblxuICAvLyBPYnNlcnZhYmlsaXR5XG4gIFwiQVdTOjpMb2dzOjpMb2dHcm91cFwiOiB7IGNmbk5hbWU6IFwiTG9nR3JvdXBOYW1lXCIsIG1heExlbmd0aDogNTEyIH0sXG4gIFwiQVdTOjpDbG91ZFdhdGNoOjpBbGFybVwiOiB7IGNmbk5hbWU6IFwiQWxhcm1OYW1lXCIsIG1heExlbmd0aDogMjU1IH0sXG5cbiAgLy8gSUFNXG4gIFwiQVdTOjpJQU06OlJvbGVcIjogeyBjZm5OYW1lOiBcIlJvbGVOYW1lXCIsIG1heExlbmd0aDogNjQgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgcHJlZml4IHRvIGFwcGx5IHRvIGFsbCByZXNvdXJjZSBuYW1lcy5cbiAgICogZS5nLiAnbXlhcHAtcHJvZCcg4oaSICdteWFwcC1wcm9kLW9yZGVycydcbiAgICovXG4gIHByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZXNvdXJjZSB0eXBlcyB0byBza2lwIGVudGlyZWx5LlxuICAgKiBlLmcuIFsnQVdTOjpJQU06OlJvbGUnXSB0byBsZWF2ZSBJQU0gcm9sZSBuYW1lcyB1bnRvdWNoZWQuXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICBleGNsdWRlPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ0RLIEFzcGVjdCB0aGF0IGF1dG9tYXRpY2FsbHkgcHJlZml4ZXMgcGh5c2ljYWwgcmVzb3VyY2UgbmFtZXMgYWNyb3NzIEFXUyByZXNvdXJjZXMuXG4gKlxuICogQHJlbWFya3NcbiAqICoqQ3JpdGljYWwgSW1wbGVtZW50YXRpb24gTm90ZXM6KipcbiAqXG4gKiAxLiAqKlN0YWdlIFN5bnRoZXNpcyBCb3VuZGFyaWVzKio6XG4gKiAgICAtIENESyBgU3RhZ2VgIGNvbnN0cnVjdHMgY3JlYXRlIHN5bnRoZXNpcyBib3VuZGFyaWVzIHRoYXQgcHJldmVudCBBcHAtbGV2ZWwgYXNwZWN0c1xuICogICAgICBmcm9tIHRyYXZlcnNpbmcgaW50byB0aGVtXG4gKiAgICAtIFRoaXMgYXNwZWN0IE1VU1QgYmUgYXBwbGllZCB0byBlYWNoIFN0YWdlIGluZGl2aWR1YWxseSwgbm90IHRvIHRoZSBBcHBcbiAqICAgIC0gRXhhbXBsZTogYEFzcGVjdHMub2Yoc3RhZ2UpLmFkZChuZXcgUmVzb3VyY2VQcmVmaXhBc3BlY3Qoey4uLn0pKWBcbiAqXG4gKiAyLiAqKlByb3BlcnR5IE5hbWUgQ2FzaW5nKio6XG4gKiAgICAtIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXMgdXNlIFBhc2NhbENhc2UgKGUuZy4sIGBGdW5jdGlvbk5hbWVgLCBgQnVja2V0TmFtZWApXG4gKiAgICAtIFVzaW5nIGNhbWVsQ2FzZSAoZS5nLiwgYGZ1bmN0aW9uTmFtZWApIHdpbGwgY2F1c2UgZXJyb3JzIHdpdGggdmVyc2lvbmluZyBhc3BlY3RzXG4gKiAgICAtIFdoZW4gdXNpbmcgYGFkZFByb3BlcnR5T3ZlcnJpZGUoKWAsIGFsd2F5cyB1c2UgdGhlIGV4YWN0IENsb3VkRm9ybWF0aW9uIHByb3BlcnR5IG5hbWVcbiAqXG4gKiAzLiAqKkFzcGVjdCBQcmlvcml0eSB3aXRoIFZlcnNpb25pbmcqKjpcbiAqICAgIC0gV2hlbiBjb21iaW5pbmcgd2l0aCBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0LCBhcHBseSB0aGlzIGFzcGVjdCBCRUZPUkUgdmVyc2lvbmluZ1xuICogICAgLSBVc2UgQ0RLJ3MgcHJpb3JpdHkgc3lzdGVtOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHByZWZpeEFzcGVjdCwgeyBwcmlvcml0eTogMTAwIH0pYFxuICogICAgLSBUaGVuOiBgQXNwZWN0cy5vZihzdGFnZSkuYWRkKHZlcnNpb25pbmdBc3BlY3QsIHsgcHJpb3JpdHk6IDIwMCB9KWBcbiAqICAgIC0gTG93ZXIgcHJpb3JpdHkgbnVtYmVycyBydW4gZmlyc3RcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29ycmVjdCB1c2FnZSB3aXRoIHN0YWdpbmdcbiAqIGNvbnN0IHN0YWdlID0gbmV3IEFwcGxpY2F0aW9uU3RhZ2UoYXBwLCAncHJvZCcpO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBSZXNvdXJjZVByZWZpeEFzcGVjdCh7IHByZWZpeDogJ215YXBwJyB9KSwgeyBwcmlvcml0eTogMTAwIH0pO1xuICogQXNwZWN0cy5vZihzdGFnZSkuYWRkKG5ldyBMYW1iZGFBbmRTdGVwRnVuY3Rpb25WZXJzaW9uaW5nQXNwZWN0KCksIHsgcHJpb3JpdHk6IDIwMCB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VQcmVmaXhBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBwcmVmaXg6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBleGNsdWRlOiBTZXQ8c3RyaW5nPjtcblxuICBjb25zdHJ1Y3Rvcihwcm9wczogUmVzb3VyY2VQcmVmaXhBc3BlY3RQcm9wcykge1xuICAgIGlmICghcHJvcHMucHJlZml4IHx8ICEvXlthLXowLTktXSskLy50ZXN0KHByb3BzLnByZWZpeCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBSZXNvdXJjZVByZWZpeEFzcGVjdDogcHJlZml4IG11c3QgY29udGFpbiBvbmx5IGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgaHlwaGVucywgZ290IFwiJHtwcm9wcy5wcmVmaXh9XCJgXG4gICAgICApO1xuXG4gICAgdGhpcy5wcmVmaXggPSBwcm9wcy5wcmVmaXg7XG4gICAgdGhpcy5leGNsdWRlID0gbmV3IFNldChwcm9wcy5leGNsdWRlID8/IFtdKTtcbiAgfVxuXG4gIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpKSByZXR1cm47XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBub2RlLmNmblJlc291cmNlVHlwZTtcbiAgICBjb25zdCBjb25maWcgPSBSRVNPVVJDRV9DT05GSUdbcmVzb3VyY2VUeXBlXTtcblxuICAgIGlmICghY29uZmlnIHx8IHRoaXMuZXhjbHVkZS5oYXMocmVzb3VyY2VUeXBlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgY2ZuTmFtZSwgbWF4TGVuZ3RoIH0gPSBjb25maWc7XG4gICAgY29uc3QgY2ZuUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPVxuICAgICAgKG5vZGUgYXMgQ2ZuUmVzb3VyY2VXaXRoUHJvcHMpLl9jZm5Qcm9wZXJ0aWVzID8/XG4gICAgICAobm9kZSBhcyBDZm5SZXNvdXJjZVdpdGhQcm9wcykuY2ZuUHJvcGVydGllcyA/P1xuICAgICAge307XG5cbiAgICAvLyBHZXQgYW55IGV4cGxpY2l0bHkgc2V0IG5hbWUsIG9yIGRlcml2ZSBvbmUgZnJvbSB0aGUgbG9naWNhbCBJRFxuICAgIGNvbnN0IGV4aXN0aW5nTmFtZSA9XG4gICAgICB0eXBlb2YgY2ZuUHJvcGVydGllc1tjZm5OYW1lXSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNmblByb3BlcnRpZXNbY2ZuTmFtZV1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmFzZU5hbWUgPSBleGlzdGluZ05hbWUgPz8gdGhpcy5kZXJpdmVOYW1lRnJvbUxvZ2ljYWxJZChub2RlKTtcblxuICAgIGlmICh0aGlzLmlzQWxyZWFkeVByZWZpeGVkKGJhc2VOYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmFsTmFtZSA9IHRoaXMuYnVpbGRQcmVmaXhlZE5hbWUoXG4gICAgICBiYXNlTmFtZSxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIGNmblByb3BlcnRpZXNcbiAgICApO1xuXG4gICAgY29uc3QgaGFzRXJyb3IgPSB0aGlzLnZhbGlkYXRlUmVzb3VyY2VOYW1lKFxuICAgICAgZmluYWxOYW1lLFxuICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgbWF4TGVuZ3RoLFxuICAgICAgbm9kZVxuICAgICk7XG5cbiAgICBpZiAoaGFzRXJyb3IpIHJldHVybjtcblxuICAgIG5vZGUuYWRkUHJvcGVydHlPdmVycmlkZShjZm5OYW1lLCBmaW5hbE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FscmVhZHlQcmVmaXhlZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgbmFtZS5zdGFydHNXaXRoKGAke3RoaXMucHJlZml4fS1gKSB8fCBuYW1lLnN0YXJ0c1dpdGgoYC8ke3RoaXMucHJlZml4fS9gKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGRlcml2ZU5hbWVGcm9tTG9naWNhbElkKG5vZGU6IENmblJlc291cmNlKSB7XG4gICAgY29uc3QgbG9naWNhbElkID0gU3RhY2sub2Yobm9kZSkuZ2V0TG9naWNhbElkKG5vZGUpO1xuICAgIHJldHVybiBsb2dpY2FsSWRcbiAgICAgIC5yZXBsYWNlKC9bXmEtekEtWjAtOV0rL2csIFwiLVwiKSAvLyBub24tYWxwaGFudW1lcmljIOKGkiBkYXNoXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKTsgLy8gdHJpbSBsZWFkaW5nL3RyYWlsaW5nIGRhc2hlc1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcHJlZml4ZWQgbmFtZSwgaGFuZGxpbmcgc3BlY2lhbCBjYXNlcyBmb3Igc3BlY2lmaWMgcmVzb3VyY2UgdHlwZXMuXG4gICAqXG4gICAqIEBwYXJhbSBiYXNlTmFtZSAtIFRoZSBiYXNlIHJlc291cmNlIG5hbWUgKHdpdGhvdXQgcHJlZml4KVxuICAgKiBAcGFyYW0gY2ZuUmVzb3VyY2VUeXBlIC0gVGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVcbiAgICogQHBhcmFtIGNmblByb3BlcnRpZXMgLSBUaGUgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgcHJlZml4ZWQgbmFtZSB3aXRoIGFueSBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgYXBwbGllZFxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFByZWZpeGVkTmFtZShcbiAgICBiYXNlTmFtZTogc3RyaW5nLFxuICAgIGNmblJlc291cmNlVHlwZTogc3RyaW5nLFxuICAgIGNmblByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICk6IHN0cmluZyB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBGSUZPIHF1ZXVlcyBtdXN0IGVuZCB3aXRoIC5maWZvIHN1ZmZpeFxuICAgIGlmIChcbiAgICAgIGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNRUzo6UXVldWVcIiAmJlxuICAgICAgY2ZuUHJvcGVydGllcy5maWZvUXVldWUgPT09IHRydWUgJiZcbiAgICAgICFiYXNlTmFtZS5lbmRzV2l0aChcIi5maWZvXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9LSR7YmFzZU5hbWV9LmZpZm9gO1xuICAgIH1cblxuICAgIC8vIFNwZWNpYWwgY2FzZTogRklGTyB0b3BpY3MgbXVzdCBlbmQgd2l0aCAuZmlmbyBzdWZmaXhcbiAgICBpZiAoXG4gICAgICBjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTTlM6OlRvcGljXCIgJiZcbiAgICAgIGNmblByb3BlcnRpZXMuZmlmb1RvcGljID09PSB0cnVlICYmXG4gICAgICAhYmFzZU5hbWUuZW5kc1dpdGgoXCIuZmlmb1wiKVxuICAgICkge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfS5maWZvYDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFNTTSBwYXJhbWV0ZXIgbmFtZXMgdXNlIHBhdGgtc3R5bGUgcHJlZml4XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlNTTTo6UGFyYW1ldGVyXCIpIHtcbiAgICAgIHJldHVybiBgLyR7dGhpcy5wcmVmaXh9LyR7YmFzZU5hbWV9YDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2U6IFMzIGJ1Y2tldCBuYW1lIGJlIGxvd2VyY2FzZSBvbmx5XG4gICAgaWYgKGNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OlMzOjpCdWNrZXRcIikge1xuICAgICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWAudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0OiBzaW1wbGUgcHJlZml4XG4gICAgcmV0dXJuIGAke3RoaXMucHJlZml4fS0ke2Jhc2VOYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHJlc291cmNlLXNwZWNpZmljIG5hbWluZyByZXF1aXJlbWVudHMgdGhhdCBBV1MgZW5mb3JjZXMuXG4gICAqIFRocm93cyBzeW50aGVzaXMgZXJyb3JzIGZvciB2aW9sYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVJlc291cmNlTmFtZShcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2ZuUmVzb3VyY2VUeXBlOiBzdHJpbmcsXG4gICAgbWF4TGVuZ3RoOiBudW1iZXIsXG4gICAgbm9kZTogSUNvbnN0cnVjdFxuICApOiBib29sZWFuIHtcbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcblxuICAgIC8vIFMzIGJ1Y2tldCBuYW1lcyBjYW5ub3QgY29udGFpbiB1bmRlcnNjb3Jlc1xuICAgIGlmIChjZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpTMzo6QnVja2V0XCIpIHtcbiAgICAgIGlmIChuYW1lICE9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2Yobm9kZSkuYWRkRXJyb3IoXG4gICAgICAgICAgYFtSZXNvdXJjZVByZWZpeEFzcGVjdF0gUzMgYnVja2V0IG5hbWUgXCIke25hbWV9XCIgY29udGFpbnMgdXBwZXJjYXNlIGxldHRlcnMuIGAgK1xuICAgICAgICAgICAgYEJ1Y2tldCBuYW1lcyBtdXN0IGJlIGxvd2VyY2FzZSBvbmx5LmBcbiAgICAgICAgKTtcbiAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAobmFtZS5pbmNsdWRlcyhcIl9cIikpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2Yobm9kZSkuYWRkRXJyb3IoXG4gICAgICAgICAgYFtSZXNvdXJjZVByZWZpeEFzcGVjdF0gUzMgYnVja2V0IG5hbWUgXCIke25hbWV9XCIgY29udGFpbnMgdW5kZXJzY29yZXMuIGAgK1xuICAgICAgICAgICAgYEJ1Y2tldCBuYW1lcyBjYW5ub3QgY29udGFpbiB1bmRlcnNjb3Jlcy4gVXNlIGh5cGhlbnMgaW5zdGVhZC5gXG4gICAgICAgICk7XG4gICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobmFtZS5sZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKG5vZGUpLmFkZEVycm9yKFxuICAgICAgICBgW1Jlc291cmNlUHJlZml4QXNwZWN0XSBcIiR7bmFtZX1cIiAoJHtuYW1lLmxlbmd0aH0gY2hhcnMpIGV4Y2VlZHMgdGhlIGAgK1xuICAgICAgICAgIGBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mICR7bWF4TGVuZ3RofSBmb3IgJHtjZm5SZXNvdXJjZVR5cGV9LiBgICtcbiAgICAgICAgICBgU2hvcnRlbiB0aGUgcmVzb3VyY2UgYmFzZSBuYW1lIG9yIHlvdXIgcHJlZml4IChcIiR7dGhpcy5wcmVmaXh9XCIpLmBcbiAgICAgICk7XG4gICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhc0Vycm9yO1xuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,10 +1,18 @@
1
1
  {
2
2
  "name": "@aligent/cdk-aspects",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Collection of CDK Asppects",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
7
7
  "license": "MIT",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/aligent/cdk-constructs.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/aligent/cdk-constructs/issues"
14
+ },
15
+ "homepage": "https://github.com/aligent/cdk-constructs/tree/main/packages/cdk-aspects#readme",
8
16
  "scripts": {
9
17
  "build": "tsc",
10
18
  "test": "npx nx test cdk-aspects",
@@ -12,7 +20,7 @@
12
20
  },
13
21
  "devDependencies": {
14
22
  "@types/jest": "^29.5.10",
15
- "@types/node": "^20.6.3",
23
+ "@types/node": "^20.19.33",
16
24
  "aws-cdk": "^2.1019.1",
17
25
  "jest": "^29.7.0",
18
26
  "ts-jest": "^29.1.1",