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 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 EXCLUDE_ANNOTATION_REF_VIA_INTERFACE = '[disable-awslint:ref-via-interface]';
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: 'ref-via-interface',
14
- message: 'API should use interface and not the concrete class (%s). ' +
15
- `If this is intentional, add "${EXCLUDE_ANNOTATION_REF_VIA_INTERFACE}" to element's jsdoc`,
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
- const cls = e.ctx.classType;
18
- const visited = new Set();
19
- assertClass(cls);
20
- function assertClass(type) {
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.summary.includes(EXCLUDE_ANNOTATION_REF_VIA_INTERFACE) || docs.remarks.includes(EXCLUDE_ANNOTATION_REF_VIA_INTERFACE)) {
43
+ if (docHasIgnoreTag(docs, L2_INTERFACE_ON_PURPOSE_RULE)) {
116
44
  return;
117
45
  }
118
- e.assert(false, scope, type.type.fqn);
119
- return;
120
- }
121
- throw new Error(`invalid type reference: ${type.toString()}`);
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 EXCLUDE_ANNOTATION_REF_VIA_INTERFACE = '[disable-awslint:ref-via-interface]';
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: 'ref-via-interface',
15
- message: 'API should use interface and not the concrete class (%s). ' +
16
- `If this is intentional, add "${EXCLUDE_ANNOTATION_REF_VIA_INTERFACE}" to element's jsdoc`,
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
- const cls = e.ctx.classType;
19
- const visited = new Set<string>();
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
- assertClass(cls);
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
- function assertClass(type: reflect.ClassType): void {
24
- if (visited.has(type.fqn)) { return; }
25
- visited.add(type.fqn);
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
- for (const method of type.allMethods) {
28
- assertMethod(method);
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
- if (type.initializer) {
32
- assertMethod(type.initializer);
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
- function assertDataType(type: reflect.InterfaceType): void {
37
- for (const property of type.allProperties) {
38
- assertProperty(property);
39
- }
101
+ if (type.initializer) {
102
+ assertMethod(type.initializer);
40
103
  }
104
+ }
41
105
 
42
- function assertInterface(type: reflect.InterfaceType): void {
43
- if (visited.has(type.fqn)) { return; }
44
- visited.add(type.fqn);
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
- function assertProperty(property: reflect.Property) {
56
- if (property.protected) {
57
- return;
58
- }
112
+ function assertInterface(type: reflect.InterfaceType): void {
113
+ if (visited.has(type.fqn)) { return; }
114
+ visited.add(type.fqn);
59
115
 
60
- const site = property.overrides ? property.overrides : property.parentType;
61
- assertType(property.type, property.docs, `${site.fqn}.${property.name}`);
116
+ if (type.datatype) {
117
+ assertDataType(type);
62
118
  }
63
119
 
64
- function assertMethod(method: reflect.Callable) {
65
- if (method.protected) {
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
- function assertType(type: reflect.TypeReference, docs: reflect.Docs, scope: string): void {
88
- if (type.primitive) {
89
- return;
90
- }
125
+ function assertProperty(property: reflect.Property) {
126
+ if (property.protected) {
127
+ return;
128
+ }
91
129
 
92
- if (type.void) {
93
- return;
94
- }
130
+ const site = property.overrides ? property.overrides : property.parentType;
131
+ assertType(property.type, property.docs, `${site.fqn}.${property.name}`);
132
+ }
95
133
 
96
- if (type.arrayOfType) {
97
- return assertType(type.arrayOfType, docs, scope);
98
- }
134
+ function assertMethod(method: reflect.Callable) {
135
+ if (method.protected) {
136
+ return;
137
+ }
99
138
 
100
- if (type.mapOfType) {
101
- return assertType(type.mapOfType, docs, scope);
102
- }
139
+ const site = method.overrides ? method.overrides : method.parentType;
140
+ const scope = `${site.fqn}.${method.name}`;
103
141
 
104
- if (type.unionOfTypes) {
105
- for (const t of type.unionOfTypes) {
106
- assertType(t, docs, scope);
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
- if (type.intersectionOfTypes) {
112
- for (const t of type.intersectionOfTypes) {
113
- assertType(t, docs, scope);
114
- }
115
- return;
116
- }
146
+ if (!firstMethod) {
147
+ firstMethod = method;
148
+ }
117
149
 
118
- // interfaces are okay
119
- if (type.type && type.type.isInterfaceType()) {
120
- return assertInterface(type.type);
121
- }
150
+ for (const param of firstMethod.parameters) {
151
+ assertType(param.type, param.docs, `${scope}.${param.name}`);
152
+ }
122
153
 
123
- // enums are okay
124
- if (type.type && type.type.isEnumType()) {
125
- return;
126
- }
154
+ // note that we do not require that return values will use an interface
155
+ }
127
156
 
128
- // classes are okay as long as they are not resource constructs
129
- if (type.type && type.type.isClassType()) {
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
- if (type.type.fqn === e.ctx.core.baseConstructClassFqn) {
135
- return;
136
- }
160
+ // And recurse
161
+ if (type.arrayOfType) {
162
+ return assertType(type.arrayOfType, docs, scope);
163
+ }
137
164
 
138
- // allow exclusion of this rule
139
- if (docs.summary.includes(EXCLUDE_ANNOTATION_REF_VIA_INTERFACE) || docs.remarks.includes(EXCLUDE_ANNOTATION_REF_VIA_INTERFACE)) {
140
- return;
141
- }
165
+ if (type.mapOfType) {
166
+ return assertType(type.mapOfType, docs, scope);
167
+ }
142
168
 
143
- e.assert(false, scope, type.type.fqn);
144
- return;
169
+ if (type.unionOfTypes) {
170
+ for (const t of type.unionOfTypes) {
171
+ assertType(t, docs, scope);
145
172
  }
173
+ return;
174
+ }
146
175
 
147
- throw new Error(`invalid type reference: ${type.toString()}`);
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
  */
@@ -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==
@@ -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,2 @@
1
+ import { Linter } from '../linter';
2
+ export declare const grantsMethodsLinter: Linter<import("jsii-reflect").ClassType>;
@@ -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
+ }
@@ -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
- 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);
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBa0M7QUFDbEMsNkNBQWdEO0FBQ2hELGlEQUFtRDtBQUNuRCwyREFBbUQ7QUFDbkQsMkNBQThDO0FBQzlDLGlDQUFvQztBQUNwQywyQ0FBOEM7QUFDOUMsdUNBQTBDO0FBQzFDLHVDQUEwQztBQUMxQyxpREFBbUQ7QUFDbkQscUNBQXdDO0FBQ3hDLHFEQUFzRDtBQUN0RCx5RUFBMEU7QUFDMUUseUNBQTRDO0FBQzVDLHNDQUE0QztBQUUvQixRQUFBLGdCQUFnQixHQUFHLElBQUksd0JBQWUsQ0FDakQscUJBQVksRUFDWiwyQkFBZSxFQUNmLGdDQUFpQixFQUNqQix5QkFBYyxFQUNkLGVBQVMsRUFDVCx1QkFBYSxFQUNiLDZCQUFnQixFQUNoQix1QkFBYSxFQUNiLGdDQUFZLEVBQ1osZ0NBQWlCLEVBQ2pCLG1DQUFrQixFQUNsQiwyQkFBZSxFQUNmLHVEQUE0QixFQUM1QixpQkFBVSxDQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcGlMaW50ZXIgfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBhdHRyaWJ1dGVzTGludGVyIH0gZnJvbSAnLi9hdHRyaWJ1dGVzJztcbmltcG9ydCB7IGNmblJlc291cmNlTGludGVyIH0gZnJvbSAnLi9jZm4tcmVzb3VyY2UnO1xuaW1wb3J0IHsgZXZlbnRzTGludGVyIH0gZnJvbSAnLi9jbG91ZHdhdGNoLWV2ZW50cyc7XG5pbXBvcnQgeyBjb25zdHJ1Y3RMaW50ZXIgfSBmcm9tICcuL2NvbnN0cnVjdCc7XG5pbXBvcnQgeyBkb2NzTGludGVyIH0gZnJvbSAnLi9kb2NzJztcbmltcG9ydCB7IGR1cmF0aW9uc0xpbnRlciB9IGZyb20gJy4vZHVyYXRpb25zJztcbmltcG9ydCB7IGV4cG9ydHNMaW50ZXIgfSBmcm9tICcuL2V4cG9ydHMnO1xuaW1wb3J0IHsgaW1wb3J0c0xpbnRlciB9IGZyb20gJy4vaW1wb3J0cyc7XG5pbXBvcnQgeyBpbnRlZ3JhdGlvbkxpbnRlciB9IGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmltcG9ydCB7IG1vZHVsZUxpbnRlciB9IGZyb20gJy4vbW9kdWxlJztcbmltcG9ydCB7IG5vVW51c2VkVHlwZUxpbnRlciB9IGZyb20gJy4vbm8tdW51c2VkLXR5cGUnO1xuaW1wb3J0IHsgcHVibGljU3RhdGljUHJvcGVydGllc0xpbnRlciB9IGZyb20gJy4vcHVibGljLXN0YXRpYy1wcm9wZXJ0aWVzJztcbmltcG9ydCB7IHJlc291cmNlTGludGVyIH0gZnJvbSAnLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVMaW50ZXIgfSBmcm9tICcuLi9saW50ZXInO1xuXG5leHBvcnQgY29uc3QgQUxMX1JVTEVTX0xJTlRFUiA9IG5ldyBBZ2dyZWdhdGVMaW50ZXIoXG4gIG1vZHVsZUxpbnRlcixcbiAgY29uc3RydWN0TGludGVyLFxuICBjZm5SZXNvdXJjZUxpbnRlcixcbiAgcmVzb3VyY2VMaW50ZXIsXG4gIGFwaUxpbnRlcixcbiAgaW1wb3J0c0xpbnRlcixcbiAgYXR0cmlidXRlc0xpbnRlcixcbiAgZXhwb3J0c0xpbnRlcixcbiAgZXZlbnRzTGludGVyLFxuICBpbnRlZ3JhdGlvbkxpbnRlcixcbiAgbm9VbnVzZWRUeXBlTGludGVyLFxuICBkdXJhdGlvbnNMaW50ZXIsXG4gIHB1YmxpY1N0YXRpY1Byb3BlcnRpZXNMaW50ZXIsXG4gIGRvY3NMaW50ZXIsXG4pO1xuIl19
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==
@@ -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.234.0-alpha.0",
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.234.0-alpha.0",
30
- "@aws-cdk/pkglint": "2.234.0-alpha.0",
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",