@cdklabs/eslint-plugin 1.3.6 → 1.4.1

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/index.d.ts CHANGED
@@ -10,4 +10,5 @@ export declare const rules: {
10
10
  'no-throw-default-error': any;
11
11
  'promiseall-no-unbounded-parallelism': any;
12
12
  'no-this-in-static': any;
13
+ 'no-evaluating-typeguard': any;
13
14
  };
package/lib/index.js CHANGED
@@ -14,5 +14,6 @@ exports.rules = {
14
14
  'no-throw-default-error': require('./rules/no-throw-default-error'),
15
15
  'promiseall-no-unbounded-parallelism': require('./rules/promiseall-no-unbounded-parallelism'),
16
16
  'no-this-in-static': require('./rules/no-this-in-static'),
17
+ 'no-evaluating-typeguard': require('./rules/no-evaluating-typeguard'),
17
18
  };
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBEQUEwRDs7O0FBRTdDLFFBQUEsSUFBSSxHQUFHO0lBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJO0lBQ3JDLE9BQU8sRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPO0NBQzVDLENBQUM7QUFFVyxRQUFBLEtBQUssR0FBRztJQUNuQixtQkFBbUIsRUFBRSxPQUFPLENBQUMsMkJBQTJCLENBQUM7SUFDekQscUJBQXFCLEVBQUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDO0lBQzdELHNCQUFzQixFQUFFLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQztJQUMvRCxpQkFBaUIsRUFBRSxPQUFPLENBQUMseUJBQXlCLENBQUM7SUFDckQsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO0lBQ25FLHFDQUFxQyxFQUFFLE9BQU8sQ0FBQyw2Q0FBNkMsQ0FBQztJQUM3RixtQkFBbUIsRUFBRSxPQUFPLENBQUMsMkJBQTJCLENBQUM7Q0FDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cblxuZXhwb3J0IGNvbnN0IG1ldGEgPSB7XG4gIG5hbWU6IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLm5hbWUsXG4gIHZlcnNpb246IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb24sXG59O1xuXG5leHBvcnQgY29uc3QgcnVsZXMgPSB7XG4gICduby1jb3JlLWNvbnN0cnVjdCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8tY29yZS1jb25zdHJ1Y3QnKSxcbiAgJ2ludmFsaWQtY2ZuLWltcG9ydHMnOiByZXF1aXJlKCcuL3J1bGVzL2ludmFsaWQtY2ZuLWltcG9ydHMnKSxcbiAgJ25vLWxpdGVyYWwtcGFydGl0aW9uJzogcmVxdWlyZSgnLi9ydWxlcy9uby1saXRlcmFsLXBhcnRpdGlvbicpLFxuICAnbm8taW52YWxpZC1wYXRoJzogcmVxdWlyZSgnLi9ydWxlcy9uby1pbnZhbGlkLXBhdGgnKSxcbiAgJ25vLXRocm93LWRlZmF1bHQtZXJyb3InOiByZXF1aXJlKCcuL3J1bGVzL25vLXRocm93LWRlZmF1bHQtZXJyb3InKSxcbiAgJ3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtJzogcmVxdWlyZSgnLi9ydWxlcy9wcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbScpLFxuICAnbm8tdGhpcy1pbi1zdGF0aWMnOiByZXF1aXJlKCcuL3J1bGVzL25vLXRoaXMtaW4tc3RhdGljJyksXG59O1xuIl19
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBEQUEwRDs7O0FBRTdDLFFBQUEsSUFBSSxHQUFHO0lBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJO0lBQ3JDLE9BQU8sRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPO0NBQzVDLENBQUM7QUFFVyxRQUFBLEtBQUssR0FBRztJQUNuQixtQkFBbUIsRUFBRSxPQUFPLENBQUMsMkJBQTJCLENBQUM7SUFDekQscUJBQXFCLEVBQUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDO0lBQzdELHNCQUFzQixFQUFFLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQztJQUMvRCxpQkFBaUIsRUFBRSxPQUFPLENBQUMseUJBQXlCLENBQUM7SUFDckQsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLGdDQUFnQyxDQUFDO0lBQ25FLHFDQUFxQyxFQUFFLE9BQU8sQ0FBQyw2Q0FBNkMsQ0FBQztJQUM3RixtQkFBbUIsRUFBRSxPQUFPLENBQUMsMkJBQTJCLENBQUM7SUFDekQseUJBQXlCLEVBQUUsT0FBTyxDQUFDLGlDQUFpQyxDQUFDO0NBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tcmVxdWlyZS1pbXBvcnRzICovXG5cbmV4cG9ydCBjb25zdCBtZXRhID0ge1xuICBuYW1lOiByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS5uYW1lLFxuICB2ZXJzaW9uOiByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uLFxufTtcblxuZXhwb3J0IGNvbnN0IHJ1bGVzID0ge1xuICAnbm8tY29yZS1jb25zdHJ1Y3QnOiByZXF1aXJlKCcuL3J1bGVzL25vLWNvcmUtY29uc3RydWN0JyksXG4gICdpbnZhbGlkLWNmbi1pbXBvcnRzJzogcmVxdWlyZSgnLi9ydWxlcy9pbnZhbGlkLWNmbi1pbXBvcnRzJyksXG4gICduby1saXRlcmFsLXBhcnRpdGlvbic6IHJlcXVpcmUoJy4vcnVsZXMvbm8tbGl0ZXJhbC1wYXJ0aXRpb24nKSxcbiAgJ25vLWludmFsaWQtcGF0aCc6IHJlcXVpcmUoJy4vcnVsZXMvbm8taW52YWxpZC1wYXRoJyksXG4gICduby10aHJvdy1kZWZhdWx0LWVycm9yJzogcmVxdWlyZSgnLi9ydWxlcy9uby10aHJvdy1kZWZhdWx0LWVycm9yJyksXG4gICdwcm9taXNlYWxsLW5vLXVuYm91bmRlZC1wYXJhbGxlbGlzbSc6IHJlcXVpcmUoJy4vcnVsZXMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc20nKSxcbiAgJ25vLXRoaXMtaW4tc3RhdGljJzogcmVxdWlyZSgnLi9ydWxlcy9uby10aGlzLWluLXN0YXRpYycpLFxuICAnbm8tZXZhbHVhdGluZy10eXBlZ3VhcmQnOiByZXF1aXJlKCcuL3J1bGVzL25vLWV2YWx1YXRpbmctdHlwZWd1YXJkJyksXG59O1xuIl19
@@ -0,0 +1,4 @@
1
+ import { Rule } from 'eslint';
2
+ export declare const meta: Rule.RuleMetaData;
3
+ export declare const defaultOptions: {};
4
+ export declare function create(context: Rule.RuleContext): Rule.RuleListener;
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultOptions = exports.meta = void 0;
4
+ exports.create = create;
5
+ const utils_1 = require("@typescript-eslint/utils");
6
+ const eslint_utils_1 = require("@typescript-eslint/utils/eslint-utils");
7
+ const typescript_1 = require("typescript");
8
+ exports.meta = {
9
+ messages: {
10
+ avoidAccess: "{{ memberAccess }}: this will evaluate '{{ prop }}', which might throw if it's a getter. Prefer using `'{{ prop }}' in {{ obj }}` (don't forget to check for object-ness of {{ obj }} if necessary!)",
11
+ },
12
+ };
13
+ exports.defaultOptions = {};
14
+ function create(context) {
15
+ const services = (0, eslint_utils_1.getParserServices)(context);
16
+ const functionStack = [];
17
+ // const classDeclarations: Map<string, ClassDeclaration> = new Map();
18
+ /**
19
+ * Whether this function is a type predicate
20
+ *
21
+ * This is a short and sweet way to determine whether this is a function we should be checking.
22
+ *
23
+ * ```
24
+ * function isSomething(x: unknown): x is Something { ... }
25
+ * ```
26
+ */
27
+ function isUserDefinedTypeGuard(node) {
28
+ if (node.params.length !== 1 || node.params[0].type !== utils_1.AST_NODE_TYPES.Identifier) {
29
+ return false;
30
+ }
31
+ return node.returnType?.typeAnnotation.type === utils_1.AST_NODE_TYPES.TSTypePredicate;
32
+ }
33
+ /**
34
+ * Whether this looks like a type coercion function
35
+ *
36
+ * There are a lot more heuristics involved here to determine whether this is actually
37
+ * a function that does a run-time type check. It could look like this for a number of reasons.
38
+ *
39
+ * ```
40
+ * function toSomething(x: SomeType): SomeSubType { ... }
41
+ * ```
42
+ */
43
+ function isTypeCoercionFunction(node) {
44
+ const typeChecker = services.program.getTypeChecker();
45
+ const functionType = services.getTypeAtLocation(node);
46
+ const callSignature = functionType.getCallSignatures()[0];
47
+ if (!callSignature) {
48
+ // Constructors, getters and setters don't have a call signature
49
+ return false;
50
+ }
51
+ const firstParameter = callSignature.getParameters()[0];
52
+ if (!firstParameter) {
53
+ // Couldn't resolve first parameter for some reason. This can happen if the argument is 'this'
54
+ return false;
55
+ }
56
+ const argumentType = typeChecker.getTypeOfSymbol(firstParameter);
57
+ const returnType = callSignature.getReturnType();
58
+ // If the output type is void this is not a type coercion
59
+ // eslint-disable-next-line no-bitwise
60
+ if ((returnType.getFlags() & typescript_1.TypeFlags.VoidLike) !== 0) {
61
+ return false;
62
+ }
63
+ // If the output type doesn't have a symbol, it's an anonymous type (`return { x: 3, y: 42 };`)
64
+ // Which is most likely not a coercion function.
65
+ if (returnType.getSymbol() == null) {
66
+ return false;
67
+ }
68
+ // Object methods are never type testing functions (static class methods might be)
69
+ if (node.parent.type === utils_1.AST_NODE_TYPES.MethodDefinition && !node.parent.static) {
70
+ return false;
71
+ }
72
+ // If the return type is assignable to the input type, then this looks like
73
+ // a downcast which probably means it's a type coercion function.
74
+ return (typeChecker.isTypeAssignableTo(returnType, argumentType)
75
+ && !typeChecker.isTypeAssignableTo(argumentType, returnType));
76
+ }
77
+ function maybeInteresting(node) {
78
+ if (node.params.length !== 1 || node.params[0].type !== utils_1.AST_NODE_TYPES.Identifier) {
79
+ return undefined;
80
+ }
81
+ if (isUserDefinedTypeGuard(node) || isTypeCoercionFunction(node)) {
82
+ return {
83
+ argumentName: node.params[0].name,
84
+ };
85
+ }
86
+ return undefined;
87
+ }
88
+ /**
89
+ * Enter a function and see if it's interesting
90
+ */
91
+ function enterFunction(node) {
92
+ functionStack.push(maybeInteresting(node));
93
+ }
94
+ function exitFunction() {
95
+ functionStack.pop();
96
+ }
97
+ function currentInteresting() {
98
+ return functionStack.length > 0 ? functionStack[functionStack.length - 1] : undefined;
99
+ }
100
+ function onlyInInterestingFunction(fn) {
101
+ return ((...args) => {
102
+ if (currentInteresting()) {
103
+ return fn(...args);
104
+ }
105
+ return undefined;
106
+ });
107
+ }
108
+ /**
109
+ * For member expressions in interesting functions
110
+ *
111
+ * - If their LHS refers to the only function argument; AND
112
+ * - If their parent is a `typeof` node; OR
113
+ * - The member expression is part of a boolean expression; OR
114
+ * - The member expression is in a bang-bang operator (!!); OR
115
+ * - The expression is by itself in an `if` or `return` or `?:` ternary
116
+ *
117
+ * Then that is a potential problem because it will evaluate a member
118
+ * that we potentially only wanted to test for presence.
119
+ */
120
+ function memberExpression(node) {
121
+ const current = currentInteresting();
122
+ // Only property access on the primary argument
123
+ if ((node.object.type !== utils_1.AST_NODE_TYPES.Identifier) || node.object.name !== current.argumentName) {
124
+ return;
125
+ }
126
+ let dangerous = false;
127
+ if (node.parent.type === utils_1.AST_NODE_TYPES.UnaryExpression && node.parent.operator === 'typeof') {
128
+ dangerous = true;
129
+ }
130
+ if (node.parent.type === utils_1.AST_NODE_TYPES.UnaryExpression
131
+ && node.parent.operator === '!'
132
+ && node.parent.parent.type === utils_1.AST_NODE_TYPES.UnaryExpression
133
+ && node.parent.parent.operator === '!') {
134
+ dangerous = true;
135
+ }
136
+ if (node.parent.type === utils_1.AST_NODE_TYPES.LogicalExpression && ['&&', '||'].includes(node.parent.operator)) {
137
+ dangerous = true;
138
+ }
139
+ if ([utils_1.AST_NODE_TYPES.ReturnStatement, utils_1.AST_NODE_TYPES.IfStatement, utils_1.AST_NODE_TYPES.ConditionalExpression].includes(node.parent.type)) {
140
+ dangerous = true;
141
+ }
142
+ if (dangerous) {
143
+ const eslintNode = node;
144
+ context.report({
145
+ node: eslintNode,
146
+ messageId: 'avoidAccess',
147
+ loc: eslintNode.loc ?? { line: 0, column: 0 },
148
+ data: {
149
+ memberAccess: context.sourceCode.getText(eslintNode),
150
+ obj: current.argumentName,
151
+ prop: node.property.name,
152
+ },
153
+ });
154
+ }
155
+ }
156
+ return {
157
+ 'FunctionDeclaration': enterFunction,
158
+ 'FunctionExpression': enterFunction,
159
+ 'FunctionDeclaration:exit': exitFunction,
160
+ 'FunctionExpression:exit': exitFunction,
161
+ 'MemberExpression': onlyInInterestingFunction(memberExpression),
162
+ };
163
+ }
164
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tZXZhbHVhdGluZy10eXBlZ3VhcmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVsZXMvbm8tZXZhbHVhdGluZy10eXBlZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBb0JBLHdCQXNLQztBQTFMRCxvREFBb0U7QUFDcEUsd0VBQTBFO0FBRzFFLDJDQUF1QztBQUcxQixRQUFBLElBQUksR0FBc0I7SUFDckMsUUFBUSxFQUFFO1FBQ1IsV0FBVyxFQUFFLHNNQUFzTTtLQUNwTjtDQUNGLENBQUM7QUFFVyxRQUFBLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFPakMsU0FBZ0IsTUFBTSxDQUFDLE9BQXlCO0lBQzlDLE1BQU0sUUFBUSxHQUFHLElBQUEsZ0NBQWlCLEVBQUMsT0FBYyxDQUFDLENBQUM7SUFFbkQsTUFBTSxhQUFhLEdBQTJDLEVBQUUsQ0FBQztJQUNqRSx1RUFBdUU7SUFFdkU7Ozs7Ozs7O09BUUc7SUFDSCxTQUFTLHNCQUFzQixDQUFDLElBQWdFO1FBQzlGLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLHNCQUFjLENBQUMsVUFBVSxFQUFFLENBQUM7WUFBQyxPQUFPLEtBQUssQ0FBQztRQUFDLENBQUM7UUFDcEcsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxJQUFJLEtBQUssc0JBQWMsQ0FBQyxlQUFlLENBQUM7SUFDakYsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILFNBQVMsc0JBQXNCLENBQUMsSUFBZ0U7UUFDOUYsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV0RCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEQsTUFBTSxhQUFhLEdBQUcsWUFBWSxD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YyxDQUFDLHFCQUFxQixDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNsSSxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7UUFFRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBd0IsQ0FBQztZQUM1QyxPQUFPLENBQUMsTUFBTSxDQUFDO2dCQUNiLElBQUksRUFBRSxVQUFVO2dCQUNoQixTQUFTLEVBQUUsYUFBYTtnQkFDeEIsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7Z0JBQzdDLElBQUksRUFBRTtvQkFDSixZQUFZLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDO29CQUNwRCxHQUFHLEVBQUUsT0FBTyxDQUFDLFlBQVk7b0JBQ3pCLElBQUksRUFBRyxJQUFJLENBQUMsUUFBNkQsQ0FBQyxJQUFJO2lCQUMvRTthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTztRQUNMLHFCQUFxQixFQUFFLGFBQW9CO1FBQzNDLG9CQUFvQixFQUFFLGFBQW9CO1FBQzFDLDBCQUEwQixFQUFFLFlBQVk7UUFDeEMseUJBQXlCLEVBQUUsWUFBWTtRQUN2QyxrQkFBa0IsRUFBRSx5QkFBeUIsQ0FBQyxnQkFBZ0IsQ0FBUTtLQUN2RSxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFTVF9OT0RFX1RZUEVTLCBUU0VTVHJlZSB9IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscyc7XG5pbXBvcnQgeyBnZXRQYXJzZXJTZXJ2aWNlcyB9IGZyb20gJ0B0eXBlc2NyaXB0LWVzbGludC91dGlscy9lc2xpbnQtdXRpbHMnO1xuaW1wb3J0IHsgUnVsZSB9IGZyb20gJ2VzbGludCc7XG5pbXBvcnQgdHlwZSB7IE1lbWJlckV4cHJlc3Npb24gfSBmcm9tICdlc3RyZWUnO1xuaW1wb3J0IHsgVHlwZUZsYWdzIH0gZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgTm9kZVBhcmVudEV4dGVuc2lvbiA9IFJ1bGUuTm9kZVBhcmVudEV4dGVuc2lvbjtcblxuZXhwb3J0IGNvbnN0IG1ldGE6IFJ1bGUuUnVsZU1ldGFEYXRhID0ge1xuICBtZXNzYWdlczoge1xuICAgIGF2b2lkQWNjZXNzOiBcInt7IG1lbWJlckFjY2VzcyB9fTogdGhpcyB3aWxsIGV2YWx1YXRlICd7eyBwcm9wIH19Jywgd2hpY2ggbWlnaHQgdGhyb3cgaWYgaXQncyBhIGdldHRlci4gUHJlZmVyIHVzaW5nIGAne3sgcHJvcCB9fScgaW4ge3sgb2JqIH19YCAoZG9uJ3QgZm9yZ2V0IHRvIGNoZWNrIGZvciBvYmplY3QtbmVzcyBvZiB7eyBvYmogfX0gaWYgbmVjZXNzYXJ5ISlcIixcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHt9O1xuXG5cbmludGVyZmFjZSBJbnRlcmVzdGluZ0Z1bmN0aW9uIHtcbiAgcmVhZG9ubHkgYXJndW1lbnROYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGUoY29udGV4dDogUnVsZS5SdWxlQ29udGV4dCk6IFJ1bGUuUnVsZUxpc3RlbmVyIHtcbiAgY29uc3Qgc2VydmljZXMgPSBnZXRQYXJzZXJTZXJ2aWNlcyhjb250ZXh0IGFzIGFueSk7XG5cbiAgY29uc3QgZnVuY3Rpb25TdGFjazogQXJyYXk8SW50ZXJlc3RpbmdGdW5jdGlvbiB8IHVuZGVmaW5lZD4gPSBbXTtcbiAgLy8gIGNvbnN0IGNsYXNzRGVjbGFyYXRpb25zOiBNYXA8c3RyaW5nLCBDbGFzc0RlY2xhcmF0aW9uPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIGEgdHlwZSBwcmVkaWNhdGVcbiAgICpcbiAgICogVGhpcyBpcyBhIHNob3J0IGFuZCBzd2VldCB3YXkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhIGZ1bmN0aW9uIHdlIHNob3VsZCBiZSBjaGVja2luZy5cbiAgICpcbiAgICogYGBgXG4gICAqIGZ1bmN0aW9uIGlzU29tZXRoaW5nKHg6IHVua25vd24pOiB4IGlzIFNvbWV0aGluZyB7IC4uLiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZnVuY3Rpb24gaXNVc2VyRGVmaW5lZFR5cGVHdWFyZChub2RlOiBUU0VTVHJlZS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uKSB7XG4gICAgaWYgKG5vZGUucGFyYW1zLmxlbmd0aCAhPT0gMSB8fCBub2RlLnBhcmFtc1swXS50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5JZGVudGlmaWVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIHJldHVybiBub2RlLnJldHVyblR5cGU/LnR5cGVBbm5vdGF0aW9uLnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlRTVHlwZVByZWRpY2F0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgbG9va3MgbGlrZSBhIHR5cGUgY29lcmNpb24gZnVuY3Rpb25cbiAgICpcbiAgICogVGhlcmUgYXJlIGEgbG90IG1vcmUgaGV1cmlzdGljcyBpbnZvbHZlZCBoZXJlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYWN0dWFsbHlcbiAgICogYSBmdW5jdGlvbiB0aGF0IGRvZXMgYSBydW4tdGltZSB0eXBlIGNoZWNrLiBJdCBjb3VsZCBsb29rIGxpa2UgdGhpcyBmb3IgYSBudW1iZXIgb2YgcmVhc29ucy5cbiAgICpcbiAgICogYGBgXG4gICAqIGZ1bmN0aW9uIHRvU29tZXRoaW5nKHg6IFNvbWVUeXBlKTogU29tZVN1YlR5cGUgeyAuLi4gfVxuICAgKiBgYGBcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZUNvZXJjaW9uRnVuY3Rpb24obm9kZTogVFNFU1RyZWUuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IFRTRVNUcmVlLkZ1bmN0aW9uRXhwcmVzc2lvbikge1xuICAgIGNvbnN0IHR5cGVDaGVja2VyID0gc2VydmljZXMucHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpO1xuXG4gICAgY29uc3QgZnVuY3Rpb25UeXBlID0gc2VydmljZXMuZ2V0VHlwZUF0TG9jYXRpb24obm9kZSk7XG4gICAgY29uc3QgY2FsbFNpZ25hdHVyZSA9IGZ1bmN0aW9uVHlwZS5nZXRDYWxsU2lnbmF0dXJlcygpWzBdO1xuICAgIGlmICghY2FsbFNpZ25hdHVyZSkge1xuICAgICAgLy8gQ29uc3RydWN0b3JzLCBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGRvbid0IGhhdmUgYSBjYWxsIHNpZ25hdHVyZVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0UGFyYW1ldGVyID0gY2FsbFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJzKClbMF07XG4gICAgaWYgKCFmaXJzdFBhcmFtZXRlcikge1xuICAgICAgLy8gQ291bGRuJ3QgcmVzb2x2ZSBmaXJzdCBwYXJhbWV0ZXIgZm9yIHNvbWUgcmVhc29uLiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIGFyZ3VtZW50IGlzICd0aGlzJ1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGFyZ3VtZW50VHlwZSA9IHR5cGVDaGVja2VyLmdldFR5cGVPZlN5bWJvbChmaXJzdFBhcmFtZXRlcik7XG4gICAgY29uc3QgcmV0dXJuVHlwZSA9IGNhbGxTaWduYXR1cmUuZ2V0UmV0dXJuVHlwZSgpO1xuXG4gICAgLy8gSWYgdGhlIG91dHB1dCB0eXBlIGlzIHZvaWQgdGhpcyBpcyBub3QgYSB0eXBlIGNvZXJjaW9uXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBpZiAoKHJldHVyblR5cGUuZ2V0RmxhZ3MoKSAmIFR5cGVGbGFncy5Wb2lkTGlrZSkgIT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgb3V0cHV0IHR5cGUgZG9lc24ndCBoYXZlIGEgc3ltYm9sLCBpdCdzIGFuIGFub255bW91cyB0eXBlIChgcmV0dXJuIHsgeDogMywgeTogNDIgfTtgKVxuICAgIC8vIFdoaWNoIGlzIG1vc3QgbGlrZWx5IG5vdCBhIGNvZXJjaW9uIGZ1bmN0aW9uLlxuICAgIGlmIChyZXR1cm5UeXBlLmdldFN5bWJvbCgpID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgbWV0aG9kcyBhcmUgbmV2ZXIgdHlwZSB0ZXN0aW5nIGZ1bmN0aW9ucyAoc3RhdGljIGNsYXNzIG1ldGhvZHMgbWlnaHQgYmUpXG4gICAgaWYgKG5vZGUucGFyZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLk1ldGhvZERlZmluaXRpb24gJiYgIW5vZGUucGFyZW50LnN0YXRpYykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuXG4gICAgLy8gSWYgdGhlIHJldHVybiB0eXBlIGlzIGFzc2lnbmFibGUgdG8gdGhlIGlucHV0IHR5cGUsIHRoZW4gdGhpcyBsb29rcyBsaWtlXG4gICAgLy8gYSBkb3duY2FzdCB3aGljaCBwcm9iYWJseSBtZWFucyBpdCdzIGEgdHlwZSBjb2VyY2lvbiBmdW5jdGlvbi5cbiAgICByZXR1cm4gKHR5cGVDaGVja2VyLmlzVHlwZUFzc2lnbmFibGVUbyhyZXR1cm5UeXBlLCBhcmd1bWVudFR5cGUpXG4gICAgICAmJiAhdHlwZUNoZWNrZXIuaXNUeXBlQXNzaWduYWJsZVRvKGFyZ3VtZW50VHlwZSwgcmV0dXJuVHlwZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF5YmVJbnRlcmVzdGluZyhub2RlOiBUU0VTVHJlZS5GdW5jdGlvbkRlY2xhcmF0aW9uIHwgVFNFU1RyZWUuRnVuY3Rpb25FeHByZXNzaW9uKTogSW50ZXJlc3RpbmdGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKG5vZGUucGFyYW1zLmxlbmd0aCAhPT0gMSB8fCBub2RlLnBhcmFtc1swXS50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5JZGVudGlmaWVyKSB7IHJldHVybiB1bmRlZmluZWQ7IH1cbiAgICBpZiAoaXNVc2VyRGVmaW5lZFR5cGVHdWFyZChub2RlKSB8fCBpc1R5cGVDb2VyY2lvbkZ1bmN0aW9uKG5vZGUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcmd1bWVudE5hbWU6IChub2RlLnBhcmFtc1swXSBhcyBUU0VTVHJlZS5JZGVudGlmaWVyKS5uYW1lLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlciBhIGZ1bmN0aW9uIGFuZCBzZWUgaWYgaXQncyBpbnRlcmVzdGluZ1xuICAgKi9cbiAgZnVuY3Rpb24gZW50ZXJGdW5jdGlvbihub2RlOiAoVFNFU1RyZWUuRnVuY3Rpb25EZWNsYXJhdGlvbiB8IFRTRVNUcmVlLkZ1bmN0aW9uRXhwcmVzc2lvbikgJiBOb2RlUGFyZW50RXh0ZW5zaW9uKSB7XG4gICAgZnVuY3Rpb25TdGFjay5wdXNoKG1heWJlSW50ZXJlc3Rpbmcobm9kZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhpdEZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uU3RhY2sucG9wKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjdXJyZW50SW50ZXJlc3RpbmcoKTogSW50ZXJlc3RpbmdGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uU3RhY2subGVuZ3RoID4gMCA/IGZ1bmN0aW9uU3RhY2tbZnVuY3Rpb25TdGFjay5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9ubHlJbkludGVyZXN0aW5nRnVuY3Rpb248QSBleHRlbmRzIEZ1bmN0aW9uPihmbjogQSk6IEEge1xuICAgIHJldHVybiAoKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBpZiAoY3VycmVudEludGVyZXN0aW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KSBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIG1lbWJlciBleHByZXNzaW9ucyBpbiBpbnRlcmVzdGluZyBmdW5jdGlvbnNcbiAgICpcbiAgICogLSBJZiB0aGVpciBMSFMgcmVmZXJzIHRvIHRoZSBvbmx5IGZ1bmN0aW9uIGFyZ3VtZW50OyBBTkRcbiAgICogICAtIElmIHRoZWlyIHBhcmVudCBpcyBhIGB0eXBlb2ZgIG5vZGU7IE9SXG4gICAqICAgLSBUaGUgbWVtYmVyIGV4cHJlc3Npb24gaXMgcGFydCBvZiBhIGJvb2xlYW4gZXhwcmVzc2lvbjsgT1JcbiAgICogICAtIFRoZSBtZW1iZXIgZXhwcmVzc2lvbiBpcyBpbiBhIGJhbmctYmFuZyBvcGVyYXRvciAoISEpOyBPUlxuICAgKiAgIC0gVGhlIGV4cHJlc3Npb24gaXMgYnkgaXRzZWxmIGluIGFuIGBpZmAgb3IgYHJldHVybmAgb3IgYD86YCB0ZXJuYXJ5XG4gICAqXG4gICAqIFRoZW4gdGhhdCBpcyBhIHBvdGVudGlhbCBwcm9ibGVtIGJlY2F1c2UgaXQgd2lsbCBldmFsdWF0ZSBhIG1lbWJlclxuICAgKiB0aGF0IHdlIHBvdGVudGlhbGx5IG9ubHkgd2FudGVkIHRvIHRlc3QgZm9yIHByZXNlbmNlLlxuICAgKi9cbiAgZnVuY3Rpb24gbWVtYmVyRXhwcmVzc2lvbihub2RlOiBUU0VTVHJlZS5NZW1iZXJFeHByZXNzaW9uKSB7XG4gICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRJbnRlcmVzdGluZygpITtcblxuICAgIC8vIE9ubHkgcHJvcGVydHkgYWNjZXNzIG9uIHRoZSBwcmltYXJ5IGFyZ3VtZW50XG4gICAgaWYgKChub2RlLm9iamVjdC50eXBlICE9PSBBU1RfTk9ERV9UWVBFUy5JZGVudGlmaWVyKSB8fCAobm9kZS5vYmplY3QgYXMgVFNFU1RyZWUuSWRlbnRpZmllcikubmFtZSAhPT0gY3VycmVudC5hcmd1bWVudE5hbWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZGFuZ2Vyb3VzID0gZmFsc2U7XG4gICAgaWYgKG5vZGUucGFyZW50LnR5cGUgPT09IEFTVF9OT0RFX1RZUEVTLlVuYXJ5RXhwcmVzc2lvbiAmJiBub2RlLnBhcmVudC5vcGVyYXRvciA9PT0gJ3R5cGVvZicpIHtcbiAgICAgIGRhbmdlcm91cyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChub2RlLnBhcmVudC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5VbmFyeUV4cHJlc3Npb25cbiAgICAgICYmIG5vZGUucGFyZW50Lm9wZXJhdG9yID09PSAnISdcbiAgICAgICYmIG5vZGUucGFyZW50LnBhcmVudC50eXBlID09PSBBU1RfTk9ERV9UWVBFUy5VbmFyeUV4cHJlc3Npb25cbiAgICAgICYmIG5vZGUucGFyZW50LnBhcmVudC5vcGVyYXRvciA9PT0gJyEnKSB7XG4gICAgICBkYW5nZXJvdXMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobm9kZS5wYXJlbnQudHlwZSA9PT0gQVNUX05PREVfVFlQRVMuTG9naWNhbEV4cHJlc3Npb24gJiYgWycmJicsICd8fCddLmluY2x1ZGVzKG5vZGUucGFyZW50Lm9wZXJhdG9yKSkge1xuICAgICAgZGFuZ2Vyb3VzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFtBU1RfTk9ERV9UWVBFUy5SZXR1cm5TdGF0ZW1lbnQsIEFTVF9OT0RFX1RZUEVTLklmU3RhdGVtZW50LCBBU1RfTk9ERV9UWVBFUy5Db25kaXRpb25hbEV4cHJlc3Npb25dLmluY2x1ZGVzKG5vZGUucGFyZW50LnR5cGUpKSB7XG4gICAgICBkYW5nZXJvdXMgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChkYW5nZXJvdXMpIHtcbiAgICAgIGNvbnN0IGVzbGludE5vZGUgPSBub2RlIGFzIE1lbWJlckV4cHJlc3Npb247XG4gICAgICBjb250ZXh0LnJlcG9ydCh7XG4gICAgICAgIG5vZGU6IGVzbGludE5vZGUsXG4gICAgICAgIG1lc3NhZ2VJZDogJ2F2b2lkQWNjZXNzJyxcbiAgICAgICAgbG9jOiBlc2xpbnROb2RlLmxvYyA/PyB7IGxpbmU6IDAsIGNvbHVtbjogMCB9LFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbWVtYmVyQWNjZXNzOiBjb250ZXh0LnNvdXJjZUNvZGUuZ2V0VGV4dChlc2xpbnROb2RlKSxcbiAgICAgICAgICBvYmo6IGN1cnJlbnQuYXJndW1lbnROYW1lLFxuICAgICAgICAgIHByb3A6IChub2RlLnByb3BlcnR5IGFzIFRTRVNUcmVlLlByaXZhdGVJZGVudGlmaWVyIHwgVFNFU1RyZWUuSWRlbnRpZmllcikubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgJ0Z1bmN0aW9uRGVjbGFyYXRpb24nOiBlbnRlckZ1bmN0aW9uIGFzIGFueSxcbiAgICAnRnVuY3Rpb25FeHByZXNzaW9uJzogZW50ZXJGdW5jdGlvbiBhcyBhbnksXG4gICAgJ0Z1bmN0aW9uRGVjbGFyYXRpb246ZXhpdCc6IGV4aXRGdW5jdGlvbixcbiAgICAnRnVuY3Rpb25FeHByZXNzaW9uOmV4aXQnOiBleGl0RnVuY3Rpb24sXG4gICAgJ01lbWJlckV4cHJlc3Npb24nOiBvbmx5SW5JbnRlcmVzdGluZ0Z1bmN0aW9uKG1lbWJlckV4cHJlc3Npb24pIGFzIGFueSxcbiAgfTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -42,6 +42,7 @@
42
42
  "@types/node": "^18",
43
43
  "@typescript-eslint/eslint-plugin": "^8",
44
44
  "@typescript-eslint/parser": "^8",
45
+ "@typescript-eslint/rule-tester": "^8.52.0",
45
46
  "cdklabs-projen-project-types": "^0.3.7",
46
47
  "commit-and-tag-version": "^12",
47
48
  "constructs": "^10.0.0",
@@ -60,7 +61,9 @@
60
61
  "eslint": ">=6 <9"
61
62
  },
62
63
  "dependencies": {
63
- "fs-extra": "^11.3.3"
64
+ "@typescript-eslint/utils": "^8.52.0",
65
+ "fs-extra": "^11.3.3",
66
+ "typescript": "^5.9.3"
64
67
  },
65
68
  "engines": {
66
69
  "node": ">= 18.12.0"
@@ -70,7 +73,7 @@
70
73
  "publishConfig": {
71
74
  "access": "public"
72
75
  },
73
- "version": "1.3.6",
76
+ "version": "1.4.1",
74
77
  "jest": {
75
78
  "coverageProvider": "v8",
76
79
  "testMatch": [