@fjall/components-infrastructure 0.42.1 → 0.43.1
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/dist/lib/app.d.ts +8 -3
- package/dist/lib/app.js +26 -8
- package/dist/lib/resources/aws/networking/vpc.js +6 -3
- package/dist/lib/utils/directTagging.d.ts +31 -0
- package/dist/lib/utils/directTagging.js +86 -0
- package/dist/lib/utils/fjallConstruct.d.ts +8 -0
- package/dist/lib/utils/fjallConstruct.js +18 -0
- package/dist/lib/utils/fjallStackSynthesizer.d.ts +9 -0
- package/dist/lib/utils/fjallStackSynthesizer.js +22 -0
- package/dist/lib/utils/standardTagsAspect.d.ts +7 -29
- package/dist/lib/utils/standardTagsAspect.js +80 -33
- package/dist/lib/utils/tagContext.d.ts +28 -0
- package/dist/lib/utils/tagContext.js +53 -0
- package/dist/lib/utils/tagResource.d.ts +5 -0
- package/dist/lib/utils/tagResource.js +8 -5
- package/dist/lib/utils/tagSynthesizer.d.ts +13 -0
- package/dist/lib/utils/tagSynthesizer.js +55 -0
- package/package.json +3 -3
package/dist/lib/app.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export declare class App extends CdkApp {
|
|
|
16
16
|
private defaultVpc;
|
|
17
17
|
private defaultEcr;
|
|
18
18
|
private existingVpcId?;
|
|
19
|
+
private globalTags;
|
|
20
|
+
private aspectApplied;
|
|
19
21
|
private constructor();
|
|
20
22
|
/**
|
|
21
23
|
* Get/Create a basic Fjall Application with standard tags applied
|
|
@@ -81,10 +83,13 @@ export declare class App extends CdkApp {
|
|
|
81
83
|
*/
|
|
82
84
|
addStorageResource(resource: Construct): void;
|
|
83
85
|
/**
|
|
84
|
-
*
|
|
85
|
-
* Standard tags include environment and service name
|
|
86
|
+
* Initialize standard tags
|
|
86
87
|
*/
|
|
87
|
-
private
|
|
88
|
+
private initializeStandardTags;
|
|
89
|
+
/**
|
|
90
|
+
* Apply all tags as a single aspect
|
|
91
|
+
*/
|
|
92
|
+
private applyTagsAspect;
|
|
88
93
|
/**
|
|
89
94
|
* Add custom tags to all resources in the app
|
|
90
95
|
* @param tags Custom tags to apply to all resources
|
package/dist/lib/app.js
CHANGED
|
@@ -16,6 +16,8 @@ class App extends aws_cdk_lib_1.App {
|
|
|
16
16
|
constructor(name) {
|
|
17
17
|
super();
|
|
18
18
|
this.stacks = {};
|
|
19
|
+
this.globalTags = {};
|
|
20
|
+
this.aspectApplied = false;
|
|
19
21
|
if (name)
|
|
20
22
|
this.name = name;
|
|
21
23
|
else
|
|
@@ -28,7 +30,7 @@ class App extends aws_cdk_lib_1.App {
|
|
|
28
30
|
*/
|
|
29
31
|
static getApp(name) {
|
|
30
32
|
const app = App.getInstance(name);
|
|
31
|
-
app.
|
|
33
|
+
app.initializeStandardTags();
|
|
32
34
|
return app;
|
|
33
35
|
}
|
|
34
36
|
/**
|
|
@@ -53,6 +55,10 @@ class App extends aws_cdk_lib_1.App {
|
|
|
53
55
|
* @returns {AwsStack}
|
|
54
56
|
*/
|
|
55
57
|
getStack(key, dependencies) {
|
|
58
|
+
// Apply the aspect once before creating the first stack
|
|
59
|
+
if (!this.aspectApplied && Object.keys(this.stacks).length === 0 && Object.keys(this.globalTags).length > 0) {
|
|
60
|
+
this.applyTagsAspect();
|
|
61
|
+
}
|
|
56
62
|
if (!this.stacks[key]) {
|
|
57
63
|
this.stacks[key] = new resources_1.AwsStack(key, dependencies);
|
|
58
64
|
}
|
|
@@ -165,16 +171,24 @@ class App extends aws_cdk_lib_1.App {
|
|
|
165
171
|
storageStack.addConstruct(resource);
|
|
166
172
|
}
|
|
167
173
|
/**
|
|
168
|
-
*
|
|
169
|
-
* Standard tags include environment and service name
|
|
174
|
+
* Initialize standard tags
|
|
170
175
|
*/
|
|
171
|
-
|
|
176
|
+
initializeStandardTags() {
|
|
172
177
|
const config = (0, getConfig_1.getConfig)();
|
|
173
|
-
|
|
178
|
+
this.globalTags = {
|
|
174
179
|
"fjall:costAllocation:environment": config.environment,
|
|
175
180
|
"fjall:costAllocation:service": this.name
|
|
176
181
|
};
|
|
177
|
-
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Apply all tags as a single aspect
|
|
185
|
+
*/
|
|
186
|
+
applyTagsAspect() {
|
|
187
|
+
if (!this.aspectApplied && Object.keys(this.globalTags).length > 0) {
|
|
188
|
+
// Apply ONE aspect with all tags using the CDK v2.206.0+ compatible StandardTagsAspect
|
|
189
|
+
aws_cdk_lib_1.Aspects.of(this).add(new standardTagsAspect_1.StandardTagsAspect(this.globalTags));
|
|
190
|
+
this.aspectApplied = true;
|
|
191
|
+
}
|
|
178
192
|
}
|
|
179
193
|
/**
|
|
180
194
|
* Add custom tags to all resources in the app
|
|
@@ -187,11 +201,15 @@ class App extends aws_cdk_lib_1.App {
|
|
|
187
201
|
* });
|
|
188
202
|
*/
|
|
189
203
|
addTags(tags) {
|
|
190
|
-
|
|
204
|
+
// Merge tags but don't apply aspect yet
|
|
205
|
+
this.globalTags = {
|
|
206
|
+
...this.globalTags,
|
|
207
|
+
...tags
|
|
208
|
+
};
|
|
191
209
|
return this;
|
|
192
210
|
}
|
|
193
211
|
}
|
|
194
212
|
exports.App = App;
|
|
195
213
|
App.instance = null;
|
|
196
214
|
exports.default = App;
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUQ7QUFFekQsd0RBQWlFO0FBR2pFLDJDQUF1QztBQUN2QyxxREFBOEQ7QUFHOUQsbUVBQWdFO0FBQ2hFLGlEQUE4QztBQUU5Qzs7OztHQUlHO0FBQ0gsTUFBYSxHQUFJLFNBQVEsaUJBQU07SUFVN0IsWUFBb0IsSUFBYTtRQUMvQixLQUFLLEVBQUUsQ0FBQztRQVBGLFdBQU0sR0FBZ0MsRUFBRSxDQUFDO1FBUy9DLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBYTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQWE7UUFDckMsNkRBQTZEO1FBQzdELCtDQUErQztRQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFFBQVEsQ0FBQyxHQUFXLEVBQUUsWUFBb0M7UUFDL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FB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TSxDQUFDLFdBQVc7WUFDdEQsOEJBQThCLEVBQUUsSUFBSSxDQUFDLElBQUk7U0FDMUMsQ0FBQztRQUVGLHFCQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLHVDQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLE9BQU8sQ0FBQyxJQUErQjtRQUM1QyxxQkFBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSx1Q0FBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7QUE1Tkgsa0JBNk5DO0FBNU5nQixZQUFRLEdBQWUsSUFBSSxBQUFuQixDQUFvQjtBQThON0Msa0JBQWUsR0FBRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwIGFzIENka0FwcCwgRm4sIEFzcGVjdHMgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBWcGMsIFZwY0ZhY3RvcnkgfSBmcm9tIFwiLi9yZXNvdXJjZXMvYXdzL25ldHdvcmtpbmcvdnBjXCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcblxuaW1wb3J0IHsgQXdzU3RhY2sgfSBmcm9tIFwiLi9yZXNvdXJjZXNcIjtcbmltcG9ydCB7IEVjciwgRWNyRmFjdG9yeSB9IGZyb20gXCIuL3Jlc291cmNlcy9hd3Mvc3RvcmFnZS9lY3JcIjtcblxuaW1wb3J0IHsgU3RvcmFnZSB9IGZyb20gXCIuL3BhdHRlcm5zL2F3cy9zdG9yYWdlXCI7XG5pbXBvcnQgeyBTdGFuZGFyZFRhZ3NBc3BlY3QgfSBmcm9tIFwiLi91dGlscy9zdGFuZGFyZFRhZ3NBc3BlY3RcIjtcbmltcG9ydCB7IGdldENvbmZpZyB9IGZyb20gXCIuL3V0aWxzL2dldENvbmZpZ1wiO1xuXG4vKipcbiAqIFRoZSBiYXNpYyBjb3JuZXItc3RvbmUgb2YgYWxsIEZqYWxsLWhvc3RlZCBhcHBsaWNhdGlvbnMuXG4gKiAgVGhpcyBjbGFzcyBpcyBhIHNpbmdsZXRvbiBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIGFuZCBtYW5hZ2VcbiAqICAgYWxsIHJlc291cmNlcyBpbiBhIEZqYWxsIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgQ2RrQXBwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFwcCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHN0YWNrczogeyBba2V5OiBzdHJpbmddOiBBd3NTdGFjayB9ID0ge307XG5cbiAgcHJpdmF0ZSBkZWZhdWx0VnBjOiBJVnBjO1xuICBwcml2YXRlIGRlZmF1bHRFY3I6IEVjcjtcbiAgcHJpdmF0ZSBleGlzdGluZ1ZwY0lkPzogc3RyaW5nO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IobmFtZT86IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAobmFtZSkgdGhpcy5uYW1lID0gbmFtZTtcbiAgICBlbHNlIHRoaXMubmFtZSA9IFwiRmphbGxBcHBcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvQ3JlYXRlIGEgYmFzaWMgRmphbGwgQXBwbGljYXRpb24gd2l0aCBzdGFuZGFyZCB0YWdzIGFwcGxpZWRcbiAgICogQHBhcmFtIG5hbWUgQXBwbGljYXRpb24gbmFtZVxuICAgKiBAcmV0dXJucyB7QXBwfVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRBcHAobmFtZT86IHN0cmluZyk6IEFwcCB7XG4gICAgY29uc3QgYXBwID0gQXBwLmdldEluc3RhbmNlKG5hbWUpO1xuICAgIGFwcC5hcHBseVN0YW5kYXJkVGFncygpO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICAvKipcbiAgICogR2V0L0NyZWF0ZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBBcHBcbiAgICogQHBhcmFtIG5hbWVcbiAgICogQHJldHVybnMge0FwcH1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UobmFtZT86IHN0cmluZyk6IEFwcCB7XG4gICAgLy8gRGVzcGl0ZSBzdXBwb3J0aW5nIG11bHRpcGxlIHN0YWNrcyB5b3UgY2FuIHN0aWxsIG9ubHkgZXZlclxuICAgIC8vIGhhdmUgYSBzaW5nbGUgQXBwbGljYXRpb24gcGVyIENESyBkZXBsb3ltZW50XG4gICAgaWYgKCFBcHAuaW5zdGFuY2UpIHtcbiAgICAgIEFwcC5pbnN0YW5jZSA9IG5ldyBBcHAobmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcC5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhIHN0YWNrIGJ5IGtleS4gSWYgdGhlIHN0YWNrIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqICBEZXBlbmRlbmNpZXMgYXJlIG9ubHkgYXBwbGllZCB0aGUgZmlyc3QgdGltZSBhIHN0YWNrIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IG9mIHRoZSBzdGFja1xuICAgKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIHN0YWNrKHMpIHRoYXQgdGhpcyBzdGFjayBkZXBlbmRzIG9uXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXRTdGFjayhrZXk6IHN0cmluZywgZGVwZW5kZW5jaWVzPzogQXdzU3RhY2sgfCBBd3NTdGFja1tdKTogQXdzU3RhY2sge1xuICAgIGlmICghdGhpcy5zdGFja3Nba2V5XSkge1xuICAgICAgdGhpcy5zdGFja3Nba2V5XSA9IG5ldyBBd3NTdGFjayhrZXksIGRlcGVuZGVuY2llcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhY2tzW2tleV07XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBjb21wdXRlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfUNvbXB1dGVgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhgJHt0aGlzLm5hbWV9Q29tcHV0ZWAsIFtcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpLFxuICAgICAgdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKClcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IG5ldHdvcmsgc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9TmV0d29ya2BcbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHROZXR3b3JrU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKGAke3RoaXMubmFtZX1OZXR3b3JrYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soYCR7dGhpcy5uYW1lfVN0b3JhZ2VgLCB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCB2cGMuIElmIHRoZSBWUEMgZG9lcyBub3QgZXhpc3QgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiBAcmV0dXJucyB7VnBjfVxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHRWcGMoKTogSVZwYyB7XG4gICAgdmFyIG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuXG4gICAgaWYgKCF0aGlzLmRlZmF1bHRWcGMpIHtcbiAgICAgIC8vIFVzZSBhbiBleGlzdGluZyBpbXBvcnRlZCBWUEMgaWYgb25lIHdhcyBzdXBwbGllZFxuICAgICAgaWYgKHRoaXMuZXhpc3RpbmdWcGNJZCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRWcGMgPSBWcGMuZnJvbUxvb2t1cChcbiAgICAgICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSxcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9SW1wb3J0ZWRWcGNgLFxuICAgICAgICAgIHsgdnBjSWQ6IHRoaXMuZXhpc3RpbmdWcGNJZCB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgZGVyaXZlIHRoZSBhY2NvdW50IGFuZCByZWdpb24gZnJvbSB0aGVcbiAgICAgICAgLy8gZW52aXJvbm1lbnQgdGhlIENESyBpcyBydW5uaW5nIGluLiBXaGVuIGFuIGFjY291bnQgSUQgaXMgYXZhaWxhYmxlLFxuICAgICAgICAvLyB1c2UgaXQgdG8gaW1wb3J0IHRoZSBjb3JyZXNwb25kaW5nIElQQU0gcG9vbCBzbyBDSURScyBhcmUgYWxsb2NhdGVkXG4gICAgICAgIC8vIGZyb20gYSBjZW50cmFsIHBvb2wgaW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCAxMC4wLjAuMC8xNiBibG9jay5cblxuICAgICAgICBjb25zdCBhY2NvdW50SWQgPSBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9BQ0NPVU5UO1xuICAgICAgICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT047XG4gICAgICAgIGNvbnN0IGlzTWFuYWdlZEFjY291bnQgPVxuICAgICAgICAgIHByb2Nlc3MuZW52LkZKQUxMX01BTkFHRURfQUNDT1VOVCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBpcHY0SXBhbVBvb2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXNNYW5hZ2VkQWNjb3VudCkge1xuICAgICAgICAgIGlwdjRJcGFtUG9vbElkID0gRm4uaW1wb3J0VmFsdWUoYElwYW1Qb29sSWQke2FjY291bnRJZH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpcHY0SXBhbVBvb2xJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVmYXVsdFZwYyA9IFZwY0ZhY3RvcnkuYnVpbGQoYCR7dGhpcy5uYW1lfURlZmF1bHRWcGNgLCB7XG4gICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBpcHY0SXBhbVBvb2xJZFxuICAgICAgICB9KSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZwYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXVzZSBhbiBleGlzdGluZyBWUEMuXG4gICAqIEFjY2VwdHMgZWl0aGVyIGEgVnBjIG9iamVjdCBvciBhIHBsYWluIFZQQyBJRCBzdHJpbmcgZm9yIGNvbnZlbmllbmNlLlxuICAgKi9cbiAgcHVibGljIHVzZUV4aXN0aW5nVnBjKHZwY0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0VnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwidXNlRXhpc3RpbmdWcGMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBkZWZhdWx0IFZQQyBoYXMgYmVlbiBjcmVhdGVkXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5leGlzdGluZ1ZwY0lkID0gdnBjSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmVpdmUgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGFpbmVyIHJlZ2lzdHJ5LiBJZiB0aGUgcmVnaXN0cnkgZG9lcyBub3QgZXhpc3RcbiAgICogIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKTogRWNyIHtcbiAgICBpZiAoIXRoaXMuZGVmYXVsdEVjcikge1xuICAgICAgdmFyIG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuXG4gICAgICB0aGlzLmRlZmF1bHRFY3IgPSBFY3JGYWN0b3J5LmJ1aWxkKGAke3RoaXMubmFtZX1FY3JgKShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbmV0d29ya1N0YWNrLmdldFN0YWNrKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdEVjcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb21wdXRlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QoZm4odGhpcywgY29tcHV0ZVN0YWNrLmdldFN0YWNrKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBjb21wdXRlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFkZENvbXB1dGVSZXNvdXJjZShyZXNvdXJjZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3QgY29tcHV0ZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChyZXNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogIEFkZCBhIHN0b3JhZ2UgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgc3RvcmFnZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKi9cbiAgcHVibGljIGFkZFN0b3JhZ2UoZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gQ29uc3RydWN0KTogU3RvcmFnZSB7XG4gICAgY29uc3Qgc3RvcmFnZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnN0cnVjdCA9IGZuKHRoaXMsIHN0b3JhZ2VTdGFjay5nZXRTdGFjaygpKTtcbiAgICBzdG9yYWdlU3RhY2suYWRkQ29uc3RydWN0KHN0b3JhZ2VDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIHN0b3JhZ2VDb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBTdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IGFkZCBhIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IHN0b3JhZ2Ugc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYWRkU3RvcmFnZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yYWdlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICBzdG9yYWdlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBzdGFuZGFyZCB0YWdzIHRvIGFsbCByZXNvdXJjZXMgaW4gdGhlIGFwcFxuICAgKiBTdGFuZGFyZCB0YWdzIGluY2x1ZGUgZW52aXJvbm1lbnQgYW5kIHNlcnZpY2UgbmFtZVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseVN0YW5kYXJkVGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICBcbiAgICBjb25zdCBzdGFuZGFyZFRhZ3MgPSB7XG4gICAgICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOmVudmlyb25tZW50XCI6IGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246c2VydmljZVwiOiB0aGlzLm5hbWVcbiAgICB9O1xuICAgIFxuICAgIEFzcGVjdHMub2YodGhpcykuYWRkKG5ldyBTdGFuZGFyZFRhZ3NBc3BlY3Qoc3RhbmRhcmRUYWdzKSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGN1c3RvbSB0YWdzIHRvIGFsbCByZXNvdXJjZXMgaW4gdGhlIGFwcFxuICAgKiBAcGFyYW0gdGFncyBDdXN0b20gdGFncyB0byBhcHBseSB0byBhbGwgcmVzb3VyY2VzXG4gICAqIEBleGFtcGxlXG4gICAqIGFwcC5hZGRUYWdzKHtcbiAgICogICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOm93bmVyXCI6IFwicGxhdGZvcm0tdGVhbVwiLFxuICAgKiAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246Y29zdC1jZW50ZXJcIjogXCJDQy0xMjNcIixcbiAgICogICBcInRlYW06c2xhY2stY2hhbm5lbFwiOiBcIiNwbGF0Zm9ybS1hbGVydHNcIlxuICAgKiB9KTtcbiAgICovXG4gIHB1YmxpYyBhZGRUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBBcHAge1xuICAgIEFzcGVjdHMub2YodGhpcykuYWRkKG5ldyBTdGFuZGFyZFRhZ3NBc3BlY3QodGFncykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiJdfQ==
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBeUQ7QUFFekQsd0RBQWlFO0FBR2pFLDJDQUF1QztBQUN2QyxxREFBOEQ7QUFHOUQsbUVBQWdFO0FBQ2hFLGlEQUE4QztBQUU5Qzs7OztHQUlHO0FBQ0gsTUFBYSxHQUFJLFNBQVEsaUJBQU07SUFZN0IsWUFBb0IsSUFBYTtRQUMvQixLQUFLLEVBQUUsQ0FBQztRQVRGLFdBQU0sR0FBZ0MsRUFBRSxDQUFDO1FBS3pDLGVBQVUsR0FBOEIsRUFBRSxDQUFDO1FBQzNDLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBS3JDLElBQUksSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDOztZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBYTtRQUNoQyxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzdCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQWE7UUFDckMsNkRBQTZEO1FBQzdELCtDQUErQztRQUMvQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFFBQVEsQ0FBQyxHQUFXLEVBQUUsWUFBb0M7UUFDL0Qsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxJQUFJLENB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cnQgeyBBcHAgYXMgQ2RrQXBwLCBGbiwgQXNwZWN0cyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IFZwYywgVnBjRmFjdG9yeSB9IGZyb20gXCIuL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGNcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuXG5pbXBvcnQgeyBBd3NTdGFjayB9IGZyb20gXCIuL3Jlc291cmNlc1wiO1xuaW1wb3J0IHsgRWNyLCBFY3JGYWN0b3J5IH0gZnJvbSBcIi4vcmVzb3VyY2VzL2F3cy9zdG9yYWdlL2VjclwiO1xuXG5pbXBvcnQgeyBTdG9yYWdlIH0gZnJvbSBcIi4vcGF0dGVybnMvYXdzL3N0b3JhZ2VcIjtcbmltcG9ydCB7IFN0YW5kYXJkVGFnc0FzcGVjdCB9IGZyb20gXCIuL3V0aWxzL3N0YW5kYXJkVGFnc0FzcGVjdFwiO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSBcIi4vdXRpbHMvZ2V0Q29uZmlnXCI7XG5cbi8qKlxuICogVGhlIGJhc2ljIGNvcm5lci1zdG9uZSBvZiBhbGwgRmphbGwtaG9zdGVkIGFwcGxpY2F0aW9ucy5cbiAqICBUaGlzIGNsYXNzIGlzIGEgc2luZ2xldG9uIGFuZCBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYW5kIG1hbmFnZVxuICogICBhbGwgcmVzb3VyY2VzIGluIGEgRmphbGwgYXBwbGljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHAgZXh0ZW5kcyBDZGtBcHAge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQXBwIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RhY2tzOiB7IFtrZXk6IHN0cmluZ106IEF3c1N0YWNrIH0gPSB7fTtcblxuICBwcml2YXRlIGRlZmF1bHRWcGM6IElWcGM7XG4gIHByaXZhdGUgZGVmYXVsdEVjcjogRWNyO1xuICBwcml2YXRlIGV4aXN0aW5nVnBjSWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgZ2xvYmFsVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIGFzcGVjdEFwcGxpZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKG5hbWU/OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKG5hbWUpIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgZWxzZSB0aGlzLm5hbWUgPSBcIkZqYWxsQXBwXCI7XG4gIH1cblxuICAvKipcbiAgICogR2V0L0NyZWF0ZSBhIGJhc2ljIEZqYWxsIEFwcGxpY2F0aW9uIHdpdGggc3RhbmRhcmQgdGFncyBhcHBsaWVkXG4gICAqIEBwYXJhbSBuYW1lIEFwcGxpY2F0aW9uIG5hbWVcbiAgICogQHJldHVybnMge0FwcH1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0QXBwKG5hbWU/OiBzdHJpbmcpOiBBcHAge1xuICAgIGNvbnN0IGFwcCA9IEFwcC5nZXRJbnN0YW5jZShuYW1lKTtcbiAgICBhcHAuaW5pdGlhbGl6ZVN0YW5kYXJkVGFncygpO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICAvKipcbiAgICogR2V0L0NyZWF0ZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBBcHBcbiAgICogQHBhcmFtIG5hbWVcbiAgICogQHJldHVybnMge0FwcH1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UobmFtZT86IHN0cmluZyk6IEFwcCB7XG4gICAgLy8gRGVzcGl0ZSBzdXBwb3J0aW5nIG11bHRpcGxlIHN0YWNrcyB5b3UgY2FuIHN0aWxsIG9ubHkgZXZlclxuICAgIC8vIGhhdmUgYSBzaW5nbGUgQXBwbGljYXRpb24gcGVyIENESyBkZXBsb3ltZW50XG4gICAgaWYgKCFBcHAuaW5zdGFuY2UpIHtcbiAgICAgIEFwcC5pbnN0YW5jZSA9IG5ldyBBcHAobmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFwcC5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhIHN0YWNrIGJ5IGtleS4gSWYgdGhlIHN0YWNrIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqICBEZXBlbmRlbmNpZXMgYXJlIG9ubHkgYXBwbGllZCB0aGUgZmlyc3QgdGltZSBhIHN0YWNrIGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUga2V5IG9mIHRoZSBzdGFja1xuICAgKiBAcGFyYW0gZGVwZW5kZW5jaWVzIC0gVGhlIHN0YWNrKHMpIHRoYXQgdGhpcyBzdGFjayBkZXBlbmRzIG9uXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXRTdGFjayhrZXk6IHN0cmluZywgZGVwZW5kZW5jaWVzPzogQXdzU3RhY2sgfCBBd3NTdGFja1tdKTogQXdzU3RhY2sge1xuICAgIC8vIEFwcGx5IHRoZSBhc3BlY3Qgb25jZSBiZWZvcmUgY3JlYXRpbmcgdGhlIGZpcnN0IHN0YWNrXG4gICAgaWYgKCF0aGlzLmFzcGVjdEFwcGxpZWQgJiYgT2JqZWN0LmtleXModGhpcy5zdGFja3MpLmxlbmd0aCA9PT0gMCAmJiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYXBwbHlUYWdzQXNwZWN0KCk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5zdGFja3Nba2V5XSkge1xuICAgICAgdGhpcy5zdGFja3Nba2V5XSA9IG5ldyBBd3NTdGFjayhrZXksIGRlcGVuZGVuY2llcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RhY2tzW2tleV07XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCBjb21wdXRlIHN0YWNrIC0gbmFtZWQgYXMgYCR7dGhpcy5uYW1lfUNvbXB1dGVgXG4gICAqIEByZXR1cm5zIHtBd3NTdGFja31cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk6IEF3c1N0YWNrIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFjayhgJHt0aGlzLm5hbWV9Q29tcHV0ZWAsIFtcbiAgICAgIHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpLFxuICAgICAgdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKClcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBkZWZhdWx0IG5ldHdvcmsgc3RhY2sgLSBuYW1lZCBhcyBgJHt0aGlzLm5hbWV9TmV0d29ya2BcbiAgICogQHJldHVybnMge0F3c1N0YWNrfVxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHROZXR3b3JrU3RhY2soKTogQXdzU3RhY2sge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrKGAke3RoaXMubmFtZX1OZXR3b3JrYCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGVmYXVsdFN0b3JhZ2VTdGFjaygpOiBBd3NTdGFjayB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2soYCR7dGhpcy5uYW1lfVN0b3JhZ2VgLCB0aGlzLmdldERlZmF1bHROZXR3b3JrU3RhY2soKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgZGVmYXVsdCB2cGMuIElmIHRoZSBWUEMgZG9lcyBub3QgZXhpc3QgaXQgd2lsbCBiZSBjcmVhdGVkLlxuICAgKiBAcmV0dXJucyB7VnBjfVxuICAgKi9cbiAgcHVibGljIGdldERlZmF1bHRWcGMoKTogSVZwYyB7XG4gICAgdmFyIG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuXG4gICAgaWYgKCF0aGlzLmRlZmF1bHRWcGMpIHtcbiAgICAgIC8vIFVzZSBhbiBleGlzdGluZyBpbXBvcnRlZCBWUEMgaWYgb25lIHdhcyBzdXBwbGllZFxuICAgICAgaWYgKHRoaXMuZXhpc3RpbmdWcGNJZCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRWcGMgPSBWcGMuZnJvbUxvb2t1cChcbiAgICAgICAgICBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSxcbiAgICAgICAgICBgJHt0aGlzLm5hbWV9SW1wb3J0ZWRWcGNgLFxuICAgICAgICAgIHsgdnBjSWQ6IHRoaXMuZXhpc3RpbmdWcGNJZCB9XG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgZGVyaXZlIHRoZSBhY2NvdW50IGFuZCByZWdpb24gZnJvbSB0aGVcbiAgICAgICAgLy8gZW52aXJvbm1lbnQgdGhlIENESyBpcyBydW5uaW5nIGluLiBXaGVuIGFuIGFjY291bnQgSUQgaXMgYXZhaWxhYmxlLFxuICAgICAgICAvLyB1c2UgaXQgdG8gaW1wb3J0IHRoZSBjb3JyZXNwb25kaW5nIElQQU0gcG9vbCBzbyBDSURScyBhcmUgYWxsb2NhdGVkXG4gICAgICAgIC8vIGZyb20gYSBjZW50cmFsIHBvb2wgaW5zdGVhZCBvZiB1c2luZyB0aGUgZGVmYXVsdCAxMC4wLjAuMC8xNiBibG9jay5cblxuICAgICAgICBjb25zdCBhY2NvdW50SWQgPSBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9BQ0NPVU5UO1xuICAgICAgICBjb25zdCByZWdpb24gPSBwcm9jZXNzLmVudi5DREtfREVGQVVMVF9SRUdJT047XG4gICAgICAgIGNvbnN0IGlzTWFuYWdlZEFjY291bnQgPVxuICAgICAgICAgIHByb2Nlc3MuZW52LkZKQUxMX01BTkFHRURfQUNDT1VOVCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBpcHY0SXBhbVBvb2xJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXNNYW5hZ2VkQWNjb3VudCkge1xuICAgICAgICAgIGlwdjRJcGFtUG9vbElkID0gRm4uaW1wb3J0VmFsdWUoYElwYW1Qb29sSWQke2FjY291bnRJZH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpcHY0SXBhbVBvb2xJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGVmYXVsdFZwYyA9IFZwY0ZhY3RvcnkuYnVpbGQoYCR7dGhpcy5uYW1lfURlZmF1bHRWcGNgLCB7XG4gICAgICAgICAgYWNjb3VudElkLFxuICAgICAgICAgIHJlZ2lvbixcbiAgICAgICAgICBpcHY0SXBhbVBvb2xJZFxuICAgICAgICB9KSh0aGlzLCBuZXR3b3JrU3RhY2suZ2V0U3RhY2soKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZwYztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXVzZSBhbiBleGlzdGluZyBWUEMuXG4gICAqIEFjY2VwdHMgZWl0aGVyIGEgVnBjIG9iamVjdCBvciBhIHBsYWluIFZQQyBJRCBzdHJpbmcgZm9yIGNvbnZlbmllbmNlLlxuICAgKi9cbiAgcHVibGljIHVzZUV4aXN0aW5nVnBjKHZwY0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0VnBjKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwidXNlRXhpc3RpbmdWcGMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBkZWZhdWx0IFZQQyBoYXMgYmVlbiBjcmVhdGVkXCJcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5leGlzdGluZ1ZwY0lkID0gdnBjSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmVpdmUgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gY29udGFpbmVyIHJlZ2lzdHJ5LiBJZiB0aGUgcmVnaXN0cnkgZG9lcyBub3QgZXhpc3RcbiAgICogIGl0IHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHB1YmxpYyBnZXREZWZhdWx0Q29udGFpbmVyUmVnaXN0cnkoKTogRWNyIHtcbiAgICBpZiAoIXRoaXMuZGVmYXVsdEVjcikge1xuICAgICAgdmFyIG5ldHdvcmtTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdE5ldHdvcmtTdGFjaygpO1xuXG4gICAgICB0aGlzLmRlZmF1bHRFY3IgPSBFY3JGYWN0b3J5LmJ1aWxkKGAke3RoaXMubmFtZX1FY3JgKShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbmV0d29ya1N0YWNrLmdldFN0YWNrKClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdEVjcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb21wdXRlIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IGNvbXB1dGUgc3RhY2sgdXNpbmcgdGhlIGZhY3RvcnkgcGF0dGVybi5cbiAgICovXG4gIHB1YmxpYyBhZGRDb21wdXRlKGZuOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IENvbnN0cnVjdCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXB1dGVTdGFjayA9IHRoaXMuZ2V0RGVmYXVsdENvbXB1dGVTdGFjaygpO1xuICAgIGNvbXB1dGVTdGFjay5hZGRDb25zdHJ1Y3QoZm4odGhpcywgY29tcHV0ZVN0YWNrLmdldFN0YWNrKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYW51YWxseSBhZGQgYSByZXNvdXJjZSB0byB0aGUgZGVmYXVsdCBjb21wdXRlIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFkZENvbXB1dGVSZXNvdXJjZShyZXNvdXJjZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3QgY29tcHV0ZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0Q29tcHV0ZVN0YWNrKCk7XG4gICAgY29tcHV0ZVN0YWNrLmFkZENvbnN0cnVjdChyZXNvdXJjZSk7XG4gIH1cblxuICAvKipcbiAgICogIEFkZCBhIHN0b3JhZ2UgcmVzb3VyY2UgdG8gdGhlIGRlZmF1bHQgc3RvcmFnZSBzdGFjayB1c2luZyB0aGUgZmFjdG9yeSBwYXR0ZXJuLlxuICAgKi9cbiAgcHVibGljIGFkZFN0b3JhZ2UoZm46IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gQ29uc3RydWN0KTogU3RvcmFnZSB7XG4gICAgY29uc3Qgc3RvcmFnZVN0YWNrID0gdGhpcy5nZXREZWZhdWx0U3RvcmFnZVN0YWNrKCk7XG4gICAgY29uc3Qgc3RvcmFnZUNvbnN0cnVjdCA9IGZuKHRoaXMsIHN0b3JhZ2VTdGFjay5nZXRTdGFjaygpKTtcbiAgICBzdG9yYWdlU3RhY2suYWRkQ29uc3RydWN0KHN0b3JhZ2VDb25zdHJ1Y3QpO1xuXG4gICAgcmV0dXJuIHN0b3JhZ2VDb25zdHJ1Y3QgYXMgdW5rbm93biBhcyBTdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hbnVhbGx5IGFkZCBhIHJlc291cmNlIHRvIHRoZSBkZWZhdWx0IHN0b3JhZ2Ugc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYWRkU3RvcmFnZVJlc291cmNlKHJlc291cmNlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBzdG9yYWdlU3RhY2sgPSB0aGlzLmdldERlZmF1bHRTdG9yYWdlU3RhY2soKTtcbiAgICBzdG9yYWdlU3RhY2suYWRkQ29uc3RydWN0KHJlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHN0YW5kYXJkIHRhZ3NcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVN0YW5kYXJkVGFncygpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoKTtcbiAgICB0aGlzLmdsb2JhbFRhZ3MgPSB7XG4gICAgICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOmVudmlyb25tZW50XCI6IGNvbmZpZy5lbnZpcm9ubWVudCxcbiAgICAgIFwiZmphbGw6Y29zdEFsbG9jYXRpb246c2VydmljZVwiOiB0aGlzLm5hbWVcbiAgICB9O1xuICB9XG5cblxuICAvKipcbiAgICogQXBwbHkgYWxsIHRhZ3MgYXMgYSBzaW5nbGUgYXNwZWN0XG4gICAqL1xuICBwcml2YXRlIGFwcGx5VGFnc0FzcGVjdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYXNwZWN0QXBwbGllZCAmJiBPYmplY3Qua2V5cyh0aGlzLmdsb2JhbFRhZ3MpLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEFwcGx5IE9ORSBhc3BlY3Qgd2l0aCBhbGwgdGFncyB1c2luZyB0aGUgQ0RLIHYyLjIwNi4wKyBjb21wYXRpYmxlIFN0YW5kYXJkVGFnc0FzcGVjdFxuICAgICAgQXNwZWN0cy5vZih0aGlzKS5hZGQobmV3IFN0YW5kYXJkVGFnc0FzcGVjdCh0aGlzLmdsb2JhbFRhZ3MpKTtcbiAgICAgIHRoaXMuYXNwZWN0QXBwbGllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBjdXN0b20gdGFncyB0byBhbGwgcmVzb3VyY2VzIGluIHRoZSBhcHBcbiAgICogQHBhcmFtIHRhZ3MgQ3VzdG9tIHRhZ3MgdG8gYXBwbHkgdG8gYWxsIHJlc291cmNlc1xuICAgKiBAZXhhbXBsZVxuICAgKiBhcHAuYWRkVGFncyh7XG4gICAqICAgXCJmamFsbDpjb3N0QWxsb2NhdGlvbjpvd25lclwiOiBcInBsYXRmb3JtLXRlYW1cIixcbiAgICogICBcImZqYWxsOmNvc3RBbGxvY2F0aW9uOmNvc3QtY2VudGVyXCI6IFwiQ0MtMTIzXCIsXG4gICAqICAgXCJ0ZWFtOnNsYWNrLWNoYW5uZWxcIjogXCIjcGxhdGZvcm0tYWxlcnRzXCJcbiAgICogfSk7XG4gICAqL1xuICBwdWJsaWMgYWRkVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogQXBwIHtcbiAgICAvLyBNZXJnZSB0YWdzIGJ1dCBkb24ndCBhcHBseSBhc3BlY3QgeWV0XG4gICAgdGhpcy5nbG9iYWxUYWdzID0ge1xuICAgICAgLi4udGhpcy5nbG9iYWxUYWdzLFxuICAgICAgLi4udGFnc1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXBwO1xuIl19
|
|
@@ -4,6 +4,7 @@ exports.Vpc = exports.VpcFactory = void 0;
|
|
|
4
4
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
5
|
const ec2 = require("aws-cdk-lib/aws-ec2");
|
|
6
6
|
const logGroup_1 = require("../logging/logGroup");
|
|
7
|
+
const tagResource_1 = require("../../../utils/tagResource");
|
|
7
8
|
class VpcFactory {
|
|
8
9
|
static build(id, props) {
|
|
9
10
|
return (app, scope) => {
|
|
@@ -28,8 +29,10 @@ class Vpc extends ec2.Vpc {
|
|
|
28
29
|
ipAddresses: Vpc.ipAddresses(scope, id, props)
|
|
29
30
|
});
|
|
30
31
|
if (!!props?.accountId) {
|
|
31
|
-
// Required for the VPC to use the IPAM Pool to
|
|
32
|
-
|
|
32
|
+
// Required for the VPC to use the IPAM Pool to provision IP addresses
|
|
33
|
+
(0, tagResource_1.default)(this, {
|
|
34
|
+
"fjall:operations:pool": props?.accountId || "noPool"
|
|
35
|
+
});
|
|
33
36
|
}
|
|
34
37
|
}
|
|
35
38
|
static availabilityZones(scope) {
|
|
@@ -81,4 +84,4 @@ class Vpc extends ec2.Vpc {
|
|
|
81
84
|
}
|
|
82
85
|
}
|
|
83
86
|
exports.Vpc = Vpc;
|
|
84
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBjLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvbmV0d29ya2luZy92cGMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQW1EO0FBQ25ELDJDQUEyQztBQUkzQyxrREFBK0M7QUFFL0MsNERBQXFEO0FBU3JELE1BQWEsVUFBVTtJQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQVUsRUFBRSxLQUFlO1FBQ3RDLE9BQU8sQ0FBQyxHQUFRLEVBQUUsS0FBZ0IsRUFBRSxFQUFFO1lBQ3BDLE1BQU0sUUFBUSxHQUFHO2dCQUNmLEdBQUcsS0FBSztnQkFDUixHQUFHO29CQUNELE9BQU8sRUFBRSxHQUFHLEdBQUcsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRTtpQkFDaEU7YUFDRixDQUFDO1lBQ0YsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQVpELGdDQVlDO0FBRUQsTUFBYSxHQUFJLFNBQVEsR0FBRyxDQUFDLEdBQUc7SUFDOUIsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFnQjtRQUN4RCxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUU7WUFDeEIsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3BCLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUM7WUFDL0MsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUM7WUFDeEMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUM7U0FDL0MsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDO1lBQ3ZCLHNFQUFzRTtZQUN0RSxJQUFBLHFCQUFXLEVBQUMsSUFBSSxFQUFFO2dCQUNoQix1QkFBdUIsRUFBRSxLQUFLLEVBQUUsU0FBUyxJQUFJLFFBQVE7YUFDdEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBZ0I7UUFDdkMsT0FBTyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdCO1FBQzVELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRWpELE9BQU87WUFDTCxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsRUFBRTtnQkFDcEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDbEQsSUFBSSxtQkFBUSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFO29CQUN2QyxZQUFZLEVBQUUscUJBQXFCLEVBQUUsR0FBRztvQkFDeEMsYUFBYSxFQUFFLDJCQUFhLENBQUMsT0FBTztpQkFDckMsQ0FBQyxDQUNIO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0I7UUFDL0QsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDaEQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztZQUN2QyxjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWM7WUFDcEMsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQiw4QkFBOEIsRUFBRSxFQUFFO1NBQ25DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQVUsRUFBRSxLQUFnQjtRQUN2QyxPQUFPLENBQUMsRUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUM7SUFDSixDQUFDO0lBQ0Q7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FDWCxFQUFVLEVBQ1YsWUFBb0I7UUFFcEIsT0FBTyxDQUFDLEVBQWdCLEVBQUUsRUFBRTtZQUMxQixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQzNDLE9BQU8sRUFBRSxHQUFHLFlBQVksSUFBSSxFQUFFLEVBQUU7YUFDakMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBMUVELGtCQTBFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBSZW1vdmFsUG9saWN5LCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgZWMyIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5cbmltcG9ydCBBcHAgZnJvbSBcIi4uLy4uLy4uL2FwcFwiO1xuaW1wb3J0IHsgU3RhY2tCdWlsZGVyIH0gZnJvbSBcIi4uL2Jhc2UvYXdzU3RhY2tcIjtcbmltcG9ydCB7IExvZ0dyb3VwIH0gZnJvbSBcIi4uL2xvZ2dpbmcvbG9nR3JvdXBcIjtcbmltcG9ydCB7IEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5pbXBvcnQgdGFnUmVzb3VyY2UgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3RhZ1Jlc291cmNlXCI7XG5cbmludGVyZmFjZSBWcGNQcm9wcyBleHRlbmRzIGVjMi5WcGNQcm9wcyB7XG4gIHJlZ2lvbj86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICBhdmFpbGFiaWxpdHlab25lcz86IHN0cmluZ1tdO1xuICBpcHY0SXBhbVBvb2xJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFZwY0ZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IFZwY1Byb3BzKSB7XG4gICAgcmV0dXJuIChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgY29uc3QgdnBjUHJvcHMgPSB7XG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgICAuLi57XG4gICAgICAgICAgdnBjTmFtZTogYCR7YXBwLmdldERlZmF1bHROZXR3b3JrU3RhY2soKS5nZXRTdGFja05hbWUoKX0vJHtpZH1gXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IFZwYyhzY29wZSwgaWQsIHZwY1Byb3BzKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWcGMgZXh0ZW5kcyBlYzIuVnBjIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBWcGNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBgdnBjLSR7aWR9YCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB2cGNOYW1lOiBgdnBjLSR7aWR9YCxcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmVzOiBWcGMuYXZhaWxhYmlsaXR5Wm9uZXMoc2NvcGUpLFxuICAgICAgZmxvd0xvZ3M6IFZwYy5mbG93TG9ncyhzY29wZSwgaWQsIHByb3BzKSxcbiAgICAgIGlwQWRkcmVzc2VzOiBWcGMuaXBBZGRyZXNzZXMoc2NvcGUsIGlkLCBwcm9wcylcbiAgICB9KTtcblxuICAgIGlmICghIXByb3BzPy5hY2NvdW50SWQpIHtcbiAgICAgIC8vIFJlcXVpcmVkIGZvciB0aGUgVlBDIHRvIHVzZSB0aGUgSVBBTSBQb29sIHRvIHByb3Zpc2lvbiBJUCBhZGRyZXNzZXNcbiAgICAgIHRhZ1Jlc291cmNlKHRoaXMsIHtcbiAgICAgICAgXCJmamFsbDpvcGVyYXRpb25zOnBvb2xcIjogcHJvcHM/LmFjY291bnRJZCB8fCBcIm5vUG9vbFwiXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXZhaWxhYmlsaXR5Wm9uZXMoc2NvcGU6IENvbnN0cnVjdCkge1xuICAgIHJldHVybiBTdGFjay5vZihzY29wZSkuYXZhaWxhYmlsaXR5Wm9uZXMuc2xpY2UoMCwgMyk7XG4gIH1cblxuICBzdGF0aWMgZmxvd0xvZ3Moc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBWcGNQcm9wcykge1xuICAgIGlmICghcHJvcHMgfHwgIXByb3BzLmFjY291bnRJZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7XG4gICAgICBbYCR7aWR9VnBjRmxvd0xvZ3NgXToge1xuICAgICAgICBkZXN0aW5hdGlvbjogZWMyLkZsb3dMb2dEZXN0aW5hdGlvbi50b0Nsb3VkV2F0Y2hMb2dzKFxuICAgICAgICAgIG5ldyBMb2dHcm91cChzY29wZSwgYCR7aWR9Rmxvd0xvZ0dyb3VwYCwge1xuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL3ZwYy9mbG93bG9ncy92cGMtJHtpZH0vYCxcbiAgICAgICAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGlwQWRkcmVzc2VzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogVnBjUHJvcHMpIHtcbiAgICBpZiAoIXByb3BzPy5hY2NvdW50SWQgfHwgIXByb3BzPy5pcHY0SXBhbVBvb2xJZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZWMyLklwQWRkcmVzc2VzLmF3c0lwYW1BbGxvY2F0aW9uKHtcbiAgICAgIGlwdjRJcGFtUG9vbElkOiBwcm9wcy5pcHY0SXBhbVBvb2xJZCxcbiAgICAgIGlwdjROZXRtYXNrTGVuZ3RoOiAyMCxcbiAgICAgIGRlZmF1bHRTdWJuZXRJcHY0TmV0bWFza0xlbmd0aDogMjNcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wcz86IFZwY1Byb3BzKTogKHNiOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdCB7XG4gICAgcmV0dXJuIChzYjogU3RhY2tCdWlsZGVyKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMoc2IuZ2V0U3RhY2soKSwgaWQsIHByb3BzKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBJbXBvcnRzIGEgcHJlLWV4aXN0aW5nIFZQQyBSZXNvdXJjZSBpbnRvIHlvdXIgU3RhY2tcbiAgICpcbiAgICogQmVmb3JlIHVzaW5nIGFuIGltcG9ydCBtZXRob2QgZW5zdXJlIHlvdSBoYXZlIHNldCB0aGUgYWNjb3VudCBhbmQgcmVnaW9uIHByb3BzXG4gICAqICB3aGVuIGNyZWF0aW5nIHlvdXIgQXdzU3RhY2suXG4gICAqXG4gICAqIEBwYXJhbSBpZFxuICAgKiBAcGFyYW0gdnBjU3RhY2tOYW1lXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgaW1wb3J0KFxuICAgIGlkOiBzdHJpbmcsXG4gICAgdnBjU3RhY2tOYW1lOiBzdHJpbmdcbiAgKTogKHNiOiBTdGFja0J1aWxkZXIpID0+IENvbnN0cnVjdCB7XG4gICAgcmV0dXJuIChzYjogU3RhY2tCdWlsZGVyKSA9PiB7XG4gICAgICByZXR1cm4gZWMyLlZwYy5mcm9tTG9va3VwKHNiLmdldFN0YWNrKCksIGlkLCB7XG4gICAgICAgIHZwY05hbWU6IGAke3ZwY1N0YWNrTmFtZX0vJHtpZH1gXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Stack, CfnResource } from "aws-cdk-lib";
|
|
2
|
+
import { IConstruct } from "constructs";
|
|
3
|
+
/**
|
|
4
|
+
* DirectTagging provides a way to apply tags to resources without using aspects.
|
|
5
|
+
* This approach works by directly manipulating CloudFormation resources during
|
|
6
|
+
* stack initialization, avoiding the infinite loop issue in CDK v2.206.0+
|
|
7
|
+
*/
|
|
8
|
+
export declare class DirectTagging {
|
|
9
|
+
private static globalTags;
|
|
10
|
+
private static stackTags;
|
|
11
|
+
/**
|
|
12
|
+
* Set global tags that will be applied to all resources
|
|
13
|
+
*/
|
|
14
|
+
static setGlobalTags(tags: {
|
|
15
|
+
[key: string]: string;
|
|
16
|
+
}): void;
|
|
17
|
+
/**
|
|
18
|
+
* Set tags for a specific stack
|
|
19
|
+
*/
|
|
20
|
+
static setStackTags(stack: Stack, tags: {
|
|
21
|
+
[key: string]: string;
|
|
22
|
+
}): void;
|
|
23
|
+
/**
|
|
24
|
+
* Apply tags to a CloudFormation resource directly
|
|
25
|
+
*/
|
|
26
|
+
static tagCfnResource(resource: CfnResource): void;
|
|
27
|
+
/**
|
|
28
|
+
* Process a construct tree and tag all CloudFormation resources
|
|
29
|
+
*/
|
|
30
|
+
static processConstructTree(root: IConstruct): void;
|
|
31
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DirectTagging = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
/**
|
|
6
|
+
* DirectTagging provides a way to apply tags to resources without using aspects.
|
|
7
|
+
* This approach works by directly manipulating CloudFormation resources during
|
|
8
|
+
* stack initialization, avoiding the infinite loop issue in CDK v2.206.0+
|
|
9
|
+
*/
|
|
10
|
+
class DirectTagging {
|
|
11
|
+
/**
|
|
12
|
+
* Set global tags that will be applied to all resources
|
|
13
|
+
*/
|
|
14
|
+
static setGlobalTags(tags) {
|
|
15
|
+
DirectTagging.globalTags = {
|
|
16
|
+
...DirectTagging.globalTags,
|
|
17
|
+
...tags
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set tags for a specific stack
|
|
22
|
+
*/
|
|
23
|
+
static setStackTags(stack, tags) {
|
|
24
|
+
const existingTags = DirectTagging.stackTags.get(stack) || {};
|
|
25
|
+
DirectTagging.stackTags.set(stack, {
|
|
26
|
+
...existingTags,
|
|
27
|
+
...tags
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Apply tags to a CloudFormation resource directly
|
|
32
|
+
*/
|
|
33
|
+
static tagCfnResource(resource) {
|
|
34
|
+
const stack = aws_cdk_lib_1.Stack.of(resource);
|
|
35
|
+
const stackTags = DirectTagging.stackTags.get(stack) || {};
|
|
36
|
+
const allTags = {
|
|
37
|
+
...DirectTagging.globalTags,
|
|
38
|
+
...stackTags
|
|
39
|
+
};
|
|
40
|
+
if (Object.keys(allTags).length === 0) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Check if resource supports tags
|
|
44
|
+
if (!('tags' in resource) || typeof resource.tags !== 'object') {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
// Get existing tags
|
|
48
|
+
const existingTags = resource.tags || [];
|
|
49
|
+
const tagMap = new Map();
|
|
50
|
+
// Add existing tags to map
|
|
51
|
+
if (Array.isArray(existingTags)) {
|
|
52
|
+
existingTags.forEach((tag) => {
|
|
53
|
+
if (tag.key && tag.value) {
|
|
54
|
+
tagMap.set(tag.key, tag.value);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
// Add new tags (overwriting if they exist)
|
|
59
|
+
Object.entries(allTags).forEach(([key, value]) => {
|
|
60
|
+
tagMap.set(key, value);
|
|
61
|
+
});
|
|
62
|
+
// Convert back to array format
|
|
63
|
+
resource.tags = Array.from(tagMap.entries()).map(([key, value]) => ({
|
|
64
|
+
key,
|
|
65
|
+
value
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Process a construct tree and tag all CloudFormation resources
|
|
70
|
+
*/
|
|
71
|
+
static processConstructTree(root) {
|
|
72
|
+
const processNode = (node) => {
|
|
73
|
+
// Check if this is a CloudFormation resource
|
|
74
|
+
if (aws_cdk_lib_1.CfnResource.isCfnResource(node)) {
|
|
75
|
+
DirectTagging.tagCfnResource(node);
|
|
76
|
+
}
|
|
77
|
+
// Process children
|
|
78
|
+
node.node.children.forEach(child => processNode(child));
|
|
79
|
+
};
|
|
80
|
+
processNode(root);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.DirectTagging = DirectTagging;
|
|
84
|
+
DirectTagging.globalTags = {};
|
|
85
|
+
DirectTagging.stackTags = new Map();
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlyZWN0VGFnZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy9kaXJlY3RUYWdnaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUFpRDtBQUdqRDs7OztHQUlHO0FBQ0gsTUFBYSxhQUFhO0lBSXhCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUErQjtRQUN6RCxhQUFhLENBQUMsVUFBVSxHQUFHO1lBQ3pCLEdBQUcsYUFBYSxDQUFDLFVBQVU7WUFDM0IsR0FBRyxJQUFJO1NBQ1IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBWSxFQUFFLElBQStCO1FBQ3RFLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM5RCxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUU7WUFDakMsR0FBRyxZQUFZO1lBQ2YsR0FBRyxJQUFJO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFxQjtRQUNoRCxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0QsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLGFBQWEsQ0FBQyxVQUFVO1lBQzNCLEdBQUcsU0FBUztTQUNiLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBRUQsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0QsT0FBTztRQUNULENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFFekMsMkJBQTJCO1FBQzNCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELDJDQUEyQztRQUMzQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDL0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7UUFFSCwrQkFBK0I7UUFDL0IsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLEdBQUc7WUFDSCxLQUFLO1NBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBZ0I7UUFDakQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFnQixFQUFFLEVBQUU7WUFDdkMsNkNBQTZDO1lBQzdDLElBQUkseUJBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxDQUFDO1lBRUQsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQztRQUVGLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDOztBQXJGSCxzQ0FzRkM7QUFyRmdCLHdCQUFVLEdBQThCLEVBQUUsQ0FBQztBQUMzQyx1QkFBUyxHQUEwQyxJQUFJLEdBQUcsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIENmblJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0LCBOb2RlIH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBEaXJlY3RUYWdnaW5nIHByb3ZpZGVzIGEgd2F5IHRvIGFwcGx5IHRhZ3MgdG8gcmVzb3VyY2VzIHdpdGhvdXQgdXNpbmcgYXNwZWN0cy5cbiAqIFRoaXMgYXBwcm9hY2ggd29ya3MgYnkgZGlyZWN0bHkgbWFuaXB1bGF0aW5nIENsb3VkRm9ybWF0aW9uIHJlc291cmNlcyBkdXJpbmdcbiAqIHN0YWNrIGluaXRpYWxpemF0aW9uLCBhdm9pZGluZyB0aGUgaW5maW5pdGUgbG9vcCBpc3N1ZSBpbiBDREsgdjIuMjA2LjArXG4gKi9cbmV4cG9ydCBjbGFzcyBEaXJlY3RUYWdnaW5nIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBzdGFja1RhZ3M6IE1hcDxTdGFjaywgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4gPSBuZXcgTWFwKCk7XG4gIFxuICAvKipcbiAgICogU2V0IGdsb2JhbCB0YWdzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCByZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0R2xvYmFsVGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgRGlyZWN0VGFnZ2luZy5nbG9iYWxUYWdzID0ge1xuICAgICAgLi4uRGlyZWN0VGFnZ2luZy5nbG9iYWxUYWdzLFxuICAgICAgLi4udGFnc1xuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXQgdGFncyBmb3IgYSBzcGVjaWZpYyBzdGFja1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRTdGFja1RhZ3Moc3RhY2s6IFN0YWNrLCB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmdUYWdzID0gRGlyZWN0VGFnZ2luZy5zdGFja1RhZ3MuZ2V0KHN0YWNrKSB8fCB7fTtcbiAgICBEaXJlY3RUYWdnaW5nLnN0YWNrVGFncy5zZXQoc3RhY2ssIHtcbiAgICAgIC4uLmV4aXN0aW5nVGFncyxcbiAgICAgIC4uLnRhZ3NcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEFwcGx5IHRhZ3MgdG8gYSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBkaXJlY3RseVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0YWdDZm5SZXNvdXJjZShyZXNvdXJjZTogQ2ZuUmVzb3VyY2UpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFjayA9IFN0YWNrLm9mKHJlc291cmNlKTtcbiAgICBjb25zdCBzdGFja1RhZ3MgPSBEaXJlY3RUYWdnaW5nLnN0YWNrVGFncy5nZXQoc3RhY2spIHx8IHt9O1xuICAgIGNvbnN0IGFsbFRhZ3MgPSB7XG4gICAgICAuLi5EaXJlY3RUYWdnaW5nLmdsb2JhbFRhZ3MsXG4gICAgICAuLi5zdGFja1RhZ3NcbiAgICB9O1xuICAgIFxuICAgIGlmIChPYmplY3Qua2V5cyhhbGxUYWdzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgcmVzb3VyY2Ugc3VwcG9ydHMgdGFnc1xuICAgIGlmICghKCd0YWdzJyBpbiByZXNvdXJjZSkgfHwgdHlwZW9mIHJlc291cmNlLnRhZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBleGlzdGluZyB0YWdzXG4gICAgY29uc3QgZXhpc3RpbmdUYWdzID0gcmVzb3VyY2UudGFncyB8fCBbXTtcbiAgICBjb25zdCB0YWdNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIFxuICAgIC8vIEFkZCBleGlzdGluZyB0YWdzIHRvIG1hcFxuICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nVGFncykpIHtcbiAgICAgIGV4aXN0aW5nVGFncy5mb3JFYWNoKCh0YWc6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGFnLmtleSAmJiB0YWcudmFsdWUpIHtcbiAgICAgICAgICB0YWdNYXAuc2V0KHRhZy5rZXksIHRhZy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbmV3IHRhZ3MgKG92ZXJ3cml0aW5nIGlmIHRoZXkgZXhpc3QpXG4gICAgT2JqZWN0LmVudHJpZXMoYWxsVGFncykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICB0YWdNYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0pO1xuICAgIFxuICAgIC8vIENvbnZlcnQgYmFjayB0byBhcnJheSBmb3JtYXRcbiAgICByZXNvdXJjZS50YWdzID0gQXJyYXkuZnJvbSh0YWdNYXAuZW50cmllcygpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIGtleSxcbiAgICAgIHZhbHVlXG4gICAgfSkpO1xuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyBhIGNvbnN0cnVjdCB0cmVlIGFuZCB0YWcgYWxsIENsb3VkRm9ybWF0aW9uIHJlc291cmNlc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwcm9jZXNzQ29uc3RydWN0VHJlZShyb290OiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3QgcHJvY2Vzc05vZGUgPSAobm9kZTogSUNvbnN0cnVjdCkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIENsb3VkRm9ybWF0aW9uIHJlc291cmNlXG4gICAgICBpZiAoQ2ZuUmVzb3VyY2UuaXNDZm5SZXNvdXJjZShub2RlKSkge1xuICAgICAgICBEaXJlY3RUYWdnaW5nLnRhZ0NmblJlc291cmNlKG5vZGUpO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBQcm9jZXNzIGNoaWxkcmVuXG4gICAgICBub2RlLm5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBwcm9jZXNzTm9kZShjaGlsZCkpO1xuICAgIH07XG4gICAgXG4gICAgcHJvY2Vzc05vZGUocm9vdCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
/**
|
|
3
|
+
* Base construct for Fjall resources that automatically
|
|
4
|
+
* applies tags from context during construction.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FjallConstruct extends Construct {
|
|
7
|
+
constructor(scope: Construct, id: string);
|
|
8
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FjallConstruct = void 0;
|
|
4
|
+
const constructs_1 = require("constructs");
|
|
5
|
+
const tagContext_1 = require("./tagContext");
|
|
6
|
+
/**
|
|
7
|
+
* Base construct for Fjall resources that automatically
|
|
8
|
+
* applies tags from context during construction.
|
|
9
|
+
*/
|
|
10
|
+
class FjallConstruct extends constructs_1.Construct {
|
|
11
|
+
constructor(scope, id) {
|
|
12
|
+
super(scope, id);
|
|
13
|
+
// Apply tags from context during construction
|
|
14
|
+
tagContext_1.TagContext.applyTagsFromContext(this.node);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.FjallConstruct = FjallConstruct;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmphbGxDb25zdHJ1Y3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvZmphbGxDb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBQ3ZDLDZDQUEwQztBQUUxQzs7O0dBR0c7QUFDSCxNQUFhLGNBQWUsU0FBUSxzQkFBUztJQUMzQyxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLDhDQUE4QztRQUM5Qyx1QkFBVSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0NBQ0Y7QUFQRCx3Q0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBUYWdDb250ZXh0IH0gZnJvbSBcIi4vdGFnQ29udGV4dFwiO1xuXG4vKipcbiAqIEJhc2UgY29uc3RydWN0IGZvciBGamFsbCByZXNvdXJjZXMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gKiBhcHBsaWVzIHRhZ3MgZnJvbSBjb250ZXh0IGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBGamFsbENvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIFxuICAgIC8vIEFwcGx5IHRhZ3MgZnJvbSBjb250ZXh0IGR1cmluZyBjb25zdHJ1Y3Rpb25cbiAgICBUYWdDb250ZXh0LmFwcGx5VGFnc0Zyb21Db250ZXh0KHRoaXMubm9kZSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DefaultStackSynthesizer } from "aws-cdk-lib";
|
|
2
|
+
import { ISynthesisSession } from "aws-cdk-lib/core";
|
|
3
|
+
/**
|
|
4
|
+
* Custom stack synthesizer that applies tags during synthesis.
|
|
5
|
+
* This avoids the infinite loop issue with aspects in CDK v2.206.0+
|
|
6
|
+
*/
|
|
7
|
+
export declare class FjallStackSynthesizer extends DefaultStackSynthesizer {
|
|
8
|
+
synthesize(session: ISynthesisSession): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FjallStackSynthesizer = void 0;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const directTagging_1 = require("./directTagging");
|
|
6
|
+
/**
|
|
7
|
+
* Custom stack synthesizer that applies tags during synthesis.
|
|
8
|
+
* This avoids the infinite loop issue with aspects in CDK v2.206.0+
|
|
9
|
+
*/
|
|
10
|
+
class FjallStackSynthesizer extends aws_cdk_lib_1.DefaultStackSynthesizer {
|
|
11
|
+
synthesize(session) {
|
|
12
|
+
const stack = this.boundStack;
|
|
13
|
+
// Process the entire construct tree to apply tags
|
|
14
|
+
if (stack) {
|
|
15
|
+
directTagging_1.DirectTagging.processConstructTree(stack);
|
|
16
|
+
}
|
|
17
|
+
// Continue with normal synthesis
|
|
18
|
+
super.synthesize(session);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.FjallStackSynthesizer = FjallStackSynthesizer;
|
|
22
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmphbGxTdGFja1N5bnRoZXNpemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL2ZqYWxsU3RhY2tTeW50aGVzaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBc0Q7QUFFdEQsbURBQWdEO0FBRWhEOzs7R0FHRztBQUNILE1BQWEscUJBQXNCLFNBQVEscUNBQXVCO0lBQ3pELFVBQVUsQ0FBQyxPQUEwQjtRQUMxQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRTlCLGtEQUFrRDtRQUNsRCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsNkJBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBWkQsc0RBWUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0U3RhY2tTeW50aGVzaXplciB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSVN5bnRoZXNpc1Nlc3Npb24gfSBmcm9tIFwiYXdzLWNkay1saWIvY29yZVwiO1xuaW1wb3J0IHsgRGlyZWN0VGFnZ2luZyB9IGZyb20gXCIuL2RpcmVjdFRhZ2dpbmdcIjtcblxuLyoqXG4gKiBDdXN0b20gc3RhY2sgc3ludGhlc2l6ZXIgdGhhdCBhcHBsaWVzIHRhZ3MgZHVyaW5nIHN5bnRoZXNpcy5cbiAqIFRoaXMgYXZvaWRzIHRoZSBpbmZpbml0ZSBsb29wIGlzc3VlIHdpdGggYXNwZWN0cyBpbiBDREsgdjIuMjA2LjArXG4gKi9cbmV4cG9ydCBjbGFzcyBGamFsbFN0YWNrU3ludGhlc2l6ZXIgZXh0ZW5kcyBEZWZhdWx0U3RhY2tTeW50aGVzaXplciB7XG4gIHB1YmxpYyBzeW50aGVzaXplKHNlc3Npb246IElTeW50aGVzaXNTZXNzaW9uKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhY2sgPSB0aGlzLmJvdW5kU3RhY2s7XG4gICAgXG4gICAgLy8gUHJvY2VzcyB0aGUgZW50aXJlIGNvbnN0cnVjdCB0cmVlIHRvIGFwcGx5IHRhZ3NcbiAgICBpZiAoc3RhY2spIHtcbiAgICAgIERpcmVjdFRhZ2dpbmcucHJvY2Vzc0NvbnN0cnVjdFRyZWUoc3RhY2spO1xuICAgIH1cbiAgICBcbiAgICAvLyBDb250aW51ZSB3aXRoIG5vcm1hbCBzeW50aGVzaXNcbiAgICBzdXBlci5zeW50aGVzaXplKHNlc3Npb24pO1xuICB9XG59XG4iXX0=
|
|
@@ -3,40 +3,18 @@ import { IConstruct } from "constructs";
|
|
|
3
3
|
/**
|
|
4
4
|
* Aspect to enforce a standard set of tags on every tag-capable resource in a construct tree.
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* const app = new App();
|
|
12
|
-
*
|
|
13
|
-
* // Define the required tags
|
|
14
|
-
* const tags = {
|
|
15
|
-
* "fjall:costAllocation:environment": "production",
|
|
16
|
-
* "fjall:costAllocation:owner": "engineering"
|
|
17
|
-
* };
|
|
18
|
-
*
|
|
19
|
-
* // Add the aspect – CDK will invoke it for every construct during synthesis
|
|
20
|
-
* Aspects.of(app).add(new StandardTagsAspect(tags));
|
|
21
|
-
*
|
|
22
|
-
* // define stacks/constructs after the aspect is attached
|
|
23
|
-
* new MyStack(app, "MyStack");
|
|
24
|
-
*
|
|
25
|
-
* app.synth();
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* How it works:
|
|
29
|
-
* 1. CDK traverses every construct and calls `visit(node)`.
|
|
30
|
-
* 2. For each required tag the aspect adds it to the construct via `Tags.of(node).add()`.
|
|
31
|
-
* 3. Constructs that don't support tagging are silently ignored.
|
|
32
|
-
* 4. The resulting CloudFormation template contains the enforced tags on all resources.
|
|
33
|
-
*
|
|
34
|
-
* If a tag already exists on a construct, CDK de-duplicates by key so no duplication occurs.
|
|
6
|
+
* Updated for CDK v2.206.0+ compatibility:
|
|
7
|
+
* - Avoids using any tagging APIs during aspect visitation to prevent infinite loops
|
|
8
|
+
* - Uses a synthesis-time approach to modify CloudFormation templates
|
|
9
|
+
* - Maintains the same clean API and automatic tagging benefits
|
|
35
10
|
*/
|
|
36
11
|
export declare class StandardTagsAspect implements IAspect {
|
|
37
12
|
private readonly requiredTags;
|
|
13
|
+
private readonly taggedResources;
|
|
38
14
|
constructor(requiredTags: {
|
|
39
15
|
[key: string]: string;
|
|
40
16
|
});
|
|
41
17
|
visit(node: IConstruct): void;
|
|
18
|
+
private processCfnResource;
|
|
19
|
+
private buildTagsArray;
|
|
42
20
|
}
|
|
@@ -5,46 +5,93 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
|
5
5
|
/**
|
|
6
6
|
* Aspect to enforce a standard set of tags on every tag-capable resource in a construct tree.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* const app = new App();
|
|
14
|
-
*
|
|
15
|
-
* // Define the required tags
|
|
16
|
-
* const tags = {
|
|
17
|
-
* "fjall:costAllocation:environment": "production",
|
|
18
|
-
* "fjall:costAllocation:owner": "engineering"
|
|
19
|
-
* };
|
|
20
|
-
*
|
|
21
|
-
* // Add the aspect – CDK will invoke it for every construct during synthesis
|
|
22
|
-
* Aspects.of(app).add(new StandardTagsAspect(tags));
|
|
23
|
-
*
|
|
24
|
-
* // define stacks/constructs after the aspect is attached
|
|
25
|
-
* new MyStack(app, "MyStack");
|
|
26
|
-
*
|
|
27
|
-
* app.synth();
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* How it works:
|
|
31
|
-
* 1. CDK traverses every construct and calls `visit(node)`.
|
|
32
|
-
* 2. For each required tag the aspect adds it to the construct via `Tags.of(node).add()`.
|
|
33
|
-
* 3. Constructs that don't support tagging are silently ignored.
|
|
34
|
-
* 4. The resulting CloudFormation template contains the enforced tags on all resources.
|
|
35
|
-
*
|
|
36
|
-
* If a tag already exists on a construct, CDK de-duplicates by key so no duplication occurs.
|
|
8
|
+
* Updated for CDK v2.206.0+ compatibility:
|
|
9
|
+
* - Avoids using any tagging APIs during aspect visitation to prevent infinite loops
|
|
10
|
+
* - Uses a synthesis-time approach to modify CloudFormation templates
|
|
11
|
+
* - Maintains the same clean API and automatic tagging benefits
|
|
37
12
|
*/
|
|
38
13
|
class StandardTagsAspect {
|
|
39
14
|
constructor(requiredTags) {
|
|
15
|
+
this.taggedResources = new WeakSet();
|
|
40
16
|
this.requiredTags = requiredTags;
|
|
41
17
|
}
|
|
42
18
|
visit(node) {
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
19
|
+
// Skip if already processed
|
|
20
|
+
if (this.taggedResources.has(node)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Process L1 (CFN) resources only
|
|
24
|
+
if (aws_cdk_lib_1.CfnResource.isCfnResource(node)) {
|
|
25
|
+
this.processCfnResource(node);
|
|
26
|
+
this.taggedResources.add(node);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
processCfnResource(resource) {
|
|
30
|
+
// List of CloudFormation resource types that don't support tags
|
|
31
|
+
const unsupportedTypes = [
|
|
32
|
+
'AWS::CloudFormation::WaitConditionHandle',
|
|
33
|
+
'AWS::CloudFormation::WaitCondition',
|
|
34
|
+
'AWS::Lambda::Permission',
|
|
35
|
+
'AWS::IAM::Policy',
|
|
36
|
+
'AWS::IAM::Role',
|
|
37
|
+
'AWS::IAM::User',
|
|
38
|
+
'AWS::IAM::Group',
|
|
39
|
+
'AWS::IAM::ManagedPolicy',
|
|
40
|
+
'AWS::IAM::InstanceProfile',
|
|
41
|
+
'AWS::Logs::LogGroup',
|
|
42
|
+
'AWS::Logs::LogStream',
|
|
43
|
+
'AWS::Events::Rule',
|
|
44
|
+
'AWS::Route53::RecordSet',
|
|
45
|
+
'AWS::Route53::RecordSetGroup',
|
|
46
|
+
'AWS::CloudWatch::Alarm',
|
|
47
|
+
'AWS::CloudWatch::Dashboard'
|
|
48
|
+
];
|
|
49
|
+
if (unsupportedTypes.includes(resource.cfnResourceType)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// Add a synthesis hook to modify the CloudFormation template
|
|
53
|
+
const stack = aws_cdk_lib_1.Stack.of(resource);
|
|
54
|
+
const logicalId = stack.getLogicalId(resource);
|
|
55
|
+
// Use addTransform to add tags during synthesis
|
|
56
|
+
resource.addPropertyOverride('Tags', this.buildTagsArray(resource));
|
|
57
|
+
}
|
|
58
|
+
buildTagsArray(resource) {
|
|
59
|
+
const tagMap = new Map();
|
|
60
|
+
// Get any existing tags if they exist
|
|
61
|
+
const existingTags = resource.tags || [];
|
|
62
|
+
// Process existing tags if they're in array format
|
|
63
|
+
if (Array.isArray(existingTags)) {
|
|
64
|
+
existingTags.forEach((tag) => {
|
|
65
|
+
if (tag && typeof tag === 'object' && 'Key' in tag && 'Value' in tag) {
|
|
66
|
+
tagMap.set(tag.Key, tag.Value);
|
|
67
|
+
}
|
|
68
|
+
else if (tag && typeof tag === 'object' && 'key' in tag && 'value' in tag) {
|
|
69
|
+
tagMap.set(tag.key, tag.value);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
46
72
|
}
|
|
73
|
+
// Check for direct tags in metadata
|
|
74
|
+
const metadata = resource.node.metadata;
|
|
75
|
+
const directTagsMetadata = metadata.filter(m => m.type === 'fjall:direct-tags');
|
|
76
|
+
directTagsMetadata.forEach(m => {
|
|
77
|
+
if (m.data && typeof m.data === 'object') {
|
|
78
|
+
Object.entries(m.data).forEach(([key, value]) => {
|
|
79
|
+
if (typeof value === 'string') {
|
|
80
|
+
tagMap.set(key, value);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
// Add required tags (overwriting if they exist)
|
|
86
|
+
Object.entries(this.requiredTags).forEach(([key, value]) => {
|
|
87
|
+
tagMap.set(key, value);
|
|
88
|
+
});
|
|
89
|
+
// Convert to CloudFormation format
|
|
90
|
+
return Array.from(tagMap.entries()).map(([key, value]) => ({
|
|
91
|
+
Key: key,
|
|
92
|
+
Value: value
|
|
93
|
+
}));
|
|
47
94
|
}
|
|
48
95
|
}
|
|
49
96
|
exports.StandardTagsAspect = StandardTagsAspect;
|
|
50
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmRUYWdzQXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL3V0aWxzL3N0YW5kYXJkVGFnc0FzcGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBMEQ7QUFHMUQ7Ozs7Ozs7R0FPRztBQUNILE1BQWEsa0JBQWtCO0lBSTdCLFlBQVksWUFBdUM7UUFGbEMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO1FBRzNELElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsSUFBZ0I7UUFDcEIsNEJBQTRCO1FBQzVCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELGtDQUFrQztRQUNsQyxJQUFJLHlCQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQW1CLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQixDQUFDLFFBQXFCO1FBQzlDLGdFQUFnRTtRQUNoRSxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLDBDQUEwQztZQUMxQyxvQ0FBb0M7WUFDcEMseUJBQXlCO1lBQ3pCLGtCQUFrQjtZQUNsQixnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLGlCQUFpQjtZQUNqQix5QkFBeUI7WUFDekIsMkJBQTJCO1lBQzNCLHFCQUFxQjtZQUNyQixzQkFBc0I7WUFDdEIsbUJBQW1CO1lBQ25CLHlCQUF5QjtZQUN6Qiw4QkFBOEI7WUFDOUIsd0JBQXdCO1lBQ3hCLDRCQUE0QjtTQUM3QixDQUFDO1FBRUYsSUFBSSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxD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LENBQUM7SUFDTixDQUFDO0NBQ0Y7QUEvRkQsZ0RBK0ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUFzcGVjdCwgQ2ZuUmVzb3VyY2UsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBBc3BlY3QgdG8gZW5mb3JjZSBhIHN0YW5kYXJkIHNldCBvZiB0YWdzIG9uIGV2ZXJ5IHRhZy1jYXBhYmxlIHJlc291cmNlIGluIGEgY29uc3RydWN0IHRyZWUuXG4gKiBcbiAqIFVwZGF0ZWQgZm9yIENESyB2Mi4yMDYuMCsgY29tcGF0aWJpbGl0eTpcbiAqIC0gQXZvaWRzIHVzaW5nIGFueSB0YWdnaW5nIEFQSXMgZHVyaW5nIGFzcGVjdCB2aXNpdGF0aW9uIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcbiAqIC0gVXNlcyBhIHN5bnRoZXNpcy10aW1lIGFwcHJvYWNoIHRvIG1vZGlmeSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZXNcbiAqIC0gTWFpbnRhaW5zIHRoZSBzYW1lIGNsZWFuIEFQSSBhbmQgYXV0b21hdGljIHRhZ2dpbmcgYmVuZWZpdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0YW5kYXJkVGFnc0FzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVpcmVkVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSByZWFkb25seSB0YWdnZWRSZXNvdXJjZXMgPSBuZXcgV2Vha1NldDxJQ29uc3RydWN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKHJlcXVpcmVkVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMucmVxdWlyZWRUYWdzID0gcmVxdWlyZWRUYWdzO1xuICB9XG5cbiAgdmlzaXQobm9kZTogSUNvbnN0cnVjdCk6IHZvaWQge1xuICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICBpZiAodGhpcy50YWdnZWRSZXNvdXJjZXMuaGFzKG5vZGUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIC8vIFByb2Nlc3MgTDEgKENGTikgcmVzb3VyY2VzIG9ubHlcbiAgICBpZiAoQ2ZuUmVzb3VyY2UuaXNDZm5SZXNvdXJjZShub2RlKSkge1xuICAgICAgdGhpcy5wcm9jZXNzQ2ZuUmVzb3VyY2Uobm9kZSBhcyBDZm5SZXNvdXJjZSk7XG4gICAgICB0aGlzLnRhZ2dlZFJlc291cmNlcy5hZGQobm9kZSk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIHByb2Nlc3NDZm5SZXNvdXJjZShyZXNvdXJjZTogQ2ZuUmVzb3VyY2UpOiB2b2lkIHtcbiAgICAvLyBMaXN0IG9mIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIHR5cGVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0YWdzXG4gICAgY29uc3QgdW5zdXBwb3J0ZWRUeXBlcyA9IFtcbiAgICAgICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpXYWl0Q29uZGl0aW9uSGFuZGxlJyxcbiAgICAgICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpXYWl0Q29uZGl0aW9uJyxcbiAgICAgICdBV1M6OkxhbWJkYTo6UGVybWlzc2lvbicsXG4gICAgICAnQVdTOjpJQU06OlBvbGljeScsXG4gICAgICAnQVdTOjpJQU06OlJvbGUnLFxuICAgICAgJ0FXUzo6SUFNOjpVc2VyJyxcbiAgICAgICdBV1M6OklBTTo6R3JvdXAnLFxuICAgICAgJ0FXUzo6SUFNOjpNYW5hZ2VkUG9saWN5JyxcbiAgICAgICdBV1M6OklBTTo6SW5zdGFuY2VQcm9maWxlJyxcbiAgICAgICdBV1M6OkxvZ3M6OkxvZ0dyb3VwJyxcbiAgICAgICdBV1M6OkxvZ3M6OkxvZ1N0cmVhbScsXG4gICAgICAnQVdTOjpFdmVudHM6OlJ1bGUnLFxuICAgICAgJ0FXUzo6Um91dGU1Mzo6UmVjb3JkU2V0JyxcbiAgICAgICdBV1M6OlJvdXRlNTM6OlJlY29yZFNldEdyb3VwJyxcbiAgICAgICdBV1M6OkNsb3VkV2F0Y2g6OkFsYXJtJyxcbiAgICAgICdBV1M6OkNsb3VkV2F0Y2g6OkRhc2hib2FyZCdcbiAgICBdO1xuICAgIFxuICAgIGlmICh1bnN1cHBvcnRlZFR5cGVzLmluY2x1ZGVzKHJlc291cmNlLmNmblJlc291cmNlVHlwZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gQWRkIGEgc3ludGhlc2lzIGhvb2sgdG8gbW9kaWZ5IHRoZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZVxuICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YocmVzb3VyY2UpO1xuICAgIGNvbnN0IGxvZ2ljYWxJZCA9IHN0YWNrLmdldExvZ2ljYWxJZChyZXNvdXJjZSk7XG4gICAgXG4gICAgLy8gVXNlIGFkZFRyYW5zZm9ybSB0byBhZGQgdGFncyBkdXJpbmcgc3ludGhlc2lzXG4gICAgcmVzb3VyY2UuYWRkUHJvcGVydHlPdmVycmlkZSgnVGFncycsIHRoaXMuYnVpbGRUYWdzQXJyYXkocmVzb3VyY2UpKTtcbiAgfVxuICBcbiAgcHJpdmF0ZSBidWlsZFRhZ3NBcnJheShyZXNvdXJjZTogQ2ZuUmVzb3VyY2UpOiBhbnlbXSB7XG4gICAgY29uc3QgdGFnTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBcbiAgICAvLyBHZXQgYW55IGV4aXN0aW5nIHRhZ3MgaWYgdGhleSBleGlzdFxuICAgIGNvbnN0IGV4aXN0aW5nVGFncyA9IChyZXNvdXJjZSBhcyBhbnkpLnRhZ3MgfHwgW107XG4gICAgXG4gICAgLy8gUHJvY2VzcyBleGlzdGluZyB0YWdzIGlmIHRoZXkncmUgaW4gYXJyYXkgZm9ybWF0XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdUYWdzKSkge1xuICAgICAgZXhpc3RpbmdUYWdzLmZvckVhY2goKHRhZzogYW55KSA9PiB7XG4gICAgICAgIGlmICh0YWcgJiYgdHlwZW9mIHRhZyA9PT0gJ29iamVjdCcgJiYgJ0tleScgaW4gdGFnICYmICdWYWx1ZScgaW4gdGFnKSB7XG4gICAgICAgICAgdGFnTWFwLnNldCh0YWcuS2V5LCB0YWcuVmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRhZyAmJiB0eXBlb2YgdGFnID09PSAnb2JqZWN0JyAmJiAna2V5JyBpbiB0YWcgJiYgJ3ZhbHVlJyBpbiB0YWcpIHtcbiAgICAgICAgICB0YWdNYXAuc2V0KHRhZy5rZXksIHRhZy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgZGlyZWN0IHRhZ3MgaW4gbWV0YWRhdGFcbiAgICBjb25zdCBtZXRhZGF0YSA9IHJlc291cmNlLm5vZGUubWV0YWRhdGE7XG4gICAgY29uc3QgZGlyZWN0VGFnc01ldGFkYXRhID0gbWV0YWRhdGEuZmlsdGVyKG0gPT4gbS50eXBlID09PSAnZmphbGw6ZGlyZWN0LXRhZ3MnKTtcbiAgICBkaXJlY3RUYWdzTWV0YWRhdGEuZm9yRWFjaChtID0+IHtcbiAgICAgIGlmIChtLmRhdGEgJiYgdHlwZW9mIG0uZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMobS5kYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGFnTWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIFxuICAgIC8vIEFkZCByZXF1aXJlZCB0YWdzIChvdmVyd3JpdGluZyBpZiB0aGV5IGV4aXN0KVxuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVxdWlyZWRUYWdzKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHRhZ01hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ29udmVydCB0byBDbG91ZEZvcm1hdGlvbiBmb3JtYXRcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0YWdNYXAuZW50cmllcygpKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHtcbiAgICAgIEtleToga2V5LFxuICAgICAgVmFsdWU6IHZhbHVlXG4gICAgfSkpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Node } from "constructs";
|
|
2
|
+
/**
|
|
3
|
+
* TagContext provides a CDK context-based approach for passing tags
|
|
4
|
+
* down the construct tree without using aspects.
|
|
5
|
+
*
|
|
6
|
+
* This avoids the infinite loop issue with Tags.of() creating aspects
|
|
7
|
+
* during the aspect visitation phase in CDK v2.206.0+
|
|
8
|
+
*/
|
|
9
|
+
export declare class TagContext {
|
|
10
|
+
private static readonly TAG_CONTEXT_KEY;
|
|
11
|
+
/**
|
|
12
|
+
* Set tags in the context for a construct
|
|
13
|
+
*/
|
|
14
|
+
static setTags(node: Node, tags: {
|
|
15
|
+
[key: string]: string;
|
|
16
|
+
}): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get tags from the context, including inherited tags from parent constructs
|
|
19
|
+
*/
|
|
20
|
+
static getTags(node: Node): {
|
|
21
|
+
[key: string]: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Apply tags from context to a construct using a safe approach
|
|
25
|
+
* This should be called during construction, not during synthesis
|
|
26
|
+
*/
|
|
27
|
+
static applyTagsFromContext(node: Node): void;
|
|
28
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TagContext = void 0;
|
|
4
|
+
const constructs_1 = require("constructs");
|
|
5
|
+
/**
|
|
6
|
+
* TagContext provides a CDK context-based approach for passing tags
|
|
7
|
+
* down the construct tree without using aspects.
|
|
8
|
+
*
|
|
9
|
+
* This avoids the infinite loop issue with Tags.of() creating aspects
|
|
10
|
+
* during the aspect visitation phase in CDK v2.206.0+
|
|
11
|
+
*/
|
|
12
|
+
class TagContext {
|
|
13
|
+
/**
|
|
14
|
+
* Set tags in the context for a construct
|
|
15
|
+
*/
|
|
16
|
+
static setTags(node, tags) {
|
|
17
|
+
const existingTags = this.getTags(node);
|
|
18
|
+
node.setContext(this.TAG_CONTEXT_KEY, {
|
|
19
|
+
...existingTags,
|
|
20
|
+
...tags
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get tags from the context, including inherited tags from parent constructs
|
|
25
|
+
*/
|
|
26
|
+
static getTags(node) {
|
|
27
|
+
// Get tags from this node
|
|
28
|
+
const nodeTags = node.tryGetContext(this.TAG_CONTEXT_KEY) || {};
|
|
29
|
+
// Get inherited tags from parent
|
|
30
|
+
const parentTags = node.scope ? this.getTags(constructs_1.Node.of(node.scope)) : {};
|
|
31
|
+
// Node tags override parent tags
|
|
32
|
+
return {
|
|
33
|
+
...parentTags,
|
|
34
|
+
...nodeTags
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Apply tags from context to a construct using a safe approach
|
|
39
|
+
* This should be called during construction, not during synthesis
|
|
40
|
+
*/
|
|
41
|
+
static applyTagsFromContext(node) {
|
|
42
|
+
const tags = this.getTags(node);
|
|
43
|
+
if (Object.keys(tags).length === 0) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Instead of using Tags.of() which creates aspects,
|
|
47
|
+
// we'll store tags as metadata that can be processed later
|
|
48
|
+
node.addMetadata('fjall:applied-tags', tags);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.TagContext = TagContext;
|
|
52
|
+
TagContext.TAG_CONTEXT_KEY = "fjall:tags";
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnQ29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi91dGlscy90YWdDb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUFrQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxNQUFhLFVBQVU7SUFHckI7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVUsRUFBRSxJQUErQjtRQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwQyxHQUFHLFlBQVk7WUFDZixHQUFHLElBQUk7U0FDUixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVU7UUFDOUIsMEJBQTBCO1FBQzFCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVoRSxpQ0FBaUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRXZFLGlDQUFpQztRQUNqQyxPQUFPO1lBQ0wsR0FBRyxVQUFVO1lBQ2IsR0FBRyxRQUFRO1NBQ1osQ0FBQztJQUNKLENBQUM7SUFFRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBVTtRQUMzQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsMkRBQTJEO1FBQzNELElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQzs7QUE3Q0gsZ0NBOENDO0FBN0N5QiwwQkFBZSxHQUFHLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG4vKipcbiAqIFRhZ0NvbnRleHQgcHJvdmlkZXMgYSBDREsgY29udGV4dC1iYXNlZCBhcHByb2FjaCBmb3IgcGFzc2luZyB0YWdzXG4gKiBkb3duIHRoZSBjb25zdHJ1Y3QgdHJlZSB3aXRob3V0IHVzaW5nIGFzcGVjdHMuXG4gKiBcbiAqIFRoaXMgYXZvaWRzIHRoZSBpbmZpbml0ZSBsb29wIGlzc3VlIHdpdGggVGFncy5vZigpIGNyZWF0aW5nIGFzcGVjdHNcbiAqIGR1cmluZyB0aGUgYXNwZWN0IHZpc2l0YXRpb24gcGhhc2UgaW4gQ0RLIHYyLjIwNi4wK1xuICovXG5leHBvcnQgY2xhc3MgVGFnQ29udGV4dCB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRBR19DT05URVhUX0tFWSA9IFwiZmphbGw6dGFnc1wiO1xuXG4gIC8qKlxuICAgKiBTZXQgdGFncyBpbiB0aGUgY29udGV4dCBmb3IgYSBjb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0VGFncyhub2RlOiBOb2RlLCB0YWdzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogdm9pZCB7XG4gICAgY29uc3QgZXhpc3RpbmdUYWdzID0gdGhpcy5nZXRUYWdzKG5vZGUpO1xuICAgIG5vZGUuc2V0Q29udGV4dCh0aGlzLlRBR19DT05URVhUX0tFWSwge1xuICAgICAgLi4uZXhpc3RpbmdUYWdzLFxuICAgICAgLi4udGFnc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0YWdzIGZyb20gdGhlIGNvbnRleHQsIGluY2x1ZGluZyBpbmhlcml0ZWQgdGFncyBmcm9tIHBhcmVudCBjb25zdHJ1Y3RzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldFRhZ3Mobm9kZTogTm9kZSk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIC8vIEdldCB0YWdzIGZyb20gdGhpcyBub2RlXG4gICAgY29uc3Qgbm9kZVRhZ3MgPSBub2RlLnRyeUdldENvbnRleHQodGhpcy5UQUdfQ09OVEVYVF9LRVkpIHx8IHt9O1xuICAgIFxuICAgIC8vIEdldCBpbmhlcml0ZWQgdGFncyBmcm9tIHBhcmVudFxuICAgIGNvbnN0IHBhcmVudFRhZ3MgPSBub2RlLnNjb3BlID8gdGhpcy5nZXRUYWdzKE5vZGUub2Yobm9kZS5zY29wZSkpIDoge307XG4gICAgXG4gICAgLy8gTm9kZSB0YWdzIG92ZXJyaWRlIHBhcmVudCB0YWdzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnBhcmVudFRhZ3MsXG4gICAgICAuLi5ub2RlVGFnc1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGFncyBmcm9tIGNvbnRleHQgdG8gYSBjb25zdHJ1Y3QgdXNpbmcgYSBzYWZlIGFwcHJvYWNoXG4gICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgY29uc3RydWN0aW9uLCBub3QgZHVyaW5nIHN5bnRoZXNpc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcHBseVRhZ3NGcm9tQ29udGV4dChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgY29uc3QgdGFncyA9IHRoaXMuZ2V0VGFncyhub2RlKTtcbiAgICBcbiAgICBpZiAoT2JqZWN0LmtleXModGFncykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5zdGVhZCBvZiB1c2luZyBUYWdzLm9mKCkgd2hpY2ggY3JlYXRlcyBhc3BlY3RzLFxuICAgIC8vIHdlJ2xsIHN0b3JlIHRhZ3MgYXMgbWV0YWRhdGEgdGhhdCBjYW4gYmUgcHJvY2Vzc2VkIGxhdGVyXG4gICAgbm9kZS5hZGRNZXRhZGF0YSgnZmphbGw6YXBwbGllZC10YWdzJywgdGFncyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { IConstruct } from "constructs";
|
|
2
|
+
/**
|
|
3
|
+
* Tag a resource directly on the CloudFormation resource.
|
|
4
|
+
* This is used for resources that need tags at construction time,
|
|
5
|
+
* like VPC IPAM pool tags.
|
|
6
|
+
*/
|
|
2
7
|
export default function tagResource(resource: IConstruct, tags: {
|
|
3
8
|
[key: string]: string;
|
|
4
9
|
}): void;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.default = tagResource;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Tag a resource directly on the CloudFormation resource.
|
|
6
|
+
* This is used for resources that need tags at construction time,
|
|
7
|
+
* like VPC IPAM pool tags.
|
|
8
|
+
*/
|
|
5
9
|
function tagResource(resource, tags) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
10
|
+
// Add a metadata marker that will be processed by StandardTagsAspect
|
|
11
|
+
resource.node.addMetadata('fjall:direct-tags', tags);
|
|
9
12
|
}
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnUmVzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvdGFnUmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSw4QkFNQztBQVhEOzs7O0dBSUc7QUFDSCxTQUF3QixXQUFXLENBQ2pDLFFBQW9CLEVBQ3BCLElBQStCO0lBRS9CLHFFQUFxRTtJQUNyRSxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDZm5SZXNvdXJjZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFRhZyBhIHJlc291cmNlIGRpcmVjdGx5IG9uIHRoZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZS5cbiAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzb3VyY2VzIHRoYXQgbmVlZCB0YWdzIGF0IGNvbnN0cnVjdGlvbiB0aW1lLFxuICogbGlrZSBWUEMgSVBBTSBwb29sIHRhZ3MuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRhZ1Jlc291cmNlKFxuICByZXNvdXJjZTogSUNvbnN0cnVjdCxcbiAgdGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuKSB7XG4gIC8vIEFkZCBhIG1ldGFkYXRhIG1hcmtlciB0aGF0IHdpbGwgYmUgcHJvY2Vzc2VkIGJ5IFN0YW5kYXJkVGFnc0FzcGVjdFxuICByZXNvdXJjZS5ub2RlLmFkZE1ldGFkYXRhKCdmamFsbDpkaXJlY3QtdGFncycsIHRhZ3MpO1xufVxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { IConstruct } from "constructs";
|
|
2
|
+
import { IAspect } from "aws-cdk-lib";
|
|
3
|
+
/**
|
|
4
|
+
* TagSynthesizer is a specialized aspect that runs during synthesis
|
|
5
|
+
* to apply tags stored in metadata to CloudFormation resources.
|
|
6
|
+
*
|
|
7
|
+
* This approach avoids creating new aspects during aspect visitation,
|
|
8
|
+
* which causes the infinite loop in CDK v2.206.0+
|
|
9
|
+
*/
|
|
10
|
+
export declare class TagSynthesizer implements IAspect {
|
|
11
|
+
visit(node: IConstruct): void;
|
|
12
|
+
private collectTagsFromTree;
|
|
13
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TagSynthesizer = void 0;
|
|
4
|
+
const constructs_1 = require("constructs");
|
|
5
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
|
+
/**
|
|
7
|
+
* TagSynthesizer is a specialized aspect that runs during synthesis
|
|
8
|
+
* to apply tags stored in metadata to CloudFormation resources.
|
|
9
|
+
*
|
|
10
|
+
* This approach avoids creating new aspects during aspect visitation,
|
|
11
|
+
* which causes the infinite loop in CDK v2.206.0+
|
|
12
|
+
*/
|
|
13
|
+
class TagSynthesizer {
|
|
14
|
+
visit(node) {
|
|
15
|
+
// Only process CfnResource nodes
|
|
16
|
+
if (!aws_cdk_lib_1.CfnResource.isCfnResource(node)) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Walk up the tree to collect all tag metadata
|
|
20
|
+
const collectedTags = {};
|
|
21
|
+
this.collectTagsFromTree(node, collectedTags);
|
|
22
|
+
if (Object.keys(collectedTags).length === 0) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Apply tags directly to the CloudFormation resource
|
|
26
|
+
// This doesn't create new aspects, avoiding the infinite loop
|
|
27
|
+
const cfnResource = node;
|
|
28
|
+
// Apply tags using the TagManager directly
|
|
29
|
+
const tagManager = aws_cdk_lib_1.TagManager.of(cfnResource);
|
|
30
|
+
if (tagManager) {
|
|
31
|
+
Object.entries(collectedTags).forEach(([key, value]) => {
|
|
32
|
+
tagManager.setTag(key, value);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
collectTagsFromTree(node, collectedTags) {
|
|
37
|
+
// Walk up the tree
|
|
38
|
+
let current = node;
|
|
39
|
+
const tagSets = [];
|
|
40
|
+
while (current) {
|
|
41
|
+
const metadata = constructs_1.Node.of(current).metadata;
|
|
42
|
+
const tagMetadata = metadata.find(m => m.type === 'fjall:applied-tags');
|
|
43
|
+
if (tagMetadata && tagMetadata.data) {
|
|
44
|
+
tagSets.unshift(tagMetadata.data);
|
|
45
|
+
}
|
|
46
|
+
current = current.node.scope;
|
|
47
|
+
}
|
|
48
|
+
// Apply tags in order (parent to child) so child tags override parent tags
|
|
49
|
+
tagSets.forEach(tags => {
|
|
50
|
+
Object.assign(collectedTags, tags);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.TagSynthesizer = TagSynthesizer;
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnU3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvdXRpbHMvdGFnU3ludGhlc2l6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQThDO0FBQzlDLDZDQUErRDtBQUUvRDs7Ozs7O0dBTUc7QUFDSCxNQUFhLGNBQWM7SUFDbEIsS0FBSyxDQUFDLElBQWdCO1FBQzNCLGlDQUFpQztRQUNqQyxJQUFJLENBQUMseUJBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPO1FBQ1QsQ0FBQztRQUVELCtDQUErQztRQUMvQyxNQUFNLGFBQWEsR0FBOEIsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFOUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxPQUFPO1FBQ1QsQ0FBQztRQUVELHFEQUFxRDtRQUNyRCw4REFBOEQ7UUFDOUQsTUFBTSxXQUFXLEdBQUcsSUFBbUIsQ0FBQztRQUV4QywyQ0FBMkM7UUFDM0MsTUFBTSxVQUFVLEdBQUcsd0JBQVUsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDckQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQWdCLEVBQUUsYUFBd0M7UUFDcEYsbUJBQW1CO1FBQ25CLElBQUksT0FBTyxHQUEyQixJQUFJLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQXFDLEVBQUUsQ0FBQztRQUVyRCxPQUFPLE9BQU8sRUFBRSxDQUFDO1lBQ2YsTUFBTSxRQUFRLEdBQUcsaUJBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQzNDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLG9CQUFvQixDQUFDLENBQUM7WUFFeEUsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFpQyxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUVELE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQStCLENBQUM7UUFDekQsQ0FBQztRQUVELDJFQUEyRTtRQUMzRSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBakRELHdDQWlEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElDb25zdHJ1Y3QsIE5vZGUgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ2ZuUmVzb3VyY2UsIElBc3BlY3QsIFRhZ01hbmFnZXIgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBUYWdTeW50aGVzaXplciBpcyBhIHNwZWNpYWxpemVkIGFzcGVjdCB0aGF0IHJ1bnMgZHVyaW5nIHN5bnRoZXNpc1xuICogdG8gYXBwbHkgdGFncyBzdG9yZWQgaW4gbWV0YWRhdGEgdG8gQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2VzLlxuICogXG4gKiBUaGlzIGFwcHJvYWNoIGF2b2lkcyBjcmVhdGluZyBuZXcgYXNwZWN0cyBkdXJpbmcgYXNwZWN0IHZpc2l0YXRpb24sXG4gKiB3aGljaCBjYXVzZXMgdGhlIGluZmluaXRlIGxvb3AgaW4gQ0RLIHYyLjIwNi4wK1xuICovXG5leHBvcnQgY2xhc3MgVGFnU3ludGhlc2l6ZXIgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAvLyBPbmx5IHByb2Nlc3MgQ2ZuUmVzb3VyY2Ugbm9kZXNcbiAgICBpZiAoIUNmblJlc291cmNlLmlzQ2ZuUmVzb3VyY2Uobm9kZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXYWxrIHVwIHRoZSB0cmVlIHRvIGNvbGxlY3QgYWxsIHRhZyBtZXRhZGF0YVxuICAgIGNvbnN0IGNvbGxlY3RlZFRhZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICB0aGlzLmNvbGxlY3RUYWdzRnJvbVRyZWUobm9kZSwgY29sbGVjdGVkVGFncyk7XG4gICAgXG4gICAgaWYgKE9iamVjdC5rZXlzKGNvbGxlY3RlZFRhZ3MpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFwcGx5IHRhZ3MgZGlyZWN0bHkgdG8gdGhlIENsb3VkRm9ybWF0aW9uIHJlc291cmNlXG4gICAgLy8gVGhpcyBkb2Vzbid0IGNyZWF0ZSBuZXcgYXNwZWN0cywgYXZvaWRpbmcgdGhlIGluZmluaXRlIGxvb3BcbiAgICBjb25zdCBjZm5SZXNvdXJjZSA9IG5vZGUgYXMgQ2ZuUmVzb3VyY2U7XG4gICAgXG4gICAgLy8gQXBwbHkgdGFncyB1c2luZyB0aGUgVGFnTWFuYWdlciBkaXJlY3RseVxuICAgIGNvbnN0IHRhZ01hbmFnZXIgPSBUYWdNYW5hZ2VyLm9mKGNmblJlc291cmNlKTtcbiAgICBpZiAodGFnTWFuYWdlcikge1xuICAgICAgT2JqZWN0LmVudHJpZXMoY29sbGVjdGVkVGFncykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIHRhZ01hbmFnZXIuc2V0VGFnKGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIGNvbGxlY3RUYWdzRnJvbVRyZWUobm9kZTogSUNvbnN0cnVjdCwgY29sbGVjdGVkVGFnczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHZvaWQge1xuICAgIC8vIFdhbGsgdXAgdGhlIHRyZWVcbiAgICBsZXQgY3VycmVudDogSUNvbnN0cnVjdCB8IHVuZGVmaW5lZCA9IG5vZGU7XG4gICAgY29uc3QgdGFnU2V0czogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4gPSBbXTtcbiAgICBcbiAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgY29uc3QgbWV0YWRhdGEgPSBOb2RlLm9mKGN1cnJlbnQpLm1ldGFkYXRhO1xuICAgICAgY29uc3QgdGFnTWV0YWRhdGEgPSBtZXRhZGF0YS5maW5kKG0gPT4gbS50eXBlID09PSAnZmphbGw6YXBwbGllZC10YWdzJyk7XG4gICAgICBcbiAgICAgIGlmICh0YWdNZXRhZGF0YSAmJiB0YWdNZXRhZGF0YS5kYXRhKSB7XG4gICAgICAgIHRhZ1NldHMudW5zaGlmdCh0YWdNZXRhZGF0YS5kYXRhIGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjdXJyZW50ID0gY3VycmVudC5ub2RlLnNjb3BlIGFzIElDb25zdHJ1Y3QgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIFxuICAgIC8vIEFwcGx5IHRhZ3MgaW4gb3JkZXIgKHBhcmVudCB0byBjaGlsZCkgc28gY2hpbGQgdGFncyBvdmVycmlkZSBwYXJlbnQgdGFnc1xuICAgIHRhZ1NldHMuZm9yRWFjaCh0YWdzID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29sbGVjdGVkVGFncywgdGFncyk7XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fjall/components-infrastructure",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.1",
|
|
4
4
|
"bin": {
|
|
5
5
|
"infrastructure": "bin/infrastructure.js"
|
|
6
6
|
},
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@aws-sdk/client-cost-explorer": "^3.717.0",
|
|
37
37
|
"@aws-sdk/client-organizations": "^3.716.0",
|
|
38
|
-
"@fjall/util": "^0.
|
|
38
|
+
"@fjall/util": "^0.43.1",
|
|
39
39
|
"@pepperize/cdk-organizations": "^0.7.135",
|
|
40
40
|
"aws-lambda": "^1.0.7",
|
|
41
41
|
"cdk-time-sleep": "^1.0.0",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"overrides": {
|
|
47
47
|
"@smithy/core": "2.5.5"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "948c10f7e2fd66f4a2854c953622334555b733b9",
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"aws-cdk": "^2.206.0",
|
|
52
52
|
"aws-cdk-lib": "^2.206.0",
|