@nielspeter/eess-ts 0.5.1 → 0.7.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 +2 -2
- package/dist/builders/class-rule-builder.d.ts +6 -10
- package/dist/builders/class-rule-builder.d.ts.map +1 -1
- package/dist/builders/class-rule-builder.js +33 -4
- 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/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-module.d.ts.map +1 -1
- package/dist/conditions/body-analysis-module.js +37 -4
- package/dist/conditions/body-analysis-module.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 +8 -5
- package/dist/conditions/call.d.ts.map +1 -1
- package/dist/conditions/call.js +46 -20
- 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/core/object-literal-functions.d.ts +4 -1
- package/dist/core/object-literal-functions.d.ts.map +1 -1
- package/dist/core/object-literal-functions.js +27 -5
- package/dist/core/object-literal-functions.js.map +1 -1
- package/dist/core/through-wrappers.d.ts +24 -0
- package/dist/core/through-wrappers.d.ts.map +1 -0
- package/dist/core/through-wrappers.js +36 -0
- package/dist/core/through-wrappers.js.map +1 -0
- package/dist/core/vacuity-diagnosis.d.ts.map +1 -1
- package/dist/core/vacuity-diagnosis.js +11 -3
- package/dist/core/vacuity-diagnosis.js.map +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 +74 -20
- package/dist/helpers/body-traversal.d.ts.map +1 -1
- package/dist/helpers/body-traversal.js +273 -48
- package/dist/helpers/body-traversal.js.map +1 -1
- package/dist/helpers/callback-extractor.d.ts +6 -1
- package/dist/helpers/callback-extractor.d.ts.map +1 -1
- package/dist/helpers/callback-extractor.js +45 -10
- package/dist/helpers/callback-extractor.js.map +1 -1
- package/dist/helpers/global-binding.d.ts +11 -0
- package/dist/helpers/global-binding.d.ts.map +1 -0
- package/dist/helpers/global-binding.js +232 -0
- package/dist/helpers/global-binding.js.map +1 -0
- 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 +2 -2
- package/dist/index.js.map +1 -1
- package/dist/models/arch-function.d.ts +44 -14
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +226 -43
- 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/presets/recommended.d.ts +14 -6
- package/dist/presets/recommended.d.ts.map +1 -1
- package/dist/presets/recommended.js +30 -11
- package/dist/presets/recommended.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 +44 -23
- 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 +19 -5
- package/dist/rules/security.d.ts.map +1 -1
- package/dist/rules/security.js +198 -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 +1 -1
package/dist/rules/security.js
CHANGED
|
@@ -1,27 +1,196 @@
|
|
|
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
|
+
import { globalChainOf } from '../helpers/global-binding.js';
|
|
7
|
+
// ─── Reading a global however its name is spelled (bugs 0301, 0297, 0308) ──────
|
|
8
|
+
//
|
|
9
|
+
// `call('eval')` compared the callee's text, so `globalThis.eval(…)`, `(0, eval)(…)`
|
|
10
|
+
// and `Function(…)` without `new` passed rules — and a `recommended` floor — written
|
|
11
|
+
// to catch exactly those; `access('process.env')` did the same to `process['env']` and
|
|
12
|
+
// `globalThis.process.env`. These matchers read the name structurally instead. They are
|
|
13
|
+
// private to this module on purpose: the public `call()` and `access()` promise a text
|
|
14
|
+
// match, and adopters' own rules depend on that.
|
|
15
|
+
//
|
|
16
|
+
// They read names, not bindings, so a local binding misleads them both ways: a global
|
|
17
|
+
// first bound to a local name (`const ev = eval`, `const { log } = console`,
|
|
18
|
+
// `const { env } = process`, an `env` imported from `node:process`) is missed,
|
|
19
|
+
// and a local declaration that shadows a global (`function Function() {}`,
|
|
20
|
+
// `const console = {…}`) is reported as the global. Both need the binding followed,
|
|
21
|
+
// which is bug 0305. A type assertion, `satisfies` and a non-null assertion are read through,
|
|
22
|
+
// and so is any number of leading global objects (`window.self.eval`) — bug 0308.
|
|
23
|
+
/** The names a global is reachable through: standard, browser, worker and Node. */
|
|
24
|
+
const GLOBAL_OBJECTS = new Set(['globalThis', 'window', 'self', 'global']);
|
|
25
|
+
/** `x['y']` reads as `x.y` when the key is a literal; a computed key reads as nothing. */
|
|
26
|
+
function elementChainOf(node) {
|
|
27
|
+
if (!Node.isElementAccessExpression(node))
|
|
28
|
+
return undefined;
|
|
29
|
+
const key = node.getArgumentExpression();
|
|
30
|
+
const base = chainOf(node.getExpression());
|
|
31
|
+
if (base === undefined)
|
|
32
|
+
return undefined;
|
|
33
|
+
if (Node.isStringLiteral(key) || Node.isNoSubstitutionTemplateLiteral(key)) {
|
|
34
|
+
return `${base}.${key.getLiteralValue()}`;
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The dotted name an expression reads, or `undefined` when it is not a plain name
|
|
40
|
+
* chain. `x?.y` reads as `x.y`, and `(0, x)` — the indirect-call idiom — as `x`.
|
|
41
|
+
* `this.x` reads as nothing, so a member of an instance is never a global. A type assertion
|
|
42
|
+
* (`as`, `<T>`), `satisfies` and a non-null assertion (`!`) read as the expression they wrap:
|
|
43
|
+
* none of them changes the value at run time (bug 0308).
|
|
44
|
+
*/
|
|
45
|
+
function chainOf(node) {
|
|
46
|
+
if (Node.isIdentifier(node))
|
|
47
|
+
return node.getText();
|
|
48
|
+
if (Node.isAsExpression(node) ||
|
|
49
|
+
Node.isSatisfiesExpression(node) ||
|
|
50
|
+
Node.isNonNullExpression(node) ||
|
|
51
|
+
Node.isTypeAssertion(node)) {
|
|
52
|
+
return chainOf(node.getExpression());
|
|
53
|
+
}
|
|
54
|
+
if (Node.isParenthesizedExpression(node)) {
|
|
55
|
+
const inner = node.getExpression();
|
|
56
|
+
const isComma = Node.isBinaryExpression(inner) && inner.getOperatorToken().getKind() === SyntaxKind.CommaToken;
|
|
57
|
+
return chainOf(isComma ? inner.getRight() : inner);
|
|
58
|
+
}
|
|
59
|
+
if (Node.isPropertyAccessExpression(node)) {
|
|
60
|
+
const base = chainOf(node.getExpression());
|
|
61
|
+
return base === undefined ? undefined : `${base}.${node.getName()}`;
|
|
62
|
+
}
|
|
63
|
+
return elementChainOf(node);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The chain with its leading global objects removed: `globalThis.eval` and `window.self.eval`
|
|
67
|
+
* both read as `eval` (bug 0308). Only leading names are dropped, so `settings.window.eval` is
|
|
68
|
+
* not the global.
|
|
69
|
+
*/
|
|
70
|
+
function globalNameOf(node) {
|
|
71
|
+
// Through the binding first (bug 0305), then the leading global objects (bug 0308): a name bound
|
|
72
|
+
// to `globalThis.eval` has to lose the `globalThis.` after the binding is followed, not before.
|
|
73
|
+
let chain = globalChainOf(node, chainOf);
|
|
74
|
+
if (chain === undefined)
|
|
75
|
+
return undefined;
|
|
76
|
+
let dot = chain.indexOf('.');
|
|
77
|
+
while (dot > 0 && GLOBAL_OBJECTS.has(chain.slice(0, dot))) {
|
|
78
|
+
chain = chain.slice(dot + 1);
|
|
79
|
+
dot = chain.indexOf('.');
|
|
80
|
+
}
|
|
81
|
+
return chain;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A call to the global `name`. Described as `call()` describes it, so messages are unchanged; a
|
|
85
|
+
* newly reported call earlier in a declaration still renumbers the matches after it.
|
|
86
|
+
*/
|
|
87
|
+
function globalCall(name) {
|
|
88
|
+
return {
|
|
89
|
+
description: `call to '${name}'`,
|
|
90
|
+
syntaxKinds: [SyntaxKind.CallExpression],
|
|
91
|
+
matches: (node) => Node.isCallExpression(node) && globalNameOf(node.getExpression()) === name,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** The global `Function`, called or constructed — `Function(…)` is `new Function(…)`. */
|
|
95
|
+
function functionConstructor() {
|
|
96
|
+
return {
|
|
97
|
+
description: 'Function constructor',
|
|
98
|
+
syntaxKinds: [SyntaxKind.NewExpression, SyntaxKind.CallExpression],
|
|
99
|
+
matches: (node) => (Node.isNewExpression(node) || Node.isCallExpression(node)) &&
|
|
100
|
+
globalNameOf(node.getExpression()) === 'Function',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Any member of the global `console`. Described as the `access()` it replaces, so messages are
|
|
105
|
+
* unchanged; a newly reported read earlier in a declaration still renumbers the matches after it.
|
|
106
|
+
*/
|
|
107
|
+
function consoleAccess() {
|
|
108
|
+
return {
|
|
109
|
+
description: 'access matching /^console\\./',
|
|
110
|
+
syntaxKinds: [
|
|
111
|
+
SyntaxKind.PropertyAccessExpression,
|
|
112
|
+
SyntaxKind.ElementAccessExpression,
|
|
113
|
+
// A member destructured out of `console` is reached by a bare NAME — `const { log } =
|
|
114
|
+
// console; log(1)` — so the identifier itself has to be asked (bug 0305).
|
|
115
|
+
SyntaxKind.Identifier,
|
|
116
|
+
],
|
|
117
|
+
matches: (node) => readsAName(node) && globalNameOf(node)?.startsWith('console.') === true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A read of the global `process.env`. Described as the `access()` it replaces, so messages are
|
|
122
|
+
* unchanged; a newly reported read earlier in a member still renumbers the matches after it.
|
|
123
|
+
*/
|
|
124
|
+
function processEnvAccess() {
|
|
125
|
+
return {
|
|
126
|
+
description: "access to 'process.env'",
|
|
127
|
+
syntaxKinds: [
|
|
128
|
+
SyntaxKind.PropertyAccessExpression,
|
|
129
|
+
SyntaxKind.ElementAccessExpression,
|
|
130
|
+
// `const { env } = process; env.B` and `import { env } from 'node:process'` reach the
|
|
131
|
+
// environment through a bare name (bug 0305).
|
|
132
|
+
SyntaxKind.Identifier,
|
|
133
|
+
],
|
|
134
|
+
matches: (node) => readsAName(node) && globalNameOf(node) === 'process.env',
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Whether a node reads a name, rather than writing one down (bug 0305).
|
|
139
|
+
*
|
|
140
|
+
* With `Identifier` in a matcher's kinds, every occurrence of a name is a candidate — including the
|
|
141
|
+
* name being DECLARED (`const { log } = console`) and the property part of an access
|
|
142
|
+
* (`console.log`, whose `log` is not the root of its own chain). Reading those would report a
|
|
143
|
+
* finding at the declaration beside the one at the use, and report `console.log` twice.
|
|
144
|
+
*/
|
|
145
|
+
function readsAName(node) {
|
|
146
|
+
if (!Node.isIdentifier(node))
|
|
147
|
+
return true;
|
|
148
|
+
const parent = node.getParent();
|
|
149
|
+
if (parent === undefined)
|
|
150
|
+
return false;
|
|
151
|
+
if (Node.isPropertyAccessExpression(parent))
|
|
152
|
+
return parent.getExpression() === node;
|
|
153
|
+
if (Node.isBindingElement(parent) || Node.isVariableDeclaration(parent)) {
|
|
154
|
+
return parent.getNameNode() !== node;
|
|
155
|
+
}
|
|
156
|
+
if (Node.isImportSpecifier(parent) || Node.isParameterDeclaration(parent))
|
|
157
|
+
return false;
|
|
158
|
+
// A shorthand property's name IS its value — `const o = { console }` reads the global, where
|
|
159
|
+
// `{ console: x }` writes the key and reads `x`. It changes no verdict today, because these
|
|
160
|
+
// matchers read a MEMBER access (`console.log`, `process.env`) and a bare `console` handed on as
|
|
161
|
+
// a value is not one; it is here so the predicate answers its own question truthfully.
|
|
162
|
+
if (Node.isShorthandPropertyAssignment(parent))
|
|
163
|
+
return true;
|
|
164
|
+
if (Node.isPropertyAssignment(parent))
|
|
165
|
+
return parent.getNameNode() !== node;
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
5
168
|
/**
|
|
6
|
-
* No eval() calls in class
|
|
169
|
+
* No eval() calls in any code a class runs — `eval(…)`, through a global object
|
|
170
|
+
* (`globalThis`, `window`, `self`, `global`), a string-keyed bracket, or the indirect
|
|
171
|
+
* `(0, eval)(…)`. An `eval` bound to a local name first is not seen (bug 0305).
|
|
7
172
|
*
|
|
8
173
|
* @example
|
|
9
174
|
* classes(p).should().satisfy(noEval()).check()
|
|
10
175
|
*/
|
|
11
176
|
export function noEval() {
|
|
12
|
-
return classNotContain(
|
|
177
|
+
return classNotContain(globalCall('eval'));
|
|
13
178
|
}
|
|
14
179
|
/**
|
|
15
|
-
* No
|
|
180
|
+
* No Function constructor (equivalent to eval) — called with or without `new`, and
|
|
181
|
+
* through a global object.
|
|
16
182
|
*
|
|
17
183
|
* @example
|
|
18
184
|
* classes(p).should().satisfy(noFunctionConstructor()).check()
|
|
19
185
|
*/
|
|
20
186
|
export function noFunctionConstructor() {
|
|
21
|
-
return classNotContain(
|
|
187
|
+
return classNotContain(functionConstructor());
|
|
22
188
|
}
|
|
23
189
|
/**
|
|
24
|
-
* No
|
|
190
|
+
* No process.env read in any code a class runs, as `notContain()` on the class
|
|
191
|
+
* builder defines it, spelled `process.env`, `process['env']`, or through a
|
|
192
|
+
* global object. An `env` destructured from `process` or imported from `node:process` is
|
|
193
|
+
* not seen (bug 0305); `import.meta.env` is not Node's environment and is not reported.
|
|
25
194
|
*
|
|
26
195
|
* Use dependency injection for configuration instead.
|
|
27
196
|
*
|
|
@@ -32,10 +201,11 @@ export function noFunctionConstructor() {
|
|
|
32
201
|
* .check()
|
|
33
202
|
*/
|
|
34
203
|
export function noProcessEnv() {
|
|
35
|
-
return classNotContain(
|
|
204
|
+
return classNotContain(processEnvAccess());
|
|
36
205
|
}
|
|
37
206
|
/**
|
|
38
|
-
* No console.log calls in class
|
|
207
|
+
* No console.log calls in any code a class runs — including `console['log']` and through a
|
|
208
|
+
* global object.
|
|
39
209
|
*
|
|
40
210
|
* Use a logger abstraction instead.
|
|
41
211
|
*
|
|
@@ -45,14 +215,15 @@ export function noProcessEnv() {
|
|
|
45
215
|
* .check()
|
|
46
216
|
*/
|
|
47
217
|
export function noConsoleLog() {
|
|
48
|
-
return classNotContain(
|
|
218
|
+
return classNotContain(globalCall('console.log'));
|
|
49
219
|
}
|
|
50
220
|
/**
|
|
51
|
-
* No direct console access (any method: log, warn, error, debug, info)
|
|
221
|
+
* No direct console access (any method: log, warn, error, debug, info), including
|
|
222
|
+
* bracketed and global-object spellings.
|
|
52
223
|
* Stricter than noConsoleLog — catches all console methods.
|
|
53
224
|
*/
|
|
54
225
|
export function noConsole() {
|
|
55
|
-
return classNotContain(
|
|
226
|
+
return classNotContain(consoleAccess());
|
|
56
227
|
}
|
|
57
228
|
/**
|
|
58
229
|
* No JSON.parse calls — centralize deserialization.
|
|
@@ -62,31 +233,39 @@ export function noJsonParse() {
|
|
|
62
233
|
}
|
|
63
234
|
// ─── Function variants ────────────────────────────────────────────
|
|
64
235
|
export function functionNoEval() {
|
|
65
|
-
return functionNotContain(
|
|
236
|
+
return functionNotContain(globalCall('eval'));
|
|
66
237
|
}
|
|
67
238
|
export function functionNoFunctionConstructor() {
|
|
68
|
-
return functionNotContain(
|
|
239
|
+
return functionNotContain(functionConstructor());
|
|
69
240
|
}
|
|
70
241
|
export function functionNoProcessEnv() {
|
|
71
|
-
return functionNotContain(
|
|
242
|
+
return functionNotContain(processEnvAccess());
|
|
72
243
|
}
|
|
73
244
|
export function functionNoConsoleLog() {
|
|
74
|
-
return functionNotContain(
|
|
245
|
+
return functionNotContain(globalCall('console.log'));
|
|
75
246
|
}
|
|
76
247
|
export function functionNoConsole() {
|
|
77
|
-
return functionNotContain(
|
|
248
|
+
return functionNotContain(consoleAccess());
|
|
78
249
|
}
|
|
79
250
|
export function functionNoJsonParse() {
|
|
80
251
|
return functionNotContain(call('JSON.parse'));
|
|
81
252
|
}
|
|
82
253
|
// ─── Module variants ──────────────────────────────────────────────
|
|
83
254
|
export function moduleNoEval() {
|
|
84
|
-
return moduleNotContain(
|
|
255
|
+
return moduleNotContain(globalCall('eval'));
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* No Function constructor anywhere in a file — the module counterpart of
|
|
259
|
+
* {@link noFunctionConstructor}, added for bug 0333 so the `recommended` floor can read a rule over
|
|
260
|
+
* the broadest subject it has a variant for.
|
|
261
|
+
*/
|
|
262
|
+
export function moduleNoFunctionConstructor() {
|
|
263
|
+
return moduleNotContain(functionConstructor());
|
|
85
264
|
}
|
|
86
265
|
export function moduleNoProcessEnv() {
|
|
87
|
-
return moduleNotContain(
|
|
266
|
+
return moduleNotContain(processEnvAccess());
|
|
88
267
|
}
|
|
89
268
|
export function moduleNoConsoleLog() {
|
|
90
|
-
return moduleNotContain(
|
|
269
|
+
return moduleNotContain(globalCall('console.log'));
|
|
91
270
|
}
|
|
92
271
|
//# 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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"}
|