awslint 2.98.0-alpha.0 → 2.99.0-alpha.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.
@@ -5,9 +5,23 @@ const camelcase = require("camelcase");
5
5
  const core_types_1 = require("./core-types");
6
6
  const resource_1 = require("./resource");
7
7
  const linter_1 = require("../linter");
8
+ const cfnResourceTagName = 'cloudformationResource';
8
9
  // this linter verifies that we have L2 coverage. it finds all "Cfn" classes and verifies
9
10
  // that we have a corresponding L1 class for it that's identified as a resource.
10
11
  exports.cfnResourceLinter = new linter_1.Linter(a => CfnResourceReflection.findAll(a));
12
+ // Cache L1 constructs per type system.
13
+ const l1ConstructCache = new Map();
14
+ function cacheL1ConstructsForTypeSystem(sys) {
15
+ if (!l1ConstructCache.has(sys)) {
16
+ l1ConstructCache.set(sys, new Map());
17
+ for (const cls of sys.classes) {
18
+ const cfnResourceTag = cls.docs.customTag(cfnResourceTagName);
19
+ if (cfnResourceTag) {
20
+ l1ConstructCache.get(sys)?.set(cfnResourceTag?.toLocaleLowerCase(), cls);
21
+ }
22
+ }
23
+ }
24
+ }
11
25
  exports.cfnResourceLinter.add({
12
26
  code: 'resource-class',
13
27
  message: 'every resource must have a resource class (L2), add \'@resource %s\' to its docstring',
@@ -23,10 +37,12 @@ class CfnResourceReflection {
23
37
  * @param fullName first two components are case-insensitive (e.g. `aws::s3::Bucket` is equivalent to `Aws::S3::Bucket`)
24
38
  */
25
39
  static findByName(sys, fullName) {
26
- for (const cls of sys.classes) {
27
- if (cls.docs.customTag('cloudformationResource')?.toLocaleLowerCase() === fullName.toLocaleLowerCase()) {
28
- return new CfnResourceReflection(cls);
29
- }
40
+ if (!l1ConstructCache.has(sys)) {
41
+ cacheL1ConstructsForTypeSystem(sys);
42
+ }
43
+ const cls = l1ConstructCache.get(sys)?.get(fullName.toLowerCase());
44
+ if (cls) {
45
+ return new CfnResourceReflection(cls);
30
46
  }
31
47
  return undefined;
32
48
  }
@@ -62,4 +78,4 @@ class CfnResourceReflection {
62
78
  }
63
79
  }
64
80
  exports.CfnResourceReflection = CfnResourceReflection;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2ZuLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2ZuLXJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUF1QztBQUV2Qyw2Q0FBeUM7QUFDekMseUNBQWdEO0FBQ2hELHNDQUFtQztBQUVuQyx5RkFBeUY7QUFDekYsZ0ZBQWdGO0FBQ25FLFFBQUEsaUJBQWlCLEdBQUcsSUFBSSxlQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVuRix5QkFBaUIsQ0FBQyxHQUFHLENBQUM7SUFDcEIsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixPQUFPLEVBQUUsdUZBQXVGO0lBQ2hHLE9BQU8sRUFBRSxJQUFJO0lBQ2IsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ1IsTUFBTSxFQUFFLEdBQUcsNkJBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0csQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMvQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsTUFBYSxxQkFBcUI7SUFDaEM7OztPQUdHO0lBQ0ksTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUF1QixFQUFFLFFBQWdCO1FBQ2hFLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtZQUM3QixJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsRUFBRTtnQkFDdEcsT0FBTyxJQUFJLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZDO1NBQ0Y7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQTBCO1FBQzlDLE9BQU8sUUFBUSxDQUFDLFVBQVU7YUFDdkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsc0JBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFTRCxZQUFZLEdBQXNCO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO1FBRXJCLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsb0ZBQW9GLEdBQUcsRUFBRSxDQUFDLENBQUM7U0FDNUc7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUV6QixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUMsYUFBYTthQUNwQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQzthQUMvRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLFNBQVMsQ0FBQzthQUNsRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLElBQVk7UUFFbkQsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxlQUFlLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUMzRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBOURELHNEQThEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNhbWVsY2FzZSBmcm9tICdjYW1lbGNhc2UnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgQ29yZVR5cGVzIH0gZnJvbSAnLi9jb3JlLXR5cGVzJztcbmltcG9ydCB7IFJlc291cmNlUmVmbGVjdGlvbiB9IGZyb20gJy4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgTGludGVyIH0gZnJvbSAnLi4vbGludGVyJztcblxuLy8gdGhpcyBsaW50ZXIgdmVyaWZpZXMgdGhhdCB3ZSBoYXZlIEwyIGNvdmVyYWdlLiBpdCBmaW5kcyBhbGwgXCJDZm5cIiBjbGFzc2VzIGFuZCB2ZXJpZmllc1xuLy8gdGhhdCB3ZSBoYXZlIGEgY29ycmVzcG9uZGluZyBMMSBjbGFzcyBmb3IgaXQgdGhhdCdzIGlkZW50aWZpZWQgYXMgYSByZXNvdXJjZS5cbmV4cG9ydCBjb25zdCBjZm5SZXNvdXJjZUxpbnRlciA9IG5ldyBMaW50ZXIoYSA9PiBDZm5SZXNvdXJjZVJlZmxlY3Rpb24uZmluZEFsbChhKSk7XG5cbmNmblJlc291cmNlTGludGVyLmFkZCh7XG4gIGNvZGU6ICdyZXNvdXJjZS1jbGFzcycsXG4gIG1lc3NhZ2U6ICdldmVyeSByZXNvdXJjZSBtdXN0IGhhdmUgYSByZXNvdXJjZSBjbGFzcyAoTDIpLCBhZGQgXFwnQHJlc291cmNlICVzXFwnIHRvIGl0cyBkb2NzdHJpbmcnLFxuICB3YXJuaW5nOiB0cnVlLFxuICBldmFsOiBlID0+IHtcbiAgICBjb25zdCBsMiA9IFJlc291cmNlUmVmbGVjdGlvbi5maW5kQWxsKGUuY3R4LmNsYXNzVHlwZS5hc3NlbWJseSkuZmluZChyID0+IHIuY2ZuLmZ1bGxuYW1lID09PSBlLmN0eC5mdWxsbmFtZSk7XG4gICAgZS5hc3NlcnQobDIsIGUuY3R4LmZ1bGxuYW1lLCBlLmN0eC5mdWxsbmFtZSk7XG4gIH0sXG59KTtcblxuZXhwb3J0IGNsYXNzIENmblJlc291cmNlUmVmbGVjdGlvbiB7XG4gIC8qKlxuICAgKiBGaW5kcyBhIENmbiByZXNvdXJjZSBjbGFzcyBieSBmdWxsIENsb3VkRm9ybWF0aW9uIHJlc291cmNlIG5hbWUgKGUuZy4gYEFXUzo6UzM6OkJ1Y2tldGApXG4gICAqIEBwYXJhbSBmdWxsTmFtZSBmaXJzdCB0d28gY29tcG9uZW50cyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSAoZS5nLiBgYXdzOjpzMzo6QnVja2V0YCBpcyBlcXVpdmFsZW50IHRvIGBBd3M6OlMzOjpCdWNrZXRgKVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmaW5kQnlOYW1lKHN5czogcmVmbGVjdC5UeXBlU3lzdGVtLCBmdWxsTmFtZTogc3RyaW5nKSB7XG4gICAgZm9yIChjb25zdCBjbHMgb2Ygc3lzLmNsYXNzZXMpIHtcbiAgICAgIGlmIChjbHMuZG9jcy5jdXN0b21UYWcoJ2Nsb3VkZm9ybWF0aW9uUmVzb3VyY2UnKT8udG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gZnVsbE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4gbmV3IENmblJlc291cmNlUmVmbGVjdGlvbihjbHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgQ0ZOIHJlc291cmNlIGNsYXNzZXMgd2l0aGluIGFuIGFzc2VtYmx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmaW5kQWxsKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5KSB7XG4gICAgcmV0dXJuIGFzc2VtYmx5LmFsbENsYXNzZXNcbiAgICAgIC5maWx0ZXIoYyA9PiBDb3JlVHlwZXMuaXNDZm5SZXNvdXJjZShjKSlcbiAgICAgIC5tYXAoYyA9PiBuZXcgQ2ZuUmVzb3VyY2VSZWZsZWN0aW9uKGMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjbGFzc1R5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZzsgLy8gQVdTOjpTMzo6QnVja2V0XG4gIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZzsgLy8gQVdTOjpTM1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZW5hbWU6IHN0cmluZzsgLy8gQnVja2V0XG4gIHB1YmxpYyByZWFkb25seSBhdHRyaWJ1dGVOYW1lczogc3RyaW5nW107IC8vIChub3JtYWxpemVkKSBidWNrZXRBcm4sIGJ1Y2tldE5hbWUsIHF1ZXVlVXJsXG4gIHB1YmxpYyByZWFkb25seSBkb2M6IHN0cmluZzsgLy8gbGluayB0byBDbG91ZEZvcm1hdGlvbiBkb2NzXG5cbiAgY29uc3RydWN0b3IoY2xzOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIHRoaXMuY2xhc3NUeXBlID0gY2xzO1xuXG4gICAgdGhpcy5iYXNlbmFtZSA9IGNscy5uYW1lLnNsaWNlKCdDZm4nLmxlbmd0aCk7XG5cbiAgICBjb25zdCBmdWxsbmFtZSA9IGNscy5kb2NzLmN1c3RvbVRhZygnY2xvdWRmb3JtYXRpb25SZXNvdXJjZScpO1xuICAgIGlmICghZnVsbG5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGV4dHJhY3QgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSBmcm9tIGluaXRpYWxpemVyIGRvY3VtZW50YXRpb24gb2YgJHtjbHN9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5mdWxsbmFtZSA9IGZ1bGxuYW1lO1xuXG4gICAgdGhpcy5uYW1lc3BhY2UgPSBmdWxsbmFtZS5zcGxpdCgnOjonKS5zbGljZSgwLCAyKS5qb2luKCc6OicpO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGVOYW1lcyA9IGNscy5vd25Qcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKHAgPT4gKHAuZG9jcy5kb2NzLmN1c3RvbSB8fCB7fSkuY2xvdWRmb3JtYXRpb25BdHRyaWJ1dGUpXG4gICAgICAubWFwKHAgPT4gcC5kb2NzLmN1c3RvbVRhZygnY2xvdWRmb3JtYXRpb25BdHRyaWJ1dGUnKSB8fCAnPGVycm9yPicpXG4gICAgICAubWFwKHAgPT4gdGhpcy5hdHRyaWJ1dGVQcm9wZXJ0eU5hbWVGcm9tQ2ZuTmFtZShwKSk7XG5cbiAgICB0aGlzLmRvYyA9IGNscy5kb2NzLmRvY3Muc2VlIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRyaWJ1dGVQcm9wZXJ0eU5hbWVGcm9tQ2ZuTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgLy8gc3BlY2lhbCBjYXNlIChzb21lb25lIHdhcyBzbWFydCksIHNwZWNpYWwgY2FzZSBjb3BpZWQgZnJvbSBjZm4ydHNcbiAgICBpZiAodGhpcy5iYXNlbmFtZSA9PT0gJ1NlY3VyaXR5R3JvdXAnICYmIG5hbWUgPT09ICdHcm91cElkJykge1xuICAgICAgcmV0dXJuICdJZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbWVsY2FzZShuYW1lLCB7IHBhc2NhbENhc2U6IHRydWUgfSk7XG4gIH1cbn1cbiJdfQ==
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2ZuLXJlc291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2ZuLXJlc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUF1QztBQUV2Qyw2Q0FBeUM7QUFDekMseUNBQWdEO0FBQ2hELHNDQUFtQztBQUVuQyxNQUFNLGtCQUFrQixHQUFHLHdCQUF3QixDQUFDO0FBRXBELHlGQUF5RjtBQUN6RixnRkFBZ0Y7QUFDbkUsUUFBQSxpQkFBaUIsR0FBRyxJQUFJLGVBQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRW5GLHVDQUF1QztBQUN2QyxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFzRCxDQUFDO0FBRXZGLFNBQVMsOEJBQThCLENBQUMsR0FBdUI7SUFDN0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUM5QixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxFQUE2QixDQUFDLENBQUM7UUFFaEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQzdCLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFOUQsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLGlCQUFpQixFQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDM0U7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQUVELHlCQUFpQixDQUFDLEdBQUcsQ0FBQztJQUNwQixJQUFJLEVBQUUsZ0JBQWdCO0lBQ3RCLE9BQU8sRUFBRSx1RkFBdUY7SUFDaEcsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsQ0FBQyxDQUFD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QUFDLFFBQVEsS0FBSyxlQUFlLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUMzRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBakVELHNEQWlFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNhbWVsY2FzZSBmcm9tICdjYW1lbGNhc2UnO1xuaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgQ29yZVR5cGVzIH0gZnJvbSAnLi9jb3JlLXR5cGVzJztcbmltcG9ydCB7IFJlc291cmNlUmVmbGVjdGlvbiB9IGZyb20gJy4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgTGludGVyIH0gZnJvbSAnLi4vbGludGVyJztcblxuY29uc3QgY2ZuUmVzb3VyY2VUYWdOYW1lID0gJ2Nsb3VkZm9ybWF0aW9uUmVzb3VyY2UnO1xuXG4vLyB0aGlzIGxpbnRlciB2ZXJpZmllcyB0aGF0IHdlIGhhdmUgTDIgY292ZXJhZ2UuIGl0IGZpbmRzIGFsbCBcIkNmblwiIGNsYXNzZXMgYW5kIHZlcmlmaWVzXG4vLyB0aGF0IHdlIGhhdmUgYSBjb3JyZXNwb25kaW5nIEwxIGNsYXNzIGZvciBpdCB0aGF0J3MgaWRlbnRpZmllZCBhcyBhIHJlc291cmNlLlxuZXhwb3J0IGNvbnN0IGNmblJlc291cmNlTGludGVyID0gbmV3IExpbnRlcihhID0+IENmblJlc291cmNlUmVmbGVjdGlvbi5maW5kQWxsKGEpKTtcblxuLy8gQ2FjaGUgTDEgY29uc3RydWN0cyBwZXIgdHlwZSBzeXN0ZW0uXG5jb25zdCBsMUNvbnN0cnVjdENhY2hlID0gbmV3IE1hcDxyZWZsZWN0LlR5cGVTeXN0ZW0sIE1hcDxzdHJpbmcsIHJlZmxlY3QuQ2xhc3NUeXBlPj4oKTtcblxuZnVuY3Rpb24gY2FjaGVMMUNvbnN0cnVjdHNGb3JUeXBlU3lzdGVtKHN5czogcmVmbGVjdC5UeXBlU3lzdGVtKSB7XG4gIGlmICghbDFDb25zdHJ1Y3RDYWNoZS5oYXMoc3lzKSkge1xuICAgIGwxQ29uc3RydWN0Q2FjaGUuc2V0KHN5cywgbmV3IE1hcDxzdHJpbmcsIHJlZmxlY3QuQ2xhc3NUeXBlPigpKTtcblxuICAgIGZvciAoY29uc3QgY2xzIG9mIHN5cy5jbGFzc2VzKSB7XG4gICAgICBjb25zdCBjZm5SZXNvdXJjZVRhZyA9IGNscy5kb2NzLmN1c3RvbVRhZyhjZm5SZXNvdXJjZVRhZ05hbWUpO1xuXG4gICAgICBpZiAoY2ZuUmVzb3VyY2VUYWcpIHtcbiAgICAgICAgbDFDb25zdHJ1Y3RDYWNoZS5nZXQoc3lzKT8uc2V0KGNmblJlc291cmNlVGFnPy50b0xvY2FsZUxvd2VyQ2FzZSgpISwgY2xzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY2ZuUmVzb3VyY2VMaW50ZXIuYWRkKHtcbiAgY29kZTogJ3Jlc291cmNlLWNsYXNzJyxcbiAgbWVzc2FnZTogJ2V2ZXJ5IHJlc291cmNlIG11c3QgaGF2ZSBhIHJlc291cmNlIGNsYXNzIChMMiksIGFkZCBcXCdAcmVzb3VyY2UgJXNcXCcgdG8gaXRzIGRvY3N0cmluZycsXG4gIHdhcm5pbmc6IHRydWUsXG4gIGV2YWw6IGUgPT4ge1xuICAgIGNvbnN0IGwyID0gUmVzb3VyY2VSZWZsZWN0aW9uLmZpbmRBbGwoZS5jdHguY2xhc3NUeXBlLmFzc2VtYmx5KS5maW5kKHIgPT4gci5jZm4uZnVsbG5hbWUgPT09IGUuY3R4LmZ1bGxuYW1lKTtcbiAgICBlLmFzc2VydChsMiwgZS5jdHguZnVsbG5hbWUsIGUuY3R4LmZ1bGxuYW1lKTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY2xhc3MgQ2ZuUmVzb3VyY2VSZWZsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEZpbmRzIGEgQ2ZuIHJlc291cmNlIGNsYXNzIGJ5IGZ1bGwgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSAoZS5nLiBgQVdTOjpTMzo6QnVja2V0YClcbiAgICogQHBhcmFtIGZ1bGxOYW1lIGZpcnN0IHR3byBjb21wb25lbnRzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIChlLmcuIGBhd3M6OnMzOjpCdWNrZXRgIGlzIGVxdWl2YWxlbnQgdG8gYEF3czo6UzM6OkJ1Y2tldGApXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZpbmRCeU5hbWUoc3lzOiByZWZsZWN0LlR5cGVTeXN0ZW0sIGZ1bGxOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWwxQ29uc3RydWN0Q2FjaGUuaGFzKHN5cykpIHtcbiAgICAgIGNhY2hlTDFDb25zdHJ1Y3RzRm9yVHlwZVN5c3RlbShzeXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNscyA9IGwxQ29uc3RydWN0Q2FjaGUuZ2V0KHN5cyk/LmdldChmdWxsTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAoY2xzKSB7XG4gICAgICByZXR1cm4gbmV3IENmblJlc291cmNlUmVmbGVjdGlvbihjbHMpO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgQ0ZOIHJlc291cmNlIGNsYXNzZXMgd2l0aGluIGFuIGFzc2VtYmx5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmaW5kQWxsKGFzc2VtYmx5OiByZWZsZWN0LkFzc2VtYmx5KSB7XG4gICAgcmV0dXJuIGFzc2VtYmx5LmFsbENsYXNzZXNcbiAgICAgIC5maWx0ZXIoYyA9PiBDb3JlVHlwZXMuaXNDZm5SZXNvdXJjZShjKSlcbiAgICAgIC5tYXAoYyA9PiBuZXcgQ2ZuUmVzb3VyY2VSZWZsZWN0aW9uKGMpKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjbGFzc1R5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZzsgLy8gQVdTOjpTMzo6QnVja2V0XG4gIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U6IHN0cmluZzsgLy8gQVdTOjpTM1xuICBwdWJsaWMgcmVhZG9ubHkgYmFzZW5hbWU6IHN0cmluZzsgLy8gQnVja2V0XG4gIHB1YmxpYyByZWFkb25seSBhdHRyaWJ1dGVOYW1lczogc3RyaW5nW107IC8vIChub3JtYWxpemVkKSBidWNrZXRBcm4sIGJ1Y2tldE5hbWUsIHF1ZXVlVXJsXG4gIHB1YmxpYyByZWFkb25seSBkb2M6IHN0cmluZzsgLy8gbGluayB0byBDbG91ZEZvcm1hdGlvbiBkb2NzXG5cbiAgY29uc3RydWN0b3IoY2xzOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIHRoaXMuY2xhc3NUeXBlID0gY2xzO1xuXG4gICAgdGhpcy5iYXNlbmFtZSA9IGNscy5uYW1lLnNsaWNlKCdDZm4nLmxlbmd0aCk7XG5cbiAgICBjb25zdCBmdWxsbmFtZSA9IGNscy5kb2NzLmN1c3RvbVRhZygnY2xvdWRmb3JtYXRpb25SZXNvdXJjZScpO1xuICAgIGlmICghZnVsbG5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGV4dHJhY3QgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgbmFtZSBmcm9tIGluaXRpYWxpemVyIGRvY3VtZW50YXRpb24gb2YgJHtjbHN9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5mdWxsbmFtZSA9IGZ1bGxuYW1lO1xuXG4gICAgdGhpcy5uYW1lc3BhY2UgPSBmdWxsbmFtZS5zcGxpdCgnOjonKS5zbGljZSgwLCAyKS5qb2luKCc6OicpO1xuXG4gICAgdGhpcy5hdHRyaWJ1dGVOYW1lcyA9IGNscy5vd25Qcm9wZXJ0aWVzXG4gICAgICAuZmlsdGVyKHAgPT4gKHAuZG9jcy5kb2NzLmN1c3RvbSB8fCB7fSkuY2xvdWRmb3JtYXRpb25BdHRyaWJ1dGUpXG4gICAgICAubWFwKHAgPT4gcC5kb2NzLmN1c3RvbVRhZygnY2xvdWRmb3JtYXRpb25BdHRyaWJ1dGUnKSB8fCAnPGVycm9yPicpXG4gICAgICAubWFwKHAgPT4gdGhpcy5hdHRyaWJ1dGVQcm9wZXJ0eU5hbWVGcm9tQ2ZuTmFtZShwKSk7XG5cbiAgICB0aGlzLmRvYyA9IGNscy5kb2NzLmRvY3Muc2VlIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRyaWJ1dGVQcm9wZXJ0eU5hbWVGcm9tQ2ZuTmFtZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gICAgLy8gc3BlY2lhbCBjYXNlIChzb21lb25lIHdhcyBzbWFydCksIHNwZWNpYWwgY2FzZSBjb3BpZWQgZnJvbSBjZm4ydHNcbiAgICBpZiAodGhpcy5iYXNlbmFtZSA9PT0gJ1NlY3VyaXR5R3JvdXAnICYmIG5hbWUgPT09ICdHcm91cElkJykge1xuICAgICAgcmV0dXJuICdJZCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhbWVsY2FzZShuYW1lLCB7IHBhc2NhbENhc2U6IHRydWUgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -4,10 +4,29 @@ import { CoreTypes } from './core-types';
4
4
  import { ResourceReflection } from './resource';
5
5
  import { Linter } from '../linter';
6
6
 
7
+ const cfnResourceTagName = 'cloudformationResource';
8
+
7
9
  // this linter verifies that we have L2 coverage. it finds all "Cfn" classes and verifies
8
10
  // that we have a corresponding L1 class for it that's identified as a resource.
9
11
  export const cfnResourceLinter = new Linter(a => CfnResourceReflection.findAll(a));
10
12
 
13
+ // Cache L1 constructs per type system.
14
+ const l1ConstructCache = new Map<reflect.TypeSystem, Map<string, reflect.ClassType>>();
15
+
16
+ function cacheL1ConstructsForTypeSystem(sys: reflect.TypeSystem) {
17
+ if (!l1ConstructCache.has(sys)) {
18
+ l1ConstructCache.set(sys, new Map<string, reflect.ClassType>());
19
+
20
+ for (const cls of sys.classes) {
21
+ const cfnResourceTag = cls.docs.customTag(cfnResourceTagName);
22
+
23
+ if (cfnResourceTag) {
24
+ l1ConstructCache.get(sys)?.set(cfnResourceTag?.toLocaleLowerCase()!, cls);
25
+ }
26
+ }
27
+ }
28
+ }
29
+
11
30
  cfnResourceLinter.add({
12
31
  code: 'resource-class',
13
32
  message: 'every resource must have a resource class (L2), add \'@resource %s\' to its docstring',
@@ -24,10 +43,13 @@ export class CfnResourceReflection {
24
43
  * @param fullName first two components are case-insensitive (e.g. `aws::s3::Bucket` is equivalent to `Aws::S3::Bucket`)
25
44
  */
26
45
  public static findByName(sys: reflect.TypeSystem, fullName: string) {
27
- for (const cls of sys.classes) {
28
- if (cls.docs.customTag('cloudformationResource')?.toLocaleLowerCase() === fullName.toLocaleLowerCase()) {
29
- return new CfnResourceReflection(cls);
30
- }
46
+ if (!l1ConstructCache.has(sys)) {
47
+ cacheL1ConstructsForTypeSystem(sys);
48
+ }
49
+
50
+ const cls = l1ConstructCache.get(sys)?.get(fullName.toLowerCase());
51
+ if (cls) {
52
+ return new CfnResourceReflection(cls);
31
53
  }
32
54
 
33
55
  return undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awslint",
3
- "version": "2.98.0-alpha.0",
3
+ "version": "2.99.0-alpha.0",
4
4
  "description": "Enforces the AWS Construct Library guidelines",
5
5
  "scripts": {
6
6
  "build": "tsc -b && eslint . --ext=.ts && pkglint && chmod +x bin/awslint",
@@ -29,14 +29,14 @@
29
29
  "@types/fs-extra": "^9.0.13",
30
30
  "@types/jest": "^29.5.5",
31
31
  "@types/yargs": "^15.0.15",
32
- "@aws-cdk/pkglint": "2.98.0-alpha.0",
32
+ "@aws-cdk/pkglint": "2.99.0-alpha.0",
33
33
  "typescript": "~5.1.6",
34
34
  "@typescript-eslint/eslint-plugin": "^6.7.2",
35
35
  "@typescript-eslint/parser": "^6.7.2",
36
36
  "eslint": "^7.32.0",
37
37
  "eslint-import-resolver-node": "^0.3.9",
38
38
  "eslint-import-resolver-typescript": "^2.7.1",
39
- "@aws-cdk/eslint-plugin": "2.98.0-alpha.0",
39
+ "@aws-cdk/eslint-plugin": "2.99.0-alpha.0",
40
40
  "eslint-plugin-import": "^2.28.1",
41
41
  "eslint-plugin-jest": "^24.7.0",
42
42
  "jest": "^29.7.0"