@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
package/dist/rules/metrics.js
CHANGED
|
@@ -1,20 +1,38 @@
|
|
|
1
|
+
import { Node } from 'ts-morph';
|
|
1
2
|
import { cyclomaticComplexity, linesOfCode } from '../helpers/complexity.js';
|
|
2
3
|
import { metricViolation } from '../core/metric-violation.js';
|
|
3
|
-
|
|
4
|
-
|
|
4
|
+
import { functionValueOf } from '../models/arch-function.js';
|
|
5
|
+
function callableMembers(cls) {
|
|
6
|
+
const clsName = cls.getName() ?? '<anonymous>';
|
|
7
|
+
const members = [];
|
|
8
|
+
for (const member of [
|
|
5
9
|
...cls.getMethods(),
|
|
6
10
|
...cls.getConstructors(),
|
|
7
11
|
...cls.getGetAccessors(),
|
|
8
12
|
...cls.getSetAccessors(),
|
|
9
|
-
]
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
]) {
|
|
14
|
+
members.push({
|
|
15
|
+
node: member,
|
|
16
|
+
name: Node.isConstructorDeclaration(member)
|
|
17
|
+
? `${clsName}.constructor`
|
|
18
|
+
: `${clsName}.${member.getName()}`,
|
|
19
|
+
body: member.getBody(),
|
|
20
|
+
parameterCount: member.getParameters().length,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
// After the declared members, so a finding the old walk reported keeps its place.
|
|
24
|
+
for (const property of cls.getProperties()) {
|
|
25
|
+
const value = functionValueOf(property.getInitializer());
|
|
26
|
+
if (value === undefined)
|
|
27
|
+
continue;
|
|
28
|
+
members.push({
|
|
29
|
+
node: property,
|
|
30
|
+
name: `${clsName}.${property.getName()}`,
|
|
31
|
+
body: value.getBody(),
|
|
32
|
+
parameterCount: value.getParameters().length,
|
|
33
|
+
});
|
|
16
34
|
}
|
|
17
|
-
return
|
|
35
|
+
return members;
|
|
18
36
|
}
|
|
19
37
|
/**
|
|
20
38
|
* A ceiling on one measurement of every callable member of every class.
|
|
@@ -37,12 +55,12 @@ function memberCeiling(threshold, spec) {
|
|
|
37
55
|
evaluate(elements, context) {
|
|
38
56
|
const violations = [];
|
|
39
57
|
for (const cls of elements) {
|
|
40
|
-
for (const member of
|
|
58
|
+
for (const member of callableMembers(cls)) {
|
|
41
59
|
const value = spec.measure(member);
|
|
42
60
|
if (value <= threshold)
|
|
43
61
|
continue;
|
|
44
|
-
const name =
|
|
45
|
-
violations.push(metricViolation(member, {
|
|
62
|
+
const name = member.name;
|
|
63
|
+
violations.push(metricViolation(member.node, {
|
|
46
64
|
metric: spec.metric,
|
|
47
65
|
...(spec.unit === undefined ? {} : { unit: spec.unit }),
|
|
48
66
|
// Written long-hand deliberately: `measured,` is a
|
|
@@ -62,8 +80,8 @@ function memberCeiling(threshold, spec) {
|
|
|
62
80
|
};
|
|
63
81
|
}
|
|
64
82
|
/**
|
|
65
|
-
* No
|
|
66
|
-
* cyclomatic complexity.
|
|
83
|
+
* No callable member of the class — a method, constructor or accessor, or a property whose
|
|
84
|
+
* value is a function — may exceed the given cyclomatic complexity (bug 0306).
|
|
67
85
|
*
|
|
68
86
|
* @example
|
|
69
87
|
* ```ts
|
|
@@ -76,7 +94,7 @@ export function maxCyclomaticComplexity(threshold) {
|
|
|
76
94
|
return memberCeiling(threshold, {
|
|
77
95
|
description: `have no method with cyclomatic complexity > ${String(threshold)}`,
|
|
78
96
|
metric: 'complexity',
|
|
79
|
-
measure: (member) => cyclomaticComplexity(member.
|
|
97
|
+
measure: (member) => cyclomaticComplexity(member.body),
|
|
80
98
|
message: (name, cc) => `${name} has cyclomatic complexity ${String(cc)} (max: ${String(threshold)}) — split into smaller methods`,
|
|
81
99
|
});
|
|
82
100
|
}
|
|
@@ -114,7 +132,8 @@ export function maxClassLines(threshold) {
|
|
|
114
132
|
};
|
|
115
133
|
}
|
|
116
134
|
/**
|
|
117
|
-
* No method
|
|
135
|
+
* No callable member of the class — a method, constructor or accessor, or a property whose
|
|
136
|
+
* value is a function — may exceed the given number of lines (bug 0306).
|
|
118
137
|
*
|
|
119
138
|
* @example
|
|
120
139
|
* ```ts
|
|
@@ -130,7 +149,7 @@ export function maxMethodLines(threshold) {
|
|
|
130
149
|
// `code-lines` since bug 0170 — the metric kept its name when it stopped
|
|
131
150
|
// counting comments, and the baseline must not compare across that.
|
|
132
151
|
unit: 'code-lines',
|
|
133
|
-
measure: (member) => linesOfCode(member),
|
|
152
|
+
measure: (member) => linesOfCode(member.node),
|
|
134
153
|
message: (name, loc) => `${name} has ${String(loc)} code lines (max: ${String(threshold)})`,
|
|
135
154
|
});
|
|
136
155
|
}
|
|
@@ -166,7 +185,8 @@ export function maxMethods(threshold) {
|
|
|
166
185
|
};
|
|
167
186
|
}
|
|
168
187
|
/**
|
|
169
|
-
* No
|
|
188
|
+
* No callable member of the class — a method, constructor or accessor, or a property whose
|
|
189
|
+
* value is a function — may have more than the given number of parameters (bug 0306).
|
|
170
190
|
*
|
|
171
191
|
* @example
|
|
172
192
|
* ```ts
|
|
@@ -181,7 +201,7 @@ export function maxParameters(threshold) {
|
|
|
181
201
|
return memberCeiling(threshold, {
|
|
182
202
|
description: `have no method with more than ${String(threshold)} parameters`,
|
|
183
203
|
metric: 'parameters',
|
|
184
|
-
measure: (member) => member.
|
|
204
|
+
measure: (member) => member.parameterCount,
|
|
185
205
|
message: (name, params) => `${name} has ${String(params)} parameters (max: ${String(threshold)}) — use an options object`,
|
|
186
206
|
});
|
|
187
207
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/rules/metrics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/rules/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/security.d.ts
CHANGED
|
@@ -2,21 +2,27 @@ import type { ClassDeclaration, SourceFile } from 'ts-morph';
|
|
|
2
2
|
import type { Condition } from '@nielspeter/eess';
|
|
3
3
|
import type { ArchFunction } from '../models/arch-function.js';
|
|
4
4
|
/**
|
|
5
|
-
* No eval() calls in class
|
|
5
|
+
* No eval() calls in any code a class runs — `eval(…)`, through a global object
|
|
6
|
+
* (`globalThis`, `window`, `self`, `global`), a string-keyed bracket, or the indirect
|
|
7
|
+
* `(0, eval)(…)`. An `eval` bound to a local name first is not seen (bug 0305).
|
|
6
8
|
*
|
|
7
9
|
* @example
|
|
8
10
|
* classes(p).should().satisfy(noEval()).check()
|
|
9
11
|
*/
|
|
10
12
|
export declare function noEval(): Condition<ClassDeclaration>;
|
|
11
13
|
/**
|
|
12
|
-
* No
|
|
14
|
+
* No Function constructor (equivalent to eval) — called with or without `new`, and
|
|
15
|
+
* through a global object.
|
|
13
16
|
*
|
|
14
17
|
* @example
|
|
15
18
|
* classes(p).should().satisfy(noFunctionConstructor()).check()
|
|
16
19
|
*/
|
|
17
20
|
export declare function noFunctionConstructor(): Condition<ClassDeclaration>;
|
|
18
21
|
/**
|
|
19
|
-
* No
|
|
22
|
+
* No process.env read in any code a class runs, as `notContain()` on the class
|
|
23
|
+
* builder defines it, spelled `process.env`, `process['env']`, or through a
|
|
24
|
+
* global object. An `env` destructured from `process` or imported from `node:process` is
|
|
25
|
+
* not seen (bug 0305); `import.meta.env` is not Node's environment and is not reported.
|
|
20
26
|
*
|
|
21
27
|
* Use dependency injection for configuration instead.
|
|
22
28
|
*
|
|
@@ -28,7 +34,8 @@ export declare function noFunctionConstructor(): Condition<ClassDeclaration>;
|
|
|
28
34
|
*/
|
|
29
35
|
export declare function noProcessEnv(): Condition<ClassDeclaration>;
|
|
30
36
|
/**
|
|
31
|
-
* No console.log calls in class
|
|
37
|
+
* No console.log calls in any code a class runs — including `console['log']` and through a
|
|
38
|
+
* global object.
|
|
32
39
|
*
|
|
33
40
|
* Use a logger abstraction instead.
|
|
34
41
|
*
|
|
@@ -39,7 +46,8 @@ export declare function noProcessEnv(): Condition<ClassDeclaration>;
|
|
|
39
46
|
*/
|
|
40
47
|
export declare function noConsoleLog(): Condition<ClassDeclaration>;
|
|
41
48
|
/**
|
|
42
|
-
* No direct console access (any method: log, warn, error, debug, info)
|
|
49
|
+
* No direct console access (any method: log, warn, error, debug, info), including
|
|
50
|
+
* bracketed and global-object spellings.
|
|
43
51
|
* Stricter than noConsoleLog — catches all console methods.
|
|
44
52
|
*/
|
|
45
53
|
export declare function noConsole(): Condition<ClassDeclaration>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/rules/security.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/rules/security.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAmI9D;;;;;;;GAOG;AACH,wBAAgB,MAAM,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAEpD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAEnE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAE1D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAEvD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAEzD;AAID,wBAAgB,cAAc,IAAI,SAAS,CAAC,YAAY,CAAC,CAExD;AAED,wBAAgB,6BAA6B,IAAI,SAAS,CAAC,YAAY,CAAC,CAEvE;AAED,wBAAgB,oBAAoB,IAAI,SAAS,CAAC,YAAY,CAAC,CAE9D;AAED,wBAAgB,oBAAoB,IAAI,SAAS,CAAC,YAAY,CAAC,CAE9D;AAED,wBAAgB,iBAAiB,IAAI,SAAS,CAAC,YAAY,CAAC,CAE3D;AAED,wBAAgB,mBAAmB,IAAI,SAAS,CAAC,YAAY,CAAC,CAE7D;AAID,wBAAgB,YAAY,IAAI,SAAS,CAAC,UAAU,CAAC,CAEpD;AAED,wBAAgB,kBAAkB,IAAI,SAAS,CAAC,UAAU,CAAC,CAE1D;AAED,wBAAgB,kBAAkB,IAAI,SAAS,CAAC,UAAU,CAAC,CAE1D"}
|
package/dist/rules/security.js
CHANGED
|
@@ -1,27 +1,150 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Node, SyntaxKind } from 'ts-morph';
|
|
2
|
+
import { call } from '../helpers/matchers.js';
|
|
2
3
|
import { classNotContain } from '../conditions/body-analysis.js';
|
|
3
4
|
import { functionNotContain } from '../conditions/body-analysis-function.js';
|
|
4
5
|
import { moduleNotContain } from '../conditions/body-analysis-module.js';
|
|
6
|
+
// ─── Reading a global however its name is spelled (bugs 0301, 0297, 0308) ──────
|
|
7
|
+
//
|
|
8
|
+
// `call('eval')` compared the callee's text, so `globalThis.eval(…)`, `(0, eval)(…)`
|
|
9
|
+
// and `Function(…)` without `new` passed rules — and a `recommended` floor — written
|
|
10
|
+
// to catch exactly those; `access('process.env')` did the same to `process['env']` and
|
|
11
|
+
// `globalThis.process.env`. These matchers read the name structurally instead. They are
|
|
12
|
+
// private to this module on purpose: the public `call()` and `access()` promise a text
|
|
13
|
+
// match, and adopters' own rules depend on that.
|
|
14
|
+
//
|
|
15
|
+
// They read names, not bindings, so a local binding misleads them both ways: a global
|
|
16
|
+
// first bound to a local name (`const ev = eval`, `const { log } = console`,
|
|
17
|
+
// `const { env } = process`, an `env` imported from `node:process`) is missed,
|
|
18
|
+
// and a local declaration that shadows a global (`function Function() {}`,
|
|
19
|
+
// `const console = {…}`) is reported as the global. Both need the binding followed,
|
|
20
|
+
// which is bug 0305. A type assertion, `satisfies` and a non-null assertion are read through,
|
|
21
|
+
// and so is any number of leading global objects (`window.self.eval`) — bug 0308.
|
|
22
|
+
/** The names a global is reachable through: standard, browser, worker and Node. */
|
|
23
|
+
const GLOBAL_OBJECTS = new Set(['globalThis', 'window', 'self', 'global']);
|
|
24
|
+
/** `x['y']` reads as `x.y` when the key is a literal; a computed key reads as nothing. */
|
|
25
|
+
function elementChainOf(node) {
|
|
26
|
+
if (!Node.isElementAccessExpression(node))
|
|
27
|
+
return undefined;
|
|
28
|
+
const key = node.getArgumentExpression();
|
|
29
|
+
const base = chainOf(node.getExpression());
|
|
30
|
+
if (base === undefined)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (Node.isStringLiteral(key) || Node.isNoSubstitutionTemplateLiteral(key)) {
|
|
33
|
+
return `${base}.${key.getLiteralValue()}`;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The dotted name an expression reads, or `undefined` when it is not a plain name
|
|
39
|
+
* chain. `x?.y` reads as `x.y`, and `(0, x)` — the indirect-call idiom — as `x`.
|
|
40
|
+
* `this.x` reads as nothing, so a member of an instance is never a global. A type assertion
|
|
41
|
+
* (`as`, `<T>`), `satisfies` and a non-null assertion (`!`) read as the expression they wrap:
|
|
42
|
+
* none of them changes the value at run time (bug 0308).
|
|
43
|
+
*/
|
|
44
|
+
function chainOf(node) {
|
|
45
|
+
if (Node.isIdentifier(node))
|
|
46
|
+
return node.getText();
|
|
47
|
+
if (Node.isAsExpression(node) ||
|
|
48
|
+
Node.isSatisfiesExpression(node) ||
|
|
49
|
+
Node.isNonNullExpression(node) ||
|
|
50
|
+
Node.isTypeAssertion(node)) {
|
|
51
|
+
return chainOf(node.getExpression());
|
|
52
|
+
}
|
|
53
|
+
if (Node.isParenthesizedExpression(node)) {
|
|
54
|
+
const inner = node.getExpression();
|
|
55
|
+
const isComma = Node.isBinaryExpression(inner) && inner.getOperatorToken().getKind() === SyntaxKind.CommaToken;
|
|
56
|
+
return chainOf(isComma ? inner.getRight() : inner);
|
|
57
|
+
}
|
|
58
|
+
if (Node.isPropertyAccessExpression(node)) {
|
|
59
|
+
const base = chainOf(node.getExpression());
|
|
60
|
+
return base === undefined ? undefined : `${base}.${node.getName()}`;
|
|
61
|
+
}
|
|
62
|
+
return elementChainOf(node);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The chain with its leading global objects removed: `globalThis.eval` and `window.self.eval`
|
|
66
|
+
* both read as `eval` (bug 0308). Only leading names are dropped, so `settings.window.eval` is
|
|
67
|
+
* not the global.
|
|
68
|
+
*/
|
|
69
|
+
function globalNameOf(node) {
|
|
70
|
+
let chain = chainOf(node);
|
|
71
|
+
if (chain === undefined)
|
|
72
|
+
return undefined;
|
|
73
|
+
let dot = chain.indexOf('.');
|
|
74
|
+
while (dot > 0 && GLOBAL_OBJECTS.has(chain.slice(0, dot))) {
|
|
75
|
+
chain = chain.slice(dot + 1);
|
|
76
|
+
dot = chain.indexOf('.');
|
|
77
|
+
}
|
|
78
|
+
return chain;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A call to the global `name`. Described as `call()` describes it, so messages are unchanged; a
|
|
82
|
+
* newly reported call earlier in a declaration still renumbers the matches after it.
|
|
83
|
+
*/
|
|
84
|
+
function globalCall(name) {
|
|
85
|
+
return {
|
|
86
|
+
description: `call to '${name}'`,
|
|
87
|
+
syntaxKinds: [SyntaxKind.CallExpression],
|
|
88
|
+
matches: (node) => Node.isCallExpression(node) && globalNameOf(node.getExpression()) === name,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** The global `Function`, called or constructed — `Function(…)` is `new Function(…)`. */
|
|
92
|
+
function functionConstructor() {
|
|
93
|
+
return {
|
|
94
|
+
description: 'Function constructor',
|
|
95
|
+
syntaxKinds: [SyntaxKind.NewExpression, SyntaxKind.CallExpression],
|
|
96
|
+
matches: (node) => (Node.isNewExpression(node) || Node.isCallExpression(node)) &&
|
|
97
|
+
globalNameOf(node.getExpression()) === 'Function',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Any member of the global `console`. Described as the `access()` it replaces, so messages are
|
|
102
|
+
* unchanged; a newly reported read earlier in a declaration still renumbers the matches after it.
|
|
103
|
+
*/
|
|
104
|
+
function consoleAccess() {
|
|
105
|
+
return {
|
|
106
|
+
description: 'access matching /^console\\./',
|
|
107
|
+
syntaxKinds: [SyntaxKind.PropertyAccessExpression, SyntaxKind.ElementAccessExpression],
|
|
108
|
+
matches: (node) => globalNameOf(node)?.startsWith('console.') === true,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* A read of the global `process.env`. Described as the `access()` it replaces, so messages are
|
|
113
|
+
* unchanged; a newly reported read earlier in a member still renumbers the matches after it.
|
|
114
|
+
*/
|
|
115
|
+
function processEnvAccess() {
|
|
116
|
+
return {
|
|
117
|
+
description: "access to 'process.env'",
|
|
118
|
+
syntaxKinds: [SyntaxKind.PropertyAccessExpression, SyntaxKind.ElementAccessExpression],
|
|
119
|
+
matches: (node) => globalNameOf(node) === 'process.env',
|
|
120
|
+
};
|
|
121
|
+
}
|
|
5
122
|
/**
|
|
6
|
-
* No eval() calls in class
|
|
123
|
+
* No eval() calls in any code a class runs — `eval(…)`, through a global object
|
|
124
|
+
* (`globalThis`, `window`, `self`, `global`), a string-keyed bracket, or the indirect
|
|
125
|
+
* `(0, eval)(…)`. An `eval` bound to a local name first is not seen (bug 0305).
|
|
7
126
|
*
|
|
8
127
|
* @example
|
|
9
128
|
* classes(p).should().satisfy(noEval()).check()
|
|
10
129
|
*/
|
|
11
130
|
export function noEval() {
|
|
12
|
-
return classNotContain(
|
|
131
|
+
return classNotContain(globalCall('eval'));
|
|
13
132
|
}
|
|
14
133
|
/**
|
|
15
|
-
* No
|
|
134
|
+
* No Function constructor (equivalent to eval) — called with or without `new`, and
|
|
135
|
+
* through a global object.
|
|
16
136
|
*
|
|
17
137
|
* @example
|
|
18
138
|
* classes(p).should().satisfy(noFunctionConstructor()).check()
|
|
19
139
|
*/
|
|
20
140
|
export function noFunctionConstructor() {
|
|
21
|
-
return classNotContain(
|
|
141
|
+
return classNotContain(functionConstructor());
|
|
22
142
|
}
|
|
23
143
|
/**
|
|
24
|
-
* No
|
|
144
|
+
* No process.env read in any code a class runs, as `notContain()` on the class
|
|
145
|
+
* builder defines it, spelled `process.env`, `process['env']`, or through a
|
|
146
|
+
* global object. An `env` destructured from `process` or imported from `node:process` is
|
|
147
|
+
* not seen (bug 0305); `import.meta.env` is not Node's environment and is not reported.
|
|
25
148
|
*
|
|
26
149
|
* Use dependency injection for configuration instead.
|
|
27
150
|
*
|
|
@@ -32,10 +155,11 @@ export function noFunctionConstructor() {
|
|
|
32
155
|
* .check()
|
|
33
156
|
*/
|
|
34
157
|
export function noProcessEnv() {
|
|
35
|
-
return classNotContain(
|
|
158
|
+
return classNotContain(processEnvAccess());
|
|
36
159
|
}
|
|
37
160
|
/**
|
|
38
|
-
* No console.log calls in class
|
|
161
|
+
* No console.log calls in any code a class runs — including `console['log']` and through a
|
|
162
|
+
* global object.
|
|
39
163
|
*
|
|
40
164
|
* Use a logger abstraction instead.
|
|
41
165
|
*
|
|
@@ -45,14 +169,15 @@ export function noProcessEnv() {
|
|
|
45
169
|
* .check()
|
|
46
170
|
*/
|
|
47
171
|
export function noConsoleLog() {
|
|
48
|
-
return classNotContain(
|
|
172
|
+
return classNotContain(globalCall('console.log'));
|
|
49
173
|
}
|
|
50
174
|
/**
|
|
51
|
-
* No direct console access (any method: log, warn, error, debug, info)
|
|
175
|
+
* No direct console access (any method: log, warn, error, debug, info), including
|
|
176
|
+
* bracketed and global-object spellings.
|
|
52
177
|
* Stricter than noConsoleLog — catches all console methods.
|
|
53
178
|
*/
|
|
54
179
|
export function noConsole() {
|
|
55
|
-
return classNotContain(
|
|
180
|
+
return classNotContain(consoleAccess());
|
|
56
181
|
}
|
|
57
182
|
/**
|
|
58
183
|
* No JSON.parse calls — centralize deserialization.
|
|
@@ -62,31 +187,31 @@ export function noJsonParse() {
|
|
|
62
187
|
}
|
|
63
188
|
// ─── Function variants ────────────────────────────────────────────
|
|
64
189
|
export function functionNoEval() {
|
|
65
|
-
return functionNotContain(
|
|
190
|
+
return functionNotContain(globalCall('eval'));
|
|
66
191
|
}
|
|
67
192
|
export function functionNoFunctionConstructor() {
|
|
68
|
-
return functionNotContain(
|
|
193
|
+
return functionNotContain(functionConstructor());
|
|
69
194
|
}
|
|
70
195
|
export function functionNoProcessEnv() {
|
|
71
|
-
return functionNotContain(
|
|
196
|
+
return functionNotContain(processEnvAccess());
|
|
72
197
|
}
|
|
73
198
|
export function functionNoConsoleLog() {
|
|
74
|
-
return functionNotContain(
|
|
199
|
+
return functionNotContain(globalCall('console.log'));
|
|
75
200
|
}
|
|
76
201
|
export function functionNoConsole() {
|
|
77
|
-
return functionNotContain(
|
|
202
|
+
return functionNotContain(consoleAccess());
|
|
78
203
|
}
|
|
79
204
|
export function functionNoJsonParse() {
|
|
80
205
|
return functionNotContain(call('JSON.parse'));
|
|
81
206
|
}
|
|
82
207
|
// ─── Module variants ──────────────────────────────────────────────
|
|
83
208
|
export function moduleNoEval() {
|
|
84
|
-
return moduleNotContain(
|
|
209
|
+
return moduleNotContain(globalCall('eval'));
|
|
85
210
|
}
|
|
86
211
|
export function moduleNoProcessEnv() {
|
|
87
|
-
return moduleNotContain(
|
|
212
|
+
return moduleNotContain(processEnvAccess());
|
|
88
213
|
}
|
|
89
214
|
export function moduleNoConsoleLog() {
|
|
90
|
-
return moduleNotContain(
|
|
215
|
+
return moduleNotContain(globalCall('console.log'));
|
|
91
216
|
}
|
|
92
217
|
//# sourceMappingURL=security.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/rules/security.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/rules/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ export declare function noAnyProperties(): Condition<ClassDeclaration>;
|
|
|
21
21
|
/**
|
|
22
22
|
* Class bodies must not contain `as` type assertions.
|
|
23
23
|
* Allows `as const` (narrows types, doesn't widen).
|
|
24
|
-
* Scans
|
|
24
|
+
* Scans all the code the class runs, as `notContain()` on the class builder defines it.
|
|
25
25
|
*
|
|
26
26
|
* @example
|
|
27
27
|
* classes(p).that().haveNameEndingWith('Service')
|
|
@@ -32,7 +32,7 @@ export declare function noTypeAssertions(): Condition<ClassDeclaration>;
|
|
|
32
32
|
/**
|
|
33
33
|
* Class bodies must not contain non-null assertions (`!`).
|
|
34
34
|
* Handle null/undefined explicitly instead of asserting it away.
|
|
35
|
-
* Scans
|
|
35
|
+
* Scans all the code the class runs, as `notContain()` on the class builder defines it.
|
|
36
36
|
*
|
|
37
37
|
* @example
|
|
38
38
|
* classes(p).that().resideInFolder('** /domain/** ')
|
package/dist/rules/typescript.js
CHANGED
|
@@ -39,7 +39,7 @@ export function noAnyProperties() {
|
|
|
39
39
|
/**
|
|
40
40
|
* Class bodies must not contain `as` type assertions.
|
|
41
41
|
* Allows `as const` (narrows types, doesn't widen).
|
|
42
|
-
* Scans
|
|
42
|
+
* Scans all the code the class runs, as `notContain()` on the class builder defines it.
|
|
43
43
|
*
|
|
44
44
|
* @example
|
|
45
45
|
* classes(p).that().haveNameEndingWith('Service')
|
|
@@ -52,7 +52,7 @@ export function noTypeAssertions() {
|
|
|
52
52
|
/**
|
|
53
53
|
* Class bodies must not contain non-null assertions (`!`).
|
|
54
54
|
* Handle null/undefined explicitly instead of asserting it away.
|
|
55
|
-
* Scans
|
|
55
|
+
* Scans all the code the class runs, as `notContain()` on the class builder defines it.
|
|
56
56
|
*
|
|
57
57
|
* @example
|
|
58
58
|
* classes(p).that().resideInFolder('** /domain/** ')
|
|
@@ -143,8 +143,8 @@ export class DuplicateBodiesBuilder extends SmellBuilder {
|
|
|
143
143
|
}
|
|
144
144
|
// Detectors scan for a property of the code, not a user-declared subject
|
|
145
145
|
// set, so they always include object-literal functions. `functions()`
|
|
146
|
-
// keeps
|
|
147
|
-
//
|
|
146
|
+
// keeps anonymous values opt-in, because every inline callback would flood a
|
|
147
|
+
// rule a user wrote; a detector has no such contract to break, and a
|
|
148
148
|
// duplicated arrow under an object key — a resolver, a route handler, a
|
|
149
149
|
// reducer case — is exactly the copy-paste rot this exists to find.
|
|
150
150
|
for (const fn of collectFunctions(sf, { includeObjectLiteralFunctions: true })) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duplicate-bodies.js","sourceRoot":"","sources":["../../src/smells/duplicate-bodies.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"duplicate-bodies.js","sourceRoot":"","sources":["../../src/smells/duplicate-bodies.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,8 @@ const TEST_PATTERNS = ['**/*.test.ts', '**/*.spec.ts', '**/__tests__/**'];
|
|
|
8
8
|
function fileMatchesPattern(sf, pattern, minLines) {
|
|
9
9
|
// Detectors scan for a property of the code, not a user-declared subject
|
|
10
10
|
// set, so they always include object-literal functions. `functions()`
|
|
11
|
-
// keeps
|
|
12
|
-
//
|
|
11
|
+
// keeps anonymous values opt-in, because every inline callback would flood a
|
|
12
|
+
// rule a user wrote; a detector has no such contract to break, and a
|
|
13
13
|
// duplicated arrow under an object key — a resolver, a route handler, a
|
|
14
14
|
// reducer case — is exactly the copy-paste rot this exists to find.
|
|
15
15
|
for (const fn of collectFunctions(sf, { includeObjectLiteralFunctions: true })) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sibling-files.js","sourceRoot":"","sources":["../../src/smells/sibling-files.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,SAAS,MAAM,WAAW,CAAA;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAEjE,0DAA0D;AAC1D,MAAM,aAAa,GAAG,CAAC,cAAc,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAA;AAmBzE,yEAAyE;AACzE,SAAS,kBAAkB,CAAC,EAAc,EAAE,OAA0B,EAAE,QAAgB;IACtF,yEAAyE;IACzE,sEAAsE;IACtE,
|
|
1
|
+
{"version":3,"file":"sibling-files.js","sourceRoot":"","sources":["../../src/smells/sibling-files.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nielspeter/eess-ts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Architecture testing for TypeScript — the TS dialect of the eess family (formerly ts-archunit)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
}
|
|
116
116
|
},
|
|
117
117
|
"dependencies": {
|
|
118
|
-
"@nielspeter/eess": "^0.5.
|
|
118
|
+
"@nielspeter/eess": "^0.5.1",
|
|
119
119
|
"jiti": "^2.6.1",
|
|
120
120
|
"picomatch": "^4.0.4",
|
|
121
121
|
"ts-morph": "^27.0.2"
|