@nielspeter/eess-ts 0.4.0 → 0.5.1
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/dist/builders/call-rule-builder.d.ts.map +1 -1
- package/dist/builders/call-rule-builder.js +2 -1
- package/dist/builders/call-rule-builder.js.map +1 -1
- package/dist/builders/class-rule-builder.d.ts.map +1 -1
- package/dist/builders/class-rule-builder.js +7 -25
- package/dist/builders/class-rule-builder.js.map +1 -1
- package/dist/builders/correspondence-builder.d.ts.map +1 -1
- package/dist/builders/correspondence-builder.js +6 -14
- package/dist/builders/correspondence-builder.js.map +1 -1
- package/dist/builders/cross-layer-builder.d.ts.map +1 -1
- package/dist/builders/cross-layer-builder.js +7 -6
- package/dist/builders/cross-layer-builder.js.map +1 -1
- package/dist/builders/function-rule-builder.d.ts.map +1 -1
- package/dist/builders/function-rule-builder.js +4 -13
- package/dist/builders/function-rule-builder.js.map +1 -1
- package/dist/builders/module-rule-builder.d.ts.map +1 -1
- package/dist/builders/module-rule-builder.js +4 -16
- package/dist/builders/module-rule-builder.js.map +1 -1
- package/dist/builders/slice-rule-builder.d.ts.map +1 -1
- package/dist/builders/slice-rule-builder.js +4 -3
- package/dist/builders/slice-rule-builder.js.map +1 -1
- package/dist/builders/type-rule-builder.d.ts.map +1 -1
- package/dist/builders/type-rule-builder.js +4 -13
- package/dist/builders/type-rule-builder.js.map +1 -1
- package/dist/cli/commands/baseline.d.ts +5 -1
- package/dist/cli/commands/baseline.d.ts.map +1 -1
- package/dist/cli/commands/baseline.js +47 -5
- package/dist/cli/commands/baseline.js.map +1 -1
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +155 -13
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +97 -6
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +21 -2
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/init.js +1 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/import-rule-module.d.ts +23 -4
- package/dist/cli/import-rule-module.d.ts.map +1 -1
- package/dist/cli/import-rule-module.js +30 -18
- package/dist/cli/import-rule-module.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/load-rules.d.ts.map +1 -1
- package/dist/cli/load-rules.js +5 -4
- package/dist/cli/load-rules.js.map +1 -1
- package/dist/cli/resolve-config.d.ts +0 -8
- package/dist/cli/resolve-config.d.ts.map +1 -1
- package/dist/cli/resolve-config.js +18 -48
- package/dist/cli/resolve-config.js.map +1 -1
- package/dist/cli/rule-file-findings.d.ts.map +1 -1
- package/dist/cli/rule-file-findings.js +60 -2
- package/dist/cli/rule-file-findings.js.map +1 -1
- package/dist/cli/watch.d.ts +13 -43
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +8 -148
- package/dist/cli/watch.js.map +1 -1
- package/dist/conditions/call.d.ts.map +1 -1
- package/dist/conditions/call.js +4 -3
- package/dist/conditions/call.js.map +1 -1
- package/dist/conditions/cross-layer.js +2 -2
- package/dist/conditions/cross-layer.js.map +1 -1
- package/dist/conditions/dependency.js +2 -2
- package/dist/conditions/dependency.js.map +1 -1
- package/dist/conditions/exports.d.ts.map +1 -1
- package/dist/conditions/exports.js +31 -37
- package/dist/conditions/exports.js.map +1 -1
- package/dist/conditions/function.js +1 -1
- package/dist/conditions/function.js.map +1 -1
- package/dist/conditions/jsx.js +1 -1
- package/dist/conditions/jsx.js.map +1 -1
- package/dist/conditions/members.d.ts.map +1 -1
- package/dist/conditions/members.js +3 -2
- package/dist/conditions/members.js.map +1 -1
- package/dist/conditions/reverse-dependency.d.ts.map +1 -1
- package/dist/conditions/reverse-dependency.js +47 -2
- package/dist/conditions/reverse-dependency.js.map +1 -1
- package/dist/conditions/slice.js +1 -1
- package/dist/conditions/slice.js.map +1 -1
- package/dist/conditions/structural.js +1 -1
- package/dist/conditions/structural.js.map +1 -1
- package/dist/core/check-all.d.ts.map +1 -1
- package/dist/core/check-all.js +61 -7
- package/dist/core/check-all.js.map +1 -1
- package/dist/core/combinators.d.ts.map +1 -1
- package/dist/core/combinators.js +20 -27
- package/dist/core/combinators.js.map +1 -1
- package/dist/core/descendant-cache.d.ts.map +1 -1
- package/dist/core/descendant-cache.js +5 -7
- package/dist/core/descendant-cache.js.map +1 -1
- package/dist/core/diagnose.js +15 -7
- package/dist/core/diagnose.js.map +1 -1
- package/dist/core/disk-set.js +1 -1
- package/dist/core/disk-set.js.map +1 -1
- package/dist/core/element-cache.js +1 -1
- package/dist/core/element-cache.js.map +1 -1
- package/dist/core/exclusion-comments.d.ts +15 -50
- package/dist/core/exclusion-comments.d.ts.map +1 -1
- package/dist/core/exclusion-comments.js +4 -307
- package/dist/core/exclusion-comments.js.map +1 -1
- package/dist/core/execute-rule.d.ts +8 -0
- package/dist/core/execute-rule.d.ts.map +1 -1
- package/dist/core/execute-rule.js +99 -13
- package/dist/core/execute-rule.js.map +1 -1
- package/dist/core/glob-evaluator.js +2 -2
- package/dist/core/glob-evaluator.js.map +1 -1
- package/dist/core/invalidate-on-modify.d.ts +20 -0
- package/dist/core/invalidate-on-modify.d.ts.map +1 -0
- package/dist/core/invalidate-on-modify.js +26 -0
- package/dist/core/invalidate-on-modify.js.map +1 -0
- package/dist/core/line-index.d.ts.map +1 -1
- package/dist/core/line-index.js +6 -8
- package/dist/core/line-index.js.map +1 -1
- package/dist/core/metric-violation.d.ts +1 -1
- package/dist/core/module-edges.d.ts.map +1 -1
- package/dist/core/module-edges.js +26 -25
- package/dist/core/module-edges.js.map +1 -1
- package/dist/core/orphan-exclusions.d.ts.map +1 -1
- package/dist/core/orphan-exclusions.js +15 -5
- package/dist/core/orphan-exclusions.js.map +1 -1
- package/dist/core/path-universe.d.ts +10 -42
- package/dist/core/path-universe.d.ts.map +1 -1
- package/dist/core/path-universe.js +0 -20
- package/dist/core/path-universe.js.map +1 -1
- package/dist/core/project.d.ts.map +1 -1
- package/dist/core/project.js +6 -5
- package/dist/core/project.js.map +1 -1
- package/dist/core/rule-builder.d.ts +22 -1
- package/dist/core/rule-builder.d.ts.map +1 -1
- package/dist/core/rule-builder.js +38 -20
- package/dist/core/rule-builder.js.map +1 -1
- package/dist/core/rule-declaration.d.ts.map +1 -1
- package/dist/core/rule-declaration.js +14 -52
- package/dist/core/rule-declaration.js.map +1 -1
- package/dist/core/terminal-builder.d.ts +17 -13
- package/dist/core/terminal-builder.d.ts.map +1 -1
- package/dist/core/terminal-builder.js +41 -21
- package/dist/core/terminal-builder.js.map +1 -1
- package/dist/core/terminal-execution.d.ts +22 -6
- package/dist/core/terminal-execution.d.ts.map +1 -1
- package/dist/core/terminal-execution.js +39 -7
- package/dist/core/terminal-execution.js.map +1 -1
- package/dist/core/ts-comment-mask.d.ts +2 -0
- package/dist/core/ts-comment-mask.d.ts.map +1 -0
- package/dist/core/ts-comment-mask.js +102 -0
- package/dist/core/ts-comment-mask.js.map +1 -0
- package/dist/core/vacuity-diagnosis.js +1 -1
- package/dist/core/vacuity-diagnosis.js.map +1 -1
- package/dist/graphql/graphql-rule-builder.d.ts +95 -0
- package/dist/graphql/graphql-rule-builder.d.ts.map +1 -0
- package/dist/graphql/graphql-rule-builder.js +127 -0
- package/dist/graphql/graphql-rule-builder.js.map +1 -0
- package/dist/graphql/index.d.ts +1 -0
- package/dist/graphql/index.d.ts.map +1 -1
- package/dist/graphql/index.js +1 -0
- package/dist/graphql/index.js.map +1 -1
- package/dist/graphql/resolver-rule-builder.d.ts +22 -76
- package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
- package/dist/graphql/resolver-rule-builder.js +8 -130
- package/dist/graphql/resolver-rule-builder.js.map +1 -1
- package/dist/graphql/schema-loader.d.ts.map +1 -1
- package/dist/graphql/schema-loader.js +4 -3
- package/dist/graphql/schema-loader.js.map +1 -1
- package/dist/graphql/schema-predicates.d.ts.map +1 -1
- package/dist/graphql/schema-predicates.js +17 -12
- package/dist/graphql/schema-predicates.js.map +1 -1
- package/dist/graphql/schema-rule-builder.d.ts +21 -67
- package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
- package/dist/graphql/schema-rule-builder.js +6 -120
- package/dist/graphql/schema-rule-builder.js.map +1 -1
- package/dist/helpers/baseline-generator.d.ts +9 -0
- package/dist/helpers/baseline-generator.d.ts.map +1 -1
- package/dist/helpers/baseline-generator.js +9 -0
- package/dist/helpers/baseline-generator.js.map +1 -1
- package/dist/helpers/baseline.d.ts.map +1 -1
- package/dist/helpers/baseline.js +4 -4
- package/dist/helpers/baseline.js.map +1 -1
- package/dist/helpers/body-traversal.d.ts.map +1 -1
- package/dist/helpers/body-traversal.js +13 -0
- package/dist/helpers/body-traversal.js.map +1 -1
- package/dist/helpers/callback-extractor.js +6 -38
- package/dist/helpers/callback-extractor.js.map +1 -1
- package/dist/helpers/complexity.d.ts +1 -1
- package/dist/helpers/complexity.js +1 -1
- package/dist/helpers/diff-aware.d.ts +11 -39
- package/dist/helpers/diff-aware.d.ts.map +1 -1
- package/dist/helpers/diff-aware.js +11 -79
- package/dist/helpers/diff-aware.js.map +1 -1
- package/dist/helpers/matchers.d.ts.map +1 -1
- package/dist/helpers/matchers.js +51 -67
- package/dist/helpers/matchers.js.map +1 -1
- package/dist/index.d.ts +15 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +37 -18
- package/dist/index.js.map +1 -1
- package/dist/models/arch-function.d.ts +26 -2
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +51 -17
- package/dist/models/arch-function.js.map +1 -1
- package/dist/models/arch-jsx-element.d.ts.map +1 -1
- package/dist/models/arch-jsx-element.js +16 -17
- package/dist/models/arch-jsx-element.js.map +1 -1
- package/dist/predicates/jsx.d.ts.map +1 -1
- package/dist/predicates/jsx.js +2 -1
- package/dist/predicates/jsx.js.map +1 -1
- package/dist/presets/agent-guardrails.d.ts +29 -3
- package/dist/presets/agent-guardrails.d.ts.map +1 -1
- package/dist/presets/agent-guardrails.js +185 -1
- package/dist/presets/agent-guardrails.js.map +1 -1
- package/dist/presets/boundaries.d.ts +2 -2
- package/dist/presets/boundaries.d.ts.map +1 -1
- package/dist/presets/data-layer.d.ts +2 -2
- package/dist/presets/data-layer.d.ts.map +1 -1
- package/dist/presets/index.d.ts +4 -1
- package/dist/presets/index.d.ts.map +1 -1
- package/dist/presets/index.js +11 -1
- package/dist/presets/index.js.map +1 -1
- package/dist/presets/layered.d.ts +2 -2
- package/dist/presets/layered.d.ts.map +1 -1
- package/dist/presets/recommended.d.ts +3 -3
- package/dist/presets/recommended.d.ts.map +1 -1
- package/dist/presets/shared.d.ts +8 -11
- package/dist/presets/shared.d.ts.map +1 -1
- package/dist/presets/shared.js +57 -28
- package/dist/presets/shared.js.map +1 -1
- package/dist/rules/metrics-function.d.ts.map +1 -1
- package/dist/rules/metrics-function.js +59 -62
- package/dist/rules/metrics-function.js.map +1 -1
- package/dist/rules/metrics.d.ts.map +1 -1
- package/dist/rules/metrics.js +62 -59
- package/dist/rules/metrics.js.map +1 -1
- package/dist/smells/clusters.d.ts +78 -0
- package/dist/smells/clusters.d.ts.map +1 -0
- package/dist/smells/clusters.js +124 -0
- package/dist/smells/clusters.js.map +1 -0
- package/dist/smells/duplicate-bodies.d.ts +38 -4
- package/dist/smells/duplicate-bodies.d.ts.map +1 -1
- package/dist/smells/duplicate-bodies.js +93 -44
- package/dist/smells/duplicate-bodies.js.map +1 -1
- package/dist/smells/duplicate-report.d.ts +90 -0
- package/dist/smells/duplicate-report.d.ts.map +1 -0
- package/dist/smells/duplicate-report.js +344 -0
- package/dist/smells/duplicate-report.js.map +1 -0
- package/dist/smells/fingerprint.d.ts +12 -0
- package/dist/smells/fingerprint.d.ts.map +1 -1
- package/dist/smells/fingerprint.js +8 -2
- package/dist/smells/fingerprint.js.map +1 -1
- package/dist/smells/inconsistent-siblings.js +1 -1
- package/dist/smells/inconsistent-siblings.js.map +1 -1
- package/dist/smells/similar-pairs.d.ts +9 -8
- package/dist/smells/similar-pairs.d.ts.map +1 -1
- package/dist/smells/similar-pairs.js +83 -1
- package/dist/smells/similar-pairs.js.map +1 -1
- package/dist/smells/smell-builder.d.ts.map +1 -1
- package/dist/smells/smell-builder.js +3 -2
- package/dist/smells/smell-builder.js.map +1 -1
- package/dist/smells/variation.d.ts +47 -0
- package/dist/smells/variation.d.ts.map +1 -0
- package/dist/smells/variation.js +90 -0
- package/dist/smells/variation.js.map +1 -0
- package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
- package/dist/tsconfig/tsconfig-builder.js +3 -2
- package/dist/tsconfig/tsconfig-builder.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type FunctionDeclaration, type VariableDeclaration, type MethodDeclaration, type SourceFile, type ParameterDeclaration, type Type, type Node } from 'ts-morph';
|
|
1
|
+
import { type FunctionDeclaration, type VariableDeclaration, type MethodDeclaration, type ArrowFunction, type FunctionExpression, type SourceFile, type ParameterDeclaration, type Type, type Node } from 'ts-morph';
|
|
2
2
|
/**
|
|
3
3
|
* Unified representation of a TypeScript function.
|
|
4
4
|
*
|
|
@@ -41,6 +41,25 @@ export interface ArchFunction {
|
|
|
41
41
|
*/
|
|
42
42
|
getScope(): 'public' | 'protected' | 'private';
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Wrap a callable node as an `ArchFunction`, taking its name from the caller.
|
|
46
|
+
*
|
|
47
|
+
* Four adapters wrote this object out by hand — `fromArrowExpression`,
|
|
48
|
+
* `fromFunctionExpression` and `fromMethodDeclaration` in
|
|
49
|
+
* `helpers/callback-extractor.ts`, plus the object-literal branch below —
|
|
50
|
+
* which `no-copy-paste` reported at 100%. Every field but the name reads the
|
|
51
|
+
* same way off any of the three node kinds, and `getName` is the caller's
|
|
52
|
+
* because only the caller knows: a callback argument is anonymous, a function
|
|
53
|
+
* expression may name itself, and an object-literal value is named by its
|
|
54
|
+
* property-key path.
|
|
55
|
+
*
|
|
56
|
+
* `isExported: false` and `getScope: 'public'` are facts about this shape
|
|
57
|
+
* rather than defaults: none of these nodes is a declaration that `export` can
|
|
58
|
+
* precede, and none carries an access modifier. Reading them off the node
|
|
59
|
+
* would return the enclosing declaration's answer, which is a different
|
|
60
|
+
* subject from the one the violation names.
|
|
61
|
+
*/
|
|
62
|
+
export declare function fromCallableNode(node: ArrowFunction | FunctionExpression | MethodDeclaration, getName: () => string | undefined): ArchFunction;
|
|
44
63
|
/**
|
|
45
64
|
* Create an ArchFunction from a FunctionDeclaration.
|
|
46
65
|
*/
|
|
@@ -51,7 +70,7 @@ export declare function fromFunctionDeclaration(decl: FunctionDeclaration): Arch
|
|
|
51
70
|
*
|
|
52
71
|
* Precondition: caller must verify the initializer is an ArrowFunction.
|
|
53
72
|
*/
|
|
54
|
-
export declare function
|
|
73
|
+
export declare function fromFunctionInitializerDeclaration(decl: VariableDeclaration): ArchFunction;
|
|
55
74
|
/**
|
|
56
75
|
* Create an ArchFunction from a class MethodDeclaration.
|
|
57
76
|
*
|
|
@@ -95,4 +114,9 @@ export declare function collectFunctions(sourceFile: SourceFile, options?: Funct
|
|
|
95
114
|
* (e.g. `routes["/x"].GET`) so violations identify the subject uniquely.
|
|
96
115
|
*/
|
|
97
116
|
export declare function fromObjectLiteralFunction(node: Node, keyPath: readonly string[]): ArchFunction | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* @deprecated Use {@link fromFunctionInitializerDeclaration} — it handles
|
|
119
|
+
* `function () {}` initializers as well as arrows (bug 0224).
|
|
120
|
+
*/
|
|
121
|
+
export declare const fromArrowVariableDeclaration: typeof fromFunctionInitializerDeclaration;
|
|
98
122
|
//# sourceMappingURL=arch-function.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arch-function.d.ts","sourceRoot":"","sources":["../../src/models/arch-function.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"arch-function.d.ts","sourceRoot":"","sources":["../../src/models/arch-function.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,IAAI,EACT,KAAK,IAAI,EAIV,MAAM,UAAU,CAAA;AAGjB;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,OAAO,IAAI,MAAM,GAAG,SAAS,CAAA;IAE7B,4CAA4C;IAC5C,aAAa,IAAI,UAAU,CAAA;IAE3B,yDAAyD;IACzD,UAAU,IAAI,OAAO,CAAA;IAErB,+CAA+C;IAC/C,OAAO,IAAI,OAAO,CAAA;IAElB,+CAA+C;IAC/C,aAAa,IAAI,oBAAoB,EAAE,CAAA;IAEvC,mEAAmE;IACnE,aAAa,IAAI,IAAI,CAAA;IAErB,yDAAyD;IACzD,OAAO,IAAI,IAAI,GAAG,SAAS,CAAA;IAE3B;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAA;IAEf;;;OAGG;IACH,kBAAkB,IAAI,MAAM,CAAA;IAE5B;;;;;;OAMG;IACH,QAAQ,IAAI,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAA;CAC/C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,aAAa,GAAG,kBAAkB,GAAG,iBAAiB,EAC5D,OAAO,EAAE,MAAM,MAAM,GAAG,SAAS,GAChC,YAAY,CAad;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CAa/E;AAED;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,mBAAmB,GAAG,YAAY,CA0B1F;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,YAAY,CAgC7E;AAED;;GAEG;AAEH,MAAM,WAAW,yBAAyB;IACxC,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB;;;;;OAKG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAA;CACxC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,yBAAyB,GAClC,YAAY,EAAE,CA4DhB;AAkCD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,YAAY,GAAG,SAAS,CAU1B;AAcD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,2CAAqC,CAAA"}
|
|
@@ -1,5 +1,38 @@
|
|
|
1
|
+
import { ArchConfigError } from '@nielspeter/eess';
|
|
1
2
|
import { Node as NodeClass, Scope, SyntaxKind, } from 'ts-morph';
|
|
2
3
|
import { collectObjectLiteralFunctions } from '../core/object-literal-functions.js';
|
|
4
|
+
/**
|
|
5
|
+
* Wrap a callable node as an `ArchFunction`, taking its name from the caller.
|
|
6
|
+
*
|
|
7
|
+
* Four adapters wrote this object out by hand — `fromArrowExpression`,
|
|
8
|
+
* `fromFunctionExpression` and `fromMethodDeclaration` in
|
|
9
|
+
* `helpers/callback-extractor.ts`, plus the object-literal branch below —
|
|
10
|
+
* which `no-copy-paste` reported at 100%. Every field but the name reads the
|
|
11
|
+
* same way off any of the three node kinds, and `getName` is the caller's
|
|
12
|
+
* because only the caller knows: a callback argument is anonymous, a function
|
|
13
|
+
* expression may name itself, and an object-literal value is named by its
|
|
14
|
+
* property-key path.
|
|
15
|
+
*
|
|
16
|
+
* `isExported: false` and `getScope: 'public'` are facts about this shape
|
|
17
|
+
* rather than defaults: none of these nodes is a declaration that `export` can
|
|
18
|
+
* precede, and none carries an access modifier. Reading them off the node
|
|
19
|
+
* would return the enclosing declaration's answer, which is a different
|
|
20
|
+
* subject from the one the violation names.
|
|
21
|
+
*/
|
|
22
|
+
export function fromCallableNode(node, getName) {
|
|
23
|
+
return {
|
|
24
|
+
getName,
|
|
25
|
+
getSourceFile: () => node.getSourceFile(),
|
|
26
|
+
isExported: () => false,
|
|
27
|
+
isAsync: () => node.isAsync(),
|
|
28
|
+
getParameters: () => node.getParameters(),
|
|
29
|
+
getReturnType: () => node.getReturnType(),
|
|
30
|
+
getBody: () => node.getBody(),
|
|
31
|
+
getNode: () => node,
|
|
32
|
+
getScope: () => 'public',
|
|
33
|
+
getStartLineNumber: () => node.getStartLineNumber(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
3
36
|
/**
|
|
4
37
|
* Create an ArchFunction from a FunctionDeclaration.
|
|
5
38
|
*/
|
|
@@ -23,10 +56,11 @@ export function fromFunctionDeclaration(decl) {
|
|
|
23
56
|
*
|
|
24
57
|
* Precondition: caller must verify the initializer is an ArrowFunction.
|
|
25
58
|
*/
|
|
26
|
-
export function
|
|
27
|
-
const arrow = decl.getInitializerIfKind(SyntaxKind.ArrowFunction)
|
|
59
|
+
export function fromFunctionInitializerDeclaration(decl) {
|
|
60
|
+
const arrow = decl.getInitializerIfKind(SyntaxKind.ArrowFunction) ??
|
|
61
|
+
decl.getInitializerIfKind(SyntaxKind.FunctionExpression);
|
|
28
62
|
if (!arrow)
|
|
29
|
-
throw new
|
|
63
|
+
throw new ArchConfigError('fromFunctionInitializerDeclaration', 'Expected an arrow function or function expression initializer');
|
|
30
64
|
return {
|
|
31
65
|
getName: () => decl.getName(),
|
|
32
66
|
getSourceFile: () => decl.getSourceFile(),
|
|
@@ -111,8 +145,14 @@ export function collectFunctions(sourceFile, options) {
|
|
|
111
145
|
}
|
|
112
146
|
// Pattern 2: const arrow functions
|
|
113
147
|
for (const varDecl of sourceFile.getVariableDeclarations()) {
|
|
114
|
-
|
|
115
|
-
|
|
148
|
+
// ArrowFunction and FunctionExpression both. `const a = function () {}` is
|
|
149
|
+
// an ordinary shape and was collected by nothing — bug 0224 measured `eval`
|
|
150
|
+
// passing the `recommended` floor inside one, because the element never
|
|
151
|
+
// reached the rule at all. (Distinct from the concise-arrow half of that
|
|
152
|
+
// bug, which was a traversal gap, not a collection gap.)
|
|
153
|
+
if (varDecl.getInitializerIfKind(SyntaxKind.ArrowFunction) ??
|
|
154
|
+
varDecl.getInitializerIfKind(SyntaxKind.FunctionExpression)) {
|
|
155
|
+
functions.push(fromFunctionInitializerDeclaration(varDecl));
|
|
116
156
|
}
|
|
117
157
|
}
|
|
118
158
|
// Pattern 3: class methods
|
|
@@ -194,18 +234,7 @@ export function fromObjectLiteralFunction(node, keyPath) {
|
|
|
194
234
|
if (NodeClass.isArrowFunction(node) ||
|
|
195
235
|
NodeClass.isFunctionExpression(node) ||
|
|
196
236
|
NodeClass.isMethodDeclaration(node)) {
|
|
197
|
-
return
|
|
198
|
-
getName: () => name,
|
|
199
|
-
getSourceFile: () => node.getSourceFile(),
|
|
200
|
-
isExported: () => false,
|
|
201
|
-
isAsync: () => node.isAsync(),
|
|
202
|
-
getParameters: () => node.getParameters(),
|
|
203
|
-
getReturnType: () => node.getReturnType(),
|
|
204
|
-
getBody: () => node.getBody(),
|
|
205
|
-
getNode: () => node,
|
|
206
|
-
getStartLineNumber: () => node.getStartLineNumber(),
|
|
207
|
-
getScope: () => 'public',
|
|
208
|
-
};
|
|
237
|
+
return fromCallableNode(node, () => name);
|
|
209
238
|
}
|
|
210
239
|
return undefined;
|
|
211
240
|
}
|
|
@@ -222,4 +251,9 @@ function qualifiedName(keyPath) {
|
|
|
222
251
|
})
|
|
223
252
|
.join('');
|
|
224
253
|
}
|
|
254
|
+
/**
|
|
255
|
+
* @deprecated Use {@link fromFunctionInitializerDeclaration} — it handles
|
|
256
|
+
* `function () {}` initializers as well as arrows (bug 0224).
|
|
257
|
+
*/
|
|
258
|
+
export const fromArrowVariableDeclaration = fromFunctionInitializerDeclaration;
|
|
225
259
|
//# sourceMappingURL=arch-function.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arch-function.js","sourceRoot":"","sources":["../../src/models/arch-function.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"arch-function.js","sourceRoot":"","sources":["../../src/models/arch-function.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arch-jsx-element.d.ts","sourceRoot":"","sources":["../../src/models/arch-jsx-element.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,qBAAqB,EAE1B,KAAK,UAAU,EAGhB,MAAM,UAAU,CAAA;AAEjB;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAiHtC,CAAA;AAEV;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,OAAO,IAAI,MAAM,CAAA;IAEjB,2CAA2C;IAC3C,aAAa,IAAI,UAAU,CAAA;IAE3B;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAA;IAExB;;OAEG;IACH,WAAW,IAAI,OAAO,CAAA;IAEtB;;;;;;;;OAQG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAE9C;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAEnC;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE,CAAA;IAE7B,+EAA+E;IAC/E,WAAW,IAAI,OAAO,CAAA;IAEtB,gCAAgC;IAChC,OAAO,IAAI,UAAU,GAAG,qBAAqB,CAAA;IAE7C,4CAA4C;IAC5C,kBAAkB,IAAI,MAAM,CAAA;CAC7B;AAiDD;;GAEG;AAEH,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"arch-jsx-element.d.ts","sourceRoot":"","sources":["../../src/models/arch-jsx-element.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,qBAAqB,EAE1B,KAAK,UAAU,EAGhB,MAAM,UAAU,CAAA;AAEjB;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAiHtC,CAAA;AAEV;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,OAAO,IAAI,MAAM,CAAA;IAEjB,2CAA2C;IAC3C,aAAa,IAAI,UAAU,CAAA;IAE3B;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAA;IAExB;;OAEG;IACH,WAAW,IAAI,OAAO,CAAA;IAEtB;;;;;;;;OAQG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IAE9C;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAEnC;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE,CAAA;IAE7B,+EAA+E;IAC/E,WAAW,IAAI,OAAO,CAAA;IAEtB,gCAAgC;IAChC,OAAO,IAAI,UAAU,GAAG,qBAAqB,CAAA;IAE7C,4CAA4C;IAC5C,kBAAkB,IAAI,MAAM,CAAA;CAC7B;AAiDD;;GAEG;AAEH,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,GAAG,cAAc,CAG7D;AAED;;GAEG;AAEH,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,qBAAqB,GAAG,cAAc,CAEnF;AA+BD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,cAAc,EAAE,CAa3E"}
|
|
@@ -172,35 +172,34 @@ function buildAttributeAccessors(getAttrs) {
|
|
|
172
172
|
// eess-exclude eess/no-unused-exports: consumed by the test suite; the build tsconfig this gate reads excludes tests, so `src` is the only usage it can see
|
|
173
173
|
export function fromJsxElement(el) {
|
|
174
174
|
const opening = el.getOpeningElement();
|
|
175
|
-
|
|
176
|
-
const htmlTag = isHtmlTag(tagName);
|
|
177
|
-
const attrs = buildAttributeAccessors(() => opening.getAttributes());
|
|
178
|
-
return {
|
|
179
|
-
getName: () => tagName,
|
|
180
|
-
getSourceFile: () => el.getSourceFile(),
|
|
181
|
-
isHtmlElement: () => htmlTag,
|
|
182
|
-
isComponent: () => !htmlTag,
|
|
183
|
-
...attrs,
|
|
184
|
-
hasChildren: () => true,
|
|
185
|
-
getNode: () => el,
|
|
186
|
-
getStartLineNumber: () => el.getStartLineNumber(),
|
|
187
|
-
};
|
|
175
|
+
return jsxElementOf(el, opening.getTagNameNode().getText(), () => opening.getAttributes(), true);
|
|
188
176
|
}
|
|
189
177
|
/**
|
|
190
178
|
* Create an ArchJsxElement from a JsxSelfClosingElement (no children).
|
|
191
179
|
*/
|
|
192
180
|
// eess-exclude eess/no-unused-exports: consumed by the test suite; the build tsconfig this gate reads excludes tests, so `src` is the only usage it can see
|
|
193
181
|
export function fromJsxSelfClosingElement(el) {
|
|
194
|
-
|
|
182
|
+
return jsxElementOf(el, el.getTagNameNode().getText(), () => el.getAttributes(), false);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* The `ArchJsxElement` shape, from whichever node carries the tag.
|
|
186
|
+
*
|
|
187
|
+
* `<X>…</X>` and `<X />` differ in exactly two things — where the attributes
|
|
188
|
+
* hang, and whether children are possible — and the two constructors were
|
|
189
|
+
* otherwise byte-identical, which `no-copy-paste` reported at 91%. The rest is
|
|
190
|
+
* a definition, not a coincidence: `isComponent` is `!isHtmlElement` and must
|
|
191
|
+
* stay so, since an element that answered false to both would be excluded by
|
|
192
|
+
* every JSX rule at once and reported by none.
|
|
193
|
+
*/
|
|
194
|
+
function jsxElementOf(el, tagName, attributes, hasChildren) {
|
|
195
195
|
const htmlTag = isHtmlTag(tagName);
|
|
196
|
-
const attrs = buildAttributeAccessors(() => el.getAttributes());
|
|
197
196
|
return {
|
|
198
197
|
getName: () => tagName,
|
|
199
198
|
getSourceFile: () => el.getSourceFile(),
|
|
200
199
|
isHtmlElement: () => htmlTag,
|
|
201
200
|
isComponent: () => !htmlTag,
|
|
202
|
-
...
|
|
203
|
-
hasChildren: () =>
|
|
201
|
+
...buildAttributeAccessors(attributes),
|
|
202
|
+
hasChildren: () => hasChildren,
|
|
204
203
|
getNode: () => el,
|
|
205
204
|
getStartLineNumber: () => el.getStartLineNumber(),
|
|
206
205
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arch-jsx-element.js","sourceRoot":"","sources":["../../src/models/arch-jsx-element.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"arch-jsx-element.js","sourceRoot":"","sources":["../../src/models/arch-jsx-element.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../../src/predicates/jsx.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../../src/predicates/jsx.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAEnE;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,CAiB5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,cAAc,CAAC,CAe3E;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,cAAc,CAAC,CAKrE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GACrB,SAAS,CAAC,cAAc,CAAC,CAW3B"}
|
package/dist/predicates/jsx.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ArchConfigError } from '@nielspeter/eess';
|
|
1
2
|
/**
|
|
2
3
|
* Matches HTML intrinsic elements with the given tag names.
|
|
3
4
|
* At least one tag name is required — throws if called with zero tags.
|
|
@@ -8,7 +9,7 @@
|
|
|
8
9
|
*/
|
|
9
10
|
export function areHtmlElements(...tags) {
|
|
10
11
|
if (tags.length === 0) {
|
|
11
|
-
throw new
|
|
12
|
+
throw new ArchConfigError('areHtmlElements', 'areHtmlElements() requires at least one tag name. ' +
|
|
12
13
|
'Use areHtmlElements(...STANDARD_HTML_TAGS) for all standard HTML elements.');
|
|
13
14
|
}
|
|
14
15
|
const tagSet = new Set(tags);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx.js","sourceRoot":"","sources":["../../src/predicates/jsx.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"jsx.js","sourceRoot":"","sources":["../../src/predicates/jsx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIlD;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,GAAG,IAAc;IAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CACvB,iBAAiB,EACjB,oDAAoD;YAClD,4EAA4E,CAC/E,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,IAAI,CAAC;QACd,CAAC,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY;QACvC,CAAC,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,qBAAqB,CAAA;IAChG,OAAO;QACL,WAAW,EAAE,IAAI;QACjB,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;KAC5E,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,GAAG,KAAe;IAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO;YACL,WAAW,EAAE,wBAAwB;YACrC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE;SACzC,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO;QACL,WAAW,EACT,KAAK,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,cAAc;YAChC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc;QAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;KAC3E,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO;QACL,WAAW,EAAE,mBAAmB,IAAI,GAAG;QACvC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;KAC9C,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,KAAsB;IAEtB,MAAM,SAAS,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1E,OAAO;QACL,WAAW,EAAE,mBAAmB,IAAI,cAAc,SAAS,EAAE;QAC7D,IAAI,CAAC,OAAO;YACV,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,SAAS,KAAK,SAAS;gBAAE,OAAO,KAAK,CAAA;YACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,SAAS,KAAK,KAAK,CAAA;YACzD,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC9B,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CollectResult } from '@nielspeter/eess';
|
|
2
2
|
import type { ArchProject } from '../core/project.js';
|
|
3
3
|
import type { RuleBuilderLike } from '@nielspeter/eess';
|
|
4
4
|
import type { PresetBaseOptions } from './shared.js';
|
|
@@ -8,7 +8,7 @@ import type { PresetBaseOptions } from './shared.js';
|
|
|
8
8
|
* the set is not closed. A typo in the API name is therefore still accepted by
|
|
9
9
|
* the type — the runtime finding is what covers that arm.
|
|
10
10
|
*/
|
|
11
|
-
type AgentGuardrailsRuleId = `preset/agent/no-inline-logic/${string}` | 'preset/agent/no-generic-errors' | 'preset/agent/no-stubs' | 'preset/agent/no-empty-bodies' | 'preset/agent/no-copy-paste';
|
|
11
|
+
type AgentGuardrailsRuleId = `preset/agent/no-inline-logic/${string}` | 'preset/agent/no-generic-errors' | 'preset/agent/no-stubs' | 'preset/agent/no-empty-bodies' | 'preset/agent/no-copy-paste' | 'preset/agent/no-verdict-outside-rules';
|
|
12
12
|
export interface AgentGuardrailsOptions extends PresetBaseOptions<AgentGuardrailsRuleId> {
|
|
13
13
|
/** Glob for the source files the rules apply to. */
|
|
14
14
|
src: string;
|
|
@@ -18,6 +18,32 @@ export interface AgentGuardrailsOptions extends PresetBaseOptions<AgentGuardrail
|
|
|
18
18
|
noStubs?: boolean;
|
|
19
19
|
noEmptyBodies?: boolean;
|
|
20
20
|
noCopyPaste?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Ban eess at runtime, and every emitter call, outside a file that is meant to
|
|
23
|
+
* write a verdict — [plan 0237](../../../../work/plans/completed/0237-eess-runtime-use-only-in-rule-files.md),
|
|
24
|
+
* reaching the two residuals ADR-014 states its own contract cannot.
|
|
25
|
+
*/
|
|
26
|
+
noVerdictOutsideRules?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Where else eess may be used as a value. **Extends**
|
|
29
|
+
* {@link DEFAULT_RULE_FILES} rather than replacing it, so an adopter naming
|
|
30
|
+
* `scripts/**` does not thereby red every one of their rule files.
|
|
31
|
+
*
|
|
32
|
+
* A list, and ADR-009 rule 3's corollary is right to be wary of one — a marker
|
|
33
|
+
* an agent can stamp to go green is worse than none. Two things make this one
|
|
34
|
+
* honest. It lives in the preset's options, so stamping it is a visible line in
|
|
35
|
+
* the config diff, exactly like `overrides`: a Tier 5 defence, review-enforced,
|
|
36
|
+
* and named as such rather than dressed as a mechanism. And a file named here
|
|
37
|
+
* is still under ADR-014 the moment it calls an emitter — the list decides
|
|
38
|
+
* WHERE a verdict may be written, not whether it needs evidence.
|
|
39
|
+
*
|
|
40
|
+
* An entry matching no file is reported as
|
|
41
|
+
* `preset/agent/rule-files-matches-nothing`, so the list cannot rot in silence.
|
|
42
|
+
* An unanchored entry (`scripts/**`) is matched relative to the tsconfig root,
|
|
43
|
+
* exactly as `resideInFile` does it — the check and the rule share one
|
|
44
|
+
* derivation rather than two that can drift apart.
|
|
45
|
+
*/
|
|
46
|
+
ruleFiles?: string[];
|
|
21
47
|
}
|
|
22
48
|
/**
|
|
23
49
|
* `report` names a delivery mode; omitting it returns the un-executed builders.
|
|
@@ -34,6 +60,6 @@ export interface AgentGuardrailsOptions extends PresetBaseOptions<AgentGuardrail
|
|
|
34
60
|
export declare function agentGuardrails(p: ArchProject, options: AgentGuardrailsOptions & {
|
|
35
61
|
report: 'builders';
|
|
36
62
|
}): RuleBuilderLike[];
|
|
37
|
-
export declare function agentGuardrails(p: ArchProject, options: AgentGuardrailsOptions):
|
|
63
|
+
export declare function agentGuardrails(p: ArchProject, options: AgentGuardrailsOptions): CollectResult;
|
|
38
64
|
export {};
|
|
39
65
|
//# sourceMappingURL=agent-guardrails.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-guardrails.d.ts","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"agent-guardrails.d.ts","sourceRoot":"","sources":["../../src/presets/agent-guardrails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAmBrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAYpD;;;;;GAKG;AACH,KAAK,qBAAqB,GACtB,gCAAgC,MAAM,EAAE,GACxC,gCAAgC,GAChC,uBAAuB,GACvB,8BAA8B,GAC9B,4BAA4B,GAC5B,uCAAuC,CAAA;AAE3C,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB,CAAC,qBAAqB,CAAC;IACtF,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAA;IACX,sFAAsF;IACtF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B;;;;;;;;;;;;;;;;;;OAkBG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAkFD;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,sBAAsB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACvD,eAAe,EAAE,CAAA;AACpB,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,sBAAsB,GAAG,aAAa,CAAA"}
|
|
@@ -1,9 +1,72 @@
|
|
|
1
1
|
import { functions } from '../builders/function-rule-builder.js';
|
|
2
|
+
import { modules } from '../builders/module-rule-builder.js';
|
|
3
|
+
import { resideInFile } from '../predicates/identity.js';
|
|
4
|
+
import { not, or } from '../core/combinators.js';
|
|
5
|
+
import { isDeadSite } from '../core/glob-evaluator.js';
|
|
6
|
+
import { isProjectRelative } from '../core/project-relative.js';
|
|
7
|
+
import { pathUniverse } from '../core/path-universe.js';
|
|
8
|
+
import { collectResult } from '@nielspeter/eess';
|
|
9
|
+
import { UNSUPPRESSABLE } from '@nielspeter/eess/internal';
|
|
2
10
|
import { call } from '../helpers/matchers.js';
|
|
3
11
|
import { functionNoGenericErrors } from '../rules/errors.js';
|
|
4
12
|
import { noStubComments, noEmptyBodies } from '../rules/hygiene.js';
|
|
5
13
|
import { smells } from '../smells/index.js';
|
|
6
14
|
import { overrideFindings, validateOverrides, declareEmptyIfListed, presetDeclarationSpelling, declaredEmptyFindings, assertEnabled, deliver, } from './shared.js';
|
|
15
|
+
/**
|
|
16
|
+
* The rule-file kinds exempt without the caller naming anything — proposal 009's
|
|
17
|
+
* own list. `*.spec.ts` is here because an earlier draft of plan 0237 dropped it
|
|
18
|
+
* with no reason given, and half the ecosystem names tests that way.
|
|
19
|
+
*/
|
|
20
|
+
const DEFAULT_RULE_FILES = ['**/*.rules.ts', '**/*.test.ts', '**/*.spec.ts'];
|
|
21
|
+
/**
|
|
22
|
+
* Every specifier shape, not only the bare package.
|
|
23
|
+
*
|
|
24
|
+
* Measured with picomatch before this list was written: `@nielspeter/eess` and
|
|
25
|
+
* `@nielspeter/eess-*` alone match NONE of `@nielspeter/eess/internal`,
|
|
26
|
+
* `@nielspeter/eess-ts/presets` or `@nielspeter/eess-md/rules/adr` — and those
|
|
27
|
+
* subpath shapes are what real code imports, this repo's own guardrails script
|
|
28
|
+
* included. An earlier draft shipped the two bare globs.
|
|
29
|
+
*/
|
|
30
|
+
const EESS_PACKAGES = [
|
|
31
|
+
'@nielspeter/eess',
|
|
32
|
+
'@nielspeter/eess/**',
|
|
33
|
+
'@nielspeter/eess-*',
|
|
34
|
+
'@nielspeter/eess-*/**',
|
|
35
|
+
];
|
|
36
|
+
/**
|
|
37
|
+
* The emitters, anchored on the callee.
|
|
38
|
+
*
|
|
39
|
+
* `(^|\.)` so `import * as eess` followed by `eess.finishPreset(...)` is caught
|
|
40
|
+
* — the consuming project that measured the field failure had exactly that
|
|
41
|
+
* escape in its own first version of this rule. A RENAMED import
|
|
42
|
+
* (`finishPreset as done`) escapes this leg and is caught by the import leg, so
|
|
43
|
+
* the two conditions cover each other's blind spot.
|
|
44
|
+
*
|
|
45
|
+
* **The two legs cover each other for a STATIC renamed import, and NOT for a
|
|
46
|
+
* dynamic one.** `import { finishPreset as done }` escapes this regex and is
|
|
47
|
+
* caught by the import leg — asserted, not assumed. But
|
|
48
|
+
* `const { finishPreset: done } = await import('@nielspeter/eess')` escapes
|
|
49
|
+
* BOTH on one line: the import leg because `TYPE_IMPORT_KINDS` sets
|
|
50
|
+
* `dynamic: false` by design, this one because the callee text is `done`. That
|
|
51
|
+
* is [bug 0264](../../../../work/bugs/0264-a-dynamic-import-escapes-the-verdict-rule.md),
|
|
52
|
+
* found by review, pinned by a KNOWN-GAP test, and named here rather than left
|
|
53
|
+
* for the next reader to discover — an unstated ceiling reads as coverage.
|
|
54
|
+
*
|
|
55
|
+
* `dispatchRule` is deliberately absent: it is the sanctioned preset-authoring
|
|
56
|
+
* call. That is not what spares a preset module, though — such a module imports
|
|
57
|
+
* `dispatchRule` at runtime, so the import leg reds it whatever this regex says.
|
|
58
|
+
* A preset module is a verdict file by definition and belongs in `ruleFiles`.
|
|
59
|
+
*
|
|
60
|
+
* `throwIfViolations` stays although plan 0263 Phase 5 removed it from this
|
|
61
|
+
* kernel's public surface, and the reason it stays is the reason it was listed:
|
|
62
|
+
* this preset runs against an ADOPTER's code, not ours. An adopter pinned to an
|
|
63
|
+
* older `@nielspeter/eess` still has the alias and can still call it outside a
|
|
64
|
+
* rule file, which is exactly the misuse this regex exists to catch. Dropping
|
|
65
|
+
* the name the day our own export went would open that gap for every consumer
|
|
66
|
+
* who has not upgraded. A dead name in a regex costs nothing; a missing one
|
|
67
|
+
* costs a silent pass.
|
|
68
|
+
*/
|
|
69
|
+
const EMITTERS = /(^|\.)(finishPreset|reportViolations|throwIfViolations)$/;
|
|
7
70
|
/**
|
|
8
71
|
* Preset targeting the mistakes AI coding agents make most often — inline
|
|
9
72
|
* logic, generic errors, stub comments, empty bodies, copy-paste.
|
|
@@ -98,12 +161,48 @@ export function agentGuardrails(p, options) {
|
|
|
98
161
|
imperative: 'Do NOT duplicate a function body — extract the shared logic',
|
|
99
162
|
}, 'warn');
|
|
100
163
|
}
|
|
164
|
+
if (options.noVerdictOutsideRules) {
|
|
165
|
+
// The exemption EXTENDS the default; an adopter naming `scripts/**` must not
|
|
166
|
+
// lose `*.rules.ts` by doing so.
|
|
167
|
+
const ruleFiles = [...DEFAULT_RULE_FILES, ...(options.ruleFiles ?? [])];
|
|
168
|
+
push(modules(p)
|
|
169
|
+
.that()
|
|
170
|
+
.resideInFile(options.src)
|
|
171
|
+
.and()
|
|
172
|
+
// `not(or(...))` rather than a `notResideInFile` the builder does not
|
|
173
|
+
// have. Both combinators compose the globs their inputs declare, so the
|
|
174
|
+
// exclusion is a declared site rather than an opaque one — it just is
|
|
175
|
+
// not a site the dead-glob pipeline will ever call a fault, which is
|
|
176
|
+
// what `ruleFilesFindings` below exists for.
|
|
177
|
+
.satisfy(not(or(...ruleFiles.map((glob) => resideInFile(glob)))))
|
|
178
|
+
.should()
|
|
179
|
+
.onlyHaveTypeImportsFrom(...EESS_PACKAGES)
|
|
180
|
+
.andShould()
|
|
181
|
+
.notContain(call(EMITTERS)), {
|
|
182
|
+
id: 'preset/agent/no-verdict-outside-rules',
|
|
183
|
+
because: 'outside a rule file nothing counts what was examined, so a pass there is a claim with ' +
|
|
184
|
+
'no evidence — a loop that skips every item looks identical to one that checked them all',
|
|
185
|
+
// The remedy must NOT lead with "move it into a *.rules.ts file": the
|
|
186
|
+
// same hand-written loop moved there is inside the exemption and green,
|
|
187
|
+
// so an agent following that Fix line would un-detect the problem rather
|
|
188
|
+
// than remediate it (ADR-009 rule 2).
|
|
189
|
+
suggestion: 'express the check as a Condition and reach the verdict through a builder (.check(), or ' +
|
|
190
|
+
'a preset), so the evidence floor sees it; moving the same loop into a *.rules.ts file ' +
|
|
191
|
+
'hides it, it does not fix it. If this module is a gate script that finishes through an ' +
|
|
192
|
+
'emitter, name it in ruleFiles',
|
|
193
|
+
imperative: 'Do NOT import eess as a value (only `import type`), or call ' +
|
|
194
|
+
'finishPreset/reportViolations, outside a rule file, a test, or a file listed in ' +
|
|
195
|
+
'ruleFiles — and inside one, reach the verdict through a builder, never a hand-written ' +
|
|
196
|
+
'loop: a green built by hand certifies nothing',
|
|
197
|
+
}, 'error');
|
|
198
|
+
}
|
|
101
199
|
// Unknown override keys FIRST: they say the configuration is wrong, which
|
|
102
200
|
// the reader needs before any finding produced under it (bug 0038).
|
|
103
201
|
// `constructed` is recorded at the `push` site above, not re-derived here.
|
|
104
202
|
const otherFindings = [
|
|
105
203
|
...overrideProblems,
|
|
106
204
|
...declaredEmptyFindings(options.expectEmpty, constructed),
|
|
205
|
+
...ruleFilesFindings(p, options),
|
|
107
206
|
];
|
|
108
207
|
return deliver([
|
|
109
208
|
...otherFindings,
|
|
@@ -113,7 +212,7 @@ export function agentGuardrails(p, options) {
|
|
|
113
212
|
...assertEnabled(attempted, otherFindings, {
|
|
114
213
|
id: 'preset/agent/constructs-nothing',
|
|
115
214
|
presetName: 'agentGuardrails',
|
|
116
|
-
optionsHint: 'noInlineLogic, noGenericErrors, noStubs, noEmptyBodies, noCopyPaste',
|
|
215
|
+
optionsHint: 'noInlineLogic, noGenericErrors, noStubs, noEmptyBodies, noCopyPaste, noVerdictOutsideRules',
|
|
117
216
|
}),
|
|
118
217
|
...builders,
|
|
119
218
|
], options);
|
|
@@ -140,6 +239,7 @@ const STATIC_RULE_IDS = [
|
|
|
140
239
|
'preset/agent/no-stubs',
|
|
141
240
|
'preset/agent/no-empty-bodies',
|
|
142
241
|
'preset/agent/no-copy-paste',
|
|
242
|
+
'preset/agent/no-verdict-outside-rules',
|
|
143
243
|
];
|
|
144
244
|
/**
|
|
145
245
|
* Rule ids the given options WOULD generate if every flag were on — for
|
|
@@ -187,6 +287,90 @@ function collectRuleIds(options) {
|
|
|
187
287
|
ids.push('preset/agent/no-empty-bodies');
|
|
188
288
|
if (options.noCopyPaste)
|
|
189
289
|
ids.push('preset/agent/no-copy-paste');
|
|
290
|
+
if (options.noVerdictOutsideRules)
|
|
291
|
+
ids.push('preset/agent/no-verdict-outside-rules');
|
|
190
292
|
return ids;
|
|
191
293
|
}
|
|
294
|
+
/**
|
|
295
|
+
* A `ruleFiles` entry that matches no file in the project.
|
|
296
|
+
*
|
|
297
|
+
* **Why this is its own check and not the dead-glob pipeline** — plan 0237's
|
|
298
|
+
* build finding. The exclusion is `not(or(...))`, and `isDeadSite` opens with
|
|
299
|
+
* `if ((site.polarity ?? 'positive') === 'negative') return false`, because
|
|
300
|
+
* `not(dead)` over-selects rather than under-selecting. Exclusion sites are
|
|
301
|
+
* never faults either: "a condition glob matching nothing is indistinguishable
|
|
302
|
+
* from an armed tripwire that has not fired". Both decisions are correct and
|
|
303
|
+
* neither is weakened here.
|
|
304
|
+
*
|
|
305
|
+
* So the question is asked differently: `isDeadSite` about each caller-supplied
|
|
306
|
+
* glob **on its own, at positive polarity**. Same computation, same
|
|
307
|
+
* `syntacticFault` anchoring — so this check and `doctor`'s pre-flight cannot
|
|
308
|
+
* disagree about what matches nothing.
|
|
309
|
+
*
|
|
310
|
+
* **Only the caller's entries.** {@link DEFAULT_RULE_FILES} is never reported: a
|
|
311
|
+
* project with no `*.spec.ts` is ordinary, the defaults are not the caller's to
|
|
312
|
+
* fix, and reporting them would red the preset out of the box.
|
|
313
|
+
*
|
|
314
|
+
* The finding is legibility, not a hole, and says so. A dead entry is already
|
|
315
|
+
* fail-CLOSED — an exemption that exempts nothing reds the files it names rather
|
|
316
|
+
* than going quiet. What it prevents is the loop: without it a typo surfaces as
|
|
317
|
+
* "your gate script violates no-verdict-outside-rules", whose remedy says "name
|
|
318
|
+
* it in ruleFiles", which the adopter did — with a typo.
|
|
319
|
+
*/
|
|
320
|
+
function ruleFilesFindings(p, options) {
|
|
321
|
+
if (options.noVerdictOutsideRules !== true)
|
|
322
|
+
return [];
|
|
323
|
+
const declared = options.ruleFiles ?? [];
|
|
324
|
+
if (declared.length === 0)
|
|
325
|
+
return [];
|
|
326
|
+
const universe = pathUniverse(p);
|
|
327
|
+
// Asked at POSITIVE polarity and `position: 'discovery'`, deliberately. In the
|
|
328
|
+
// rule this same glob sits negated inside an exclusion, where `isDeadSite`
|
|
329
|
+
// answers `false` by design (twice over). Here the question is the honest one:
|
|
330
|
+
// "does this glob, by itself, match anything?"
|
|
331
|
+
//
|
|
332
|
+
// **`base` is DERIVED, not hard-coded, and that is the whole correctness of
|
|
333
|
+
// this check.** An architect review measured what a hard-coded
|
|
334
|
+
// `base: 'absolute'` did: `ruleFiles: ['gates/**']` genuinely exempted
|
|
335
|
+
// `gates/check-corpus.ts` — `resideInFile` falls back to matching the path
|
|
336
|
+
// relative to the tsconfig root for an unanchored glob (plan 0067 C) — while
|
|
337
|
+
// this producer reported "matches no file in this project, so it exempts
|
|
338
|
+
// nothing" about the same string. Both in one run. That is two derivations
|
|
339
|
+
// disagreeing about one glob, which is the failure this project spends most
|
|
340
|
+
// of its guards on, and the remedy it printed told the adopter to WIDEN a
|
|
341
|
+
// correctly-scoped exemption to silence a finding that was wrong.
|
|
342
|
+
//
|
|
343
|
+
// So the derivation is `resideInFile`'s own, taken from the same helper:
|
|
344
|
+
// every other site that stamps a `GlobSite` does `relative ? 'normalized' :
|
|
345
|
+
// 'absolute'` (`identity.ts:83`, `:114`, `:157`), and this one now does too.
|
|
346
|
+
const dead = declared.filter((glob) => isDeadSite({
|
|
347
|
+
glob,
|
|
348
|
+
kind: 'file-path',
|
|
349
|
+
base: isProjectRelative(glob) ? 'normalized' : 'absolute',
|
|
350
|
+
position: 'discovery',
|
|
351
|
+
origin: `ruleFiles entry "${glob}"`,
|
|
352
|
+
}, universe));
|
|
353
|
+
if (dead.length === 0)
|
|
354
|
+
return [];
|
|
355
|
+
const violations = dead.map((glob) => ({
|
|
356
|
+
rule: `preset ruleFiles '${glob}'`,
|
|
357
|
+
ruleId: 'preset/agent/rule-files-matches-nothing',
|
|
358
|
+
element: glob,
|
|
359
|
+
file: '',
|
|
360
|
+
line: 0,
|
|
361
|
+
message: `ruleFiles entry '${glob}' matches no file in this project, so it exempts nothing.`,
|
|
362
|
+
because: 'an exemption that exempts nothing is not a weaker exemption, it is a typo — and the rule ' +
|
|
363
|
+
'it was meant to quiet will red the very files the entry names, sending the reader back to ' +
|
|
364
|
+
'a list that already says what they meant',
|
|
365
|
+
suggestion: `Correct the glob or remove it. An unanchored glob like 'scripts/**' is matched ` +
|
|
366
|
+
`against the path relative to your tsconfig root, so it is already correct for a ` +
|
|
367
|
+
`top-level directory; '**/scripts/**' matches one at any depth. Check the spelling ` +
|
|
368
|
+
`and the depth before widening. ` +
|
|
369
|
+
UNSUPPRESSABLE,
|
|
370
|
+
bypassFilters: true,
|
|
371
|
+
}));
|
|
372
|
+
// `examined: 0` and honest: a CONFIGURATION finding, not a rule that examined
|
|
373
|
+
// units. The receipt carries a violation, so ADR-014 §4 passes it through.
|
|
374
|
+
return [{ violations: () => collectResult(violations, { examined: 0 }) }];
|
|
375
|
+
}
|
|
192
376
|
//# sourceMappingURL=agent-guardrails.js.map
|