@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
|
@@ -45,6 +45,14 @@ export function reportedLine(node, triviaPos) {
|
|
|
45
45
|
* Parent nodes' getText() includes children's text, so regex-based
|
|
46
46
|
* matchers (expression()) match at multiple ancestor levels.
|
|
47
47
|
* Keep only the deepest (most specific) matching nodes.
|
|
48
|
+
*
|
|
49
|
+
* Several nodes can share one span — a statement without a semicolon and its
|
|
50
|
+
* expression, a shorthand property and its name, a call's only argument and
|
|
51
|
+
* the `SyntaxList` holding it. Each lies inside the others, so a filter that
|
|
52
|
+
* drops a match with another inside it dropped all of them and reported
|
|
53
|
+
* nothing (bug 0322). Of a tie, the last in walk order is kept: the walk is
|
|
54
|
+
* pre-order, so that is the deepest. `getAncestors()` cannot break the tie —
|
|
55
|
+
* it follows `getParent()`, which skips the `SyntaxList` the walk yields.
|
|
48
56
|
*/
|
|
49
57
|
function findMatchesBroad(node, matcher) {
|
|
50
58
|
const matches = [];
|
|
@@ -57,7 +65,14 @@ function findMatchesBroad(node, matcher) {
|
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
return matches
|
|
60
|
-
.filter((m) => !matches.some((other) =>
|
|
68
|
+
.filter((m, i) => !matches.some((other, j) => {
|
|
69
|
+
if (other === m)
|
|
70
|
+
return false;
|
|
71
|
+
if (other.getStart() < m.getStart() || other.getEnd() > m.getEnd())
|
|
72
|
+
return false;
|
|
73
|
+
const sameSpan = other.getStart() === m.getStart() && other.getEnd() === m.getEnd();
|
|
74
|
+
return !sameSpan || j > i;
|
|
75
|
+
}))
|
|
61
76
|
.map((n) => ({ node: n }));
|
|
62
77
|
}
|
|
63
78
|
/**
|
|
@@ -67,7 +82,7 @@ function findMatchesBroad(node, matcher) {
|
|
|
67
82
|
* (efficient — only walks nodes of that kind). Falls back to
|
|
68
83
|
* getDescendants() for matchers without syntaxKinds (expression()).
|
|
69
84
|
*/
|
|
70
|
-
|
|
85
|
+
function findMatchesInNode(node, matcher) {
|
|
71
86
|
// TRIVIA first, and at the dispatcher rather than inside the broad walk.
|
|
72
87
|
// A trivia matcher may also narrow by `syntaxKinds` for speed — plan 0047's
|
|
73
88
|
// `tsDirective()` wants exactly that — and with the branch one level down it
|
|
@@ -111,43 +126,257 @@ function triviaMatches(node, matcher) {
|
|
|
111
126
|
return out.sort((a, b) => (a.triviaPos ?? 0) - (b.triviaPos ?? 0));
|
|
112
127
|
}
|
|
113
128
|
/**
|
|
114
|
-
* Search
|
|
129
|
+
* Search the code a class runs (bugs 0300, 0307), as far as `reach` says.
|
|
130
|
+
*
|
|
131
|
+
* In four passes, for baselines. A match's identity is numbered within its enclosing declaration
|
|
132
|
+
* (`match-identity.ts`), and a declaration is known by its name, so a getter and its setter, or a
|
|
133
|
+
* static and an instance member of one name, share one. What the walk read before bug 0300 comes
|
|
134
|
+
* first for every member, then what 0300 added, then what 0307 added, then what 0309 added, so a
|
|
135
|
+
* finding a baseline accepted keeps its ordinal and a new one is numbered after it however the
|
|
136
|
+
* members interleave:
|
|
115
137
|
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
138
|
+
* 1. every method, constructor and accessor body;
|
|
139
|
+
* 2. every parameter default, property initializer (which covers an arrow-function property) and
|
|
140
|
+
* static block;
|
|
141
|
+
* 3. for `'all-code'`: every parameter, member and property decorator, computed member name, class
|
|
142
|
+
* decorator and the `extends` expression;
|
|
143
|
+
* 4. under either reach, the code every destructured parameter runs at each call, at any depth
|
|
144
|
+
* (`bindingPatternMatches`).
|
|
145
|
+
*
|
|
146
|
+
* Overload signatures have no body, defaults or decorators, so walking every constructor is the
|
|
147
|
+
* same as walking the implementation. An overload's parameter LIST does hold comments, which that
|
|
148
|
+
* rationale does not cover — but ts-morph's `getClasses().getMethods()` yields only the
|
|
149
|
+
* implementation (measured), so neither this search nor the function search reads them, and the
|
|
150
|
+
* two agree. Named in bug 0329 rather than closed here. `implements` is type-only and docstrings are not code, so
|
|
151
|
+
* neither is read, and a `comment()` rule reads code, not documentation.
|
|
118
152
|
*/
|
|
119
|
-
export function searchClassBody(cls, matcher) {
|
|
153
|
+
export function searchClassBody(cls, matcher, reach) {
|
|
120
154
|
const matchingNodes = [];
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
155
|
+
const searchBody = (node) => {
|
|
156
|
+
if (node !== undefined)
|
|
157
|
+
matchingNodes.push(...findMatchesInNode(node, matcher));
|
|
158
|
+
};
|
|
159
|
+
const searchExpression = (node) => {
|
|
160
|
+
if (node !== undefined)
|
|
161
|
+
matchingNodes.push(...findMatchesInExpression(node, matcher));
|
|
162
|
+
};
|
|
163
|
+
const searchDecorators = (decorators) => {
|
|
164
|
+
for (const decorator of decorators)
|
|
165
|
+
searchExpression(decorator.getExpression());
|
|
166
|
+
};
|
|
167
|
+
const searchComputedName = (name) => {
|
|
168
|
+
if (NodeUtils.isComputedPropertyName(name))
|
|
169
|
+
searchExpression(name.getExpression());
|
|
170
|
+
};
|
|
171
|
+
const runnable = [
|
|
172
|
+
...cls.getMethods(),
|
|
173
|
+
...cls.getConstructors(),
|
|
174
|
+
...cls.getGetAccessors(),
|
|
175
|
+
...cls.getSetAccessors(),
|
|
176
|
+
];
|
|
177
|
+
const properties = cls.getProperties();
|
|
178
|
+
for (const member of runnable)
|
|
179
|
+
searchBody(member.getBody());
|
|
180
|
+
for (const member of runnable) {
|
|
181
|
+
for (const parameter of member.getParameters())
|
|
182
|
+
searchExpression(parameter.getInitializer());
|
|
126
183
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
184
|
+
for (const property of properties)
|
|
185
|
+
searchExpression(property.getInitializer());
|
|
186
|
+
for (const block of cls.getStaticBlocks())
|
|
187
|
+
searchBody(block.getBody());
|
|
188
|
+
if (reach === 'all-code') {
|
|
189
|
+
for (const member of runnable) {
|
|
190
|
+
for (const parameter of member.getParameters())
|
|
191
|
+
searchDecorators(parameter.getDecorators());
|
|
192
|
+
if (!NodeUtils.isConstructorDeclaration(member)) {
|
|
193
|
+
searchDecorators(member.getDecorators());
|
|
194
|
+
searchComputedName(member.getNameNode());
|
|
195
|
+
}
|
|
134
196
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const body = accessor.getBody();
|
|
139
|
-
if (body) {
|
|
140
|
-
matchingNodes.push(...findMatchesInNode(body, matcher));
|
|
197
|
+
for (const property of properties) {
|
|
198
|
+
searchDecorators(property.getDecorators());
|
|
199
|
+
searchComputedName(property.getNameNode());
|
|
141
200
|
}
|
|
201
|
+
searchDecorators(cls.getDecorators());
|
|
202
|
+
searchExpression(cls.getExtends()?.getExpression());
|
|
142
203
|
}
|
|
143
|
-
for (const
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
matchingNodes.push(...findMatchesInNode(body, matcher));
|
|
204
|
+
for (const member of runnable) {
|
|
205
|
+
for (const parameter of member.getParameters()) {
|
|
206
|
+
matchingNodes.push(...bindingPatternMatches(parameter.getNameNode(), matcher));
|
|
147
207
|
}
|
|
148
208
|
}
|
|
209
|
+
matchingNodes.push(...parameterListComments(runnable, matcher, reach, matchingNodes));
|
|
149
210
|
return toResult(matchingNodes);
|
|
150
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* The comments written inside a member's parameter LIST that the passes above have not already
|
|
214
|
+
* found (bug 0325) — everything between `(` and `)`, by position.
|
|
215
|
+
*
|
|
216
|
+
* The class search reads a parameter as CODE — its default, and a destructured parameter's defaults
|
|
217
|
+
* and computed keys — so a comment matcher searching those expressions misses a comment written on
|
|
218
|
+
* the parameter itself, and one written inline between `=` and the default, which TypeScript counts
|
|
219
|
+
* as leading trivia of neither. Measured before this fix: `m(g = /* TODO *\/ 1)` and a `// TODO` on its own
|
|
220
|
+
* line before a parameter were 0 for the class rules and 1 for the function rules, on the same
|
|
221
|
+
* member. A comment in a parameter list is the function search's for free — it starts a trivia
|
|
222
|
+
* matcher at the declaration — and a class rule that cannot see a TODO marker there is a false green.
|
|
223
|
+
*
|
|
224
|
+
* **The span, not each parameter.** A first version walked each `ParameterDeclaration`, and a
|
|
225
|
+
* comment on the same line as the `(` or a `,` belongs to that TOKEN rather than to the parameter
|
|
226
|
+
* after it — TypeScript starts collecting leading trivia only after a line break. Six placements
|
|
227
|
+
* stayed silent, `m(/* TODO *\/ g = 1)` and `m(a, /* TODO *\/ b)` among them, while the docs said the
|
|
228
|
+
* parameter list was read. So the walk takes the parens and the list, and keeps every comment
|
|
229
|
+
* POSITIONED inside them: the `(`'s trailing trivia and the `)`'s leading trivia are in, the
|
|
230
|
+
* member's docstring and anything after `)` are out, whatever node they happen to hang from.
|
|
231
|
+
*
|
|
232
|
+
* **A member's own docstring is still not read** (bug 0307): it lies before the `(`. Measured — the
|
|
233
|
+
* class search reports 0 for `/** TODO *\/` above a method, before this pass and after it. So does a
|
|
234
|
+
* comment in the return type or between `)` and `{`, which is bug 0329.
|
|
235
|
+
*
|
|
236
|
+
* Under `'member-code'` reach a comment inside a parameter's DECORATOR is left out, for the same
|
|
237
|
+
* reason the decorator's code is (bug 0307): a must-contain rule must not be satisfied by wiring.
|
|
238
|
+
* Its span covers the decorator's own leading trivia, so a comment written above `@Inject()` counts
|
|
239
|
+
* as the decorator's, as a docstring counts as the member's.
|
|
240
|
+
*
|
|
241
|
+
* Deduplicated by comment position against everything already found, and pushed LAST, so a comment
|
|
242
|
+
* inside a default keeps the ordinal a baseline accepted and a newly read one is numbered after it.
|
|
243
|
+
*/
|
|
244
|
+
function parameterListComments(members, matcher, reach, found) {
|
|
245
|
+
if (matcher.matchedTriviaPositions === undefined)
|
|
246
|
+
return [];
|
|
247
|
+
const seen = new Set(found.map((match) => match.triviaPos));
|
|
248
|
+
const out = [];
|
|
249
|
+
for (const member of members) {
|
|
250
|
+
const open = member.getFirstChildByKind(SyntaxKind.OpenParenToken);
|
|
251
|
+
const close = member.getFirstChildByKind(SyntaxKind.CloseParenToken);
|
|
252
|
+
if (open === undefined || close === undefined)
|
|
253
|
+
continue;
|
|
254
|
+
const wiring = reach === 'all-code'
|
|
255
|
+
? []
|
|
256
|
+
: member
|
|
257
|
+
.getParameters()
|
|
258
|
+
.flatMap((parameter) => parameter.getDecorators())
|
|
259
|
+
.map((decorator) => [
|
|
260
|
+
decorator.getFullStart(),
|
|
261
|
+
decorator.getEnd(),
|
|
262
|
+
]);
|
|
263
|
+
// The list itself carries the commas; the parens carry the trivia written against them.
|
|
264
|
+
const roots = [open, close, ...member.getChildrenOfKind(SyntaxKind.SyntaxList)];
|
|
265
|
+
const inList = (pos) => pos >= open.getEnd() && pos < close.getStart();
|
|
266
|
+
for (const match of roots.flatMap((root) => findMatchesInNode(root, matcher))) {
|
|
267
|
+
const pos = match.triviaPos;
|
|
268
|
+
if (pos === undefined || seen.has(pos) || !inList(pos))
|
|
269
|
+
continue;
|
|
270
|
+
if (wiring.some(([start, end]) => pos >= start && pos < end))
|
|
271
|
+
continue;
|
|
272
|
+
seen.add(pos);
|
|
273
|
+
out.push(match);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return out.sort((a, b) => (a.triviaPos ?? 0) - (b.triviaPos ?? 0));
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The code a destructured binding runs (bug 0309): for each binding element, at any depth, its computed
|
|
280
|
+
* key, then its default, then the pattern it destructures into — the order they run. A name that is not
|
|
281
|
+
* a pattern runs nothing, and a hole in an array pattern is not an element.
|
|
282
|
+
*
|
|
283
|
+
* One walk for both searches: the class search reads a member's parameters with it through
|
|
284
|
+
* `bindingPatternMatches`, and the function search a function's through `codeOfParameters` (bug 0314).
|
|
285
|
+
*/
|
|
286
|
+
function codeOfBindingPattern(name) {
|
|
287
|
+
if (!NodeUtils.isObjectBindingPattern(name) && !NodeUtils.isArrayBindingPattern(name))
|
|
288
|
+
return [];
|
|
289
|
+
const code = [];
|
|
290
|
+
for (const element of name.getElements()) {
|
|
291
|
+
if (!NodeUtils.isBindingElement(element))
|
|
292
|
+
continue;
|
|
293
|
+
const key = element.getPropertyNameNode();
|
|
294
|
+
if (NodeUtils.isComputedPropertyName(key))
|
|
295
|
+
code.push(key.getExpression());
|
|
296
|
+
const initializer = element.getInitializer();
|
|
297
|
+
if (initializer !== undefined)
|
|
298
|
+
code.push(initializer);
|
|
299
|
+
code.push(...codeOfBindingPattern(element.getNameNode()));
|
|
300
|
+
}
|
|
301
|
+
return code;
|
|
302
|
+
}
|
|
303
|
+
/** Matches in the code a destructured parameter of a class member runs (bug 0309). */
|
|
304
|
+
function bindingPatternMatches(name, matcher) {
|
|
305
|
+
return codeOfBindingPattern(name).flatMap((code) => findMatchesInExpression(code, matcher));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* The code a function's parameters run (bug 0314): for each parameter, its default, then the code of
|
|
309
|
+
* its destructured binding, if it has one. A default runs whenever its argument is omitted — like a
|
|
310
|
+
* class member's parameter default, it is read as the function's code. A parameter without a default
|
|
311
|
+
* or a pattern runs nothing.
|
|
312
|
+
*/
|
|
313
|
+
export function codeOfParameters(parameters) {
|
|
314
|
+
const code = [];
|
|
315
|
+
for (const parameter of parameters) {
|
|
316
|
+
const initializer = parameter.getInitializer();
|
|
317
|
+
if (initializer !== undefined)
|
|
318
|
+
code.push(initializer);
|
|
319
|
+
code.push(...codeOfBindingPattern(parameter.getNameNode()));
|
|
320
|
+
}
|
|
321
|
+
return code;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Matches in an expression that is code in its own right — a property initializer or a
|
|
325
|
+
* parameter default — including the expression itself (bug 0300).
|
|
326
|
+
*
|
|
327
|
+
* `findMatchesInNode` tests a subtree's descendants, not its root. That never mattered for a
|
|
328
|
+
* body, a block: no shipped by-kind matcher names a block, and a broad matcher keeps the
|
|
329
|
+
* deepest match, which lies inside it. An initializer can BE the match — `field = eval('1')`
|
|
330
|
+
* — so its root has to be tested too. A trivia matcher already
|
|
331
|
+
* includes the root. A broad matcher keeps only the deepest match, so the root counts only
|
|
332
|
+
* when nothing inside it matched.
|
|
333
|
+
*/
|
|
334
|
+
function findMatchesInExpression(node, matcher) {
|
|
335
|
+
const inner = findMatchesInNode(node, matcher);
|
|
336
|
+
if (matcher.matchedTriviaPositions !== undefined)
|
|
337
|
+
return inner;
|
|
338
|
+
const kinds = matcher.syntaxKinds ?? [];
|
|
339
|
+
const broad = kinds.length === 0;
|
|
340
|
+
if (!broad && !kinds.includes(node.getKind()))
|
|
341
|
+
return inner;
|
|
342
|
+
if (!matcher.matches(node))
|
|
343
|
+
return inner;
|
|
344
|
+
if (broad && inner.length > 0)
|
|
345
|
+
return inner;
|
|
346
|
+
return [{ node }, ...inner];
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Matches in what a call condition searches — an argument, or a callback's body — including the
|
|
350
|
+
* node itself unless it is a block (bug 0323).
|
|
351
|
+
*
|
|
352
|
+
* An argument can BE the match — `use(legacy(1))` — and so can a concise callback's body, which is
|
|
353
|
+
* the expression itself: `use(() => legacy(1))`. With
|
|
354
|
+
* `findMatchesInNode` alone neither was tested, under `call()` as under `expression()`. A block is
|
|
355
|
+
* searched below its root, as `searchFunctionBody` searches a function's own: tested itself, a
|
|
356
|
+
* block would match a broad pattern against the whole body.
|
|
357
|
+
*/
|
|
358
|
+
export function findMatchesInCode(node, matcher) {
|
|
359
|
+
return NodeUtils.isBlock(node)
|
|
360
|
+
? findMatchesInNode(node, matcher)
|
|
361
|
+
: findMatchesInExpression(node, matcher);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* `findMatchesInCode` over several roots, numbered so a baseline keeps its identities (bug 0323):
|
|
365
|
+
* every match below a root first, in order, then the roots that are matches themselves.
|
|
366
|
+
*
|
|
367
|
+
* 0.5.1 never tested a root, so each root match is new. Numbered in place, one would take the
|
|
368
|
+
* ordinal of a match a baseline already accepted, and the new finding would be the one hidden —
|
|
369
|
+
* as `searchClassBody` numbers the code bug 0300 made it read after the code it read before. A
|
|
370
|
+
* trivia match was found on a root before too, so it keeps its place.
|
|
371
|
+
*/
|
|
372
|
+
export function findMatchesInEach(roots, matcher) {
|
|
373
|
+
const found = roots.map((root) => ({ root, matches: findMatchesInCode(root, matcher) }));
|
|
374
|
+
const isNewRoot = (root, match) => match.node === root && match.triviaPos === undefined;
|
|
375
|
+
return [
|
|
376
|
+
...found.flatMap(({ root, matches }) => matches.filter((m) => !isNewRoot(root, m))),
|
|
377
|
+
...found.flatMap(({ root, matches }) => matches.filter((m) => isNewRoot(root, m))),
|
|
378
|
+
];
|
|
379
|
+
}
|
|
151
380
|
/**
|
|
152
381
|
* The node a function's own docstring is attached to.
|
|
153
382
|
*
|
|
@@ -215,28 +444,23 @@ export function searchFunctionBody(fn, matcher) {
|
|
|
215
444
|
// the comment above warns about — `expression(/…/)` against a Block matches
|
|
216
445
|
// the function's whole body text, turning every body-analysis rule into a
|
|
217
446
|
// whole-declaration one.
|
|
218
|
-
|
|
447
|
+
//
|
|
448
|
+
// Nor when a broad matcher already matched inside the body. The body is then an
|
|
449
|
+
// ancestor of that match, which the broad search exists to leave out, and adding
|
|
450
|
+
// it reported one match twice — `() => use(legacy(1))` under
|
|
451
|
+
// `expression(/legacy\(1\)/)` (bug 0322). A by-kind matcher never tests the root
|
|
452
|
+
// it searches, so for it the body is a different node and still counts.
|
|
453
|
+
const broadHit = (matcher.syntaxKinds ?? []).length === 0 && matchingNodes.length > 0;
|
|
454
|
+
if (!NodeUtils.isBlock(body) && !broadHit && matcher.matches(body)) {
|
|
219
455
|
matchingNodes.push({ node: body });
|
|
220
456
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
* Handles:
|
|
227
|
-
* - ArrowFunction: () => { ... } or () => expr
|
|
228
|
-
* - FunctionExpression: function() { ... }
|
|
229
|
-
*
|
|
230
|
-
* Returns undefined if the node is not a function-like expression.
|
|
231
|
-
*/
|
|
232
|
-
export function getFunctionBody(node) {
|
|
233
|
-
if (NodeUtils.isArrowFunction(node)) {
|
|
234
|
-
return node.getBody();
|
|
235
|
-
}
|
|
236
|
-
if (NodeUtils.isFunctionExpression(node)) {
|
|
237
|
-
return node.getBody();
|
|
457
|
+
// What the parameters run — a default, and a destructured or rest parameter's defaults and computed
|
|
458
|
+
// keys — is the function's code too (bug 0314). Read after the body, so within one function a finding a
|
|
459
|
+
// baseline accepted in the body keeps its identity and a new one is numbered after it.
|
|
460
|
+
for (const code of codeOfParameters(fn.getParameters())) {
|
|
461
|
+
matchingNodes.push(...findMatchesInExpression(code, matcher));
|
|
238
462
|
}
|
|
239
|
-
return
|
|
463
|
+
return toResult(matchingNodes);
|
|
240
464
|
}
|
|
241
465
|
/**
|
|
242
466
|
* Search a module (SourceFile) for matches.
|
|
@@ -266,7 +490,8 @@ function collectVariableStatementMatches(statement, matcher) {
|
|
|
266
490
|
if (NodeUtils.isArrowFunction(initializer) || NodeUtils.isFunctionExpression(initializer)) {
|
|
267
491
|
continue;
|
|
268
492
|
}
|
|
269
|
-
|
|
493
|
+
// The initializer can BE the match — `const x = legacy(1)` (bug 0323).
|
|
494
|
+
matches.push(...findMatchesInEach([initializer], matcher));
|
|
270
495
|
}
|
|
271
496
|
return matches;
|
|
272
497
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"body-traversal.js","sourceRoot":"","sources":["../../src/helpers/body-traversal.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"body-traversal.js","sourceRoot":"","sources":["../../src/helpers/body-traversal.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,9 +18,14 @@ export interface ExtractedCallback {
|
|
|
18
18
|
* Handles:
|
|
19
19
|
* - Arrow functions: `app.get('/path', (req, res) => { ... })`
|
|
20
20
|
* - Function expressions: `app.get('/path', function(req, res) { ... })`
|
|
21
|
+
* - Either behind parentheses, `as`, `<T>`, `satisfies` or `!` (bug 0324)
|
|
22
|
+
* - Function-valued properties and method shorthands of an object-literal argument, to three
|
|
23
|
+
* levels: `use({ handler: () => ... })`
|
|
21
24
|
*
|
|
22
25
|
* Does NOT resolve named references (e.g., `app.get('/path', myHandler)`).
|
|
23
|
-
* Reference resolution requires type-checker lookups and is deferred.
|
|
26
|
+
* Reference resolution requires type-checker lookups and is deferred. A callback held by a
|
|
27
|
+
* variable, and one nested deeper than three object literals, are not found either — the
|
|
28
|
+
* limits of this one definition, shared by `within()` and the callback conditions (bug 0324).
|
|
24
29
|
*
|
|
25
30
|
* @returns Array of extracted callbacks with their source metadata
|
|
26
31
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-extractor.d.ts","sourceRoot":"","sources":["../../src/helpers/callback-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,UAAU,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"callback-extractor.d.ts","sourceRoot":"","sources":["../../src/helpers/callback-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,UAAU,CAAA;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAK9D;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,EAAE,EAAE,YAAY,CAAA;IAChB,4DAA4D;IAC5D,QAAQ,EAAE,cAAc,CAAA;IACxB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,iBAAiB,EAAE,CA8B9E"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Node, SyntaxKind } from 'ts-morph';
|
|
2
2
|
import { fromObjectLiteralFunction, fromCallableNode } from '../models/arch-function.js';
|
|
3
|
+
import { throughWrappers, isValueWrapper } from '../core/through-wrappers.js';
|
|
3
4
|
import { collectObjectLiteralFunctions } from '../core/object-literal-functions.js';
|
|
4
5
|
/**
|
|
5
6
|
* Extract all inline function arguments from a call expression.
|
|
@@ -7,29 +8,63 @@ import { collectObjectLiteralFunctions } from '../core/object-literal-functions.
|
|
|
7
8
|
* Handles:
|
|
8
9
|
* - Arrow functions: `app.get('/path', (req, res) => { ... })`
|
|
9
10
|
* - Function expressions: `app.get('/path', function(req, res) { ... })`
|
|
11
|
+
* - Either behind parentheses, `as`, `<T>`, `satisfies` or `!` (bug 0324)
|
|
12
|
+
* - Function-valued properties and method shorthands of an object-literal argument, to three
|
|
13
|
+
* levels: `use({ handler: () => ... })`
|
|
10
14
|
*
|
|
11
15
|
* Does NOT resolve named references (e.g., `app.get('/path', myHandler)`).
|
|
12
|
-
* Reference resolution requires type-checker lookups and is deferred.
|
|
16
|
+
* Reference resolution requires type-checker lookups and is deferred. A callback held by a
|
|
17
|
+
* variable, and one nested deeper than three object literals, are not found either — the
|
|
18
|
+
* limits of this one definition, shared by `within()` and the callback conditions (bug 0324).
|
|
13
19
|
*
|
|
14
20
|
* @returns Array of extracted callbacks with their source metadata
|
|
15
21
|
*/
|
|
16
22
|
export function extractCallbacks(callExpr) {
|
|
17
|
-
const
|
|
23
|
+
const unwrapped = [];
|
|
24
|
+
const behindAWrapper = [];
|
|
18
25
|
const args = callExpr.getArguments();
|
|
19
26
|
for (let i = 0; i < args.length; i++) {
|
|
20
|
-
const
|
|
27
|
+
const raw = args[i];
|
|
28
|
+
if (!raw)
|
|
29
|
+
continue;
|
|
30
|
+
// Read through parentheses, `as`, `<T>`, `satisfies` and `!` (bug 0324): `use((() => …))`
|
|
31
|
+
// passes the same callback as `use(() => …)`, and the wrappers are the ones the function
|
|
32
|
+
// collector already reads a variable's initializer through (bug 0315).
|
|
33
|
+
const arg = throughWrappers(raw);
|
|
21
34
|
if (!arg)
|
|
22
35
|
continue;
|
|
23
36
|
const fn = extractInlineFunction(arg, callExpr, i);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
const found = fn ? [fn] : extractFromObjectLiteral(arg, callExpr, i);
|
|
38
|
+
// A callback reached THROUGH a wrapper — the argument's, or a property value's — is one this
|
|
39
|
+
// function could not reach before bug 0324, so it goes LAST. A match's identity is numbered in
|
|
40
|
+
// order across the subjects of one rule, and `within()` walks this list: numbered in place, a
|
|
41
|
+
// newly reachable callback ahead of an accepted one takes its ordinal, which both hides the new
|
|
42
|
+
// finding and re-reports the accepted one. Measured in the enforcement review of 0324 on
|
|
43
|
+
// `use((() => legacy(1)), () => legacy(2))`, and again on
|
|
44
|
+
// `use({ handler: (() => legacy(1)) }, () => legacy(2))` — the second is why this asks about
|
|
45
|
+
// the PATH to the callback and not about the argument alone, which was the first answer.
|
|
46
|
+
for (const callback of found) {
|
|
47
|
+
const wrapped = reachedThroughAWrapper(callback.fn.getNode(), raw);
|
|
48
|
+
(wrapped ? behindAWrapper : unwrapped).push(callback);
|
|
30
49
|
}
|
|
31
50
|
}
|
|
32
|
-
return
|
|
51
|
+
return [...unwrapped, ...behindAWrapper];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Whether the path from an argument down to a callback passes through a value wrapper — the
|
|
55
|
+
* argument itself being one included. That is exactly "this callback is newly reachable since bug
|
|
56
|
+
* 0324", which decides where it is ordered (see {@link extractCallbacks}).
|
|
57
|
+
*/
|
|
58
|
+
function reachedThroughAWrapper(callback, argument) {
|
|
59
|
+
let current = callback;
|
|
60
|
+
while (current !== undefined) {
|
|
61
|
+
if (isValueWrapper(current))
|
|
62
|
+
return true;
|
|
63
|
+
if (current === argument)
|
|
64
|
+
return false;
|
|
65
|
+
current = current.getParent();
|
|
66
|
+
}
|
|
67
|
+
return false;
|
|
33
68
|
}
|
|
34
69
|
/**
|
|
35
70
|
* Extract function-valued properties from an object-literal argument as
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callback-extractor.js","sourceRoot":"","sources":["../../src/helpers/callback-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAEhE,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AACxF,OAAO,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAA;AAenF
|
|
1
|
+
{"version":3,"file":"callback-extractor.js","sourceRoot":"","sources":["../../src/helpers/callback-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Node } from 'ts-morph';
|
|
2
|
+
/**
|
|
3
|
+
* The dotted global chain an expression denotes, following bindings, or `undefined` when it denotes
|
|
4
|
+
* a local that is not a global.
|
|
5
|
+
*
|
|
6
|
+
* `chainOf` — the caller's reader for a dotted name — is passed in rather than imported, so this
|
|
7
|
+
* module owns the binding question while `security.ts` keeps the one definition of what a name
|
|
8
|
+
* chain is (bug 0308's matchers).
|
|
9
|
+
*/
|
|
10
|
+
export declare function globalChainOf(node: Node, chainOf: (node: Node) => string | undefined): string | undefined;
|
|
11
|
+
//# sourceMappingURL=global-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-binding.d.ts","sourceRoot":"","sources":["../../src/helpers/global-binding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAA;AAuC3C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,GAAG,SAAS,GAC1C,MAAM,GAAG,SAAS,CAOpB"}
|