awslint 2.241.0-alpha.0 → 2.243.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.
@@ -11,6 +11,7 @@ const durations_1 = require("./durations");
11
11
  const exports_1 = require("./exports");
12
12
  const imports_1 = require("./imports");
13
13
  const integrations_1 = require("./integrations");
14
+ const mixins_1 = require("./mixins");
14
15
  const module_1 = require("./module");
15
16
  const no_unused_type_1 = require("./no-unused-type");
16
17
  const public_static_properties_1 = require("./public-static-properties");
@@ -18,5 +19,5 @@ const resource_1 = require("./resource");
18
19
  const linter_1 = require("../linter");
19
20
  const grant_methods_1 = require("./grant-methods");
20
21
  const l2_interfaces_1 = require("./l2-interfaces");
21
- 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, l2_interfaces_1.l2InterfaceLinter);
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBa0M7QUFDbEMsNkNBQWdEO0FBQ2hELGlEQUFtRDtBQUNuRCwyREFBbUQ7QUFDbkQsMkNBQThDO0FBQzlDLGlDQUFvQztBQUNwQywyQ0FBOEM7QUFDOUMsdUNBQTBDO0FBQzFDLHVDQUEwQztBQUMxQyxpREFBbUQ7QUFDbkQscUNBQXdDO0FBQ3hDLHFEQUFzRDtBQUN0RCx5RUFBMEU7QUFDMUUseUNBQTRDO0FBQzVDLHNDQUE0QztBQUM1QyxtREFBc0Q7QUFDdEQsbURBQW9EO0FBRXZDLFFBQUEsZ0JBQWdCLEdBQUcsSUFBSSx3QkFBZSxDQUNqRCxxQkFBWSxFQUNaLDJCQUFlLEVBQ2YsZ0NBQWlCLEVBQ2pCLHlCQUFjLEVBQ2QsZUFBUyxFQUNULHVCQUFhLEVBQ2IsNkJBQWdCLEVBQ2hCLHVCQUFhLEVBQ2IsZ0NBQVksRUFDWixnQ0FBaUIsRUFDakIsbUNBQWtCLEVBQ2xCLDJCQUFlLEVBQ2YsdURBQTRCLEVBQzVCLGlCQUFVLEVBQ1YsbUNBQW1CLEVBQ25CLGlDQUFpQixDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBpTGludGVyIH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgYXR0cmlidXRlc0xpbnRlciB9IGZyb20gJy4vYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBjZm5SZXNvdXJjZUxpbnRlciB9IGZyb20gJy4vY2ZuLXJlc291cmNlJztcbmltcG9ydCB7IGV2ZW50c0xpbnRlciB9IGZyb20gJy4vY2xvdWR3YXRjaC1ldmVudHMnO1xuaW1wb3J0IHsgY29uc3RydWN0TGludGVyIH0gZnJvbSAnLi9jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgZG9jc0xpbnRlciB9IGZyb20gJy4vZG9jcyc7XG5pbXBvcnQgeyBkdXJhdGlvbnNMaW50ZXIgfSBmcm9tICcuL2R1cmF0aW9ucyc7XG5pbXBvcnQgeyBleHBvcnRzTGludGVyIH0gZnJvbSAnLi9leHBvcnRzJztcbmltcG9ydCB7IGltcG9ydHNMaW50ZXIgfSBmcm9tICcuL2ltcG9ydHMnO1xuaW1wb3J0IHsgaW50ZWdyYXRpb25MaW50ZXIgfSBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgeyBtb2R1bGVMaW50ZXIgfSBmcm9tICcuL21vZHVsZSc7XG5pbXBvcnQgeyBub1VudXNlZFR5cGVMaW50ZXIgfSBmcm9tICcuL25vLXVudXNlZC10eXBlJztcbmltcG9ydCB7IHB1YmxpY1N0YXRpY1Byb3BlcnRpZXNMaW50ZXIgfSBmcm9tICcuL3B1YmxpYy1zdGF0aWMtcHJvcGVydGllcyc7XG5pbXBvcnQgeyByZXNvdXJjZUxpbnRlciB9IGZyb20gJy4vcmVzb3VyY2UnO1xuaW1wb3J0IHsgQWdncmVnYXRlTGludGVyIH0gZnJvbSAnLi4vbGludGVyJztcbmltcG9ydCB7IGdyYW50c01ldGhvZHNMaW50ZXIgfSBmcm9tICcuL2dyYW50LW1ldGhvZHMnO1xuaW1wb3J0IHsgbDJJbnRlcmZhY2VMaW50ZXIgfSBmcm9tICcuL2wyLWludGVyZmFjZXMnO1xuXG5leHBvcnQgY29uc3QgQUxMX1JVTEVTX0xJTlRFUiA9IG5ldyBBZ2dyZWdhdGVMaW50ZXIoXG4gIG1vZHVsZUxpbnRlcixcbiAgY29uc3RydWN0TGludGVyLFxuICBjZm5SZXNvdXJjZUxpbnRlcixcbiAgcmVzb3VyY2VMaW50ZXIsXG4gIGFwaUxpbnRlcixcbiAgaW1wb3J0c0xpbnRlcixcbiAgYXR0cmlidXRlc0xpbnRlcixcbiAgZXhwb3J0c0xpbnRlcixcbiAgZXZlbnRzTGludGVyLFxuICBpbnRlZ3JhdGlvbkxpbnRlcixcbiAgbm9VbnVzZWRUeXBlTGludGVyLFxuICBkdXJhdGlvbnNMaW50ZXIsXG4gIHB1YmxpY1N0YXRpY1Byb3BlcnRpZXNMaW50ZXIsXG4gIGRvY3NMaW50ZXIsXG4gIGdyYW50c01ldGhvZHNMaW50ZXIsXG4gIGwySW50ZXJmYWNlTGludGVyLFxuKTtcbiJdfQ==
22
+ 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, mixins_1.mixinLinter, no_unused_type_1.noUnusedTypeLinter, durations_1.durationsLinter, public_static_properties_1.publicStaticPropertiesLinter, docs_1.docsLinter, grant_methods_1.grantsMethodsLinter, l2_interfaces_1.l2InterfaceLinter);
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBa0M7QUFDbEMsNkNBQWdEO0FBQ2hELGlEQUFtRDtBQUNuRCwyREFBbUQ7QUFDbkQsMkNBQThDO0FBQzlDLGlDQUFvQztBQUNwQywyQ0FBOEM7QUFDOUMsdUNBQTBDO0FBQzFDLHVDQUEwQztBQUMxQyxpREFBbUQ7QUFDbkQscUNBQXVDO0FBQ3ZDLHFDQUF3QztBQUN4QyxxREFBc0Q7QUFDdEQseUVBQTBFO0FBQzFFLHlDQUE0QztBQUM1QyxzQ0FBNEM7QUFDNUMsbURBQXNEO0FBQ3RELG1EQUFvRDtBQUV2QyxRQUFBLGdCQUFnQixHQUFHLElBQUksd0JBQWUsQ0FDakQscUJBQVksRUFDWiwyQkFBZSxFQUNmLGdDQUFpQixFQUNqQix5QkFBYyxFQUNkLGVBQVMsRUFDVCx1QkFBYSxFQUNiLDZCQUFnQixFQUNoQix1QkFBYSxFQUNiLGdDQUFZLEVBQ1osZ0NBQWlCLEVBQ2pCLG9CQUFXLEVBQ1gsbUNBQWtCLEVBQ2xCLDJCQUFlLEVBQ2YsdURBQTRCLEVBQzVCLGlCQUFVLEVBQ1YsbUNBQW1CLEVBQ25CLGlDQUFpQixDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBpTGludGVyIH0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgYXR0cmlidXRlc0xpbnRlciB9IGZyb20gJy4vYXR0cmlidXRlcyc7XG5pbXBvcnQgeyBjZm5SZXNvdXJjZUxpbnRlciB9IGZyb20gJy4vY2ZuLXJlc291cmNlJztcbmltcG9ydCB7IGV2ZW50c0xpbnRlciB9IGZyb20gJy4vY2xvdWR3YXRjaC1ldmVudHMnO1xuaW1wb3J0IHsgY29uc3RydWN0TGludGVyIH0gZnJvbSAnLi9jb25zdHJ1Y3QnO1xuaW1wb3J0IHsgZG9jc0xpbnRlciB9IGZyb20gJy4vZG9jcyc7XG5pbXBvcnQgeyBkdXJhdGlvbnNMaW50ZXIgfSBmcm9tICcuL2R1cmF0aW9ucyc7XG5pbXBvcnQgeyBleHBvcnRzTGludGVyIH0gZnJvbSAnLi9leHBvcnRzJztcbmltcG9ydCB7IGltcG9ydHNMaW50ZXIgfSBmcm9tICcuL2ltcG9ydHMnO1xuaW1wb3J0IHsgaW50ZWdyYXRpb25MaW50ZXIgfSBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgeyBtaXhpbkxpbnRlciB9IGZyb20gJy4vbWl4aW5zJztcbmltcG9ydCB7IG1vZHVsZUxpbnRlciB9IGZyb20gJy4vbW9kdWxlJztcbmltcG9ydCB7IG5vVW51c2VkVHlwZUxpbnRlciB9IGZyb20gJy4vbm8tdW51c2VkLXR5cGUnO1xuaW1wb3J0IHsgcHVibGljU3RhdGljUHJvcGVydGllc0xpbnRlciB9IGZyb20gJy4vcHVibGljLXN0YXRpYy1wcm9wZXJ0aWVzJztcbmltcG9ydCB7IHJlc291cmNlTGludGVyIH0gZnJvbSAnLi9yZXNvdXJjZSc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVMaW50ZXIgfSBmcm9tICcuLi9saW50ZXInO1xuaW1wb3J0IHsgZ3JhbnRzTWV0aG9kc0xpbnRlciB9IGZyb20gJy4vZ3JhbnQtbWV0aG9kcyc7XG5pbXBvcnQgeyBsMkludGVyZmFjZUxpbnRlciB9IGZyb20gJy4vbDItaW50ZXJmYWNlcyc7XG5cbmV4cG9ydCBjb25zdCBBTExfUlVMRVNfTElOVEVSID0gbmV3IEFnZ3JlZ2F0ZUxpbnRlcihcbiAgbW9kdWxlTGludGVyLFxuICBjb25zdHJ1Y3RMaW50ZXIsXG4gIGNmblJlc291cmNlTGludGVyLFxuICByZXNvdXJjZUxpbnRlcixcbiAgYXBpTGludGVyLFxuICBpbXBvcnRzTGludGVyLFxuICBhdHRyaWJ1dGVzTGludGVyLFxuICBleHBvcnRzTGludGVyLFxuICBldmVudHNMaW50ZXIsXG4gIGludGVncmF0aW9uTGludGVyLFxuICBtaXhpbkxpbnRlcixcbiAgbm9VbnVzZWRUeXBlTGludGVyLFxuICBkdXJhdGlvbnNMaW50ZXIsXG4gIHB1YmxpY1N0YXRpY1Byb3BlcnRpZXNMaW50ZXIsXG4gIGRvY3NMaW50ZXIsXG4gIGdyYW50c01ldGhvZHNMaW50ZXIsXG4gIGwySW50ZXJmYWNlTGludGVyLFxuKTtcbiJdfQ==
@@ -8,6 +8,7 @@ import { durationsLinter } from './durations';
8
8
  import { exportsLinter } from './exports';
9
9
  import { importsLinter } from './imports';
10
10
  import { integrationLinter } from './integrations';
11
+ import { mixinLinter } from './mixins';
11
12
  import { moduleLinter } from './module';
12
13
  import { noUnusedTypeLinter } from './no-unused-type';
13
14
  import { publicStaticPropertiesLinter } from './public-static-properties';
@@ -27,6 +28,7 @@ export const ALL_RULES_LINTER = new AggregateLinter(
27
28
  exportsLinter,
28
29
  eventsLinter,
29
30
  integrationLinter,
31
+ mixinLinter,
30
32
  noUnusedTypeLinter,
31
33
  durationsLinter,
32
34
  publicStaticPropertiesLinter,
@@ -0,0 +1,7 @@
1
+ import type * as reflect from 'jsii-reflect';
2
+ import { Linter } from '../linter';
3
+ interface MixinLinterContext {
4
+ readonly classType: reflect.ClassType;
5
+ }
6
+ export declare const mixinLinter: Linter<MixinLinterContext>;
7
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mixinLinter = void 0;
4
+ const linter_1 = require("../linter");
5
+ const IMIXIN_FQN = 'constructs.IMixin';
6
+ const MIXIN_FQN = 'aws-cdk-lib.Mixin';
7
+ const EXCLUDED_PACKAGES = ['@aws-cdk/cfn-property-mixins', '@aws-cdk/mixins-preview'];
8
+ exports.mixinLinter = new linter_1.Linter(assembly => {
9
+ if (!assembly.system.tryFindFqn(IMIXIN_FQN)) {
10
+ return [];
11
+ }
12
+ const iMixin = assembly.system.findInterface(IMIXIN_FQN);
13
+ return assembly.allClasses
14
+ .filter(c => !c.abstract)
15
+ .filter(c => c.getInterfaces(true).some(i => i.fqn === iMixin.fqn))
16
+ .filter(c => !EXCLUDED_PACKAGES.some(pkg => c.fqn.startsWith(`${pkg}.`)))
17
+ .map(classType => ({ classType }));
18
+ });
19
+ // Rule 1: IMixin implementors must extend Mixin base class
20
+ exports.mixinLinter.add({
21
+ code: 'mixin-extends-base',
22
+ message: 'classes implementing IMixin must extend the Mixin base class',
23
+ eval: e => {
24
+ const mixinBase = e.ctx.classType.system.tryFindFqn(MIXIN_FQN);
25
+ if (!mixinBase || !mixinBase.isClassType())
26
+ return;
27
+ e.assert(e.ctx.classType.extends(mixinBase), e.ctx.classType.fqn);
28
+ },
29
+ });
30
+ // Rule 2: Mixin classes must live in lib/mixins/ on disk
31
+ exports.mixinLinter.add({
32
+ code: 'mixin-file-location',
33
+ message: 'mixin classes must be defined in a lib/mixins/ directory',
34
+ eval: e => {
35
+ const loc = e.ctx.classType.locationInModule;
36
+ e.assert(loc && loc.filename.includes('/mixins/'), e.ctx.classType.fqn, loc ? `(found at ${loc.filename})` : undefined);
37
+ },
38
+ });
39
+ // Rule 3: Mixin classes must be in the .mixins. jsii namespace
40
+ exports.mixinLinter.add({
41
+ code: 'mixin-namespace',
42
+ message: 'mixin classes must be in a "mixins" jsii submodule namespace',
43
+ eval: e => {
44
+ const ns = e.ctx.classType.namespace;
45
+ e.assert(ns && ns.split('.').includes('mixins'), e.ctx.classType.fqn, ns ? `(found in namespace "${ns}")` : undefined);
46
+ },
47
+ });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWl4aW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHNDQUFtQztBQUVuQyxNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQztBQUN2QyxNQUFNLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztBQUN0QyxNQUFNLGlCQUFpQixHQUFHLENBQUMsOEJBQThCLEVBQUUseUJBQXlCLENBQUMsQ0FBQztBQU16RSxRQUFBLFdBQVcsR0FBRyxJQUFJLGVBQU0sQ0FBcUIsUUFBUSxDQUFDLEVBQUU7SUFDbkUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDNUMsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFekQsT0FBTyxRQUFRLENBQUMsVUFBVTtTQUN2QixNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3hFLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFFSCwyREFBMkQ7QUFDM0QsbUJBQVcsQ0FBQyxHQUFHLENBQUM7SUFDZCxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCLE9BQU8sRUFBRSw4REFBOEQ7SUFDdkUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ1IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUFFLE9BQU87UUFFbkQsQ0FBQyxDQUFDLE1BQU0sQ0FDTixDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQ2xDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FDcEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUM7QUFFSCx5REFBeUQ7QUFDekQsbUJBQVcsQ0FBQyxHQUFHLENBQUM7SUFDZCxJQUFJLEVBQUUscUJBQXFCO0lBQzNCLE9BQU8sRUFBRSwwREFBMEQ7SUFDbkUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQ1IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUM7UUFDN0MsQ0FBQyxDQUFDLE1BQU0sQ0FDTixHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQ3hDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFDbkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUMvQyxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMsQ0FBQztBQUVILCtEQUErRDtBQUMvRCxtQkFBVyxDQUFDLEdBQUcsQ0FBQztJQUNkLElBQUksRUFBRSxpQkFBaUI7SUFDdkIsT0FBTyxFQUFFLDhEQUE4RDtJQUN2RSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUU7UUFDUixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDckMsQ0FBQyxDQUFDLE1BQU0sQ0FDTixFQUFFLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQ3RDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFDbkIsRUFBRSxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDaEQsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIHJlZmxlY3QgZnJvbSAnanNpaS1yZWZsZWN0JztcbmltcG9ydCB7IExpbnRlciB9IGZyb20gJy4uL2xpbnRlcic7XG5cbmNvbnN0IElNSVhJTl9GUU4gPSAnY29uc3RydWN0cy5JTWl4aW4nO1xuY29uc3QgTUlYSU5fRlFOID0gJ2F3cy1jZGstbGliLk1peGluJztcbmNvbnN0IEVYQ0xVREVEX1BBQ0tBR0VTID0gWydAYXdzLWNkay9jZm4tcHJvcGVydHktbWl4aW5zJywgJ0Bhd3MtY2RrL21peGlucy1wcmV2aWV3J107XG5cbmludGVyZmFjZSBNaXhpbkxpbnRlckNvbnRleHQge1xuICByZWFkb25seSBjbGFzc1R5cGU6IHJlZmxlY3QuQ2xhc3NUeXBlO1xufVxuXG5leHBvcnQgY29uc3QgbWl4aW5MaW50ZXIgPSBuZXcgTGludGVyPE1peGluTGludGVyQ29udGV4dD4oYXNzZW1ibHkgPT4ge1xuICBpZiAoIWFzc2VtYmx5LnN5c3RlbS50cnlGaW5kRnFuKElNSVhJTl9GUU4pKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgaU1peGluID0gYXNzZW1ibHkuc3lzdGVtLmZpbmRJbnRlcmZhY2UoSU1JWElOX0ZRTik7XG5cbiAgcmV0dXJuIGFzc2VtYmx5LmFsbENsYXNzZXNcbiAgICAuZmlsdGVyKGMgPT4gIWMuYWJzdHJhY3QpXG4gICAgLmZpbHRlcihjID0+IGMuZ2V0SW50ZXJmYWNlcyh0cnVlKS5zb21lKGkgPT4gaS5mcW4gPT09IGlNaXhpbi5mcW4pKVxuICAgIC5maWx0ZXIoYyA9PiAhRVhDTFVERURfUEFDS0FHRVMuc29tZShwa2cgPT4gYy5mcW4uc3RhcnRzV2l0aChgJHtwa2d9LmApKSlcbiAgICAubWFwKGNsYXNzVHlwZSA9PiAoeyBjbGFzc1R5cGUgfSkpO1xufSk7XG5cbi8vIFJ1bGUgMTogSU1peGluIGltcGxlbWVudG9ycyBtdXN0IGV4dGVuZCBNaXhpbiBiYXNlIGNsYXNzXG5taXhpbkxpbnRlci5hZGQoe1xuICBjb2RlOiAnbWl4aW4tZXh0ZW5kcy1iYXNlJyxcbiAgbWVzc2FnZTogJ2NsYXNzZXMgaW1wbGVtZW50aW5nIElNaXhpbiBtdXN0IGV4dGVuZCB0aGUgTWl4aW4gYmFzZSBjbGFzcycsXG4gIGV2YWw6IGUgPT4ge1xuICAgIGNvbnN0IG1peGluQmFzZSA9IGUuY3R4LmNsYXNzVHlwZS5zeXN0ZW0udHJ5RmluZEZxbihNSVhJTl9GUU4pO1xuICAgIGlmICghbWl4aW5CYXNlIHx8ICFtaXhpbkJhc2UuaXNDbGFzc1R5cGUoKSkgcmV0dXJuO1xuXG4gICAgZS5hc3NlcnQoXG4gICAgICBlLmN0eC5jbGFzc1R5cGUuZXh0ZW5kcyhtaXhpbkJhc2UpLFxuICAgICAgZS5jdHguY2xhc3NUeXBlLmZxbixcbiAgICApO1xuICB9LFxufSk7XG5cbi8vIFJ1bGUgMjogTWl4aW4gY2xhc3NlcyBtdXN0IGxpdmUgaW4gbGliL21peGlucy8gb24gZGlza1xubWl4aW5MaW50ZXIuYWRkKHtcbiAgY29kZTogJ21peGluLWZpbGUtbG9jYXRpb24nLFxuICBtZXNzYWdlOiAnbWl4aW4gY2xhc3NlcyBtdXN0IGJlIGRlZmluZWQgaW4gYSBsaWIvbWl4aW5zLyBkaXJlY3RvcnknLFxuICBldmFsOiBlID0+IHtcbiAgICBjb25zdCBsb2MgPSBlLmN0eC5jbGFzc1R5cGUubG9jYXRpb25Jbk1vZHVsZTtcbiAgICBlLmFzc2VydChcbiAgICAgIGxvYyAmJiBsb2MuZmlsZW5hbWUuaW5jbHVkZXMoJy9taXhpbnMvJyksXG4gICAgICBlLmN0eC5jbGFzc1R5cGUuZnFuLFxuICAgICAgbG9jID8gYChmb3VuZCBhdCAke2xvYy5maWxlbmFtZX0pYCA6IHVuZGVmaW5lZCxcbiAgICApO1xuICB9LFxufSk7XG5cbi8vIFJ1bGUgMzogTWl4aW4gY2xhc3NlcyBtdXN0IGJlIGluIHRoZSAubWl4aW5zLiBqc2lpIG5hbWVzcGFjZVxubWl4aW5MaW50ZXIuYWRkKHtcbiAgY29kZTogJ21peGluLW5hbWVzcGFjZScsXG4gIG1lc3NhZ2U6ICdtaXhpbiBjbGFzc2VzIG11c3QgYmUgaW4gYSBcIm1peGluc1wiIGpzaWkgc3VibW9kdWxlIG5hbWVzcGFjZScsXG4gIGV2YWw6IGUgPT4ge1xuICAgIGNvbnN0IG5zID0gZS5jdHguY2xhc3NUeXBlLm5hbWVzcGFjZTtcbiAgICBlLmFzc2VydChcbiAgICAgIG5zICYmIG5zLnNwbGl0KCcuJykuaW5jbHVkZXMoJ21peGlucycpLFxuICAgICAgZS5jdHguY2xhc3NUeXBlLmZxbixcbiAgICAgIG5zID8gYChmb3VuZCBpbiBuYW1lc3BhY2UgXCIke25zfVwiKWAgOiB1bmRlZmluZWQsXG4gICAgKTtcbiAgfSxcbn0pO1xuIl19
@@ -0,0 +1,67 @@
1
+ import type * as reflect from 'jsii-reflect';
2
+ import { Linter } from '../linter';
3
+
4
+ const IMIXIN_FQN = 'constructs.IMixin';
5
+ const MIXIN_FQN = 'aws-cdk-lib.Mixin';
6
+ const EXCLUDED_PACKAGES = ['@aws-cdk/cfn-property-mixins', '@aws-cdk/mixins-preview'];
7
+
8
+ interface MixinLinterContext {
9
+ readonly classType: reflect.ClassType;
10
+ }
11
+
12
+ export const mixinLinter = new Linter<MixinLinterContext>(assembly => {
13
+ if (!assembly.system.tryFindFqn(IMIXIN_FQN)) {
14
+ return [];
15
+ }
16
+
17
+ const iMixin = assembly.system.findInterface(IMIXIN_FQN);
18
+
19
+ return assembly.allClasses
20
+ .filter(c => !c.abstract)
21
+ .filter(c => c.getInterfaces(true).some(i => i.fqn === iMixin.fqn))
22
+ .filter(c => !EXCLUDED_PACKAGES.some(pkg => c.fqn.startsWith(`${pkg}.`)))
23
+ .map(classType => ({ classType }));
24
+ });
25
+
26
+ // Rule 1: IMixin implementors must extend Mixin base class
27
+ mixinLinter.add({
28
+ code: 'mixin-extends-base',
29
+ message: 'classes implementing IMixin must extend the Mixin base class',
30
+ eval: e => {
31
+ const mixinBase = e.ctx.classType.system.tryFindFqn(MIXIN_FQN);
32
+ if (!mixinBase || !mixinBase.isClassType()) return;
33
+
34
+ e.assert(
35
+ e.ctx.classType.extends(mixinBase),
36
+ e.ctx.classType.fqn,
37
+ );
38
+ },
39
+ });
40
+
41
+ // Rule 2: Mixin classes must live in lib/mixins/ on disk
42
+ mixinLinter.add({
43
+ code: 'mixin-file-location',
44
+ message: 'mixin classes must be defined in a lib/mixins/ directory',
45
+ eval: e => {
46
+ const loc = e.ctx.classType.locationInModule;
47
+ e.assert(
48
+ loc && loc.filename.includes('/mixins/'),
49
+ e.ctx.classType.fqn,
50
+ loc ? `(found at ${loc.filename})` : undefined,
51
+ );
52
+ },
53
+ });
54
+
55
+ // Rule 3: Mixin classes must be in the .mixins. jsii namespace
56
+ mixinLinter.add({
57
+ code: 'mixin-namespace',
58
+ message: 'mixin classes must be in a "mixins" jsii submodule namespace',
59
+ eval: e => {
60
+ const ns = e.ctx.classType.namespace;
61
+ e.assert(
62
+ ns && ns.split('.').includes('mixins'),
63
+ e.ctx.classType.fqn,
64
+ ns ? `(found in namespace "${ns}")` : undefined,
65
+ );
66
+ },
67
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "awslint",
3
- "version": "2.241.0-alpha.0",
3
+ "version": "2.243.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.241.0-alpha.0",
30
- "@aws-cdk/pkglint": "2.241.0-alpha.0",
29
+ "@aws-cdk/eslint-config": "2.243.0-alpha.0",
30
+ "@aws-cdk/pkglint": "2.243.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",
@@ -53,7 +53,7 @@
53
53
  "maturity": "developer-preview",
54
54
  "stability": "experimental",
55
55
  "engines": {
56
- "node": ">= 18.0.0"
56
+ "node": ">= 20.0.0"
57
57
  },
58
58
  "nozem": {
59
59
  "ostools": [