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.
- package/lib/rules/cfn-resource.js +21 -5
- package/lib/rules/cfn-resource.ts +26 -4
- package/package.json +3 -3
|
@@ -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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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,
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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"
|