@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/predicates/function.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"function.js","sourceRoot":"","sources":["../../src/predicates/function.ts"],"names":[],"mappings":"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"}
|
|
@@ -38,7 +38,8 @@ export declare function haveProperty(name: string): Predicate<TypeDeclaration>;
|
|
|
38
38
|
*/
|
|
39
39
|
export declare function havePropertyOfType(name: string, matcher: TypeMatcher): Predicate<TypeDeclaration>;
|
|
40
40
|
/**
|
|
41
|
-
* Matches interfaces that extend the given type name
|
|
41
|
+
* Matches interfaces that directly extend the given type name — as written, or through an
|
|
42
|
+
* aliased import or a namespace member.
|
|
42
43
|
* For type aliases, checks if the type text references the name.
|
|
43
44
|
*
|
|
44
45
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/predicates/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,oBAAoB,EAAE,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/predicates/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,oBAAoB,EAAE,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAA;AACrF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG9D;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,oBAAoB,CAAA;AAEzE;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAAC,eAAe,CAAC,CAK1D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,SAAS,CAAC,eAAe,CAAC,CAK3D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,CAQrE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC,eAAe,CAAC,CASjG;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,CAkBnE"}
|
package/dist/predicates/type.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Node } from 'ts-morph';
|
|
2
|
+
import { clauseResolvesTo } from '../helpers/heritage.js';
|
|
2
3
|
/**
|
|
3
4
|
* Matches only InterfaceDeclaration elements.
|
|
4
5
|
*
|
|
@@ -59,7 +60,8 @@ export function havePropertyOfType(name, matcher) {
|
|
|
59
60
|
};
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
|
-
* Matches interfaces that extend the given type name
|
|
63
|
+
* Matches interfaces that directly extend the given type name — as written, or through an
|
|
64
|
+
* aliased import or a namespace member.
|
|
63
65
|
* For type aliases, checks if the type text references the name.
|
|
64
66
|
*
|
|
65
67
|
* @example
|
|
@@ -72,7 +74,9 @@ export function extendType(name) {
|
|
|
72
74
|
if (Node.isInterfaceDeclaration(element)) {
|
|
73
75
|
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
74
76
|
const nameRegex = new RegExp(`^${escaped}(\\b|$|<)`);
|
|
75
|
-
return element
|
|
77
|
+
return element
|
|
78
|
+
.getExtends()
|
|
79
|
+
.some((ext) => nameRegex.test(ext.getText()) || clauseResolvesTo(ext, name));
|
|
76
80
|
}
|
|
77
81
|
// For type aliases, check if the type directly references the named type
|
|
78
82
|
// Use word boundary matching to avoid false positives (e.g., "BaseConfig" inside "{ bar: BaseConfig }")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/predicates/type.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwD,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/predicates/type.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,13 +79,13 @@ const EMITTERS = /(^|\.)(finishPreset|reportViolations|throwIfViolations)$/;
|
|
|
79
79
|
* agent an actionable fix.
|
|
80
80
|
*
|
|
81
81
|
* Uses function-variant rules so standalone functions, arrow functions, and
|
|
82
|
-
* class
|
|
82
|
+
* class members are all covered.
|
|
83
83
|
*/
|
|
84
84
|
// Presets collect object-literal functions unconditionally. `functions()`
|
|
85
|
-
// keeps
|
|
86
|
-
//
|
|
87
|
-
// promises "standalone functions, arrow functions, and class
|
|
88
|
-
// covered". A handler map — the shape agents generate most — was none of the
|
|
85
|
+
// keeps these anonymous values opt-in because every inline callback would flood
|
|
86
|
+
// a rule the USER wrote; a preset's subject set is the preset's own, and this one
|
|
87
|
+
// already promises "standalone functions, arrow functions, and class members are
|
|
88
|
+
// all covered". A handler map — the shape agents generate most — was none of the
|
|
89
89
|
// three, so `{ POST: () => {} }` slipped every guardrail (bug 0013).
|
|
90
90
|
const COLLECT_ALL = { includeObjectLiteralFunctions: true };
|
|
91
91
|
export function agentGuardrails(p, options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-guardrails.js","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAA;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAI3C,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,aAAa,EACb,OAAO,GACR,MAAM,aAAa,CAAA;AAsDpB;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,CAAC,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC,CAAA;AAE5E;;;;;;;;GAQG;AACH,MAAM,aAAa,GAAG;IACpB,kBAAkB;IAClB,qBAAqB;IACrB,oBAAoB;IACpB,uBAAuB;CACxB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,QAAQ,GAAG,0DAA0D,CAAA;AAE3E;;;;;;;;;;;;;GAaG;AACH,0EAA0E;AAC1E,
|
|
1
|
+
{"version":3,"file":"agent-guardrails.js","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { CollectResult } from '@nielspeter/eess';
|
|
|
2
2
|
import type { ArchProject } from '../core/project.js';
|
|
3
3
|
import type { Condition } from '@nielspeter/eess';
|
|
4
4
|
import type { ArchFunction } from '../models/arch-function.js';
|
|
5
|
+
import type { SourceFile } from 'ts-morph';
|
|
5
6
|
import type { RuleBuilderLike } from '@nielspeter/eess';
|
|
6
7
|
import type { PresetBaseOptions } from './shared.js';
|
|
7
8
|
export interface RecommendedOptions extends PresetBaseOptions<RecommendedRuleId> {
|
|
@@ -23,7 +24,8 @@ export interface RecommendedOptions extends PresetBaseOptions<RecommendedRuleId>
|
|
|
23
24
|
* needs updating.
|
|
24
25
|
*/
|
|
25
26
|
declare const SPECS: readonly [{
|
|
26
|
-
readonly condition: Condition<
|
|
27
|
+
readonly condition: Condition<SourceFile>;
|
|
28
|
+
readonly subject: "module";
|
|
27
29
|
readonly meta: {
|
|
28
30
|
readonly id: "preset/recommended/no-eval";
|
|
29
31
|
readonly because: "eval() executes arbitrary code — a code-injection risk";
|
|
@@ -32,7 +34,8 @@ declare const SPECS: readonly [{
|
|
|
32
34
|
};
|
|
33
35
|
readonly default: "error";
|
|
34
36
|
}, {
|
|
35
|
-
readonly condition: Condition<
|
|
37
|
+
readonly condition: Condition<SourceFile>;
|
|
38
|
+
readonly subject: "module";
|
|
36
39
|
readonly meta: {
|
|
37
40
|
readonly id: "preset/recommended/no-function-constructor";
|
|
38
41
|
readonly because: "the Function constructor is eval() in disguise";
|
|
@@ -41,7 +44,8 @@ declare const SPECS: readonly [{
|
|
|
41
44
|
};
|
|
42
45
|
readonly default: "error";
|
|
43
46
|
}, {
|
|
44
|
-
readonly condition: Condition<
|
|
47
|
+
readonly condition: Condition<SourceFile>;
|
|
48
|
+
readonly subject: "module";
|
|
45
49
|
readonly meta: {
|
|
46
50
|
readonly id: "preset/recommended/no-silent-catch";
|
|
47
51
|
readonly because: "a silent catch hides failures";
|
|
@@ -51,6 +55,7 @@ declare const SPECS: readonly [{
|
|
|
51
55
|
readonly default: "warn";
|
|
52
56
|
}, {
|
|
53
57
|
readonly condition: Condition<ArchFunction>;
|
|
58
|
+
readonly subject: "function";
|
|
54
59
|
readonly meta: {
|
|
55
60
|
readonly id: "preset/recommended/no-empty-bodies";
|
|
56
61
|
readonly because: "an empty function body is usually an unfinished stub";
|
|
@@ -80,9 +85,12 @@ type RecommendedRuleId = (typeof SPECS)[number]['meta']['id'];
|
|
|
80
85
|
* glob is dead) is `error` regardless of severity and fails the build: `'warn'`
|
|
81
86
|
* grades violations, not a rule that cannot enforce anything.
|
|
82
87
|
*
|
|
83
|
-
* Overlaps `agentGuardrails` on empty bodies and `eval
|
|
84
|
-
*
|
|
85
|
-
* `'
|
|
88
|
+
* Overlaps `agentGuardrails` on empty bodies and `eval`, and the two no longer READ the same code:
|
|
89
|
+
* since bug 0333 this preset's `eval` rule reads the whole file, while `agentGuardrails` still
|
|
90
|
+
* reads function bodies — measured, its `noInlineLogic: ['eval']` reports nothing for a bare
|
|
91
|
+
* top-level `eval` or one in a static block (bug 0337). So "prefer `agentGuardrails` alone", which
|
|
92
|
+
* this comment used to advise, now means less coverage; run both and override a duplicated id to
|
|
93
|
+
* `'off'` in one of them if the doubled finding is noise.
|
|
86
94
|
*/
|
|
87
95
|
/**
|
|
88
96
|
* `report` names a delivery mode; omitting it returns the un-executed builders.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommended.d.ts","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"recommended.d.ts","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAQ1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAUpD,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB,CAAC,iBAAiB,CAAC;IAC9E;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AA0BD;;;;GAIG;AACH,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6C6B,CAAA;AAwBxC;;;;;GAKG;AACH,KAAK,iBAAiB,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAI7D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,kBAAkB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACnD,eAAe,EAAE,CAAA;AACpB,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,aAAa,CAAA"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { functions } from '../builders/function-rule-builder.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { modules } from '../builders/module-rule-builder.js';
|
|
3
|
+
import { moduleNoEval, moduleNoFunctionConstructor } from '../rules/security.js';
|
|
4
|
+
import { moduleNoSilentCatch } from '../rules/errors.js';
|
|
4
5
|
import { noEmptyBodies } from '../rules/hygiene.js';
|
|
5
6
|
import { overrideFindings, validateOverrides, declareEmptyIfListed, presetDeclarationSpelling, declaredEmptyFindings, deliver, } from './shared.js';
|
|
6
7
|
/**
|
|
@@ -10,7 +11,8 @@ import { overrideFindings, validateOverrides, declareEmptyIfListed, presetDeclar
|
|
|
10
11
|
*/
|
|
11
12
|
const SPECS = [
|
|
12
13
|
{
|
|
13
|
-
condition:
|
|
14
|
+
condition: moduleNoEval(),
|
|
15
|
+
subject: 'module',
|
|
14
16
|
meta: {
|
|
15
17
|
id: 'preset/recommended/no-eval',
|
|
16
18
|
because: 'eval() executes arbitrary code — a code-injection risk',
|
|
@@ -20,7 +22,8 @@ const SPECS = [
|
|
|
20
22
|
default: 'error',
|
|
21
23
|
},
|
|
22
24
|
{
|
|
23
|
-
condition:
|
|
25
|
+
condition: moduleNoFunctionConstructor(),
|
|
26
|
+
subject: 'module',
|
|
24
27
|
meta: {
|
|
25
28
|
id: 'preset/recommended/no-function-constructor',
|
|
26
29
|
because: 'the Function constructor is eval() in disguise',
|
|
@@ -30,7 +33,8 @@ const SPECS = [
|
|
|
30
33
|
default: 'error',
|
|
31
34
|
},
|
|
32
35
|
{
|
|
33
|
-
condition:
|
|
36
|
+
condition: moduleNoSilentCatch(),
|
|
37
|
+
subject: 'module',
|
|
34
38
|
meta: {
|
|
35
39
|
id: 'preset/recommended/no-silent-catch',
|
|
36
40
|
because: 'a silent catch hides failures',
|
|
@@ -41,6 +45,7 @@ const SPECS = [
|
|
|
41
45
|
},
|
|
42
46
|
{
|
|
43
47
|
condition: noEmptyBodies(),
|
|
48
|
+
subject: 'function',
|
|
44
49
|
meta: {
|
|
45
50
|
id: 'preset/recommended/no-empty-bodies',
|
|
46
51
|
because: 'an empty function body is usually an unfinished stub',
|
|
@@ -50,6 +55,23 @@ const SPECS = [
|
|
|
50
55
|
default: 'warn',
|
|
51
56
|
},
|
|
52
57
|
];
|
|
58
|
+
/**
|
|
59
|
+
* The builder a spec reads its subject with (bug 0333), selected and narrowed in one place so the
|
|
60
|
+
* loop below cannot pair a condition with the wrong one.
|
|
61
|
+
*
|
|
62
|
+
* `satisfy` is called on the concrete builder while its element type is still known — a single
|
|
63
|
+
* `satisfy` after the branch would need the union, which no condition accepts.
|
|
64
|
+
*/
|
|
65
|
+
function builderFor(p, spec, include) {
|
|
66
|
+
if (spec.subject === 'module') {
|
|
67
|
+
return modules(p).that().resideInFile(include).should().satisfy(spec.condition);
|
|
68
|
+
}
|
|
69
|
+
return functions(p, { includeObjectLiteralFunctions: true })
|
|
70
|
+
.that()
|
|
71
|
+
.resideInFile(include)
|
|
72
|
+
.should()
|
|
73
|
+
.satisfy(spec.condition);
|
|
74
|
+
}
|
|
53
75
|
const RULE_IDS = SPECS.map((s) => s.meta.id);
|
|
54
76
|
export function recommended(p, options = {}) {
|
|
55
77
|
const include = options.include ?? '**/src/**';
|
|
@@ -57,7 +79,8 @@ export function recommended(p, options = {}) {
|
|
|
57
79
|
const overrideProblems = overrideFindings(options.overrides, RULE_IDS);
|
|
58
80
|
const builders = [];
|
|
59
81
|
const constructed = [];
|
|
60
|
-
for (const
|
|
82
|
+
for (const spec of SPECS) {
|
|
83
|
+
const { meta, default: def } = spec;
|
|
61
84
|
const sev = options.overrides?.[meta.id] ?? def;
|
|
62
85
|
if (sev === 'off')
|
|
63
86
|
continue;
|
|
@@ -65,11 +88,7 @@ export function recommended(p, options = {}) {
|
|
|
65
88
|
builders.push(
|
|
66
89
|
// Plan 0089's carrier. Applied at construction so it reaches every rule
|
|
67
90
|
// this preset builds, not only the ones routed through `collectRule`.
|
|
68
|
-
declareEmptyIfListed(
|
|
69
|
-
.that()
|
|
70
|
-
.resideInFile(include)
|
|
71
|
-
.should()
|
|
72
|
-
.satisfy(condition)
|
|
91
|
+
declareEmptyIfListed(builderFor(p, spec, include)
|
|
73
92
|
.rule({ ...meta, declarationSpelling: presetDeclarationSpelling(meta.id) })
|
|
74
93
|
.asSeverity(sev), meta.id, options));
|
|
75
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,11 +33,22 @@ export declare function requireJsDocOnPublicMethods(): Condition<ClassDeclaratio
|
|
|
33
33
|
*/
|
|
34
34
|
export declare function noPublicFields(): Condition<ClassDeclaration>;
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
36
|
+
* No member code of a class may contain magic numbers: method, constructor and accessor bodies,
|
|
37
|
+
* parameter defaults, property initializers and static blocks (bug 0306). Decorators, computed member
|
|
38
|
+
* names and `extends` are not read: a number in `@Max(150)` or `@Column({ precision: 12 })` is named by the
|
|
39
|
+
* decorator that takes it, and reading them would report every validation and ORM field.
|
|
37
40
|
*
|
|
38
41
|
* Numbers 0, 1, -1, 2, 10, 100 are allowed by default.
|
|
39
42
|
* Configure with options.allowed to customize.
|
|
40
43
|
*
|
|
44
|
+
* A number that is the whole value of one of the class's own properties or its members' parameter
|
|
45
|
+
* defaults, a default inside a destructured parameter included, is named by it, and is not reported
|
|
46
|
+
* — read through a sign, parentheses, `as`, `<T>`,
|
|
47
|
+
* `satisfies` and `!`, so `static readonly LIMIT = 5000 as const` is named too.
|
|
48
|
+
*
|
|
49
|
+
* A finding names the member the number sits in — `Class.method`, `Class.constructor`,
|
|
50
|
+
* `Class.static` for a static block — so a number in a method keeps the message it always had.
|
|
51
|
+
*
|
|
41
52
|
* @example
|
|
42
53
|
* import { noMagicNumbers } from '@nielspeter/eess-ts/rules/code-quality'
|
|
43
54
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-quality.d.ts","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"code-quality.d.ts","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAMnE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAuBzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAoC5D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAiC5F"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Node, SyntaxKind } from 'ts-morph';
|
|
2
2
|
import { createViolation } from '../core/violation.js';
|
|
3
|
+
import { searchClassBody } from '../helpers/body-traversal.js';
|
|
3
4
|
/**
|
|
4
5
|
* All public methods must have JSDoc comments.
|
|
5
6
|
*
|
|
@@ -82,11 +83,22 @@ export function noPublicFields() {
|
|
|
82
83
|
};
|
|
83
84
|
}
|
|
84
85
|
/**
|
|
85
|
-
*
|
|
86
|
+
* No member code of a class may contain magic numbers: method, constructor and accessor bodies,
|
|
87
|
+
* parameter defaults, property initializers and static blocks (bug 0306). Decorators, computed member
|
|
88
|
+
* names and `extends` are not read: a number in `@Max(150)` or `@Column({ precision: 12 })` is named by the
|
|
89
|
+
* decorator that takes it, and reading them would report every validation and ORM field.
|
|
86
90
|
*
|
|
87
91
|
* Numbers 0, 1, -1, 2, 10, 100 are allowed by default.
|
|
88
92
|
* Configure with options.allowed to customize.
|
|
89
93
|
*
|
|
94
|
+
* A number that is the whole value of one of the class's own properties or its members' parameter
|
|
95
|
+
* defaults, a default inside a destructured parameter included, is named by it, and is not reported
|
|
96
|
+
* — read through a sign, parentheses, `as`, `<T>`,
|
|
97
|
+
* `satisfies` and `!`, so `static readonly LIMIT = 5000 as const` is named too.
|
|
98
|
+
*
|
|
99
|
+
* A finding names the member the number sits in — `Class.method`, `Class.constructor`,
|
|
100
|
+
* `Class.static` for a static block — so a number in a method keeps the message it always had.
|
|
101
|
+
*
|
|
90
102
|
* @example
|
|
91
103
|
* import { noMagicNumbers } from '@nielspeter/eess-ts/rules/code-quality'
|
|
92
104
|
*
|
|
@@ -100,26 +112,108 @@ export function noPublicFields() {
|
|
|
100
112
|
*/
|
|
101
113
|
export function noMagicNumbers(options) {
|
|
102
114
|
const allowedSet = new Set(options?.allowed ?? [0, 1, -1, 2, 10, 100]);
|
|
115
|
+
const magicNumberIn = (cls) => ({
|
|
116
|
+
description: 'magic number',
|
|
117
|
+
syntaxKinds: [SyntaxKind.NumericLiteral],
|
|
118
|
+
matches: (node) => Node.isNumericLiteral(node) &&
|
|
119
|
+
!allowedSet.has(node.getLiteralValue()) &&
|
|
120
|
+
!isNamedValue(node, cls),
|
|
121
|
+
});
|
|
103
122
|
return {
|
|
104
|
-
description: 'have no magic numbers in
|
|
123
|
+
description: 'have no magic numbers in member code',
|
|
105
124
|
evaluate(elements, context) {
|
|
106
125
|
const violations = [];
|
|
107
126
|
for (const cls of elements) {
|
|
108
|
-
for (const
|
|
109
|
-
|
|
110
|
-
if (!
|
|
127
|
+
for (const literal of searchClassBody(cls, magicNumberIn(cls), 'member-code')
|
|
128
|
+
.matchingNodes) {
|
|
129
|
+
if (!Node.isNumericLiteral(literal))
|
|
111
130
|
continue;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (!allowedSet.has(value)) {
|
|
116
|
-
violations.push(createViolation(lit, `${cls.getName() ?? '<anonymous>'}.${method.getName()} contains magic number ${String(value)} — extract to a named constant`, context));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
131
|
+
// The value, not the text: `5_000` is 5000, in the message and against the allowed list.
|
|
132
|
+
const value = literal.getLiteralValue();
|
|
133
|
+
violations.push(createViolation(literal, `${memberLabel(cls, literal)} contains magic number ${String(value)} — extract to a named constant`, context));
|
|
119
134
|
}
|
|
120
135
|
}
|
|
121
136
|
return violations;
|
|
122
137
|
},
|
|
123
138
|
};
|
|
124
139
|
}
|
|
140
|
+
/**
|
|
141
|
+
* A number that is the whole value of one of the class's own declarations — a property's initializer,
|
|
142
|
+
* a member's parameter default, or a binding element's default in a member's destructured parameter
|
|
143
|
+
* (bug 0309) — is named by that declaration: `private timeout = 5000`, `retry(attempts = 3)`,
|
|
144
|
+
* `retry({ attempts = 3 } = {})`, `static readonly LIMIT = -5000 as const`. It is not reported. A
|
|
145
|
+
* number inside a larger initializer or default still is, and so is one in a function or class nested
|
|
146
|
+
* inside a member: the method walk before bug 0306 reported those, and they are not the class's names.
|
|
147
|
+
*/
|
|
148
|
+
function isNamedValue(literal, cls) {
|
|
149
|
+
let value = literal;
|
|
150
|
+
let parent = value.getParent();
|
|
151
|
+
while (parent !== undefined && leavesValueUnchanged(parent)) {
|
|
152
|
+
value = parent;
|
|
153
|
+
parent = value.getParent();
|
|
154
|
+
}
|
|
155
|
+
if (Node.isPropertyDeclaration(parent)) {
|
|
156
|
+
return parent.getInitializer() === value && parent.getParent() === cls;
|
|
157
|
+
}
|
|
158
|
+
if (Node.isParameterDeclaration(parent)) {
|
|
159
|
+
return parent.getInitializer() === value && isOwnParameter(parent, cls);
|
|
160
|
+
}
|
|
161
|
+
if (Node.isBindingElement(parent)) {
|
|
162
|
+
return parent.getInitializer() === value && isOwnParameter(patternOwner(parent), cls);
|
|
163
|
+
}
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
/** Whether a node is a parameter of one of the class's own members, not of a function nested in one. */
|
|
167
|
+
function isOwnParameter(node, cls) {
|
|
168
|
+
return Node.isParameterDeclaration(node) && node.getParent()?.getParent() === cls;
|
|
169
|
+
}
|
|
170
|
+
/** What a binding element destructures, through any nested patterns: a parameter, or a variable. */
|
|
171
|
+
function patternOwner(element) {
|
|
172
|
+
let node = element.getParent();
|
|
173
|
+
while (Node.isObjectBindingPattern(node) ||
|
|
174
|
+
Node.isArrayBindingPattern(node) ||
|
|
175
|
+
Node.isBindingElement(node)) {
|
|
176
|
+
node = node.getParent();
|
|
177
|
+
}
|
|
178
|
+
return node;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* A wrapper that leaves the value inside it unchanged: a `-` or `+` sign, parentheses, `as`, `<T>`,
|
|
182
|
+
* `satisfies` or `!`. The metrics rules read a function-valued property through the same wrappers.
|
|
183
|
+
*/
|
|
184
|
+
function leavesValueUnchanged(node) {
|
|
185
|
+
if (Node.isPrefixUnaryExpression(node)) {
|
|
186
|
+
const operator = node.getOperatorToken();
|
|
187
|
+
return operator === SyntaxKind.MinusToken || operator === SyntaxKind.PlusToken;
|
|
188
|
+
}
|
|
189
|
+
return (Node.isParenthesizedExpression(node) ||
|
|
190
|
+
Node.isAsExpression(node) ||
|
|
191
|
+
Node.isTypeAssertion(node) ||
|
|
192
|
+
Node.isSatisfiesExpression(node) ||
|
|
193
|
+
Node.isNonNullExpression(node));
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* `Class.member` for the member of `cls` a node sits in: `Class.constructor` in a constructor,
|
|
197
|
+
* `Class.static` in a static block, and the class alone for a node outside every member.
|
|
198
|
+
*/
|
|
199
|
+
function memberLabel(cls, node) {
|
|
200
|
+
const className = cls.getName() ?? '<anonymous>';
|
|
201
|
+
let member = node;
|
|
202
|
+
let parent = member.getParent();
|
|
203
|
+
while (parent !== undefined && parent !== cls) {
|
|
204
|
+
member = parent;
|
|
205
|
+
parent = member.getParent();
|
|
206
|
+
}
|
|
207
|
+
if (Node.isConstructorDeclaration(member))
|
|
208
|
+
return `${className}.constructor`;
|
|
209
|
+
if (Node.isClassStaticBlockDeclaration(member))
|
|
210
|
+
return `${className}.static`;
|
|
211
|
+
if (Node.isMethodDeclaration(member) ||
|
|
212
|
+
Node.isPropertyDeclaration(member) ||
|
|
213
|
+
Node.isGetAccessorDeclaration(member) ||
|
|
214
|
+
Node.isSetAccessorDeclaration(member)) {
|
|
215
|
+
return `${className}.${member.getName()}`;
|
|
216
|
+
}
|
|
217
|
+
return className;
|
|
218
|
+
}
|
|
125
219
|
//# sourceMappingURL=code-quality.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-quality.js","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAI3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"code-quality.js","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/errors.d.ts
CHANGED
|
@@ -18,8 +18,10 @@ export declare function noTypeErrors(): Condition<ClassDeclaration>;
|
|
|
18
18
|
export declare function functionNoGenericErrors(): Condition<ArchFunction>;
|
|
19
19
|
export declare function functionNoTypeErrors(): Condition<ArchFunction>;
|
|
20
20
|
/**
|
|
21
|
-
* Catch blocks
|
|
22
|
-
*
|
|
21
|
+
* Catch blocks anywhere a class runs code must reference the caught error variable: member
|
|
22
|
+
* bodies, parameter defaults, property initializers (an arrow-function event handler included),
|
|
23
|
+
* static blocks, decorators, computed names and `extends` (bug 0306). It forbids something, so
|
|
24
|
+
* it reads all of it, as `notContain()` on the class builder does.
|
|
23
25
|
*
|
|
24
26
|
* Detects catch blocks that silently discard errors — no logging,
|
|
25
27
|
* no rethrowing, no passing to another function. A common source of
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/rules/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/rules/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAO9D;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAE7D;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAE1D;AAID,wBAAgB,uBAAuB,IAAI,SAAS,CAAC,YAAY,CAAC,CAEjE;AAED,wBAAgB,oBAAoB,IAAI,SAAS,CAAC,YAAY,CAAC,CAE9D;AAWD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAe3D;AAED,wBAAgB,qBAAqB,IAAI,SAAS,CAAC,YAAY,CAAC,CAmB/D;AAED,wBAAgB,mBAAmB,IAAI,SAAS,CAAC,UAAU,CAAC,CAgC3D"}
|