@nielspeter/eess-ts 0.5.0 → 0.6.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/README.md +1 -1
- package/dist/builders/class-rule-builder.d.ts +6 -3
- package/dist/builders/class-rule-builder.d.ts.map +1 -1
- package/dist/builders/class-rule-builder.js +6 -3
- package/dist/builders/class-rule-builder.js.map +1 -1
- package/dist/builders/function-rule-builder.d.ts +29 -7
- package/dist/builders/function-rule-builder.d.ts.map +1 -1
- package/dist/builders/function-rule-builder.js +34 -8
- package/dist/builders/function-rule-builder.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +96 -5
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +21 -2
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/import-rule-module.d.ts +23 -4
- package/dist/cli/import-rule-module.d.ts.map +1 -1
- package/dist/cli/import-rule-module.js +30 -5
- package/dist/cli/import-rule-module.js.map +1 -1
- package/dist/conditions/body-analysis-function.d.ts.map +1 -1
- package/dist/conditions/body-analysis-function.js +19 -1
- package/dist/conditions/body-analysis-function.js.map +1 -1
- package/dist/conditions/body-analysis.d.ts +5 -2
- package/dist/conditions/body-analysis.d.ts.map +1 -1
- package/dist/conditions/body-analysis.js +9 -6
- package/dist/conditions/body-analysis.js.map +1 -1
- package/dist/conditions/call.d.ts +4 -2
- package/dist/conditions/call.d.ts.map +1 -1
- package/dist/conditions/call.js +11 -8
- package/dist/conditions/call.js.map +1 -1
- package/dist/conditions/catch-analysis.d.ts +7 -1
- package/dist/conditions/catch-analysis.d.ts.map +1 -1
- package/dist/conditions/catch-analysis.js +26 -27
- package/dist/conditions/catch-analysis.js.map +1 -1
- package/dist/conditions/class.d.ts +5 -3
- package/dist/conditions/class.d.ts.map +1 -1
- package/dist/conditions/class.js +9 -6
- package/dist/conditions/class.js.map +1 -1
- package/dist/conditions/function.d.ts +4 -4
- package/dist/conditions/function.js +4 -4
- package/dist/core/execute-rule.js +1 -1
- package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
- package/dist/graphql/resolver-rule-builder.js +16 -2
- package/dist/graphql/resolver-rule-builder.js.map +1 -1
- package/dist/helpers/body-traversal.d.ts +63 -9
- package/dist/helpers/body-traversal.d.ts.map +1 -1
- package/dist/helpers/body-traversal.js +179 -30
- package/dist/helpers/body-traversal.js.map +1 -1
- package/dist/helpers/heritage.d.ts +25 -0
- package/dist/helpers/heritage.d.ts.map +1 -0
- package/dist/helpers/heritage.js +41 -0
- package/dist/helpers/heritage.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/models/arch-function.d.ts +42 -12
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +104 -18
- package/dist/models/arch-function.js.map +1 -1
- package/dist/predicates/class.d.ts +9 -9
- package/dist/predicates/class.d.ts.map +1 -1
- package/dist/predicates/class.js +14 -13
- package/dist/predicates/class.js.map +1 -1
- package/dist/predicates/function.d.ts +16 -4
- package/dist/predicates/function.d.ts.map +1 -1
- package/dist/predicates/function.js +56 -3
- package/dist/predicates/function.js.map +1 -1
- package/dist/predicates/type.d.ts +2 -1
- package/dist/predicates/type.d.ts.map +1 -1
- package/dist/predicates/type.js +6 -2
- package/dist/predicates/type.js.map +1 -1
- package/dist/presets/agent-guardrails.js +5 -5
- package/dist/presets/agent-guardrails.js.map +1 -1
- package/dist/rules/code-quality.d.ts +12 -1
- package/dist/rules/code-quality.d.ts.map +1 -1
- package/dist/rules/code-quality.js +106 -12
- package/dist/rules/code-quality.js.map +1 -1
- package/dist/rules/errors.d.ts +4 -2
- package/dist/rules/errors.d.ts.map +1 -1
- package/dist/rules/errors.js +18 -16
- package/dist/rules/errors.js.map +1 -1
- package/dist/rules/hygiene.d.ts +3 -1
- package/dist/rules/hygiene.d.ts.map +1 -1
- package/dist/rules/hygiene.js +3 -1
- package/dist/rules/hygiene.js.map +1 -1
- package/dist/rules/metrics.d.ts +6 -4
- package/dist/rules/metrics.d.ts.map +1 -1
- package/dist/rules/metrics.js +40 -20
- package/dist/rules/metrics.js.map +1 -1
- package/dist/rules/security.d.ts +13 -5
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +144 -19
- package/dist/rules/security.js.map +1 -1
- package/dist/rules/typescript.d.ts +2 -2
- package/dist/rules/typescript.js +2 -2
- package/dist/smells/duplicate-bodies.js +2 -2
- package/dist/smells/duplicate-bodies.js.map +1 -1
- package/dist/smells/sibling-files.js +2 -2
- package/dist/smells/sibling-files.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
import { createJiti } from 'jiti';
|
|
2
2
|
import { importFresh } from './watch.js';
|
|
3
|
-
import { isModuleFormatRefusal } from '@nielspeter/eess/internal';
|
|
3
|
+
import { isModuleFormatRefusal, isTypeScriptSpecifierMiss, enableTypeScriptSpecifierResolution, } from '@nielspeter/eess/internal';
|
|
4
4
|
/**
|
|
5
5
|
* Load a rule file or config module — natively when Node can, via jiti when it cannot.
|
|
6
6
|
*
|
|
7
|
-
* **Native first, and that ordering is the whole design
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
7
|
+
* **Native first, and that ordering is the whole design — but not for the reason
|
|
8
|
+
* this comment used to give.** It said a rule file loaded through jiti "gets
|
|
9
|
+
* jiti's own module registry, so the copy of eess-ts it imports is a DIFFERENT
|
|
10
|
+
* instance from the CLI's". Measured and false: under the pinned jiti 2.7.0 a
|
|
11
|
+
* transpiled rule file resolves its bare specifiers to the instances the host
|
|
12
|
+
* already holds. A second physical copy on disk splits them; the loader does not.
|
|
13
|
+
* [Bug 0199](../../../../work/bugs/fixed/0199-a-bare-preset-call-throws-before-baseline-filtering.md)
|
|
14
|
+
* had already disproved the same claim three ways, and this file kept repeating it.
|
|
15
|
+
*
|
|
16
|
+
* The real reason to load natively is that the loader decides which PROGRAMS are
|
|
17
|
+
* valid rule files: jiti transpiles, so it accepts TypeScript that Node's
|
|
18
|
+
* strip-only mode refuses. See ADR-015.
|
|
19
|
+
*
|
|
20
|
+
* The two hazards plan 0165 named are recorded below because the SECOND physical
|
|
21
|
+
* copy case is real and neither is fixed by a loader choice:
|
|
11
22
|
*
|
|
12
23
|
* - `instanceof ArchRuleError` is false for an error that is one, so
|
|
13
24
|
* `check.ts` skipped `ruleFileTruncated()` and a truncated run said nothing
|
|
@@ -27,12 +38,26 @@ import { isModuleFormatRefusal } from '@nielspeter/eess/internal';
|
|
|
27
38
|
* `npm init -y` writes. Everything else rethrows, including an `ArchRuleError`
|
|
28
39
|
* thrown by a self-executing rule file, which must never be retried (a second
|
|
29
40
|
* execution would print its findings twice).
|
|
41
|
+
*
|
|
42
|
+
* **The second condition does not involve jiti at all.** Bug 0223: under
|
|
43
|
+
* `"type": "module"`, a rule file importing `./sibling.js` — the specifier
|
|
44
|
+
* TypeScript REQUIRES — fails with `ERR_MODULE_NOT_FOUND`, because Node performs
|
|
45
|
+
* no `.js` → `.ts` substitution. Widening the jiti fallback to cover it was the
|
|
46
|
+
* obvious fix and the wrong one: it would reopen both hazards above. Instead the
|
|
47
|
+
* process loader is taught the substitution and the NATIVE import is retried, so
|
|
48
|
+
* the rule file still lands in this registry.
|
|
30
49
|
*/
|
|
31
50
|
export async function importRuleModule(file, fresh) {
|
|
32
51
|
try {
|
|
33
52
|
return fresh ? await importFresh(file) : await import(file);
|
|
34
53
|
}
|
|
35
54
|
catch (error) {
|
|
55
|
+
if (isTypeScriptSpecifierMiss(error)) {
|
|
56
|
+
// Resolution only — same loader, same registry. Retried once: if it fails
|
|
57
|
+
// again the specifier named something that is genuinely not there.
|
|
58
|
+
enableTypeScriptSpecifierResolution();
|
|
59
|
+
return fresh ? await importFresh(file) : await import(file);
|
|
60
|
+
}
|
|
36
61
|
if (!isModuleFormatRefusal(error))
|
|
37
62
|
throw error;
|
|
38
63
|
// jiti transpiles to CJS, so the host's `"type": "commonjs"` stops mattering.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-rule-module.js","sourceRoot":"","sources":["../../src/cli/import-rule-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,
|
|
1
|
+
{"version":3,"file":"import-rule-module.js","sourceRoot":"","sources":["../../src/cli/import-rule-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,mCAAmC,GACpC,MAAM,2BAA2B,CAAA;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAc;IACjE,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;IAC7D,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,yBAAyB,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,0EAA0E;YAC1E,mEAAmE;YACnE,mCAAmC,EAAE,CAAA;YACrC,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;QAC7D,CAAC;QACD,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;YAAE,MAAM,KAAK,CAAA;QAC9C,8EAA8E;QAC9E,4EAA4E;QAC5E,qDAAqD;QACrD,MAAM,IAAI,GAAG,KAAK;YAChB,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;YACrE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-analysis-function.d.ts","sourceRoot":"","sources":["../../src/conditions/body-analysis-function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAEnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAyB9D;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC,CAoBnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC,CA2BtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,iBAAiB,GACtB,SAAS,CAAC,YAAY,CAAC,CAuCzB;
|
|
1
|
+
{"version":3,"file":"body-analysis-function.d.ts","sourceRoot":"","sources":["../../src/conditions/body-analysis-function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAEnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAyB9D;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC,CAoBnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,YAAY,CAAC,CA2BtF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,iBAAiB,GACtB,SAAS,CAAC,YAAY,CAAC,CAuCzB;AAiBD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,SAAS,CAAC,YAAY,CAAC,CA0BlE"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Node } from 'ts-morph';
|
|
1
|
+
import { Node, Scope } from 'ts-morph';
|
|
2
2
|
import { searchFunctionBody, reportedLine } from '../helpers/body-traversal.js';
|
|
3
3
|
import { identifyMatches } from './match-identity.js';
|
|
4
4
|
/**
|
|
@@ -83,6 +83,22 @@ export function functionUseInsteadOf(bad, good) {
|
|
|
83
83
|
},
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* An empty constructor that still does something (bug 0315). One whose every parameter is a parameter
|
|
88
|
+
* property assigns a field for each — `constructor(private readonly db: Db) {}` — and a private or
|
|
89
|
+
* protected one that takes nothing restricts who may construct the class. An empty constructor that
|
|
90
|
+
* takes a plain parameter drops it, and an empty public constructor that takes nothing does nothing:
|
|
91
|
+
* both are reported.
|
|
92
|
+
*/
|
|
93
|
+
function isPurposefulConstructor(node) {
|
|
94
|
+
if (!Node.isConstructorDeclaration(node))
|
|
95
|
+
return false;
|
|
96
|
+
const parameters = node.getParameters();
|
|
97
|
+
if (parameters.length > 0)
|
|
98
|
+
return parameters.every((parameter) => parameter.isParameterProperty());
|
|
99
|
+
const scope = node.getScope();
|
|
100
|
+
return scope === Scope.Private || scope === Scope.Protected;
|
|
101
|
+
}
|
|
86
102
|
/**
|
|
87
103
|
* Function must not have an empty body (zero statements).
|
|
88
104
|
*
|
|
@@ -101,6 +117,8 @@ export function functionNotHaveEmptyBody() {
|
|
|
101
117
|
// Expression-bodied arrows return the expression, not a Block
|
|
102
118
|
if (!Node.isBlock(body))
|
|
103
119
|
continue; // expression body — always has content
|
|
120
|
+
if (isPurposefulConstructor(fn.getNode()))
|
|
121
|
+
continue;
|
|
104
122
|
if (body.getStatements().length === 0) {
|
|
105
123
|
violations.push(createFunctionViolation(fn, `${fn.getName() ?? '<anonymous>'} has an empty body`, context));
|
|
106
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-analysis-function.js","sourceRoot":"","sources":["../../src/conditions/body-analysis-function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"body-analysis-function.js","sourceRoot":"","sources":["../../src/conditions/body-analysis-function.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,16 @@ import type { ExpressionMatcher } from '../helpers/matchers.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Class body must contain at least one node matching the matcher.
|
|
6
6
|
*
|
|
7
|
-
* Violation if
|
|
7
|
+
* Violation if nothing in the class's member code contains a match: method, constructor and
|
|
8
|
+
* accessor bodies, parameter defaults, property initializers and static blocks. Not decorators,
|
|
9
|
+
* computed names or `extends` — wiring cannot satisfy a must-contain rule (bug 0307).
|
|
8
10
|
*/
|
|
9
11
|
export declare function classContain(matcher: ExpressionMatcher): Condition<ClassDeclaration>;
|
|
10
12
|
/**
|
|
11
13
|
* Class body must NOT contain any node matching the matcher.
|
|
12
14
|
*
|
|
13
|
-
* Violation for EACH matching node found in any
|
|
15
|
+
* Violation for EACH matching node found in any code the class runs: its member code, and every
|
|
16
|
+
* decorator expression, computed member name and the `extends` expression (bug 0307).
|
|
14
17
|
* Reports the specific line where the violation occurs.
|
|
15
18
|
*/
|
|
16
19
|
export declare function classNotContain(matcher: ExpressionMatcher): Condition<ClassDeclaration>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-analysis.d.ts","sourceRoot":"","sources":["../../src/conditions/body-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAK/D
|
|
1
|
+
{"version":3,"file":"body-analysis.d.ts","sourceRoot":"","sources":["../../src/conditions/body-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAK/D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAoBpF;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CA2BvF;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,iBAAiB,EACtB,IAAI,EAAE,iBAAiB,GACtB,SAAS,CAAC,gBAAgB,CAAC,CAyC7B;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAmBnE"}
|
|
@@ -5,7 +5,9 @@ import { searchClassBody, reportedLine } from '../helpers/body-traversal.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* Class body must contain at least one node matching the matcher.
|
|
7
7
|
*
|
|
8
|
-
* Violation if
|
|
8
|
+
* Violation if nothing in the class's member code contains a match: method, constructor and
|
|
9
|
+
* accessor bodies, parameter defaults, property initializers and static blocks. Not decorators,
|
|
10
|
+
* computed names or `extends` — wiring cannot satisfy a must-contain rule (bug 0307).
|
|
9
11
|
*/
|
|
10
12
|
export function classContain(matcher) {
|
|
11
13
|
return {
|
|
@@ -13,7 +15,7 @@ export function classContain(matcher) {
|
|
|
13
15
|
evaluate(elements, context) {
|
|
14
16
|
const violations = [];
|
|
15
17
|
for (const cls of elements) {
|
|
16
|
-
const result = searchClassBody(cls, matcher);
|
|
18
|
+
const result = searchClassBody(cls, matcher, 'member-code');
|
|
17
19
|
if (!result.found) {
|
|
18
20
|
violations.push(createViolation(cls, `${getElementName(cls)} does not contain ${matcher.description}`, context));
|
|
19
21
|
}
|
|
@@ -25,7 +27,8 @@ export function classContain(matcher) {
|
|
|
25
27
|
/**
|
|
26
28
|
* Class body must NOT contain any node matching the matcher.
|
|
27
29
|
*
|
|
28
|
-
* Violation for EACH matching node found in any
|
|
30
|
+
* Violation for EACH matching node found in any code the class runs: its member code, and every
|
|
31
|
+
* decorator expression, computed member name and the `extends` expression (bug 0307).
|
|
29
32
|
* Reports the specific line where the violation occurs.
|
|
30
33
|
*/
|
|
31
34
|
export function classNotContain(matcher) {
|
|
@@ -34,7 +37,7 @@ export function classNotContain(matcher) {
|
|
|
34
37
|
evaluate(elements, context) {
|
|
35
38
|
const violations = [];
|
|
36
39
|
for (const cls of elements) {
|
|
37
|
-
const result = searchClassBody(cls, matcher);
|
|
40
|
+
const result = searchClassBody(cls, matcher, 'all-code');
|
|
38
41
|
const identities = identifyMatches('class-body', cls.getSourceFile().getFilePath(), result.matchingNodes, matcher.description);
|
|
39
42
|
result.matchingNodes.forEach((node, index) => {
|
|
40
43
|
violations.push({
|
|
@@ -63,8 +66,8 @@ export function classUseInsteadOf(bad, good) {
|
|
|
63
66
|
evaluate(elements, context) {
|
|
64
67
|
const violations = [];
|
|
65
68
|
for (const cls of elements) {
|
|
66
|
-
const badResult = searchClassBody(cls, bad);
|
|
67
|
-
const goodResult = searchClassBody(cls, good);
|
|
69
|
+
const badResult = searchClassBody(cls, bad, 'all-code');
|
|
70
|
+
const goodResult = searchClassBody(cls, good, 'member-code');
|
|
68
71
|
// Report each occurrence of the bad pattern
|
|
69
72
|
const identities = identifyMatches('class-body', cls.getSourceFile().getFilePath(), badResult.matchingNodes, bad.description);
|
|
70
73
|
badResult.matchingNodes.forEach((node, index) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-analysis.js","sourceRoot":"","sources":["../../src/conditions/body-analysis.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAErD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE5E,uEAAuE;AAEvE
|
|
1
|
+
{"version":3,"file":"body-analysis.js","sourceRoot":"","sources":["../../src/conditions/body-analysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,8 @@ export declare function notHaveArgumentWithProperty(...names: string[]): Conditi
|
|
|
40
40
|
/**
|
|
41
41
|
* Assert that at least one argument subtree contains a match.
|
|
42
42
|
*
|
|
43
|
-
* Searches ALL arguments of each call recursively using `
|
|
43
|
+
* Searches ALL arguments of each call recursively using `findMatchesInCode`,
|
|
44
|
+
* which tests each argument itself too (bug 0323).
|
|
44
45
|
* This is a superset of `haveCallbackContaining` — it searches the entire
|
|
45
46
|
* subtree of every argument (object literals, callbacks, nested expressions),
|
|
46
47
|
* not just function-like arguments. Use `haveCallbackContaining` when you
|
|
@@ -50,7 +51,8 @@ export declare function haveArgumentContaining(matcher: ExpressionMatcher): Cond
|
|
|
50
51
|
/**
|
|
51
52
|
* Assert that NO argument subtree contains a match.
|
|
52
53
|
*
|
|
53
|
-
* Searches ALL arguments of each call recursively using `
|
|
54
|
+
* Searches ALL arguments of each call recursively using `findMatchesInCode`,
|
|
55
|
+
* which tests each argument itself too (bug 0323).
|
|
54
56
|
* Produces one violation per matching node found in any argument.
|
|
55
57
|
*
|
|
56
58
|
* This is a superset of `notHaveCallbackContaining` — it searches the entire
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/conditions/call.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAEnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/conditions/call.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAEnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAqDtD;;GAEG;AACH,wBAAgB,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,CAiB9C;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,CAoBtF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,CAuCzF;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAyChF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAwCnF;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,CA4BtF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,CA+BzF"}
|
package/dist/conditions/call.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ArchConfigError } from '@nielspeter/eess';
|
|
2
2
|
import { Node } from 'ts-morph';
|
|
3
|
-
import { getFunctionBody,
|
|
3
|
+
import { getFunctionBody, findMatchesInCode, findMatchesInEach, reportedLine, } from '../helpers/body-traversal.js';
|
|
4
4
|
import { identifyMatches } from './match-identity.js';
|
|
5
5
|
import { marksAssertsCardinality } from '@nielspeter/eess/internal';
|
|
6
6
|
/**
|
|
@@ -94,10 +94,11 @@ export function notHaveCallbackContaining(matcher) {
|
|
|
94
94
|
// Flatten across arguments before assigning identities: a per-argument
|
|
95
95
|
// counter would restart at 1 for each callback, so two callbacks with a
|
|
96
96
|
// match in the same enclosing declaration would collide.
|
|
97
|
-
const
|
|
97
|
+
const bodies = args.flatMap((arg) => {
|
|
98
98
|
const body = getFunctionBody(arg);
|
|
99
|
-
return body ?
|
|
99
|
+
return body ? [body] : [];
|
|
100
100
|
});
|
|
101
|
+
const matches = findMatchesInEach(bodies, matcher);
|
|
101
102
|
const identities = identifyMatches('call-callback', archCall.getSourceFile().getFilePath(), matches.map((m) => m.node), `${identityNameOf(archCall, context)} :: ${matcher.description}`);
|
|
102
103
|
matches.forEach((match, index) => {
|
|
103
104
|
violations.push({
|
|
@@ -119,7 +120,7 @@ function searchCallbacksFor(archCall, matcher) {
|
|
|
119
120
|
const body = getFunctionBody(arg);
|
|
120
121
|
if (!body)
|
|
121
122
|
continue;
|
|
122
|
-
const matches =
|
|
123
|
+
const matches = findMatchesInCode(body, matcher);
|
|
123
124
|
if (matches.length > 0)
|
|
124
125
|
return true;
|
|
125
126
|
}
|
|
@@ -223,7 +224,8 @@ export function notHaveArgumentWithProperty(...names) {
|
|
|
223
224
|
/**
|
|
224
225
|
* Assert that at least one argument subtree contains a match.
|
|
225
226
|
*
|
|
226
|
-
* Searches ALL arguments of each call recursively using `
|
|
227
|
+
* Searches ALL arguments of each call recursively using `findMatchesInCode`,
|
|
228
|
+
* which tests each argument itself too (bug 0323).
|
|
227
229
|
* This is a superset of `haveCallbackContaining` — it searches the entire
|
|
228
230
|
* subtree of every argument (object literals, callbacks, nested expressions),
|
|
229
231
|
* not just function-like arguments. Use `haveCallbackContaining` when you
|
|
@@ -238,7 +240,7 @@ export function haveArgumentContaining(matcher) {
|
|
|
238
240
|
const args = archCall.getArguments();
|
|
239
241
|
let found = false;
|
|
240
242
|
for (const arg of args) {
|
|
241
|
-
const matches =
|
|
243
|
+
const matches = findMatchesInCode(arg, matcher);
|
|
242
244
|
if (matches.length > 0) {
|
|
243
245
|
found = true;
|
|
244
246
|
break;
|
|
@@ -255,7 +257,8 @@ export function haveArgumentContaining(matcher) {
|
|
|
255
257
|
/**
|
|
256
258
|
* Assert that NO argument subtree contains a match.
|
|
257
259
|
*
|
|
258
|
-
* Searches ALL arguments of each call recursively using `
|
|
260
|
+
* Searches ALL arguments of each call recursively using `findMatchesInCode`,
|
|
261
|
+
* which tests each argument itself too (bug 0323).
|
|
259
262
|
* Produces one violation per matching node found in any argument.
|
|
260
263
|
*
|
|
261
264
|
* This is a superset of `notHaveCallbackContaining` — it searches the entire
|
|
@@ -273,7 +276,7 @@ export function notHaveArgumentContaining(matcher) {
|
|
|
273
276
|
// same archCall — same identity work each time.
|
|
274
277
|
const callName = callNameForMessage(archCall, context);
|
|
275
278
|
const args = archCall.getArguments();
|
|
276
|
-
const matches = args
|
|
279
|
+
const matches = findMatchesInEach(args, matcher);
|
|
277
280
|
const identities = identifyMatches('call-argument', archCall.getSourceFile().getFilePath(), matches.map((m) => m.node), `${identityNameOf(archCall, context)} :: ${matcher.description}`);
|
|
278
281
|
matches.forEach((match, index) => {
|
|
279
282
|
violations.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/conditions/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAK/B,OAAO,
|
|
1
|
+
{"version":3,"file":"call.js","sourceRoot":"","sources":["../../src/conditions/call.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Node } from 'ts-morph';
|
|
2
|
+
import type { CatchClause } from 'ts-morph';
|
|
2
3
|
/**
|
|
3
4
|
* Result of scanning a single catch clause.
|
|
4
5
|
*/
|
|
@@ -9,7 +10,7 @@ interface SilentCatchResult {
|
|
|
9
10
|
message: string;
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* Why a catch clause is silent, or `undefined` when it references the caught error.
|
|
13
14
|
*
|
|
14
15
|
* A catch clause is "silent" if:
|
|
15
16
|
* 1. It has no binding at all (`catch { ... }`) — no error to reference
|
|
@@ -27,6 +28,11 @@ interface SilentCatchResult {
|
|
|
27
28
|
* — the inner `err` usage satisfies the outer check.
|
|
28
29
|
* Both are rare in practice and arguably code smells themselves.
|
|
29
30
|
*/
|
|
31
|
+
export declare function silentCatchMessage(catchClause: CatchClause): string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Find catch clauses in the body that don't reference the caught error — see
|
|
34
|
+
* `silentCatchMessage` for what counts as silent.
|
|
35
|
+
*/
|
|
30
36
|
export declare function findSilentCatches(body: Node): SilentCatchResult[];
|
|
31
37
|
export {};
|
|
32
38
|
//# sourceMappingURL=catch-analysis.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catch-analysis.d.ts","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAA;AAE3C;;GAEG;AACH,UAAU,iBAAiB;IACzB,oEAAoE;IACpE,IAAI,EAAE,IAAI,CAAA;IACV,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;CAChB;AA8BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,EAAE,
|
|
1
|
+
{"version":3,"file":"catch-analysis.d.ts","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C;;GAEG;AACH,UAAU,iBAAiB;IACzB,oEAAoE;IACpE,IAAI,EAAE,IAAI,CAAA;IACV,6DAA6D;IAC7D,OAAO,EAAE,MAAM,CAAA;CAChB;AA8BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAkB/E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,GAAG,iBAAiB,EAAE,CAOjE"}
|
|
@@ -25,7 +25,7 @@ function getBindingNames(nameNode) {
|
|
|
25
25
|
return new Set();
|
|
26
26
|
}
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Why a catch clause is silent, or `undefined` when it references the caught error.
|
|
29
29
|
*
|
|
30
30
|
* A catch clause is "silent" if:
|
|
31
31
|
* 1. It has no binding at all (`catch { ... }`) — no error to reference
|
|
@@ -43,35 +43,34 @@ function getBindingNames(nameNode) {
|
|
|
43
43
|
* — the inner `err` usage satisfies the outer check.
|
|
44
44
|
* Both are rare in practice and arguably code smells themselves.
|
|
45
45
|
*/
|
|
46
|
+
export function silentCatchMessage(catchClause) {
|
|
47
|
+
const varDecl = catchClause.getVariableDeclaration();
|
|
48
|
+
// catch { ... } — no binding at all, always a violation
|
|
49
|
+
if (!varDecl)
|
|
50
|
+
return 'catch block has no error binding — error is silently discarded';
|
|
51
|
+
// No binding names extracted (e.g., unusual pattern) — skip to avoid false positive
|
|
52
|
+
const bindingNames = getBindingNames(varDecl.getNameNode());
|
|
53
|
+
if (bindingNames.size === 0)
|
|
54
|
+
return undefined;
|
|
55
|
+
// Walk the catch block for Identifier nodes matching any binding name
|
|
56
|
+
const hasReference = catchClause
|
|
57
|
+
.getBlock()
|
|
58
|
+
.getDescendantsOfKind(SyntaxKind.Identifier)
|
|
59
|
+
.some((id) => bindingNames.has(id.getText()));
|
|
60
|
+
if (hasReference)
|
|
61
|
+
return undefined;
|
|
62
|
+
return `catch block binds '${varDecl.getName()}' but never references it — error is silently discarded`;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Find catch clauses in the body that don't reference the caught error — see
|
|
66
|
+
* `silentCatchMessage` for what counts as silent.
|
|
67
|
+
*/
|
|
46
68
|
export function findSilentCatches(body) {
|
|
47
69
|
const results = [];
|
|
48
70
|
for (const catchClause of body.getDescendantsOfKind(SyntaxKind.CatchClause)) {
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
51
|
-
|
|
52
|
-
results.push({
|
|
53
|
-
node: catchClause,
|
|
54
|
-
message: 'catch block has no error binding — error is silently discarded',
|
|
55
|
-
});
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
// Collect the binding names to search for
|
|
59
|
-
const bindingNames = getBindingNames(varDecl.getNameNode());
|
|
60
|
-
// No binding names extracted (e.g., unusual pattern) — skip to avoid false positive
|
|
61
|
-
if (bindingNames.size === 0)
|
|
62
|
-
continue;
|
|
63
|
-
// Walk the catch block for Identifier nodes matching any binding name
|
|
64
|
-
const block = catchClause.getBlock();
|
|
65
|
-
const hasReference = block
|
|
66
|
-
.getDescendantsOfKind(SyntaxKind.Identifier)
|
|
67
|
-
.some((id) => bindingNames.has(id.getText()));
|
|
68
|
-
if (!hasReference) {
|
|
69
|
-
const varName = varDecl.getName();
|
|
70
|
-
results.push({
|
|
71
|
-
node: catchClause,
|
|
72
|
-
message: `catch block binds '${varName}' but never references it — error is silently discarded`,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
71
|
+
const message = silentCatchMessage(catchClause);
|
|
72
|
+
if (message !== undefined)
|
|
73
|
+
results.push({ node: catchClause, message });
|
|
75
74
|
}
|
|
76
75
|
return results;
|
|
77
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catch-analysis.js","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"catch-analysis.js","sourceRoot":"","sources":["../../src/conditions/catch-analysis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAa3C;;;;;GAKG;AACH,SAAS,eAAe,CAAC,QAAc;IACrC,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IACtC,CAAC;IAED,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;QAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;gBACzC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;oBACnC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,yEAAyE;IACzE,OAAO,IAAI,GAAG,EAAU,CAAA;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAwB;IACzD,MAAM,OAAO,GAAG,WAAW,CAAC,sBAAsB,EAAE,CAAA;IAEpD,wDAAwD;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,gEAAgE,CAAA;IAErF,oFAAoF;IACpF,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IAC3D,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAE7C,sEAAsE;IACtE,MAAM,YAAY,GAAG,WAAW;SAC7B,QAAQ,EAAE;SACV,oBAAoB,CAAC,UAAU,CAAC,UAAU,CAAC;SAC3C,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC/C,IAAI,YAAY;QAAE,OAAO,SAAS,CAAA;IAElC,OAAO,sBAAsB,OAAO,CAAC,OAAO,EAAE,yDAAyD,CAAA;AACzG,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,MAAM,OAAO,GAAwB,EAAE,CAAA;IACvC,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAA;QAC/C,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;IACzE,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -2,11 +2,13 @@ import type { ClassDeclaration } from 'ts-morph';
|
|
|
2
2
|
import type { Condition } from '@nielspeter/eess';
|
|
3
3
|
import type { TypeMatcher } from '../helpers/type-matchers.js';
|
|
4
4
|
/**
|
|
5
|
-
* Assert that classes extend the named base class
|
|
5
|
+
* Assert that classes directly extend the named base class — written as its name, or through
|
|
6
|
+
* an aliased import, a namespace member or a mixin call.
|
|
6
7
|
*/
|
|
7
8
|
export declare function shouldExtend(className: string): Condition<ClassDeclaration>;
|
|
8
9
|
/**
|
|
9
|
-
* Assert that classes implement the named interface
|
|
10
|
+
* Assert that classes implement the named interface in their own `implements` clause — as
|
|
11
|
+
* written, or through an aliased import.
|
|
10
12
|
*/
|
|
11
13
|
export declare function shouldImplement(interfaceName: string): Condition<ClassDeclaration>;
|
|
12
14
|
/**
|
|
@@ -26,7 +28,7 @@ export declare function shouldNotHaveMethodMatching(regex: RegExp): Condition<Cl
|
|
|
26
28
|
*
|
|
27
29
|
* **Scope note:** This scans constructors, methods, AND set accessors.
|
|
28
30
|
* The function-level counterpart (`functions(p).should().acceptParameterOfType(...)`)
|
|
29
|
-
*
|
|
31
|
+
* reads a set accessor as its own function, `Class.set x` (bug 0315).
|
|
30
32
|
*/
|
|
31
33
|
export declare function acceptParameterOfType(matcher: TypeMatcher): Condition<ClassDeclaration>;
|
|
32
34
|
export declare function notAcceptParameterOfType(matcher: TypeMatcher): Condition<ClassDeclaration>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAwB,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAM3E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAMlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAM/E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAYtF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAyBvF;AAkDD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAW1F"}
|
package/dist/conditions/class.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { elementCondition } from './helpers.js';
|
|
2
2
|
import { createViolation, getElementName } from '../core/violation.js';
|
|
3
|
+
import { extendsByName, implementsByName } from '../helpers/heritage.js';
|
|
3
4
|
/**
|
|
4
|
-
* Assert that classes extend the named base class
|
|
5
|
+
* Assert that classes directly extend the named base class — written as its name, or through
|
|
6
|
+
* an aliased import, a namespace member or a mixin call.
|
|
5
7
|
*/
|
|
6
8
|
export function shouldExtend(className) {
|
|
7
|
-
return elementCondition(`extend "${className}"`, (cls) => cls
|
|
9
|
+
return elementCondition(`extend "${className}"`, (cls) => extendsByName(cls, className), (cls) => `${getElementName(cls)} does not extend "${className}"`);
|
|
8
10
|
}
|
|
9
11
|
/**
|
|
10
|
-
* Assert that classes implement the named interface
|
|
12
|
+
* Assert that classes implement the named interface in their own `implements` clause — as
|
|
13
|
+
* written, or through an aliased import.
|
|
11
14
|
*/
|
|
12
15
|
export function shouldImplement(interfaceName) {
|
|
13
|
-
return elementCondition(`implement "${interfaceName}"`, (cls) => cls
|
|
16
|
+
return elementCondition(`implement "${interfaceName}"`, (cls) => implementsByName(cls, interfaceName), (cls) => `${getElementName(cls)} does not implement "${interfaceName}"`);
|
|
14
17
|
}
|
|
15
18
|
/**
|
|
16
19
|
* Assert that classes have a method with the given name.
|
|
@@ -39,7 +42,7 @@ export function shouldNotHaveMethodMatching(regex) {
|
|
|
39
42
|
*
|
|
40
43
|
* **Scope note:** This scans constructors, methods, AND set accessors.
|
|
41
44
|
* The function-level counterpart (`functions(p).should().acceptParameterOfType(...)`)
|
|
42
|
-
*
|
|
45
|
+
* reads a set accessor as its own function, `Class.set x` (bug 0315).
|
|
43
46
|
*/
|
|
44
47
|
export function acceptParameterOfType(matcher) {
|
|
45
48
|
return {
|
|
@@ -70,7 +73,7 @@ export function acceptParameterOfType(matcher) {
|
|
|
70
73
|
*
|
|
71
74
|
* **Scope note:** This scans constructors, methods, AND set accessors.
|
|
72
75
|
* The function-level counterpart (`functions(p).should().notAcceptParameterOfType(...)`)
|
|
73
|
-
*
|
|
76
|
+
* reads a set accessor as its own function, `Class.set x` (bug 0315).
|
|
74
77
|
*/
|
|
75
78
|
/**
|
|
76
79
|
* Scan parameters of class members (constructors, methods, set accessors) for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/conditions/class.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,8 +34,8 @@ export declare function haveNameMatching(pattern: RegExp): Condition<ArchFunctio
|
|
|
34
34
|
* Reports one violation per function that has no matching parameter.
|
|
35
35
|
*
|
|
36
36
|
* **Scope note:** This operates on the function's own parameter list only.
|
|
37
|
-
*
|
|
38
|
-
*
|
|
37
|
+
* A set accessor is a function of its own, `Class.set x`, since bug 0315; the class-level
|
|
38
|
+
* counterpart scans the whole class at once.
|
|
39
39
|
*/
|
|
40
40
|
export declare function acceptParameterOfType(matcher: TypeMatcher): Condition<ArchFunction>;
|
|
41
41
|
/**
|
|
@@ -46,8 +46,8 @@ export declare function acceptParameterOfType(matcher: TypeMatcher): Condition<A
|
|
|
46
46
|
* with actionable messages including the parameter name and type.
|
|
47
47
|
*
|
|
48
48
|
* **Scope note:** This operates on the function's own parameter list only.
|
|
49
|
-
*
|
|
50
|
-
*
|
|
49
|
+
* A set accessor is a function of its own, `Class.set x`, since bug 0315; the class-level
|
|
50
|
+
* counterpart scans the whole class at once.
|
|
51
51
|
*/
|
|
52
52
|
export declare function notAcceptParameterOfType(matcher: TypeMatcher): Condition<ArchFunction>;
|
|
53
53
|
/**
|