awslint 2.234.0-alpha.0 → 2.235.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/api.js +135 -106
- package/lib/rules/api.ts +143 -108
- package/lib/rules/core-types.d.ts +8 -0
- package/lib/rules/core-types.js +20 -1
- package/lib/rules/core-types.ts +22 -0
- package/lib/rules/grant-methods.d.ts +2 -0
- package/lib/rules/grant-methods.js +25 -0
- package/lib/rules/grant-methods.ts +26 -0
- package/lib/rules/index.js +3 -2
- package/lib/rules/index.ts +2 -0
- package/package.json +3 -3
package/lib/rules/api.js
CHANGED
|
@@ -4,122 +4,151 @@ exports.apiLinter = void 0;
|
|
|
4
4
|
const construct_1 = require("./construct");
|
|
5
5
|
const core_types_1 = require("./core-types");
|
|
6
6
|
const linter_1 = require("../linter");
|
|
7
|
-
const
|
|
7
|
+
const CLASS_ON_PURPOSE_RULE = 'ref-via-interface';
|
|
8
|
+
const L2_INTERFACE_ON_PURPOSE_RULE = 'prefer-ref-interface';
|
|
8
9
|
// lint all constructs that are not L1 resources
|
|
9
10
|
exports.apiLinter = new linter_1.Linter(a => construct_1.ConstructReflection
|
|
10
11
|
.findAllConstructs(a)
|
|
11
12
|
.filter(c => !core_types_1.CoreTypes.isCfnResource(c.classType)));
|
|
12
13
|
exports.apiLinter.add({
|
|
13
|
-
code:
|
|
14
|
-
message: 'API should use interface and not the concrete class (%s). ' +
|
|
15
|
-
`If this is intentional, add "${
|
|
14
|
+
code: CLASS_ON_PURPOSE_RULE,
|
|
15
|
+
message: 'API should use interface (preferably IxxxRef, otherwise Ixxx) and not the concrete class (%s). ' +
|
|
16
|
+
`If this is intentional, add "${ignoreTag(CLASS_ON_PURPOSE_RULE)}" to element's jsdoc`,
|
|
16
17
|
eval: e => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if (visited.has(type.fqn)) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
visited.add(type.fqn);
|
|
25
|
-
for (const method of type.allMethods) {
|
|
26
|
-
assertMethod(method);
|
|
27
|
-
}
|
|
28
|
-
if (type.initializer) {
|
|
29
|
-
assertMethod(type.initializer);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function assertDataType(type) {
|
|
33
|
-
for (const property of type.allProperties) {
|
|
34
|
-
assertProperty(property);
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function assertInterface(type) {
|
|
38
|
-
if (visited.has(type.fqn)) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
visited.add(type.fqn);
|
|
42
|
-
if (type.datatype) {
|
|
43
|
-
assertDataType(type);
|
|
44
|
-
}
|
|
45
|
-
for (const method of type.allMethods) {
|
|
46
|
-
assertMethod(method);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function assertProperty(property) {
|
|
50
|
-
if (property.protected) {
|
|
51
|
-
return;
|
|
52
|
-
}
|
|
53
|
-
const site = property.overrides ? property.overrides : property.parentType;
|
|
54
|
-
assertType(property.type, property.docs, `${site.fqn}.${property.name}`);
|
|
55
|
-
}
|
|
56
|
-
function assertMethod(method) {
|
|
57
|
-
if (method.protected) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const site = method.overrides ? method.overrides : method.parentType;
|
|
61
|
-
const scope = `${site.fqn}.${method.name}`;
|
|
62
|
-
let firstMethod = site.isClassType() || site.isInterfaceType()
|
|
63
|
-
? site.allMethods.find(m => m.name === method.name)
|
|
64
|
-
: undefined;
|
|
65
|
-
if (!firstMethod) {
|
|
66
|
-
firstMethod = method;
|
|
67
|
-
}
|
|
68
|
-
for (const param of firstMethod.parameters) {
|
|
69
|
-
assertType(param.type, param.docs, `${scope}.${param.name}`);
|
|
70
|
-
}
|
|
71
|
-
// note that we do not require that return values will use an interface
|
|
72
|
-
}
|
|
73
|
-
function assertType(type, docs, scope) {
|
|
74
|
-
if (type.primitive) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
if (type.void) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (type.arrayOfType) {
|
|
81
|
-
return assertType(type.arrayOfType, docs, scope);
|
|
82
|
-
}
|
|
83
|
-
if (type.mapOfType) {
|
|
84
|
-
return assertType(type.mapOfType, docs, scope);
|
|
85
|
-
}
|
|
86
|
-
if (type.unionOfTypes) {
|
|
87
|
-
for (const t of type.unionOfTypes) {
|
|
88
|
-
assertType(t, docs, scope);
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
if (type.intersectionOfTypes) {
|
|
93
|
-
for (const t of type.intersectionOfTypes) {
|
|
94
|
-
assertType(t, docs, scope);
|
|
95
|
-
}
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
// interfaces are okay
|
|
99
|
-
if (type.type && type.type.isInterfaceType()) {
|
|
100
|
-
return assertInterface(type.type);
|
|
101
|
-
}
|
|
102
|
-
// enums are okay
|
|
103
|
-
if (type.type && type.type.isEnumType()) {
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
// classes are okay as long as they are not resource constructs
|
|
107
|
-
if (type.type && type.type.isClassType()) {
|
|
108
|
-
if (!core_types_1.CoreTypes.isResourceClass(type.type)) {
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
if (type.type.fqn === e.ctx.core.baseConstructClassFqn) {
|
|
18
|
+
visitParameters(e.ctx.classType, {
|
|
19
|
+
visitType: function (type, docs, scope) {
|
|
20
|
+
// allow exclusion of this rule
|
|
21
|
+
if (docHasIgnoreTag(docs, CLASS_ON_PURPOSE_RULE)) {
|
|
112
22
|
return;
|
|
113
23
|
}
|
|
24
|
+
// Assert that all types that reference classes are not resource constructs. Those
|
|
25
|
+
// should be referenced via Interface.
|
|
26
|
+
e.assert(!type.type
|
|
27
|
+
|| !type.type.isClassType()
|
|
28
|
+
|| !core_types_1.CoreTypes.isResourceClass(type.type)
|
|
29
|
+
// Make an exception for `constructs.Construct`.
|
|
30
|
+
|| type.type.fqn === e.ctx.core.baseConstructClassFqn, scope, type.type?.fqn);
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
exports.apiLinter.add({
|
|
36
|
+
code: L2_INTERFACE_ON_PURPOSE_RULE,
|
|
37
|
+
message: 'API should prefer to use the L1 reference interface (IxxxRef) and not the L2 interface (%s). ' +
|
|
38
|
+
`If this is intentional, add "${ignoreTag(L2_INTERFACE_ON_PURPOSE_RULE)}" to element's jsdoc`,
|
|
39
|
+
eval: e => {
|
|
40
|
+
visitParameters(e.ctx.classType, {
|
|
41
|
+
visitType: function (type, docs, scope) {
|
|
114
42
|
// allow exclusion of this rule
|
|
115
|
-
if (docs
|
|
43
|
+
if (docHasIgnoreTag(docs, L2_INTERFACE_ON_PURPOSE_RULE)) {
|
|
116
44
|
return;
|
|
117
45
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
46
|
+
// Assert that all types that interfaces are not L2 interfaces. This is actually not checking
|
|
47
|
+
// that they ARE Ref interfaces, just that they aren't L2 interfaces (could also be service-
|
|
48
|
+
// specific non-resource interfaces, and those are fine too)
|
|
49
|
+
e.assert(!type.type
|
|
50
|
+
|| !type.type.isInterfaceType()
|
|
51
|
+
|| type.type.datatype
|
|
52
|
+
|| !core_types_1.CoreTypes.isL2Interface(type.type), scope, type.type?.fqn);
|
|
53
|
+
},
|
|
54
|
+
});
|
|
123
55
|
},
|
|
124
56
|
});
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUFrRDtBQUNsRCw2Q0FBeUM7QUFDekMsc0NBQW1DO0FBRW5DLE1BQU0sb0NBQW9DLEdBQUcscUNBQXFDLENBQUM7QUFFbkYsZ0RBQWdEO0FBQ25DLFFBQUEsU0FBUyxHQUFHLElBQUksZUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsK0JBQW1CO0tBQ3pELGlCQUFpQixDQUFDLENBQUMsQ0FBQztLQUNwQixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLHNCQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFdkQsaUJBQVMsQ0FBQyxHQUFHLENBQUM7SUFDWixJQUFJLEVBQUUsbUJBQW1CO0lBQ3pCLE9BQU8sRUFBRSw0REFBNEQ7UUFDbkUsZ0NBQWdDLG9DQUFvQyxzQkFBc0I7SUFDNUYsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ1IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQUVsQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFakIsU0FBUyxXQUFXLENBQUMsSUFBdUI7WUFDMUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUFDLE9BQU87WUFBQyxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXRCLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNyQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkIsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFB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O2dCQUNULENBQUM7Z0JBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUN2RCxPQUFPO2dCQUNULENBQUM7Z0JBRUQsK0JBQStCO2dCQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsb0NBQW9DLENBQUMsRUFBRSxDQUFDO29CQUMvSCxPQUFPO2dCQUNULENBQUM7Z0JBRUQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLE9BQU87WUFDVCxDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztDQUNGLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7IENvbnN0cnVjdFJlZmxlY3Rpb24gfSBmcm9tICcuL2NvbnN0cnVjdCc7XG5pbXBvcnQgeyBDb3JlVHlwZXMgfSBmcm9tICcuL2NvcmUtdHlwZXMnO1xuaW1wb3J0IHsgTGludGVyIH0gZnJvbSAnLi4vbGludGVyJztcblxuY29uc3QgRVhDTFVERV9BTk5PVEFUSU9OX1JFRl9WSUFfSU5URVJGQUNFID0gJ1tkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdJztcblxuLy8gbGludCBhbGwgY29uc3RydWN0cyB0aGF0IGFyZSBub3QgTDEgcmVzb3VyY2VzXG5leHBvcnQgY29uc3QgYXBpTGludGVyID0gbmV3IExpbnRlcihhID0+IENvbnN0cnVjdFJlZmxlY3Rpb25cbiAgLmZpbmRBbGxDb25zdHJ1Y3RzKGEpXG4gIC5maWx0ZXIoYyA9PiAhQ29yZVR5cGVzLmlzQ2ZuUmVzb3VyY2UoYy5jbGFzc1R5cGUpKSk7XG5cbmFwaUxpbnRlci5hZGQoe1xuICBjb2RlOiAncmVmLXZpYS1pbnRlcmZhY2UnLFxuICBtZXNzYWdlOiAnQVBJIHNob3VsZCB1c2UgaW50ZXJmYWNlIGFuZCBub3QgdGhlIGNvbmNyZXRlIGNsYXNzICglcykuICcgK1xuICAgIGBJZiB0aGlzIGlzIGludGVudGlvbmFsLCBhZGQgXCIke0VYQ0xVREVfQU5OT1RBVElPTl9SRUZfVklBX0lOVEVSRkFDRX1cIiB0byBlbGVtZW50J3MganNkb2NgLFxuICBldmFsOiBlID0+IHtcbiAgICBjb25zdCBjbHMgPSBlLmN0eC5jbGFzc1R5cGU7XG4gICAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgYXNzZXJ0Q2xhc3MoY2xzKTtcblxuICAgIGZ1bmN0aW9uIGFzc2VydENsYXNzKHR5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlKTogdm9pZCB7XG4gICAgICBpZiAodmlzaXRlZC5oYXModHlwZS5mcW4pKSB7IHJldHVybjsgfVxuICAgICAgdmlzaXRlZC5hZGQodHlwZS5mcW4pO1xuXG4gICAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiB0eXBlLmFsbE1ldGhvZHMpIHtcbiAgICAgICAgYXNzZXJ0TWV0aG9kKG1ldGhvZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlLmluaXRpYWxpemVyKSB7XG4gICAgICAgIGFzc2VydE1ldGhvZCh0eXBlLmluaXRpYWxpemVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhc3NlcnREYXRhVHlwZSh0eXBlOiByZWZsZWN0LkludGVyZmFjZVR5cGUpOiB2b2lkIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgdHlwZS5hbGxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGFzc2VydFByb3BlcnR5KHByb3BlcnR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhc3NlcnRJbnRlcmZhY2UodHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKTogdm9pZCB7XG4gICAgICBpZiAodmlzaXRlZC5oYXModHlwZS5mcW4pKSB7IHJldHVybjsgfVxuICAgICAgdmlzaXRlZC5hZGQodHlwZS5mcW4pO1xuXG4gICAgICBpZiAodHlwZS5kYXRhdHlwZSkge1xuICAgICAgICBhc3NlcnREYXRhVHlwZSh0eXBlKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBtZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzKSB7XG4gICAgICAgIGFzc2VydE1ldGhvZChtZXRob2QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzc2VydFByb3BlcnR5KHByb3BlcnR5OiByZWZsZWN0LlByb3BlcnR5KSB7XG4gICAgICBpZiAocHJvcGVydHkucHJvdGVjdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2l0ZSA9IHByb3BlcnR5Lm92ZXJyaWRlcyA/IHByb3BlcnR5Lm92ZXJyaWRlcyA6IHByb3BlcnR5LnBhcmVudFR5cGU7XG4gICAgICBhc3NlcnRUeXBlKHByb3BlcnR5LnR5cGUsIHByb3BlcnR5LmRvY3MsIGAke3NpdGUuZnFufS4ke3Byb3BlcnR5Lm5hbWV9YCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYXNzZXJ0TWV0aG9kKG1ldGhvZDogcmVmbGVjdC5DYWxsYWJsZSkge1xuICAgICAgaWYgKG1ldGhvZC5wcm90ZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaXRlID0gbWV0aG9kLm92ZXJyaWRlcyA/IG1ldGhvZC5vdmVycmlkZXMgOiBtZXRob2QucGFyZW50VHlwZTtcbiAgICAgIGNvbnN0IHNjb3BlID0gYCR7c2l0ZS5mcW59LiR7bWV0aG9kLm5hbWV9YDtcblxuICAgICAgbGV0IGZpcnN0TWV0aG9kOiByZWZsZWN0LkNhbGxhYmxlIHwgdW5kZWZpbmVkID0gc2l0ZS5pc0NsYXNzVHlwZSgpIHx8IHNpdGUuaXNJbnRlcmZhY2VUeXBlKClcbiAgICAgICAgPyBzaXRlLmFsbE1ldGhvZHMuZmluZChtID0+IG0ubmFtZSA9PT0gbWV0aG9kLm5hbWUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoIWZpcnN0TWV0aG9kKSB7XG4gICAgICAgIGZpcnN0TWV0aG9kID0gbWV0aG9kO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIGZpcnN0TWV0aG9kLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgYXNzZXJ0VHlwZShwYXJhbS50eXBlLCBwYXJhbS5kb2NzLCBgJHtzY29wZX0uJHtwYXJhbS5uYW1lfWApO1xuICAgICAgfVxuXG4gICAgICAvLyBub3RlIHRoYXQgd2UgZG8gbm90IHJlcXVpcmUgdGhhdCByZXR1cm4gdmFsdWVzIHdpbGwgdXNlIGFuIGludGVyZmFjZVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzc2VydFR5cGUodHlwZTogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLCBkb2NzOiByZWZsZWN0LkRvY3MsIHNjb3BlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGlmICh0eXBlLnByaW1pdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlLnZvaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZS5hcnJheU9mVHlwZSkge1xuICAgICAgICByZXR1cm4gYXNzZXJ0VHlwZSh0eXBlLmFycmF5T2ZUeXBlLCBkb2NzLCBzY29wZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlLm1hcE9mVHlwZSkge1xuICAgICAgICByZXR1cm4gYXNzZXJ0VHlwZSh0eXBlLm1hcE9mVHlwZSwgZG9jcywgc2NvcGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZS51bmlvbk9mVHlwZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHR5cGUudW5pb25PZlR5cGVzKSB7XG4gICAgICAgICAgYXNzZXJ0VHlwZSh0LCBkb2NzLCBzY29wZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZS5pbnRlcnNlY3Rpb25PZlR5cGVzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdCBvZiB0eXBlLmludGVyc2VjdGlvbk9mVHlwZXMpIHtcbiAgICAgICAgICBhc3NlcnRUeXBlKHQsIGRvY3MsIHNjb3BlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGludGVyZmFjZXMgYXJlIG9rYXlcbiAgICAgIGlmICh0eXBlLnR5cGUgJiYgdHlwZS50eXBlLmlzSW50ZXJmYWNlVHlwZSgpKSB7XG4gICAgICAgIHJldHVybiBhc3NlcnRJbnRlcmZhY2UodHlwZS50eXBlKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW51bXMgYXJlIG9rYXlcbiAgICAgIGlmICh0eXBlLnR5cGUgJiYgdHlwZS50eXBlLmlzRW51bVR5cGUoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNsYXNzZXMgYXJlIG9rYXkgYXMgbG9uZyBhcyB0aGV5IGFyZSBub3QgcmVzb3VyY2UgY29uc3RydWN0c1xuICAgICAgaWYgKHR5cGUudHlwZSAmJiB0eXBlLnR5cGUuaXNDbGFzc1R5cGUoKSkge1xuICAgICAgICBpZiAoIUNvcmVUeXBlcy5pc1Jlc291cmNlQ2xhc3ModHlwZS50eXBlKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlLnR5cGUuZnFuID09PSBlLmN0eC5jb3JlLmJhc2VDb25zdHJ1Y3RDbGFzc0Zxbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFsbG93IGV4Y2x1c2lvbiBvZiB0aGlzIHJ1bGVcbiAgICAgICAgaWYgKGRvY3Muc3VtbWFyeS5pbmNsdWRlcyhFWENMVURFX0FOTk9UQVRJT05fUkVGX1ZJQV9JTlRFUkZBQ0UpIHx8IGRvY3MucmVtYXJrcy5pbmNsdWRlcyhFWENMVURFX0FOTk9UQVRJT05fUkVGX1ZJQV9JTlRFUkZBQ0UpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZS5hc3NlcnQoZmFsc2UsIHNjb3BlLCB0eXBlLnR5cGUuZnFuKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHlwZSByZWZlcmVuY2U6ICR7dHlwZS50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfSxcbn0pO1xuIl19
|
|
57
|
+
function ignoreTag(rule) {
|
|
58
|
+
return `[disable-awslint:${rule}]`;
|
|
59
|
+
}
|
|
60
|
+
function docHasIgnoreTag(docs, rule) {
|
|
61
|
+
const tag = ignoreTag(rule);
|
|
62
|
+
return docs.summary.includes(tag) || docs.remarks.includes(tag);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Visit all types in the API of a given type
|
|
66
|
+
*
|
|
67
|
+
* This visits method parameters and members of structs of method parameters.
|
|
68
|
+
*/
|
|
69
|
+
function visitParameters(root, visitor) {
|
|
70
|
+
const visited = new Set();
|
|
71
|
+
if (root.isClassType()) {
|
|
72
|
+
assertClass(root);
|
|
73
|
+
}
|
|
74
|
+
else if (root.isInterfaceType()) {
|
|
75
|
+
assertInterface(root);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new Error(`invalid type: ${root.toString()}`);
|
|
79
|
+
}
|
|
80
|
+
function assertClass(type) {
|
|
81
|
+
if (visited.has(type.fqn)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
visited.add(type.fqn);
|
|
85
|
+
for (const method of type.allMethods) {
|
|
86
|
+
assertMethod(method);
|
|
87
|
+
}
|
|
88
|
+
if (type.initializer) {
|
|
89
|
+
assertMethod(type.initializer);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function assertDataType(type) {
|
|
93
|
+
for (const property of type.allProperties) {
|
|
94
|
+
assertProperty(property);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function assertInterface(type) {
|
|
98
|
+
if (visited.has(type.fqn)) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
visited.add(type.fqn);
|
|
102
|
+
if (type.datatype) {
|
|
103
|
+
assertDataType(type);
|
|
104
|
+
}
|
|
105
|
+
for (const method of type.allMethods) {
|
|
106
|
+
assertMethod(method);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function assertProperty(property) {
|
|
110
|
+
if (property.protected) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const site = property.overrides ? property.overrides : property.parentType;
|
|
114
|
+
assertType(property.type, property.docs, `${site.fqn}.${property.name}`);
|
|
115
|
+
}
|
|
116
|
+
function assertMethod(method) {
|
|
117
|
+
if (method.protected) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const site = method.overrides ? method.overrides : method.parentType;
|
|
121
|
+
const scope = `${site.fqn}.${method.name}`;
|
|
122
|
+
let firstMethod = site.isClassType() || site.isInterfaceType()
|
|
123
|
+
? site.allMethods.find(m => m.name === method.name)
|
|
124
|
+
: undefined;
|
|
125
|
+
if (!firstMethod) {
|
|
126
|
+
firstMethod = method;
|
|
127
|
+
}
|
|
128
|
+
for (const param of firstMethod.parameters) {
|
|
129
|
+
assertType(param.type, param.docs, `${scope}.${param.name}`);
|
|
130
|
+
}
|
|
131
|
+
// note that we do not require that return values will use an interface
|
|
132
|
+
}
|
|
133
|
+
function assertType(type, docs, scope) {
|
|
134
|
+
visitor.visitType(type, docs, scope);
|
|
135
|
+
// And recurse
|
|
136
|
+
if (type.arrayOfType) {
|
|
137
|
+
return assertType(type.arrayOfType, docs, scope);
|
|
138
|
+
}
|
|
139
|
+
if (type.mapOfType) {
|
|
140
|
+
return assertType(type.mapOfType, docs, scope);
|
|
141
|
+
}
|
|
142
|
+
if (type.unionOfTypes) {
|
|
143
|
+
for (const t of type.unionOfTypes) {
|
|
144
|
+
assertType(t, docs, scope);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// interfaces are okay
|
|
149
|
+
if (type.type && type.type.isInterfaceType()) {
|
|
150
|
+
return assertInterface(type.type);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUFrRDtBQUNsRCw2Q0FBeUM7QUFDekMsc0NBQW1DO0FBRW5DLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFDbEQsTUFBTSw0QkFBNEIsR0FBRyxzQkFBc0IsQ0FBQztBQUU1RCxnREFBZ0Q7QUFDbkMsUUFBQSxTQUFTLEdBQUcsSUFBSSxlQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQywrQkFBbUI7S0FDekQsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0tBQ3BCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsc0JBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV2RCxpQkFBUyxDQUFDLEdBQUcsQ0FBQztJQUNaLElBQUksRUFBRSxxQkFBcUI7SUFDM0IsT0FBTyxFQUFFLGlHQUFpRztRQUN4RyxnQ0FBZ0MsU0FBUyxDQUFDLHFCQUFxQixDQUFDLHNCQUFzQjtJQUN4RixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDUixlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7WUFDL0IsU0FBUyxFQUFFLFVBQVUsSUFBMkIsRUFBRSxJQUFrQixFQUFFLEtBQWE7Z0JBQ2pGLCtCQUErQjtnQkFDL0IsSUFBSSxlQUFlLENBQUMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLEVBQUUsQ0FBQztvQkFDakQsT0FBTztnQkFDVCxDQUFDO2dCQUVELGtGQUFrRjtnQkFDbEYsc0NBQXNDO2dCQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUk7dUJBQ2QsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTt1QkFDeEIsQ0FBQyxzQkFBUyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO29C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Q0FBQztRQUVELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUM3QyxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgQ29uc3RydWN0UmVmbGVjdGlvbiB9IGZyb20gJy4vY29uc3RydWN0JztcbmltcG9ydCB7IENvcmVUeXBlcyB9IGZyb20gJy4vY29yZS10eXBlcyc7XG5pbXBvcnQgeyBMaW50ZXIgfSBmcm9tICcuLi9saW50ZXInO1xuXG5jb25zdCBDTEFTU19PTl9QVVJQT1NFX1JVTEUgPSAncmVmLXZpYS1pbnRlcmZhY2UnO1xuY29uc3QgTDJfSU5URVJGQUNFX09OX1BVUlBPU0VfUlVMRSA9ICdwcmVmZXItcmVmLWludGVyZmFjZSc7XG5cbi8vIGxpbnQgYWxsIGNvbnN0cnVjdHMgdGhhdCBhcmUgbm90IEwxIHJlc291cmNlc1xuZXhwb3J0IGNvbnN0IGFwaUxpbnRlciA9IG5ldyBMaW50ZXIoYSA9PiBDb25zdHJ1Y3RSZWZsZWN0aW9uXG4gIC5maW5kQWxsQ29uc3RydWN0cyhhKVxuICAuZmlsdGVyKGMgPT4gIUNvcmVUeXBlcy5pc0NmblJlc291cmNlKGMuY2xhc3NUeXBlKSkpO1xuXG5hcGlMaW50ZXIuYWRkKHtcbiAgY29kZTogQ0xBU1NfT05fUFVSUE9TRV9SVUxFLFxuICBtZXNzYWdlOiAnQVBJIHNob3VsZCB1c2UgaW50ZXJmYWNlIChwcmVmZXJhYmx5IEl4eHhSZWYsIG90aGVyd2lzZSBJeHh4KSBhbmQgbm90IHRoZSBjb25jcmV0ZSBjbGFzcyAoJXMpLiAnICtcbiAgICBgSWYgdGhpcyBpcyBpbnRlbnRpb25hbCwgYWRkIFwiJHtpZ25vcmVUYWcoQ0xBU1NfT05fUFVSUE9TRV9SVUxFKX1cIiB0byBlbGVtZW50J3MganNkb2NgLFxuICBldmFsOiBlID0+IHtcbiAgICB2aXNpdFBhcmFtZXRlcnMoZS5jdHguY2xhc3NUeXBlLCB7XG4gICAgICB2aXNpdFR5cGU6IGZ1bmN0aW9uICh0eXBlOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsIGRvY3M6IHJlZmxlY3QuRG9jcywgc2NvcGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBhbGxvdyBleGNsdXNpb24gb2YgdGhpcyBydWxlXG4gICAgICAgIGlmIChkb2NIYXNJZ25vcmVUYWcoZG9jcywgQ0xBU1NfT05fUFVSUE9TRV9SVUxFKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFzc2VydCB0aGF0IGFsbCB0eXBlcyB0aGF0IHJlZmVyZW5jZSBjbGFzc2VzIGFyZSBub3QgcmVzb3VyY2UgY29uc3RydWN0cy4gVGhvc2VcbiAgICAgICAgLy8gc2hvdWxkIGJlIHJlZmVyZW5jZWQgdmlhIEludGVyZmFjZS5cbiAgICAgICAgZS5hc3NlcnQoIXR5cGUudHlwZVxuICAgICAgICAgIHx8ICF0eXBlLnR5cGUuaXNDbGFzc1R5cGUoKVxuICAgICAgICAgIHx8ICFDb3JlVHlwZXMuaXNSZXNvdXJjZUNsYXNzKHR5cGUudHlwZSlcbiAgICAgICAgICAvLyBNYWtlIGFuIGV4Y2VwdGlvbiBmb3IgYGNvbnN0cnVjdHMuQ29uc3RydWN0YC5cbiAgICAgICAgICB8fCB0eXBlLnR5cGUuZnFuID09PSBlLmN0eC5jb3JlLmJhc2VDb25zdHJ1Y3RDbGFzc0ZxbixcbiAgICAgICAgc2NvcGUsXG4gICAgICAgIHR5cGUudHlwZT8uZnFuLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfSxcbn0pO1xuXG5hcGlMaW50ZXIuYWRkKHtcbiAgY29kZTogTDJfSU5URVJGQUNFX09OX1BVUlBPU0VfUlVMRSxcbiAgbWVzc2FnZTogJ0FQSSBzaG91bGQgcHJlZmVyIHRvIHVzZSB0aGUgTDEgcmVmZXJlbmNlIGludGVyZmFjZSAoSXh4eFJlZikgYW5kIG5vdCB0aGUgTDIgaW50ZXJmYWNlICglcykuICcgK1xuICAgIGBJZiB0aGlzIGlzIGludGVudGlvbmFsLCBhZGQgXCIke2lnbm9yZVRhZyhMMl9JTlRFUkZBQ0VfT05fUFVSUE9TRV9SVUxFKX1cIiB0byBlbGVtZW50J3MganNkb2NgLFxuICBldmFsOiBlID0+IHtcbiAgICB2aXNpdFBhcmFtZXRlcnMoZS5jdHguY2xhc3NUeXBlLCB7XG4gICAgICB2aXNpdFR5cGU6IGZ1bmN0aW9uICh0eXBlOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsIGRvY3M6IHJlZmxlY3QuRG9jcywgc2NvcGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBhbGxvdyBleGNsdXNpb24gb2YgdGhpcyBydWxlXG4gICAgICAgIGlmIChkb2NIYXNJZ25vcmVUYWcoZG9jcywgTDJfSU5URVJGQUNFX09OX1BVUlBPU0VfUlVMRSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBc3NlcnQgdGhhdCBhbGwgdHlwZXMgdGhhdCBpbnRlcmZhY2VzIGFyZSBub3QgTDIgaW50ZXJmYWNlcy4gVGhpcyBpcyBhY3R1YWxseSBub3QgY2hlY2tpbmdcbiAgICAgICAgLy8gdGhhdCB0aGV5IEFSRSBSZWYgaW50ZXJmYWNlcywganVzdCB0aGF0IHRoZXkgYXJlbid0IEwyIGludGVyZmFjZXMgKGNvdWxkIGFsc28gYmUgc2VydmljZS1cbiAgICAgICAgLy8gc3BlY2lmaWMgbm9uLXJlc291cmNlIGludGVyZmFjZXMsIGFuZCB0aG9zZSBhcmUgZmluZSB0b28pXG4gICAgICAgIGUuYXNzZXJ0KCF0eXBlLnR5cGVcbiAgICAgICAgICB8fCAhdHlwZS50eXBlLmlzSW50ZXJmYWNlVHlwZSgpXG4gICAgICAgICAgfHwgdHlwZS50eXBlLmRhdGF0eXBlXG4gICAgICAgICAgfHwgIUNvcmVUeXBlcy5pc0wySW50ZXJmYWNlKHR5cGUudHlwZSksXG4gICAgICAgIHNjb3BlLFxuICAgICAgICB0eXBlLnR5cGU/LmZxbixcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0sXG59KTtcblxuZnVuY3Rpb24gaWdub3JlVGFnKHJ1bGU6IHN0cmluZykge1xuICByZXR1cm4gYFtkaXNhYmxlLWF3c2xpbnQ6JHtydWxlfV1gO1xufVxuXG5mdW5jdGlvbiBkb2NIYXNJZ25vcmVUYWcoZG9jczogcmVmbGVjdC5Eb2NzLCBydWxlOiBzdHJpbmcpIHtcbiAgY29uc3QgdGFnID0gaWdub3JlVGFnKHJ1bGUpO1xuICByZXR1cm4gZG9jcy5zdW1tYXJ5LmluY2x1ZGVzKHRhZykgfHwgZG9jcy5yZW1hcmtzLmluY2x1ZGVzKHRhZyk7XG59XG5cbi8qKlxuICogVmlzaXQgYWxsIHR5cGVzIGluIHRoZSBBUEkgb2YgYSBnaXZlbiB0eXBlXG4gKlxuICogVGhpcyB2aXNpdHMgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIG1lbWJlcnMgb2Ygc3RydWN0cyBvZiBtZXRob2QgcGFyYW1ldGVycy5cbiAqL1xuZnVuY3Rpb24gdmlzaXRQYXJhbWV0ZXJzKHJvb3Q6IHJlZmxlY3QuVHlwZSwgdmlzaXRvcjogVHlwZVZpc2l0b3IpIHtcbiAgY29uc3QgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGlmIChyb290LmlzQ2xhc3NUeXBlKCkpIHtcbiAgICBhc3NlcnRDbGFzcyhyb290KTtcbiAgfSBlbHNlIGlmIChyb290LmlzSW50ZXJmYWNlVHlwZSgpKSB7XG4gICAgYXNzZXJ0SW50ZXJmYWNlKHJvb3QpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCB0eXBlOiAke3Jvb3QudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFzc2VydENsYXNzKHR5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHR5cGUuZnFuKSkgeyByZXR1cm47IH1cbiAgICB2aXNpdGVkLmFkZCh0eXBlLmZxbik7XG5cbiAgICBmb3IgKGNvbnN0IG1ldGhvZCBvZiB0eXBlLmFsbE1ldGhvZHMpIHtcbiAgICAgIGFzc2VydE1ldGhvZChtZXRob2QpO1xuICAgIH1cblxuICAgIGlmICh0eXBlLmluaXRpYWxpemVyKSB7XG4gICAgICBhc3NlcnRNZXRob2QodHlwZS5pbml0aWFsaXplcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXNzZXJ0RGF0YVR5cGUodHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0eXBlLmFsbFByb3BlcnRpZXMpIHtcbiAgICAgIGFzc2VydFByb3BlcnR5KHByb3BlcnR5KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnRJbnRlcmZhY2UodHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKTogdm9pZCB7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHR5cGUuZnFuKSkgeyByZXR1cm47IH1cbiAgICB2aXNpdGVkLmFkZCh0eXBlLmZxbik7XG5cbiAgICBpZiAodHlwZS5kYXRhdHlwZSkge1xuICAgICAgYXNzZXJ0RGF0YVR5cGUodHlwZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtZXRob2Qgb2YgdHlwZS5hbGxNZXRob2RzKSB7XG4gICAgICBhc3NlcnRNZXRob2QobWV0aG9kKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnRQcm9wZXJ0eShwcm9wZXJ0eTogcmVmbGVjdC5Qcm9wZXJ0eSkge1xuICAgIGlmIChwcm9wZXJ0eS5wcm90ZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzaXRlID0gcHJvcGVydHkub3ZlcnJpZGVzID8gcHJvcGVydHkub3ZlcnJpZGVzIDogcHJvcGVydHkucGFyZW50VHlwZTtcbiAgICBhc3NlcnRUeXBlKHByb3BlcnR5LnR5cGUsIHByb3BlcnR5LmRvY3MsIGAke3NpdGUuZnFufS4ke3Byb3BlcnR5Lm5hbWV9YCk7XG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnRNZXRob2QobWV0aG9kOiByZWZsZWN0LkNhbGxhYmxlKSB7XG4gICAgaWYgKG1ldGhvZC5wcm90ZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzaXRlID0gbWV0aG9kLm92ZXJyaWRlcyA/IG1ldGhvZC5vdmVycmlkZXMgOiBtZXRob2QucGFyZW50VHlwZTtcbiAgICBjb25zdCBzY29wZSA9IGAke3NpdGUuZnFufS4ke21ldGhvZC5uYW1lfWA7XG5cbiAgICBsZXQgZmlyc3RNZXRob2Q6IHJlZmxlY3QuQ2FsbGFibGUgfCB1bmRlZmluZWQgPSBzaXRlLmlzQ2xhc3NUeXBlKCkgfHwgc2l0ZS5pc0ludGVyZmFjZVR5cGUoKVxuICAgICAgPyBzaXRlLmFsbE1ldGhvZHMuZmluZChtID0+IG0ubmFtZSA9PT0gbWV0aG9kLm5hbWUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghZmlyc3RNZXRob2QpIHtcbiAgICAgIGZpcnN0TWV0aG9kID0gbWV0aG9kO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcGFyYW0gb2YgZmlyc3RNZXRob2QucGFyYW1ldGVycykge1xuICAgICAgYXNzZXJ0VHlwZShwYXJhbS50eXBlLCBwYXJhbS5kb2NzLCBgJHtzY29wZX0uJHtwYXJhbS5uYW1lfWApO1xuICAgIH1cblxuICAgIC8vIG5vdGUgdGhhdCB3ZSBkbyBub3QgcmVxdWlyZSB0aGF0IHJldHVybiB2YWx1ZXMgd2lsbCB1c2UgYW4gaW50ZXJmYWNlXG4gIH1cblxuICBmdW5jdGlvbiBhc3NlcnRUeXBlKHR5cGU6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSwgZG9jczogcmVmbGVjdC5Eb2NzLCBzY29wZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdmlzaXRvci52aXNpdFR5cGUodHlwZSwgZG9jcywgc2NvcGUpO1xuXG4gICAgLy8gQW5kIHJlY3Vyc2VcbiAgICBpZiAodHlwZS5hcnJheU9mVHlwZSkge1xuICAgICAgcmV0dXJuIGFzc2VydFR5cGUodHlwZS5hcnJheU9mVHlwZSwgZG9jcywgc2NvcGUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlLm1hcE9mVHlwZSkge1xuICAgICAgcmV0dXJuIGFzc2VydFR5cGUodHlwZS5tYXBPZlR5cGUsIGRvY3MsIHNjb3BlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZS51bmlvbk9mVHlwZXMpIHtcbiAgICAgIGZvciAoY29uc3QgdCBvZiB0eXBlLnVuaW9uT2ZUeXBlcykge1xuICAgICAgICBhc3NlcnRUeXBlKHQsIGRvY3MsIHNjb3BlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpbnRlcmZhY2VzIGFyZSBva2F5XG4gICAgaWYgKHR5cGUudHlwZSAmJiB0eXBlLnR5cGUuaXNJbnRlcmZhY2VUeXBlKCkpIHtcbiAgICAgIHJldHVybiBhc3NlcnRJbnRlcmZhY2UodHlwZS50eXBlKTtcbiAgICB9XG4gIH1cbn1cblxuaW50ZXJmYWNlIFR5cGVWaXNpdG9yIHtcbiAgdmlzaXRUeXBlKHR5cGU6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSwgZG9jczogcmVmbGVjdC5Eb2NzLCBzY29wZTogc3RyaW5nKTogdm9pZDtcbn1cbiJdfQ==
|
package/lib/rules/api.ts
CHANGED
|
@@ -3,7 +3,8 @@ import { ConstructReflection } from './construct';
|
|
|
3
3
|
import { CoreTypes } from './core-types';
|
|
4
4
|
import { Linter } from '../linter';
|
|
5
5
|
|
|
6
|
-
const
|
|
6
|
+
const CLASS_ON_PURPOSE_RULE = 'ref-via-interface';
|
|
7
|
+
const L2_INTERFACE_ON_PURPOSE_RULE = 'prefer-ref-interface';
|
|
7
8
|
|
|
8
9
|
// lint all constructs that are not L1 resources
|
|
9
10
|
export const apiLinter = new Linter(a => ConstructReflection
|
|
@@ -11,140 +12,174 @@ export const apiLinter = new Linter(a => ConstructReflection
|
|
|
11
12
|
.filter(c => !CoreTypes.isCfnResource(c.classType)));
|
|
12
13
|
|
|
13
14
|
apiLinter.add({
|
|
14
|
-
code:
|
|
15
|
-
message: 'API should use interface and not the concrete class (%s). ' +
|
|
16
|
-
`If this is intentional, add "${
|
|
15
|
+
code: CLASS_ON_PURPOSE_RULE,
|
|
16
|
+
message: 'API should use interface (preferably IxxxRef, otherwise Ixxx) and not the concrete class (%s). ' +
|
|
17
|
+
`If this is intentional, add "${ignoreTag(CLASS_ON_PURPOSE_RULE)}" to element's jsdoc`,
|
|
17
18
|
eval: e => {
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
visitParameters(e.ctx.classType, {
|
|
20
|
+
visitType: function (type: reflect.TypeReference, docs: reflect.Docs, scope: string): void {
|
|
21
|
+
// allow exclusion of this rule
|
|
22
|
+
if (docHasIgnoreTag(docs, CLASS_ON_PURPOSE_RULE)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
20
25
|
|
|
21
|
-
|
|
26
|
+
// Assert that all types that reference classes are not resource constructs. Those
|
|
27
|
+
// should be referenced via Interface.
|
|
28
|
+
e.assert(!type.type
|
|
29
|
+
|| !type.type.isClassType()
|
|
30
|
+
|| !CoreTypes.isResourceClass(type.type)
|
|
31
|
+
// Make an exception for `constructs.Construct`.
|
|
32
|
+
|| type.type.fqn === e.ctx.core.baseConstructClassFqn,
|
|
33
|
+
scope,
|
|
34
|
+
type.type?.fqn,
|
|
35
|
+
);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
});
|
|
22
40
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
41
|
+
apiLinter.add({
|
|
42
|
+
code: L2_INTERFACE_ON_PURPOSE_RULE,
|
|
43
|
+
message: 'API should prefer to use the L1 reference interface (IxxxRef) and not the L2 interface (%s). ' +
|
|
44
|
+
`If this is intentional, add "${ignoreTag(L2_INTERFACE_ON_PURPOSE_RULE)}" to element's jsdoc`,
|
|
45
|
+
eval: e => {
|
|
46
|
+
visitParameters(e.ctx.classType, {
|
|
47
|
+
visitType: function (type: reflect.TypeReference, docs: reflect.Docs, scope: string): void {
|
|
48
|
+
// allow exclusion of this rule
|
|
49
|
+
if (docHasIgnoreTag(docs, L2_INTERFACE_ON_PURPOSE_RULE)) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
26
52
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
53
|
+
// Assert that all types that interfaces are not L2 interfaces. This is actually not checking
|
|
54
|
+
// that they ARE Ref interfaces, just that they aren't L2 interfaces (could also be service-
|
|
55
|
+
// specific non-resource interfaces, and those are fine too)
|
|
56
|
+
e.assert(!type.type
|
|
57
|
+
|| !type.type.isInterfaceType()
|
|
58
|
+
|| type.type.datatype
|
|
59
|
+
|| !CoreTypes.isL2Interface(type.type),
|
|
60
|
+
scope,
|
|
61
|
+
type.type?.fqn,
|
|
62
|
+
);
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
});
|
|
30
67
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
68
|
+
function ignoreTag(rule: string) {
|
|
69
|
+
return `[disable-awslint:${rule}]`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function docHasIgnoreTag(docs: reflect.Docs, rule: string) {
|
|
73
|
+
const tag = ignoreTag(rule);
|
|
74
|
+
return docs.summary.includes(tag) || docs.remarks.includes(tag);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Visit all types in the API of a given type
|
|
79
|
+
*
|
|
80
|
+
* This visits method parameters and members of structs of method parameters.
|
|
81
|
+
*/
|
|
82
|
+
function visitParameters(root: reflect.Type, visitor: TypeVisitor) {
|
|
83
|
+
const visited = new Set<string>();
|
|
84
|
+
|
|
85
|
+
if (root.isClassType()) {
|
|
86
|
+
assertClass(root);
|
|
87
|
+
} else if (root.isInterfaceType()) {
|
|
88
|
+
assertInterface(root);
|
|
89
|
+
} else {
|
|
90
|
+
throw new Error(`invalid type: ${root.toString()}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function assertClass(type: reflect.ClassType): void {
|
|
94
|
+
if (visited.has(type.fqn)) { return; }
|
|
95
|
+
visited.add(type.fqn);
|
|
96
|
+
|
|
97
|
+
for (const method of type.allMethods) {
|
|
98
|
+
assertMethod(method);
|
|
34
99
|
}
|
|
35
100
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
assertProperty(property);
|
|
39
|
-
}
|
|
101
|
+
if (type.initializer) {
|
|
102
|
+
assertMethod(type.initializer);
|
|
40
103
|
}
|
|
104
|
+
}
|
|
41
105
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (type.datatype) {
|
|
47
|
-
assertDataType(type);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
for (const method of type.allMethods) {
|
|
51
|
-
assertMethod(method);
|
|
52
|
-
}
|
|
106
|
+
function assertDataType(type: reflect.InterfaceType): void {
|
|
107
|
+
for (const property of type.allProperties) {
|
|
108
|
+
assertProperty(property);
|
|
53
109
|
}
|
|
110
|
+
}
|
|
54
111
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
112
|
+
function assertInterface(type: reflect.InterfaceType): void {
|
|
113
|
+
if (visited.has(type.fqn)) { return; }
|
|
114
|
+
visited.add(type.fqn);
|
|
59
115
|
|
|
60
|
-
|
|
61
|
-
|
|
116
|
+
if (type.datatype) {
|
|
117
|
+
assertDataType(type);
|
|
62
118
|
}
|
|
63
119
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const site = method.overrides ? method.overrides : method.parentType;
|
|
70
|
-
const scope = `${site.fqn}.${method.name}`;
|
|
71
|
-
|
|
72
|
-
let firstMethod: reflect.Callable | undefined = site.isClassType() || site.isInterfaceType()
|
|
73
|
-
? site.allMethods.find(m => m.name === method.name)
|
|
74
|
-
: undefined;
|
|
75
|
-
|
|
76
|
-
if (!firstMethod) {
|
|
77
|
-
firstMethod = method;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
for (const param of firstMethod.parameters) {
|
|
81
|
-
assertType(param.type, param.docs, `${scope}.${param.name}`);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// note that we do not require that return values will use an interface
|
|
120
|
+
for (const method of type.allMethods) {
|
|
121
|
+
assertMethod(method);
|
|
85
122
|
}
|
|
123
|
+
}
|
|
86
124
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
125
|
+
function assertProperty(property: reflect.Property) {
|
|
126
|
+
if (property.protected) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
91
129
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
130
|
+
const site = property.overrides ? property.overrides : property.parentType;
|
|
131
|
+
assertType(property.type, property.docs, `${site.fqn}.${property.name}`);
|
|
132
|
+
}
|
|
95
133
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
134
|
+
function assertMethod(method: reflect.Callable) {
|
|
135
|
+
if (method.protected) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
99
138
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
139
|
+
const site = method.overrides ? method.overrides : method.parentType;
|
|
140
|
+
const scope = `${site.fqn}.${method.name}`;
|
|
103
141
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
142
|
+
let firstMethod: reflect.Callable | undefined = site.isClassType() || site.isInterfaceType()
|
|
143
|
+
? site.allMethods.find(m => m.name === method.name)
|
|
144
|
+
: undefined;
|
|
110
145
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
146
|
+
if (!firstMethod) {
|
|
147
|
+
firstMethod = method;
|
|
148
|
+
}
|
|
117
149
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
}
|
|
150
|
+
for (const param of firstMethod.parameters) {
|
|
151
|
+
assertType(param.type, param.docs, `${scope}.${param.name}`);
|
|
152
|
+
}
|
|
122
153
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
154
|
+
// note that we do not require that return values will use an interface
|
|
155
|
+
}
|
|
127
156
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (!CoreTypes.isResourceClass(type.type)) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
157
|
+
function assertType(type: reflect.TypeReference, docs: reflect.Docs, scope: string): void {
|
|
158
|
+
visitor.visitType(type, docs, scope);
|
|
133
159
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
160
|
+
// And recurse
|
|
161
|
+
if (type.arrayOfType) {
|
|
162
|
+
return assertType(type.arrayOfType, docs, scope);
|
|
163
|
+
}
|
|
137
164
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
}
|
|
165
|
+
if (type.mapOfType) {
|
|
166
|
+
return assertType(type.mapOfType, docs, scope);
|
|
167
|
+
}
|
|
142
168
|
|
|
143
|
-
|
|
144
|
-
|
|
169
|
+
if (type.unionOfTypes) {
|
|
170
|
+
for (const t of type.unionOfTypes) {
|
|
171
|
+
assertType(t, docs, scope);
|
|
145
172
|
}
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
146
175
|
|
|
147
|
-
|
|
176
|
+
// interfaces are okay
|
|
177
|
+
if (type.type && type.type.isInterfaceType()) {
|
|
178
|
+
return assertInterface(type.type);
|
|
148
179
|
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
interface TypeVisitor {
|
|
184
|
+
visitType(type: reflect.TypeReference, docs: reflect.Docs, scope: string): void;
|
|
185
|
+
}
|
|
@@ -25,6 +25,14 @@ export declare class CoreTypes {
|
|
|
25
25
|
* @returns true if `classType` represents an AWS resource (i.e. extends `cdk.Resource`).
|
|
26
26
|
*/
|
|
27
27
|
static isResourceClass(classType: reflect.ClassType): string | true | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* @returns true if `interfaceType` looks like an L2 interface (`IBucket`)
|
|
30
|
+
*/
|
|
31
|
+
static isL2Interface(interfaceType: reflect.InterfaceType): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* @returns true if `interfaceType` looks like an L1 Ref interface (`IBucketRef)`
|
|
34
|
+
*/
|
|
35
|
+
static isL1RefInterface(interfaceType: reflect.InterfaceType): boolean;
|
|
28
36
|
/**
|
|
29
37
|
* Return true if the nesting parent of the given interface is a CFN class
|
|
30
38
|
*/
|
package/lib/rules/core-types.js
CHANGED
|
@@ -62,6 +62,22 @@ class CoreTypes {
|
|
|
62
62
|
const baseResource = classType.system.findClass(CoreTypesFqn.Resource);
|
|
63
63
|
return classType.extends(baseResource) || (0, util_1.getDocTag)(classType, 'resource');
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* @returns true if `interfaceType` looks like an L2 interface (`IBucket`)
|
|
67
|
+
*/
|
|
68
|
+
static isL2Interface(interfaceType) {
|
|
69
|
+
// We determine this by it being a behavioral interface, and it inheriting from `IResource`.
|
|
70
|
+
const baseInterface = interfaceType.system.findInterface(CoreTypesFqn.ResourceInterface);
|
|
71
|
+
return !interfaceType.datatype && interfaceExtends(interfaceType, baseInterface);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @returns true if `interfaceType` looks like an L1 Ref interface (`IBucketRef)`
|
|
75
|
+
*/
|
|
76
|
+
static isL1RefInterface(interfaceType) {
|
|
77
|
+
// We determine this by it being a behavioral interface, and it living inside the `aws-cdk-lib.interfaces` namespace
|
|
78
|
+
// with a name ending in `Ref`.
|
|
79
|
+
return !interfaceType.datatype && interfaceType.fqn.startsWith('aws-cdk-lib.interfaces.') && interfaceType.name.endsWith('Ref');
|
|
80
|
+
}
|
|
65
81
|
/**
|
|
66
82
|
* Return true if the nesting parent of the given interface is a CFN class
|
|
67
83
|
*/
|
|
@@ -183,4 +199,7 @@ class CoreTypes {
|
|
|
183
199
|
}
|
|
184
200
|
}
|
|
185
201
|
exports.CoreTypes = CoreTypes;
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvcmUtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaUNBQW1DO0FBRW5DLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztBQUNsQyxJQUFLLFlBU0o7QUFURCxXQUFLLFlBQVk7SUFDZix1REFBdUMsQ0FBQTtJQUN2QyxpREFBaUMsQ0FBQTtJQUNqQywyREFBMkMsQ0FBQTtJQUMzQywrREFBK0MsQ0FBQTtJQUMvQyx5REFBeUMsQ0FBQTtJQUV6QyxrREFBa0MsQ0FBQTtJQUNsQyw0REFBNEMsQ0FBQTtBQUM5QyxDQUFDLEVBVEksWUFBWSxLQUFaLFlBQVksUUFTaEI7QUFFRCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQTBCO1FBQ3BELE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQW9CO1FBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FB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bUJBQW1CLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQVcsaUJBQWlCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFZ0IsR0FBRyxDQUFxQjtJQUV6QyxZQUFZLEdBQXVCO1FBQ2pDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLHFCQUFxQjtZQUNyQixPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXpNRCw4QkF5TUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBnZXREb2NUYWcgfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBDT1JFX01PRFVMRSA9ICdhd3MtY2RrLWxpYic7XG5lbnVtIENvcmVUeXBlc0ZxbiB7XG4gIENmblJlc291cmNlID0gJ2F3cy1jZGstbGliLkNmblJlc291cmNlJyxcbiAgUmVzb3VyY2UgPSAnYXdzLWNkay1saWIuUmVzb3VyY2UnLFxuICBSZXNvdXJjZUludGVyZmFjZSA9ICdhd3MtY2RrLWxpYi5JUmVzb3VyY2UnLFxuICBSZXNvbHZhYmxlSW50ZXJmYWNlID0gJ2F3cy1jZGstbGliLklSZXNvbHZhYmxlJyxcbiAgUGh5c2ljYWxOYW1lID0gJ2F3cy1jZGstbGliLlBoeXNpY2FsTmFtZScsXG5cbiAgQ29uc3RydWN0ID0gJ2NvbnN0cnVjdHMuQ29uc3RydWN0JyxcbiAgQ29uc3RydWN0SW50ZXJmYWNlID0gJ2NvbnN0cnVjdHMuSUNvbnN0cnVjdCcsXG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlVHlwZXMge1xuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhc3NlbWJseSBoYXMgdGhlIENvcmUgbW9kdWxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhc0NvcmVNb2R1bGUoYXNzZW1ibHk6IHJlZmxlY3QuQXNzZW1ibHkpIHtcbiAgICByZXR1cm4gKCFhc3NlbWJseS5zeXN0ZW0uYXNzZW1ibGllcy5maW5kKGEgPT4gYS5uYW1lID09PSBDT1JFX01PRFVMRSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYGNsYXNzVHlwZWAgcmVwcmVzZW50cyBhbiBMMSBDZm4gUmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDZm5SZXNvdXJjZShjOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGlmICghYy5zeXN0ZW0uaW5jbHVkZXNBc3NlbWJseShDT1JFX01PRFVMRSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBza2lwIENmblJlc291cmNlIGl0c2VsZlxuICAgIGlmIChjLmZxbiA9PT0gQ29yZVR5cGVzRnFuLkNmblJlc291cmNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQ29uc3RydWN0Q2xhc3MoYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjZm5SZXNvdXJjZUNsYXNzID0gYy5zeXN0ZW0uZmluZEZxbihDb3JlVHlwZXNGcW4uQ2ZuUmVzb3VyY2UpO1xuICAgIGlmICghYy5leHRlbmRzKGNmblJlc291cmNlQ2xhc3MpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGMubmFtZS5zdGFydHNXaXRoKCdDZm4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGBjbGFzc1R5cGVgIHJlcHJlc2VudHMgYSBDb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb25zdHJ1Y3RDbGFzcyhjOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGlmICghYy5zeXN0ZW0uaW5jbHVkZXNBc3NlbWJseShDT1JFX01PRFVMRSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWMuaXNDbGFzc1R5cGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChjLmFic3RyYWN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGMuZXh0ZW5kcyhjLnN5c3RlbS5maW5kRnFuKENvcmVUeXBlc0Zxbi5Db25zdHJ1Y3QpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGBjbGFzc1R5cGVgIHJlcHJlc2VudHMgYW4gQVdTIHJlc291cmNlIChpLmUuIGV4dGVuZHMgYGNkay5SZXNvdXJjZWApLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc1Jlc291cmNlQ2xhc3MoY2xhc3NUeXBlOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGNvbnN0IGJhc2VSZXNvdXJjZSA9IGNsYXNzVHlwZS5zeXN0ZW0uZmluZENsYXNzKENvcmVUeXBlc0Zxbi5SZXNvdXJjZSk7XG4gICAgcmV0dXJuIGNsYXNzVHlwZS5leHRlbmRzKGJhc2VSZXNvdXJjZSkgfHwgZ2V0RG9jVGFnKGNsYXNzVHlwZSwgJ3Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgdGhlIG5lc3RpbmcgcGFyZW50IG9mIHRoZSBnaXZlbiBpbnRlcmZhY2UgaXMgYSBDRk4gY2xhc3NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDZm5OZXN0ZWRUeXBlKGludGVyZmFjZVR5cGU6IHJlZmxlY3QuVHlwZSkge1xuICAgIHJldHVybiBpbnRlcmZhY2VUeXBlLm5lc3RpbmdQYXJlbnQgJiYgQ29yZVR5cGVzLmlzQ2ZuVHlwZShpbnRlcmZhY2VUeXBlLm5lc3RpbmdQYXJlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBpbnRlcmZhY2UgdHlwZSBpcyBhIENGTiBjbGFzcywgcHJvcCB0eXBlIG9yIGludGVyZmFjZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc0NmblR5cGUoaW50ZXJmYWNlVHlwZTogcmVmbGVjdC5UeXBlKTogYm9vbGVhbiB7XG4gICAgLy8gYXdzX3NlcnZpY2UuQ2ZuVGhlUmVzb3VyY2VcbiAgICBpZiAoaW50ZXJmYWNlVHlwZS5uYW1lLnN0YXJ0c1dpdGgoJ0NmbicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBhd3Nfc2VydmljZS5JVGhlUmVzb3VyY2VSZlxuICAgIGlmICgvXklcXHcrUmVmLy50ZXN0KGludGVyZmFjZVR5cGUubmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpbnRlcmZhY2VUeXBlLm5hbWVzcGFjZSkge1xuICAgICAgaWYgKGludGVyZmFjZVR5cGUubmFtZXNwYWNlLnN0YXJ0c1dpdGgoJ0NmbicpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lc3BhY2VQYXJ0cyA9IGludGVyZmFjZVR5cGUubmFtZXNwYWNlLnNwbGl0KCcuJyk7XG5cbiAgICAgIC8vIGF3c19zZXJ2aWNlLkNmblRoZVJlc291cmNlLlN1YlR5cGVcbiAgICAgIGlmIChuYW1lc3BhY2VQYXJ0cy5hdCgxKT8uc3RhcnRzV2l0aCgnQ2ZuJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGF3c19zZXJ2aWNlLm1peGlucy5DZm5UaGVSZXNvdXJjZS5TdWJUeXBlXG4gICAgICBpZiAobmFtZXNwYWNlUGFydHMuYXQoMSkgPT09ICdtaXhpbnMnICYmIG5hbWVzcGFjZVBhcnRzLmF0KDIpPy5zdGFydHNXaXRoKCdDZm4nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGNsYXNzVHlwZWAgZm9yIHRoZSBjb3JlIHR5cGUgQ29uc3RydWN0XG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGBiYXNlQ29uc3RydWN0Q2xhc3MoKWBcbiAgICovXG4gIHB1YmxpYyBnZXQgY29uc3RydWN0Q2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvbnN0cnVjdENsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGBjbGFzc1R5cGVgIGZvciB0aGUgY29yZSB0eXBlIENvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIGdldCBiYXNlQ29uc3RydWN0Q2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3lzLmZpbmRDbGFzcyh0aGlzLmJhc2VDb25zdHJ1Y3RDbGFzc0Zxbik7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGNsYXNzVHlwZWAgZm9yIHRoZSBjb3JlIHR5cGUgQ29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGJhc2VDb25zdHJ1Y3RDbGFzc0ZxbigpIHtcbiAgICByZXR1cm4gQ29yZVR5cGVzRnFuLkNvbnN0cnVjdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBgaW50ZXJmYWNldHlwZWAgZm9yIHRoZSBjb3JlIHR5cGUgQ29uc3RydWN0XG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIGBiYXNlQ29uc3RydWN0SW50ZXJmYWNlKClgXG4gICAqL1xuICBwdWJsaWMgZ2V0IGNvbnN0cnVjdEludGVyZmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29uc3RydWN0SW50ZXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGBpbnRlcmZhY2V0eXBlYCBmb3IgdGhlIGNvcmUgdHlwZSBDb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBnZXQgYmFzZUNvbnN0cnVjdEludGVyZmFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zeXMuZmluZEludGVyZmFjZSh0aGlzLmJhc2VDb25zdHJ1Y3RJbnRlcmZhY2VGcW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGZxbiBmb3IgZm9yIHRoZSBjb3JlIENvbnN0cnVjdCBpbnRlcmZhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgYmFzZUNvbnN0cnVjdEludGVyZmFjZUZxbigpIHtcbiAgICByZXR1cm4gQ29yZVR5cGVzRnFuLkNvbnN0cnVjdEludGVyZmFjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBgY2xhc3NUeXBlYCBmb3IgdGhlIGNvcmUgdHlwZSBSZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnN5cy5maW5kQ2xhc3ModGhpcy5yZXNvdXJjZUNsYXNzRnFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBmcW4gZm9yIHRoZSBjb3JlIHR5cGUgUmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VDbGFzc0ZxbigpIHtcbiAgICByZXR1cm4gQ29yZVR5cGVzRnFuLlJlc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGZxbiBmb3IgdGhlIGNvcmUgUmVzb3VyY2UgaW50ZXJmYWNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlSW50ZXJmYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnN5cy5maW5kSW50ZXJmYWNlKHRoaXMucmVzb3VyY2VJbnRlcmZhY2VGcW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGBpbnRlcmZhY2VUeXBlYCBmb3IgdGhlIGNvcmUgdHlwZSBSZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUludGVyZmFjZUZxbigpIHtcbiAgICByZXR1cm4gQ29yZVR5cGVzRnFuLlJlc291cmNlSW50ZXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGBjbGFzc1R5cGVgIGZvciB0aGUgY29yZSB0eXBlIFRva2VuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRva2VuSW50ZXJmYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnN5cy5maW5kSW50ZXJmYWNlKHRoaXMudG9rZW5JbnRlcmZhY2VGcW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGZxbiBmb3IgdGhlIGNvcmUgdHlwZSBUb2tlblxuICAgKi9cbiAgcHVibGljIGdldCB0b2tlbkludGVyZmFjZUZxbigpIHtcbiAgICByZXR1cm4gQ29yZVR5cGVzRnFuLlJlc29sdmFibGVJbnRlcmZhY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBoeXNpY2FsTmFtZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnN5cy5maW5kQ2xhc3MoQ29yZVR5cGVzRnFuLlBoeXNpY2FsTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IHN5czogcmVmbGVjdC5UeXBlU3lzdGVtO1xuXG4gIGNvbnN0cnVjdG9yKHN5czogcmVmbGVjdC5UeXBlU3lzdGVtKSB7XG4gICAgdGhpcy5zeXMgPSBzeXM7XG4gICAgaWYgKCFzeXMuaW5jbHVkZXNBc3NlbWJseShDT1JFX01PRFVMRSkpIHtcbiAgICAgIC8vIGRpc2FibGUtYWxsLWNoZWNrc1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
202
|
+
function interfaceExtends(interfaceType, baseInterface) {
|
|
203
|
+
return interfaceType.getInterfaces(true).some(i => i.fqn === baseInterface.fqn);
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvcmUtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaUNBQW1DO0FBRW5DLE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQztBQUNsQyxJQUFLLFlBU0o7QUFURCxXQUFLLFlBQVk7SUFDZix1REFBdUMsQ0FBQTtJQUN2QyxpREFBaUMsQ0FBQTtJQUNqQywyREFBMkMsQ0FBQTtJQUMzQywrREFBK0MsQ0FBQTtJQUMvQyx5REFBeUMsQ0FBQTtJQUV6QyxrREFBa0MsQ0FBQTtJQUNsQyw0REFBNEMsQ0FBQTtBQUM5QyxDQUFDLEVBVEksWUFBWSxLQUFaLFlBQVksUUFTaEI7QUFFRCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQTBCO1FBQ3BELE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQW9CO1FBQzlDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDNUMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FB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QUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZWZsZWN0IGZyb20gJ2pzaWktcmVmbGVjdCc7XG5pbXBvcnQgeyBnZXREb2NUYWcgfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBDT1JFX01PRFVMRSA9ICdhd3MtY2RrLWxpYic7XG5lbnVtIENvcmVUeXBlc0ZxbiB7XG4gIENmblJlc291cmNlID0gJ2F3cy1jZGstbGliLkNmblJlc291cmNlJyxcbiAgUmVzb3VyY2UgPSAnYXdzLWNkay1saWIuUmVzb3VyY2UnLFxuICBSZXNvdXJjZUludGVyZmFjZSA9ICdhd3MtY2RrLWxpYi5JUmVzb3VyY2UnLFxuICBSZXNvbHZhYmxlSW50ZXJmYWNlID0gJ2F3cy1jZGstbGliLklSZXNvbHZhYmxlJyxcbiAgUGh5c2ljYWxOYW1lID0gJ2F3cy1jZGstbGliLlBoeXNpY2FsTmFtZScsXG5cbiAgQ29uc3RydWN0ID0gJ2NvbnN0cnVjdHMuQ29uc3RydWN0JyxcbiAgQ29uc3RydWN0SW50ZXJmYWNlID0gJ2NvbnN0cnVjdHMuSUNvbnN0cnVjdCcsXG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlVHlwZXMge1xuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBhc3NlbWJseSBoYXMgdGhlIENvcmUgbW9kdWxlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhc0NvcmVNb2R1bGUoYXNzZW1ibHk6IHJlZmxlY3QuQXNzZW1ibHkpIHtcbiAgICByZXR1cm4gKCFhc3NlbWJseS5zeXN0ZW0uYXNzZW1ibGllcy5maW5kKGEgPT4gYS5uYW1lID09PSBDT1JFX01PRFVMRSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgYGNsYXNzVHlwZWAgcmVwcmVzZW50cyBhbiBMMSBDZm4gUmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDZm5SZXNvdXJjZShjOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGlmICghYy5zeXN0ZW0uaW5jbHVkZXNBc3NlbWJseShDT1JFX01PRFVMRSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBza2lwIENmblJlc291cmNlIGl0c2VsZlxuICAgIGlmIChjLmZxbiA9PT0gQ29yZVR5cGVzRnFuLkNmblJlc291cmNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzQ29uc3RydWN0Q2xhc3MoYykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBjZm5SZXNvdXJjZUNsYXNzID0gYy5zeXN0ZW0uZmluZEZxbihDb3JlVHlwZXNGcW4uQ2ZuUmVzb3VyY2UpO1xuICAgIGlmICghYy5leHRlbmRzKGNmblJlc291cmNlQ2xhc3MpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGMubmFtZS5zdGFydHNXaXRoKCdDZm4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGBjbGFzc1R5cGVgIHJlcHJlc2VudHMgYSBDb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNDb25zdHJ1Y3RDbGFzcyhjOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGlmICghYy5zeXN0ZW0uaW5jbHVkZXNBc3NlbWJseShDT1JFX01PRFVMRSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIWMuaXNDbGFzc1R5cGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChjLmFic3RyYWN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIGMuZXh0ZW5kcyhjLnN5c3RlbS5maW5kRnFuKENvcmVUeXBlc0Zxbi5Db25zdHJ1Y3QpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGBjbGFzc1R5cGVgIHJlcHJlc2VudHMgYW4gQVdTIHJlc291cmNlIChpLmUuIGV4dGVuZHMgYGNkay5SZXNvdXJjZWApLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc1Jlc291cmNlQ2xhc3MoY2xhc3NUeXBlOiByZWZsZWN0LkNsYXNzVHlwZSkge1xuICAgIGNvbnN0IGJhc2VSZXNvdXJjZSA9IGNsYXNzVHlwZS5zeXN0ZW0uZmluZENsYXNzKENvcmVUeXBlc0Zxbi5SZXNvdXJjZSk7XG4gICAgcmV0dXJuIGNsYXNzVHlwZS5leHRlbmRzKGJhc2VSZXNvdXJjZSkgfHwgZ2V0RG9jVGFnKGNsYXNzVHlwZSwgJ3Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBgaW50ZXJmYWNlVHlwZWAgbG9va3MgbGlrZSBhbiBMMiBpbnRlcmZhY2UgKGBJQnVja2V0YClcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaXNMMkludGVyZmFjZShpbnRlcmZhY2VUeXBlOiByZWZsZWN0LkludGVyZmFjZVR5cGUpIHtcbiAgICAvLyBXZSBkZXRlcm1pbmUgdGhpcyBieSBpdCBiZWluZyBhIGJlaGF2aW9yYWwgaW50ZXJmYWNlLCBhbmQgaXQgaW5oZXJpdGluZyBmcm9tIGBJUmVzb3VyY2VgLlxuICAgIGNvbnN0IGJhc2VJbnRlcmZhY2UgPSBpbnRlcmZhY2VUeXBlLnN5c3RlbS5maW5kSW50ZXJmYWNlKENvcmVUeXBlc0Zxbi5SZXNvdXJjZUludGVyZmFjZSk7XG4gICAgcmV0dXJuICFpbnRlcmZhY2VUeXBlLmRhdGF0eXBlICYmIGludGVyZmFjZUV4dGVuZHMoaW50ZXJmYWNlVHlwZSwgYmFzZUludGVyZmFjZSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBgaW50ZXJmYWNlVHlwZWAgbG9va3MgbGlrZSBhbiBMMSBSZWYgaW50ZXJmYWNlIChgSUJ1Y2tldFJlZilgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzTDFSZWZJbnRlcmZhY2UoaW50ZXJmYWNlVHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlKSB7XG4gICAgLy8gV2UgZGV0ZXJtaW5lIHRoaXMgYnkgaXQgYmVpbmcgYSBiZWhhdmlvcmFsIGludGVyZmFjZSwgYW5kIGl0IGxpdmluZyBpbnNpZGUgdGhlIGBhd3MtY2RrLWxpYi5pbnRlcmZhY2VzYCBuYW1lc3BhY2VcbiAgICAvLyB3aXRoIGEgbmFtZSBlbmRpbmcgaW4gYFJlZmAuXG4gICAgcmV0dXJuICFpbnRlcmZhY2VUeXBlLmRhdGF0eXBlICYmIGludGVyZmFjZVR5cGUuZnFuLnN0YXJ0c1dpdGgoJ2F3cy1jZGstbGliLmludGVyZmFjZXMuJykgJiYgaW50ZXJmYWNlVHlwZS5uYW1lLmVuZHNXaXRoKCdSZWYnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbmVzdGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGludGVyZmFjZSBpcyBhIENGTiBjbGFzc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpc0Nmbk5lc3RlZFR5cGUoaW50ZXJmYWNlVHlwZTogcmVmbGVjdC5UeXBlKSB7XG4gICAgcmV0dXJuIGludGVyZmFjZVR5cGUubmVzdGluZ1BhcmVudCAmJiBDb3JlVHlwZXMuaXNDZm5UeXBlKGludGVyZmFjZVR5cGUubmVzdGluZ1BhcmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGludGVyZmFjZSB0eXBlIGlzIGEgQ0ZOIGNsYXNzLCBwcm9wIHR5cGUgb3IgaW50ZXJmYWNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlzQ2ZuVHlwZShpbnRlcmZhY2VUeXBlOiByZWZsZWN0LlR5cGUpOiBib29sZWFuIHtcbiAgICAvLyBhd3Nfc2VydmljZS5DZm5UaGVSZXNvdXJjZVxuICAgIGlmIChpbnRlcmZhY2VUeXBlLm5hbWUuc3RhcnRzV2l0aCgnQ2ZuJykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIGF3c19zZXJ2aWNlLklUaGVSZXNvdXJjZVJmXG4gICAgaWYgKC9eSVxcdytSZWYvLnRlc3QoaW50ZXJmYWNlVHlwZS5uYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGludGVyZmFjZVR5cGUubmFtZXNwYWNlKSB7XG4gICAgICBpZiAoaW50ZXJmYWNlVHlwZS5uYW1lc3BhY2Uuc3RhcnRzV2l0aCgnQ2ZuJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWVzcGFjZVBhcnRzID0gaW50ZXJmYWNlVHlwZS5uYW1lc3BhY2Uuc3BsaXQoJy4nKTtcblxuICAgICAgLy8gYXdzX3NlcnZpY2UuQ2ZuVGhlUmVzb3VyY2UuU3ViVHlwZVxuICAgICAgaWYgKG5hbWVzcGFjZVBhcnRzLmF0KDEpPy5zdGFydHNXaXRoKCdDZm4nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYXdzX3NlcnZpY2UubWl4aW5zLkNmblRoZVJlc291cmNlLlN1YlR5cGVcbiAgICAgIGlmIChuYW1lc3BhY2VQYXJ0cy5hdCgxKSA9PT0gJ21peGlucycgJiYgbmFtZXNwYWNlUGFydHMuYXQoMik/LnN0YXJ0c1dpdGgoJ0NmbicpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBgY2xhc3NUeXBlYCBmb3IgdGhlIGNvcmUgdHlwZSBDb25zdHJ1Y3RcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgYGJhc2VDb25zdHJ1Y3RDbGFzcygpYFxuICAgKi9cbiAgcHVibGljIGdldCBjb25zdHJ1Y3RDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlQ29uc3RydWN0Q2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGNsYXNzVHlwZWAgZm9yIHRoZSBjb3JlIHR5cGUgQ29uc3RydWN0XG4gICAqL1xuICBwdWJsaWMgZ2V0IGJhc2VDb25zdHJ1Y3RDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5zeXMuZmluZENsYXNzKHRoaXMuYmFzZUNvbnN0cnVjdENsYXNzRnFuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBgY2xhc3NUeXBlYCBmb3IgdGhlIGNvcmUgdHlwZSBDb25zdHJ1Y3RcbiAgICovXG4gIHB1YmxpYyBnZXQgYmFzZUNvbnN0cnVjdENsYXNzRnFuKCkge1xuICAgIHJldHVybiBDb3JlVHlwZXNGcW4uQ29uc3RydWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGBpbnRlcmZhY2V0eXBlYCBmb3IgdGhlIGNvcmUgdHlwZSBDb25zdHJ1Y3RcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgYGJhc2VDb25zdHJ1Y3RJbnRlcmZhY2UoKWBcbiAgICovXG4gIHB1YmxpYyBnZXQgY29uc3RydWN0SW50ZXJmYWNlKCkge1xuICAgIHJldHVybiB0aGlzLmJhc2VDb25zdHJ1Y3RJbnRlcmZhY2U7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGludGVyZmFjZXR5cGVgIGZvciB0aGUgY29yZSB0eXBlIENvbnN0cnVjdFxuICAgKi9cbiAgcHVibGljIGdldCBiYXNlQ29uc3RydWN0SW50ZXJmYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnN5cy5maW5kSW50ZXJmYWNlKHRoaXMuYmFzZUNvbnN0cnVjdEludGVyZmFjZUZxbik7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgZnFuIGZvciBmb3IgdGhlIGNvcmUgQ29uc3RydWN0IGludGVyZmFjZVxuICAgKi9cbiAgcHVibGljIGdldCBiYXNlQ29uc3RydWN0SW50ZXJmYWNlRnFuKCkge1xuICAgIHJldHVybiBDb3JlVHlwZXNGcW4uQ29uc3RydWN0SW50ZXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGBjbGFzc1R5cGVgIGZvciB0aGUgY29yZSB0eXBlIFJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3lzLmZpbmRDbGFzcyh0aGlzLnJlc291cmNlQ2xhc3NGcW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGZxbiBmb3IgdGhlIGNvcmUgdHlwZSBSZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIGdldCByZXNvdXJjZUNsYXNzRnFuKCkge1xuICAgIHJldHVybiBDb3JlVHlwZXNGcW4uUmVzb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgZnFuIGZvciB0aGUgY29yZSBSZXNvdXJjZSBpbnRlcmZhY2VcbiAgICovXG4gIHB1YmxpYyBnZXQgcmVzb3VyY2VJbnRlcmZhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3lzLmZpbmRJbnRlcmZhY2UodGhpcy5yZXNvdXJjZUludGVyZmFjZUZxbik7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGludGVyZmFjZVR5cGVgIGZvciB0aGUgY29yZSB0eXBlIFJlc291cmNlXG4gICAqL1xuICBwdWJsaWMgZ2V0IHJlc291cmNlSW50ZXJmYWNlRnFuKCkge1xuICAgIHJldHVybiBDb3JlVHlwZXNGcW4uUmVzb3VyY2VJbnRlcmZhY2U7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgYGNsYXNzVHlwZWAgZm9yIHRoZSBjb3JlIHR5cGUgVG9rZW5cbiAgICovXG4gIHB1YmxpYyBnZXQgdG9rZW5JbnRlcmZhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3lzLmZpbmRJbnRlcmZhY2UodGhpcy50b2tlbkludGVyZmFjZUZxbik7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgZnFuIGZvciB0aGUgY29yZSB0eXBlIFRva2VuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHRva2VuSW50ZXJmYWNlRnFuKCkge1xuICAgIHJldHVybiBDb3JlVHlwZXNGcW4uUmVzb2x2YWJsZUludGVyZmFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGh5c2ljYWxOYW1lQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3lzLmZpbmRDbGFzcyhDb3JlVHlwZXNGcW4uUGh5c2ljYWxOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgc3lzOiByZWZsZWN0LlR5cGVTeXN0ZW07XG5cbiAgY29uc3RydWN0b3Ioc3lzOiByZWZsZWN0LlR5cGVTeXN0ZW0pIHtcbiAgICB0aGlzLnN5cyA9IHN5cztcbiAgICBpZiAoIXN5cy5pbmNsdWRlc0Fzc2VtYmx5KENPUkVfTU9EVUxFKSkge1xuICAgICAgLy8gZGlzYWJsZS1hbGwtY2hlY2tzXG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGludGVyZmFjZUV4dGVuZHMoaW50ZXJmYWNlVHlwZTogcmVmbGVjdC5JbnRlcmZhY2VUeXBlLCBiYXNlSW50ZXJmYWNlOiByZWZsZWN0LkludGVyZmFjZVR5cGUpIHtcbiAgcmV0dXJuIGludGVyZmFjZVR5cGUuZ2V0SW50ZXJmYWNlcyh0cnVlKS5zb21lKGkgPT4gaS5mcW4gPT09IGJhc2VJbnRlcmZhY2UuZnFuKTtcbn1cbiJdfQ==
|
package/lib/rules/core-types.ts
CHANGED
|
@@ -73,6 +73,24 @@ export class CoreTypes {
|
|
|
73
73
|
return classType.extends(baseResource) || getDocTag(classType, 'resource');
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
/**
|
|
77
|
+
* @returns true if `interfaceType` looks like an L2 interface (`IBucket`)
|
|
78
|
+
*/
|
|
79
|
+
public static isL2Interface(interfaceType: reflect.InterfaceType) {
|
|
80
|
+
// We determine this by it being a behavioral interface, and it inheriting from `IResource`.
|
|
81
|
+
const baseInterface = interfaceType.system.findInterface(CoreTypesFqn.ResourceInterface);
|
|
82
|
+
return !interfaceType.datatype && interfaceExtends(interfaceType, baseInterface);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* @returns true if `interfaceType` looks like an L1 Ref interface (`IBucketRef)`
|
|
87
|
+
*/
|
|
88
|
+
public static isL1RefInterface(interfaceType: reflect.InterfaceType) {
|
|
89
|
+
// We determine this by it being a behavioral interface, and it living inside the `aws-cdk-lib.interfaces` namespace
|
|
90
|
+
// with a name ending in `Ref`.
|
|
91
|
+
return !interfaceType.datatype && interfaceType.fqn.startsWith('aws-cdk-lib.interfaces.') && interfaceType.name.endsWith('Ref');
|
|
92
|
+
}
|
|
93
|
+
|
|
76
94
|
/**
|
|
77
95
|
* Return true if the nesting parent of the given interface is a CFN class
|
|
78
96
|
*/
|
|
@@ -215,3 +233,7 @@ export class CoreTypes {
|
|
|
215
233
|
}
|
|
216
234
|
}
|
|
217
235
|
}
|
|
236
|
+
|
|
237
|
+
function interfaceExtends(interfaceType: reflect.InterfaceType, baseInterface: reflect.InterfaceType) {
|
|
238
|
+
return interfaceType.getInterfaces(true).some(i => i.fqn === baseInterface.fqn);
|
|
239
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.grantsMethodsLinter = void 0;
|
|
4
|
+
const linter_1 = require("../linter");
|
|
5
|
+
const EXCLUDE_ANNOTATION_NO_GRANTS = '[disable-awslint:no-grants]';
|
|
6
|
+
exports.grantsMethodsLinter = new linter_1.Linter(assembly => assembly.allClasses);
|
|
7
|
+
exports.grantsMethodsLinter.add({
|
|
8
|
+
code: 'no-grants',
|
|
9
|
+
message: 'L2 constructs are not allowed to have new "grantXxx()" methods. Create or re-use a companion <Contruct>Grants class instead.',
|
|
10
|
+
eval: e => {
|
|
11
|
+
Object.values(e.ctx.getMethods())
|
|
12
|
+
.filter(m => !m.static)
|
|
13
|
+
.filter(m => !m.abstract)
|
|
14
|
+
.filter(m => m.name.startsWith('grant') && m.name !== 'grantOnKey')
|
|
15
|
+
.filter(m => m.parameters.length > 0 && m.parameters[0].type.fqn === 'aws-cdk-lib.aws_iam.IGrantable')
|
|
16
|
+
.forEach((grant) => {
|
|
17
|
+
e.assert(isExempted(grant), `${e.ctx.fqn}.${grant.name}`);
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
function isExempted(method) {
|
|
22
|
+
const docs = method.docs;
|
|
23
|
+
return [docs.summary, docs.remarks].some(doc => doc.includes(EXCLUDE_ANNOTATION_NO_GRANTS));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhbnQtbWV0aG9kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdyYW50LW1ldGhvZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esc0NBQW1DO0FBRW5DLE1BQU0sNEJBQTRCLEdBQUcsNkJBQTZCLENBQUM7QUFFdEQsUUFBQSxtQkFBbUIsR0FBRyxJQUFJLGVBQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUUvRSwyQkFBbUIsQ0FBQyxHQUFHLENBQUM7SUFDdEIsSUFBSSxFQUFFLFdBQVc7SUFDakIsT0FBTyxFQUFFLDhIQUE4SDtJQUN2SSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDUixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQzthQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQzthQUNsRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLGdDQUFnQyxDQUFDO2FBQ3JHLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2pCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0YsQ0FBQyxDQUFDO0FBRUgsU0FBUyxVQUFVLENBQUMsTUFBYztJQUNoQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQztBQUM5RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWV0aG9kIH0gZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7IExpbnRlciB9IGZyb20gJy4uL2xpbnRlcic7XG5cbmNvbnN0IEVYQ0xVREVfQU5OT1RBVElPTl9OT19HUkFOVFMgPSAnW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdJztcblxuZXhwb3J0IGNvbnN0IGdyYW50c01ldGhvZHNMaW50ZXIgPSBuZXcgTGludGVyKGFzc2VtYmx5ID0+IGFzc2VtYmx5LmFsbENsYXNzZXMpO1xuXG5ncmFudHNNZXRob2RzTGludGVyLmFkZCh7XG4gIGNvZGU6ICduby1ncmFudHMnLFxuICBtZXNzYWdlOiAnTDIgY29uc3RydWN0cyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBuZXcgXCJncmFudFh4eCgpXCIgbWV0aG9kcy4gQ3JlYXRlIG9yIHJlLXVzZSBhIGNvbXBhbmlvbiA8Q29udHJ1Y3Q+R3JhbnRzIGNsYXNzIGluc3RlYWQuJyxcbiAgZXZhbDogZSA9PiB7XG4gICAgT2JqZWN0LnZhbHVlcyhlLmN0eC5nZXRNZXRob2RzKCkpXG4gICAgICAuZmlsdGVyKG0gPT4gIW0uc3RhdGljKVxuICAgICAgLmZpbHRlcihtID0+ICFtLmFic3RyYWN0KVxuICAgICAgLmZpbHRlcihtID0+IG0ubmFtZS5zdGFydHNXaXRoKCdncmFudCcpICYmIG0ubmFtZSAhPT0gJ2dyYW50T25LZXknKVxuICAgICAgLmZpbHRlcihtID0+IG0ucGFyYW1ldGVycy5sZW5ndGggPiAwICYmIG0ucGFyYW1ldGVyc1swXS50eXBlLmZxbiA9PT0gJ2F3cy1jZGstbGliLmF3c19pYW0uSUdyYW50YWJsZScpXG4gICAgICAuZm9yRWFjaCgoZ3JhbnQpID0+IHtcbiAgICAgICAgZS5hc3NlcnQoaXNFeGVtcHRlZChncmFudCksIGAke2UuY3R4LmZxbn0uJHtncmFudC5uYW1lfWApO1xuICAgICAgfSk7XG4gIH0sXG59KTtcblxuZnVuY3Rpb24gaXNFeGVtcHRlZChtZXRob2Q6IE1ldGhvZCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb2NzID0gbWV0aG9kLmRvY3M7XG4gIHJldHVybiBbZG9jcy5zdW1tYXJ5LCBkb2NzLnJlbWFya3NdLnNvbWUoZG9jID0+IGRvYy5pbmNsdWRlcyhFWENMVURFX0FOTk9UQVRJT05fTk9fR1JBTlRTKSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Method } from 'jsii-reflect';
|
|
2
|
+
import { Linter } from '../linter';
|
|
3
|
+
|
|
4
|
+
const EXCLUDE_ANNOTATION_NO_GRANTS = '[disable-awslint:no-grants]';
|
|
5
|
+
|
|
6
|
+
export const grantsMethodsLinter = new Linter(assembly => assembly.allClasses);
|
|
7
|
+
|
|
8
|
+
grantsMethodsLinter.add({
|
|
9
|
+
code: 'no-grants',
|
|
10
|
+
message: 'L2 constructs are not allowed to have new "grantXxx()" methods. Create or re-use a companion <Contruct>Grants class instead.',
|
|
11
|
+
eval: e => {
|
|
12
|
+
Object.values(e.ctx.getMethods())
|
|
13
|
+
.filter(m => !m.static)
|
|
14
|
+
.filter(m => !m.abstract)
|
|
15
|
+
.filter(m => m.name.startsWith('grant') && m.name !== 'grantOnKey')
|
|
16
|
+
.filter(m => m.parameters.length > 0 && m.parameters[0].type.fqn === 'aws-cdk-lib.aws_iam.IGrantable')
|
|
17
|
+
.forEach((grant) => {
|
|
18
|
+
e.assert(isExempted(grant), `${e.ctx.fqn}.${grant.name}`);
|
|
19
|
+
});
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
function isExempted(method: Method): boolean {
|
|
24
|
+
const docs = method.docs;
|
|
25
|
+
return [docs.summary, docs.remarks].some(doc => doc.includes(EXCLUDE_ANNOTATION_NO_GRANTS));
|
|
26
|
+
}
|
package/lib/rules/index.js
CHANGED
|
@@ -16,5 +16,6 @@ const no_unused_type_1 = require("./no-unused-type");
|
|
|
16
16
|
const public_static_properties_1 = require("./public-static-properties");
|
|
17
17
|
const resource_1 = require("./resource");
|
|
18
18
|
const linter_1 = require("../linter");
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const grant_methods_1 = require("./grant-methods");
|
|
20
|
+
exports.ALL_RULES_LINTER = new linter_1.AggregateLinter(module_1.moduleLinter, construct_1.constructLinter, cfn_resource_1.cfnResourceLinter, resource_1.resourceLinter, api_1.apiLinter, imports_1.importsLinter, attributes_1.attributesLinter, exports_1.exportsLinter, cloudwatch_events_1.eventsLinter, integrations_1.integrationLinter, no_unused_type_1.noUnusedTypeLinter, durations_1.durationsLinter, public_static_properties_1.publicStaticPropertiesLinter, docs_1.docsLinter, grant_methods_1.grantsMethodsLinter);
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBa0M7QUFDbEMsNkNBQWdEO0FBQ2hELGlEQUFtRDtBQUNuRCwyREFBbUQ7QUFDbkQsMkNBQThDO0FBQzlDLGlDQUFvQztBQUNwQywyQ0FBOEM7QUFDOUMsdUNBQTBDO0FBQzFDLHVDQUEwQztBQUMxQyxpREFBbUQ7QUFDbkQscUNBQXdDO0FBQ3hDLHFEQUFzRDtBQUN0RCx5RUFBMEU7QUFDMUUseUNBQTRDO0FBQzVDLHNDQUE0QztBQUM1QyxtREFBc0Q7QUFFekMsUUFBQSxnQkFBZ0IsR0FBRyxJQUFJLHdCQUFlLENBQ2pELHFCQUFZLEVBQ1osMkJBQWUsRUFDZixnQ0FBaUIsRUFDakIseUJBQWMsRUFDZCxlQUFTLEVBQ1QsdUJBQWEsRUFDYiw2QkFBZ0IsRUFDaEIsdUJBQWEsRUFDYixnQ0FBWSxFQUNaLGdDQUFpQixFQUNqQixtQ0FBa0IsRUFDbEIsMkJBQWUsRUFDZix1REFBNEIsRUFDNUIsaUJBQVUsRUFDVixtQ0FBbUIsQ0FDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFwaUxpbnRlciB9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7IGF0dHJpYnV0ZXNMaW50ZXIgfSBmcm9tICcuL2F0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgY2ZuUmVzb3VyY2VMaW50ZXIgfSBmcm9tICcuL2Nmbi1yZXNvdXJjZSc7XG5pbXBvcnQgeyBldmVudHNMaW50ZXIgfSBmcm9tICcuL2Nsb3Vkd2F0Y2gtZXZlbnRzJztcbmltcG9ydCB7IGNvbnN0cnVjdExpbnRlciB9IGZyb20gJy4vY29uc3RydWN0JztcbmltcG9ydCB7IGRvY3NMaW50ZXIgfSBmcm9tICcuL2RvY3MnO1xuaW1wb3J0IHsgZHVyYXRpb25zTGludGVyIH0gZnJvbSAnLi9kdXJhdGlvbnMnO1xuaW1wb3J0IHsgZXhwb3J0c0xpbnRlciB9IGZyb20gJy4vZXhwb3J0cyc7XG5pbXBvcnQgeyBpbXBvcnRzTGludGVyIH0gZnJvbSAnLi9pbXBvcnRzJztcbmltcG9ydCB7IGludGVncmF0aW9uTGludGVyIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbnMnO1xuaW1wb3J0IHsgbW9kdWxlTGludGVyIH0gZnJvbSAnLi9tb2R1bGUnO1xuaW1wb3J0IHsgbm9VbnVzZWRUeXBlTGludGVyIH0gZnJvbSAnLi9uby11bnVzZWQtdHlwZSc7XG5pbXBvcnQgeyBwdWJsaWNTdGF0aWNQcm9wZXJ0aWVzTGludGVyIH0gZnJvbSAnLi9wdWJsaWMtc3RhdGljLXByb3BlcnRpZXMnO1xuaW1wb3J0IHsgcmVzb3VyY2VMaW50ZXIgfSBmcm9tICcuL3Jlc291cmNlJztcbmltcG9ydCB7IEFnZ3JlZ2F0ZUxpbnRlciB9IGZyb20gJy4uL2xpbnRlcic7XG5pbXBvcnQgeyBncmFudHNNZXRob2RzTGludGVyIH0gZnJvbSAnLi9ncmFudC1tZXRob2RzJztcblxuZXhwb3J0IGNvbnN0IEFMTF9SVUxFU19MSU5URVIgPSBuZXcgQWdncmVnYXRlTGludGVyKFxuICBtb2R1bGVMaW50ZXIsXG4gIGNvbnN0cnVjdExpbnRlcixcbiAgY2ZuUmVzb3VyY2VMaW50ZXIsXG4gIHJlc291cmNlTGludGVyLFxuICBhcGlMaW50ZXIsXG4gIGltcG9ydHNMaW50ZXIsXG4gIGF0dHJpYnV0ZXNMaW50ZXIsXG4gIGV4cG9ydHNMaW50ZXIsXG4gIGV2ZW50c0xpbnRlcixcbiAgaW50ZWdyYXRpb25MaW50ZXIsXG4gIG5vVW51c2VkVHlwZUxpbnRlcixcbiAgZHVyYXRpb25zTGludGVyLFxuICBwdWJsaWNTdGF0aWNQcm9wZXJ0aWVzTGludGVyLFxuICBkb2NzTGludGVyLFxuICBncmFudHNNZXRob2RzTGludGVyLFxuKTtcbiJdfQ==
|
package/lib/rules/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { noUnusedTypeLinter } from './no-unused-type';
|
|
|
13
13
|
import { publicStaticPropertiesLinter } from './public-static-properties';
|
|
14
14
|
import { resourceLinter } from './resource';
|
|
15
15
|
import { AggregateLinter } from '../linter';
|
|
16
|
+
import { grantsMethodsLinter } from './grant-methods';
|
|
16
17
|
|
|
17
18
|
export const ALL_RULES_LINTER = new AggregateLinter(
|
|
18
19
|
moduleLinter,
|
|
@@ -29,4 +30,5 @@ export const ALL_RULES_LINTER = new AggregateLinter(
|
|
|
29
30
|
durationsLinter,
|
|
30
31
|
publicStaticPropertiesLinter,
|
|
31
32
|
docsLinter,
|
|
33
|
+
grantsMethodsLinter,
|
|
32
34
|
);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "awslint",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.235.0-alpha.0",
|
|
4
4
|
"description": "Enforces the AWS Construct Library guidelines",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsc -b && eslint && pkglint && chmod +x bin/awslint",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"yargs": "^16.2.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@aws-cdk/eslint-config": "2.
|
|
30
|
-
"@aws-cdk/pkglint": "2.
|
|
29
|
+
"@aws-cdk/eslint-config": "2.235.0-alpha.0",
|
|
30
|
+
"@aws-cdk/pkglint": "2.235.0-alpha.0",
|
|
31
31
|
"@types/fs-extra": "^9.0.13",
|
|
32
32
|
"@types/jest": "^29.5.14",
|
|
33
33
|
"@types/yargs": "^15.0.20",
|