@nielspeter/eess-ts 0.2.1 → 0.4.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 +61 -35
- package/dist/builders/call-rule-builder.d.ts +66 -26
- package/dist/builders/call-rule-builder.d.ts.map +1 -1
- package/dist/builders/call-rule-builder.js +73 -31
- package/dist/builders/call-rule-builder.js.map +1 -1
- package/dist/builders/class-rule-builder.d.ts +125 -26
- package/dist/builders/class-rule-builder.d.ts.map +1 -1
- package/dist/builders/class-rule-builder.js +134 -30
- package/dist/builders/class-rule-builder.js.map +1 -1
- package/dist/builders/correspondence-builder.d.ts +287 -0
- package/dist/builders/correspondence-builder.d.ts.map +1 -0
- package/dist/builders/correspondence-builder.js +393 -0
- package/dist/builders/correspondence-builder.js.map +1 -0
- package/dist/builders/correspondence-findings.d.ts +104 -0
- package/dist/builders/correspondence-findings.d.ts.map +1 -0
- package/dist/builders/correspondence-findings.js +301 -0
- package/dist/builders/correspondence-findings.js.map +1 -0
- package/dist/builders/cross-layer-builder.d.ts +99 -16
- package/dist/builders/cross-layer-builder.d.ts.map +1 -1
- package/dist/builders/cross-layer-builder.js +181 -35
- package/dist/builders/cross-layer-builder.js.map +1 -1
- package/dist/builders/function-rule-builder.d.ts +144 -25
- package/dist/builders/function-rule-builder.d.ts.map +1 -1
- package/dist/builders/function-rule-builder.js +173 -26
- package/dist/builders/function-rule-builder.js.map +1 -1
- package/dist/builders/jsx-rule-builder.d.ts +70 -14
- package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
- package/dist/builders/jsx-rule-builder.js +73 -14
- package/dist/builders/jsx-rule-builder.js.map +1 -1
- package/dist/builders/module-rule-builder.d.ts +2 -2
- package/dist/builders/module-rule-builder.d.ts.map +1 -1
- package/dist/builders/module-rule-builder.js +12 -3
- package/dist/builders/module-rule-builder.js.map +1 -1
- package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
- package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
- package/dist/builders/scoped-function-rule-builder.js +12 -0
- package/dist/builders/scoped-function-rule-builder.js.map +1 -1
- package/dist/builders/slice-discovery-message.d.ts +36 -0
- package/dist/builders/slice-discovery-message.d.ts.map +1 -0
- package/dist/builders/slice-discovery-message.js +181 -0
- package/dist/builders/slice-discovery-message.js.map +1 -0
- package/dist/builders/slice-rule-builder.d.ts +151 -12
- package/dist/builders/slice-rule-builder.d.ts.map +1 -1
- package/dist/builders/slice-rule-builder.js +242 -35
- package/dist/builders/slice-rule-builder.js.map +1 -1
- package/dist/builders/type-rule-builder.d.ts +95 -24
- package/dist/builders/type-rule-builder.d.ts.map +1 -1
- package/dist/builders/type-rule-builder.js +105 -29
- package/dist/builders/type-rule-builder.js.map +1 -1
- package/dist/{helpers → builders}/within.d.ts +2 -2
- package/dist/builders/within.d.ts.map +1 -0
- package/dist/{helpers → builders}/within.js +1 -1
- package/dist/builders/within.js.map +1 -0
- package/dist/cli/commands/baseline.d.ts +3 -2
- package/dist/cli/commands/baseline.d.ts.map +1 -1
- package/dist/cli/commands/baseline.js +68 -6
- package/dist/cli/commands/baseline.js.map +1 -1
- package/dist/cli/commands/check.d.ts +7 -2
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +241 -45
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +224 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +2 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +19 -10
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/init.d.ts +9 -3
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +162 -137
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/import-rule-module.d.ts +29 -0
- package/dist/cli/import-rule-module.d.ts.map +1 -0
- package/dist/cli/import-rule-module.js +60 -0
- package/dist/cli/import-rule-module.js.map +1 -0
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +98 -33
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/load-rules.d.ts +6 -11
- package/dist/cli/load-rules.d.ts.map +1 -1
- package/dist/cli/load-rules.js +21 -29
- package/dist/cli/load-rules.js.map +1 -1
- package/dist/cli/resolve-config.d.ts.map +1 -1
- package/dist/cli/resolve-config.js +24 -24
- package/dist/cli/resolve-config.js.map +1 -1
- package/dist/cli/rule-file-findings.d.ts +178 -0
- package/dist/cli/rule-file-findings.d.ts.map +1 -0
- package/dist/cli/rule-file-findings.js +293 -0
- package/dist/cli/rule-file-findings.js.map +1 -0
- package/dist/cli/watch.d.ts +20 -7
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +39 -14
- package/dist/cli/watch.js.map +1 -1
- package/dist/conditions/body-analysis-function.d.ts.map +1 -1
- package/dist/conditions/body-analysis-function.js +16 -7
- 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 +14 -9
- package/dist/conditions/body-analysis-module.js.map +1 -1
- package/dist/conditions/body-analysis.d.ts.map +1 -1
- package/dist/conditions/body-analysis.js +16 -7
- package/dist/conditions/body-analysis.js.map +1 -1
- package/dist/conditions/call.d.ts.map +1 -1
- package/dist/conditions/call.js +38 -17
- package/dist/conditions/call.js.map +1 -1
- package/dist/conditions/catch-analysis.d.ts +2 -1
- package/dist/conditions/catch-analysis.d.ts.map +1 -1
- package/dist/conditions/catch-analysis.js.map +1 -1
- package/dist/conditions/cross-layer.d.ts +2 -10
- package/dist/conditions/cross-layer.d.ts.map +1 -1
- package/dist/conditions/cross-layer.js +227 -23
- package/dist/conditions/cross-layer.js.map +1 -1
- package/dist/conditions/dependency.d.ts +35 -6
- package/dist/conditions/dependency.d.ts.map +1 -1
- package/dist/conditions/dependency.js +299 -45
- package/dist/conditions/dependency.js.map +1 -1
- package/dist/conditions/exports.d.ts.map +1 -1
- package/dist/conditions/exports.js +10 -0
- package/dist/conditions/exports.js.map +1 -1
- package/dist/conditions/function.d.ts.map +1 -1
- package/dist/conditions/function.js +19 -5
- package/dist/conditions/function.js.map +1 -1
- package/dist/conditions/helpers.d.ts +2 -1
- package/dist/conditions/helpers.d.ts.map +1 -1
- package/dist/conditions/helpers.js +4 -1
- package/dist/conditions/helpers.js.map +1 -1
- package/dist/conditions/jsx.d.ts.map +1 -1
- package/dist/conditions/jsx.js +7 -2
- package/dist/conditions/jsx.js.map +1 -1
- package/dist/conditions/match-identity.d.ts +43 -0
- package/dist/conditions/match-identity.d.ts.map +1 -0
- package/dist/conditions/match-identity.js +43 -0
- package/dist/conditions/match-identity.js.map +1 -0
- package/dist/conditions/members.d.ts.map +1 -1
- package/dist/conditions/members.js +17 -4
- package/dist/conditions/members.js.map +1 -1
- package/dist/conditions/reverse-dependency.d.ts +18 -5
- package/dist/conditions/reverse-dependency.d.ts.map +1 -1
- package/dist/conditions/reverse-dependency.js +109 -92
- package/dist/conditions/reverse-dependency.js.map +1 -1
- package/dist/conditions/slice.d.ts +86 -2
- package/dist/conditions/slice.d.ts.map +1 -1
- package/dist/conditions/slice.js +234 -53
- package/dist/conditions/slice.js.map +1 -1
- package/dist/conditions/structural.d.ts.map +1 -1
- package/dist/conditions/structural.js +16 -4
- package/dist/conditions/structural.js.map +1 -1
- package/dist/core/check-all.d.ts +19 -0
- package/dist/core/check-all.d.ts.map +1 -0
- package/dist/core/check-all.js +96 -0
- package/dist/core/check-all.js.map +1 -0
- package/dist/core/combinators.d.ts +48 -0
- package/dist/core/combinators.d.ts.map +1 -0
- package/dist/core/combinators.js +56 -0
- package/dist/core/combinators.js.map +1 -0
- package/dist/core/descendant-cache.d.ts +36 -0
- package/dist/core/descendant-cache.d.ts.map +1 -0
- package/dist/core/descendant-cache.js +119 -0
- package/dist/core/descendant-cache.js.map +1 -0
- package/dist/core/diagnose.d.ts +234 -0
- package/dist/core/diagnose.d.ts.map +1 -0
- package/dist/core/diagnose.js +382 -0
- package/dist/core/diagnose.js.map +1 -0
- package/dist/core/disk-set.d.ts +48 -0
- package/dist/core/disk-set.d.ts.map +1 -0
- package/dist/core/disk-set.js +218 -0
- package/dist/core/disk-set.js.map +1 -0
- package/dist/core/element-cache.d.ts +75 -0
- package/dist/core/element-cache.d.ts.map +1 -0
- package/dist/core/element-cache.js +32 -0
- package/dist/core/element-cache.js.map +1 -0
- package/dist/core/empty-project-advice.d.ts +75 -0
- package/dist/core/empty-project-advice.d.ts.map +1 -0
- package/dist/core/empty-project-advice.js +61 -0
- package/dist/core/empty-project-advice.js.map +1 -0
- package/dist/core/exclusion-comments.d.ts +54 -0
- package/dist/core/exclusion-comments.d.ts.map +1 -0
- package/dist/core/exclusion-comments.js +310 -0
- package/dist/core/exclusion-comments.js.map +1 -0
- package/dist/core/execute-rule.d.ts +150 -0
- package/dist/core/execute-rule.d.ts.map +1 -0
- package/dist/core/execute-rule.js +580 -0
- package/dist/core/execute-rule.js.map +1 -0
- package/dist/core/glob-diagnosis.d.ts +78 -0
- package/dist/core/glob-diagnosis.d.ts.map +1 -0
- package/dist/core/glob-diagnosis.js +134 -0
- package/dist/core/glob-diagnosis.js.map +1 -0
- package/dist/core/glob-evaluator.d.ts +48 -0
- package/dist/core/glob-evaluator.d.ts.map +1 -0
- package/dist/core/glob-evaluator.js +89 -0
- package/dist/core/glob-evaluator.js.map +1 -0
- package/dist/core/import-candidates.d.ts +60 -0
- package/dist/core/import-candidates.d.ts.map +1 -0
- package/dist/core/import-candidates.js +93 -0
- package/dist/core/import-candidates.js.map +1 -0
- package/dist/core/import-options.d.ts +55 -2
- package/dist/core/import-options.d.ts.map +1 -1
- package/dist/core/import-options.js +64 -0
- package/dist/core/import-options.js.map +1 -1
- package/dist/core/line-index.d.ts +3 -0
- package/dist/core/line-index.d.ts.map +1 -0
- package/dist/core/line-index.js +229 -0
- package/dist/core/line-index.js.map +1 -0
- package/dist/core/metric-violation.d.ts +86 -0
- package/dist/core/metric-violation.d.ts.map +1 -0
- package/dist/core/metric-violation.js +132 -0
- package/dist/core/metric-violation.js.map +1 -0
- package/dist/core/module-edges.d.ts +361 -0
- package/dist/core/module-edges.d.ts.map +1 -0
- package/dist/core/module-edges.js +592 -0
- package/dist/core/module-edges.js.map +1 -0
- package/dist/core/object-literal-functions.d.ts +42 -0
- package/dist/core/object-literal-functions.d.ts.map +1 -0
- package/dist/core/object-literal-functions.js +75 -0
- package/dist/core/object-literal-functions.js.map +1 -0
- package/dist/core/orphan-exclusions.d.ts +44 -0
- package/dist/core/orphan-exclusions.d.ts.map +1 -0
- package/dist/core/orphan-exclusions.js +214 -0
- package/dist/core/orphan-exclusions.js.map +1 -0
- package/dist/core/pair-condition.d.ts +32 -3
- package/dist/core/pair-condition.d.ts.map +1 -1
- package/dist/core/path-universe.d.ts +54 -0
- package/dist/core/path-universe.d.ts.map +1 -0
- package/dist/core/path-universe.js +65 -0
- package/dist/core/path-universe.js.map +1 -0
- package/dist/core/per-root-compiler-options.d.ts +20 -0
- package/dist/core/per-root-compiler-options.d.ts.map +1 -0
- package/dist/core/per-root-compiler-options.js +57 -0
- package/dist/core/per-root-compiler-options.js.map +1 -0
- package/dist/core/project-relative.d.ts +98 -0
- package/dist/core/project-relative.d.ts.map +1 -0
- package/dist/core/project-relative.js +185 -0
- package/dist/core/project-relative.js.map +1 -0
- package/dist/core/project.d.ts +7 -1
- package/dist/core/project.d.ts.map +1 -1
- package/dist/core/project.js +24 -0
- package/dist/core/project.js.map +1 -1
- package/dist/core/rule-builder.d.ts +282 -0
- package/dist/core/rule-builder.d.ts.map +1 -0
- package/dist/core/rule-builder.js +445 -0
- package/dist/core/rule-builder.js.map +1 -0
- package/dist/core/rule-declaration.d.ts +32 -0
- package/dist/core/rule-declaration.d.ts.map +1 -0
- package/dist/core/rule-declaration.js +126 -0
- package/dist/core/rule-declaration.js.map +1 -0
- package/dist/core/terminal-builder.d.ts +625 -0
- package/dist/core/terminal-builder.d.ts.map +1 -0
- package/dist/core/terminal-builder.js +787 -0
- package/dist/core/terminal-builder.js.map +1 -0
- package/dist/core/terminal-execution.d.ts +23 -0
- package/dist/core/terminal-execution.d.ts.map +1 -0
- package/dist/core/terminal-execution.js +71 -0
- package/dist/core/terminal-execution.js.map +1 -0
- package/dist/core/vacuity-diagnosis.d.ts +103 -0
- package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
- package/dist/core/vacuity-diagnosis.js +415 -0
- package/dist/core/vacuity-diagnosis.js.map +1 -0
- package/dist/core/violation.d.ts +16 -11
- package/dist/core/violation.d.ts.map +1 -1
- package/dist/core/violation.js +33 -13
- package/dist/core/violation.js.map +1 -1
- package/dist/graphql/index.js +1 -1
- package/dist/graphql/index.js.map +1 -1
- package/dist/graphql/resolver-rule-builder.d.ts +98 -23
- package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
- package/dist/graphql/resolver-rule-builder.js +151 -21
- package/dist/graphql/resolver-rule-builder.js.map +1 -1
- package/dist/graphql/schema-loader.d.ts +21 -0
- package/dist/graphql/schema-loader.d.ts.map +1 -1
- package/dist/graphql/schema-loader.js +81 -12
- package/dist/graphql/schema-loader.js.map +1 -1
- package/dist/graphql/schema-rule-builder.d.ts +57 -20
- package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
- package/dist/graphql/schema-rule-builder.js +101 -25
- package/dist/graphql/schema-rule-builder.js.map +1 -1
- package/dist/helpers/baseline-diagnostics.d.ts +45 -0
- package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
- package/dist/helpers/baseline-diagnostics.js +168 -0
- package/dist/helpers/baseline-diagnostics.js.map +1 -0
- package/dist/helpers/baseline-generator.d.ts +19 -0
- package/dist/helpers/baseline-generator.d.ts.map +1 -0
- package/dist/helpers/baseline-generator.js +18 -0
- package/dist/helpers/baseline-generator.js.map +1 -0
- package/dist/helpers/baseline.d.ts +336 -0
- package/dist/helpers/baseline.d.ts.map +1 -0
- package/dist/helpers/baseline.js +664 -0
- package/dist/helpers/baseline.js.map +1 -0
- package/dist/helpers/body-traversal.d.ts +27 -2
- package/dist/helpers/body-traversal.d.ts.map +1 -1
- package/dist/helpers/body-traversal.js +122 -16
- package/dist/helpers/body-traversal.js.map +1 -1
- package/dist/helpers/callback-extractor.d.ts.map +1 -1
- package/dist/helpers/callback-extractor.js +48 -47
- package/dist/helpers/callback-extractor.js.map +1 -1
- package/dist/helpers/complexity.d.ts +13 -5
- package/dist/helpers/complexity.d.ts.map +1 -1
- package/dist/helpers/complexity.js +15 -6
- package/dist/helpers/complexity.js.map +1 -1
- package/dist/helpers/diff-aware.d.ts +44 -0
- package/dist/helpers/diff-aware.d.ts.map +1 -0
- package/dist/helpers/diff-aware.js +84 -0
- package/dist/helpers/diff-aware.js.map +1 -0
- package/dist/helpers/matchers.d.ts +68 -7
- package/dist/helpers/matchers.d.ts.map +1 -1
- package/dist/helpers/matchers.js +114 -20
- package/dist/helpers/matchers.js.map +1 -1
- package/dist/helpers/slice-graph.d.ts +100 -8
- package/dist/helpers/slice-graph.d.ts.map +1 -1
- package/dist/helpers/slice-graph.js +126 -34
- package/dist/helpers/slice-graph.js.map +1 -1
- package/dist/helpers/tarjan.d.ts +0 -14
- package/dist/helpers/tarjan.d.ts.map +1 -1
- package/dist/helpers/tarjan.js +29 -16
- package/dist/helpers/tarjan.js.map +1 -1
- package/dist/index.d.ts +56 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -13
- package/dist/index.js.map +1 -1
- package/dist/models/arch-call.d.ts +3 -2
- package/dist/models/arch-call.d.ts.map +1 -1
- package/dist/models/arch-call.js.map +1 -1
- package/dist/models/arch-function.d.ts +28 -6
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +106 -3
- package/dist/models/arch-function.js.map +1 -1
- package/dist/models/arch-jsx-element.js +2 -2
- package/dist/models/arch-jsx-element.js.map +1 -1
- package/dist/models/slice.d.ts +33 -9
- package/dist/models/slice.d.ts.map +1 -1
- package/dist/models/slice.js +129 -19
- package/dist/models/slice.js.map +1 -1
- package/dist/predicates/call.d.ts.map +1 -1
- package/dist/predicates/call.js +5 -0
- package/dist/predicates/call.js.map +1 -1
- package/dist/predicates/identity.d.ts +21 -0
- package/dist/predicates/identity.d.ts.map +1 -1
- package/dist/predicates/identity.js +75 -3
- package/dist/predicates/identity.js.map +1 -1
- package/dist/predicates/index.d.ts +1 -1
- package/dist/predicates/index.d.ts.map +1 -1
- package/dist/predicates/index.js +1 -1
- package/dist/predicates/index.js.map +1 -1
- package/dist/predicates/metrics.d.ts +4 -2
- package/dist/predicates/metrics.d.ts.map +1 -1
- package/dist/predicates/metrics.js +4 -2
- package/dist/predicates/metrics.js.map +1 -1
- package/dist/predicates/module.d.ts +4 -12
- package/dist/predicates/module.d.ts.map +1 -1
- package/dist/predicates/module.js +57 -37
- package/dist/predicates/module.js.map +1 -1
- package/dist/presets/agent-guardrails.d.ts +22 -15
- package/dist/presets/agent-guardrails.d.ts.map +1 -1
- package/dist/presets/agent-guardrails.js +124 -19
- package/dist/presets/agent-guardrails.js.map +1 -1
- package/dist/presets/boundaries.d.ts +45 -2
- package/dist/presets/boundaries.d.ts.map +1 -1
- package/dist/presets/boundaries.js +132 -23
- package/dist/presets/boundaries.js.map +1 -1
- package/dist/presets/data-layer.d.ts +22 -2
- package/dist/presets/data-layer.d.ts.map +1 -1
- package/dist/presets/data-layer.js +58 -16
- package/dist/presets/data-layer.js.map +1 -1
- package/dist/presets/index.d.ts +7 -5
- package/dist/presets/index.d.ts.map +1 -1
- package/dist/presets/index.js +9 -3
- package/dist/presets/index.js.map +1 -1
- package/dist/presets/layered.d.ts +46 -2
- package/dist/presets/layered.d.ts.map +1 -1
- package/dist/presets/layered.js +66 -29
- package/dist/presets/layered.js.map +1 -1
- package/dist/presets/recommended.d.ts +80 -9
- package/dist/presets/recommended.d.ts.map +1 -1
- package/dist/presets/recommended.js +25 -23
- package/dist/presets/recommended.js.map +1 -1
- package/dist/presets/shared.d.ts +270 -2
- package/dist/presets/shared.d.ts.map +1 -1
- package/dist/presets/shared.js +338 -4
- package/dist/presets/shared.js.map +1 -1
- package/dist/rules/code-quality.d.ts.map +1 -1
- package/dist/rules/code-quality.js +15 -6
- package/dist/rules/code-quality.js.map +1 -1
- package/dist/rules/hygiene.d.ts +1 -1
- package/dist/rules/hygiene.js +1 -1
- package/dist/rules/metrics-function.d.ts +2 -1
- package/dist/rules/metrics-function.d.ts.map +1 -1
- package/dist/rules/metrics-function.js +33 -6
- package/dist/rules/metrics-function.js.map +1 -1
- package/dist/rules/metrics.d.ts +2 -1
- package/dist/rules/metrics.d.ts.map +1 -1
- package/dist/rules/metrics.js +39 -9
- package/dist/rules/metrics.js.map +1 -1
- package/dist/smells/duplicate-bodies.d.ts +58 -5
- package/dist/smells/duplicate-bodies.d.ts.map +1 -1
- package/dist/smells/duplicate-bodies.js +137 -56
- package/dist/smells/duplicate-bodies.js.map +1 -1
- package/dist/smells/fingerprint.d.ts +8 -1
- package/dist/smells/fingerprint.d.ts.map +1 -1
- package/dist/smells/fingerprint.js +21 -3
- package/dist/smells/fingerprint.js.map +1 -1
- package/dist/smells/inconsistent-siblings.d.ts +128 -7
- package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
- package/dist/smells/inconsistent-siblings.js +288 -86
- package/dist/smells/inconsistent-siblings.js.map +1 -1
- package/dist/smells/sibling-files.d.ts +47 -0
- package/dist/smells/sibling-files.d.ts.map +1 -0
- package/dist/smells/sibling-files.js +104 -0
- package/dist/smells/sibling-files.js.map +1 -0
- package/dist/smells/similar-pairs.d.ts +27 -0
- package/dist/smells/similar-pairs.d.ts.map +1 -0
- package/dist/smells/similar-pairs.js +52 -0
- package/dist/smells/similar-pairs.js.map +1 -0
- package/dist/smells/smell-builder.d.ts +57 -12
- package/dist/smells/smell-builder.d.ts.map +1 -1
- package/dist/smells/smell-builder.js +111 -14
- package/dist/smells/smell-builder.js.map +1 -1
- package/dist/tsconfig/index.d.ts +19 -0
- package/dist/tsconfig/index.d.ts.map +1 -0
- package/dist/tsconfig/index.js +20 -0
- package/dist/tsconfig/index.js.map +1 -0
- package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
- package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
- package/dist/tsconfig/tsconfig-builder.js +64 -16
- package/dist/tsconfig/tsconfig-builder.js.map +1 -1
- package/package.json +3 -2
- package/dist/core/module-dependencies.d.ts +0 -28
- package/dist/core/module-dependencies.d.ts.map +0 -1
- package/dist/core/module-dependencies.js +0 -35
- package/dist/core/module-dependencies.js.map +0 -1
- package/dist/helpers/within.d.ts.map +0 -1
- package/dist/helpers/within.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @nielspeter/eess-ts
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@nielspeter/eess-ts)
|
|
4
|
-
[](https://github.com/nielspeter/eess/actions/workflows/ci.yml)
|
|
5
5
|
[](https://opensource.org/licenses/MIT)
|
|
6
6
|
[](https://nodejs.org/)
|
|
7
7
|
|
|
@@ -9,9 +9,9 @@
|
|
|
9
9
|
|
|
10
10
|
Inspired by Java's [ArchUnit](https://www.archunit.org/). Powered by [ts-morph](https://ts-morph.com/).
|
|
11
11
|
|
|
12
|
-
> **The TypeScript dialect of the [eess](
|
|
12
|
+
> **The TypeScript dialect of the [eess](https://github.com/nielspeter/eess/blob/main/README.md) family.** Formerly published as `@nielspeter/ts-archunit` — that name still works as an alias, so existing installs are unaffected. New projects should prefer `@nielspeter/eess-ts`. Migrating? See [Migrating from ts-archunit](https://github.com/nielspeter/eess/blob/main/docs/migrating-from-ts-archunit.md).
|
|
13
13
|
|
|
14
|
-
[Documentation](https://
|
|
14
|
+
[Documentation](https://github.com/nielspeter/eess) · [Getting Started](https://github.com/nielspeter/eess/blob/main/docs/getting-started.md) · [What Can It Check?](https://github.com/nielspeter/eess/blob/main/docs/what-to-check.md)
|
|
15
15
|
|
|
16
16
|
## Quickstart — zero to a red gate
|
|
17
17
|
|
|
@@ -38,7 +38,7 @@ rm src/probe.ts # green again — and now you trust the green
|
|
|
38
38
|
|
|
39
39
|
Then wire the rules into your agent's loop — CI annotations, a Claude Code
|
|
40
40
|
hook, and an AGENTS.md block regenerated from the actual rules:
|
|
41
|
-
[agent integration recipes](
|
|
41
|
+
[agent integration recipes](https://github.com/nielspeter/eess/blob/main/docs/agent-integration.md).
|
|
42
42
|
|
|
43
43
|
## The Problem
|
|
44
44
|
|
|
@@ -56,7 +56,7 @@ Code review catches some of this. But at scale — with multiple agents generati
|
|
|
56
56
|
|
|
57
57
|
## The Solution
|
|
58
58
|
|
|
59
|
-
ts
|
|
59
|
+
eess-ts turns your architecture decisions into executable tests. They run in CI. Violations show up inline on the PR with clear messages explaining **what's wrong, why it matters, and how to fix it** — exactly the context an agent needs to self-correct.
|
|
60
60
|
|
|
61
61
|
```typescript
|
|
62
62
|
classes(p)
|
|
@@ -96,7 +96,7 @@ Every other tool (dependency-cruiser, eslint-plugin-boundaries, ts-arch) only ch
|
|
|
96
96
|
|
|
97
97
|
AI agents don't violate architecture by importing wrong files. They violate it by **writing the wrong code in the right place** — inlining logic instead of delegating, using raw APIs instead of abstractions, skipping validation, throwing generic errors.
|
|
98
98
|
|
|
99
|
-
ts
|
|
99
|
+
eess-ts checks what happens **inside** your functions:
|
|
100
100
|
|
|
101
101
|
```typescript
|
|
102
102
|
// "Services must delegate to repositories, not hardcode data"
|
|
@@ -119,22 +119,22 @@ functions(p)
|
|
|
119
119
|
.check()
|
|
120
120
|
```
|
|
121
121
|
|
|
122
|
-
| Capability | ts
|
|
123
|
-
| -------------------------------------------------- |
|
|
124
|
-
| Import path rules | Yes
|
|
125
|
-
| **Body analysis** (what's called inside functions) | Yes
|
|
126
|
-
| **Type checking** (string vs typed union) | Yes
|
|
127
|
-
| JSX element rules | Yes
|
|
128
|
-
| Cross-layer rules | Yes
|
|
129
|
-
| Cycle detection | Yes
|
|
130
|
-
| Code smell detection (duplicate bodies) | Yes
|
|
131
|
-
| Code metrics (cyclomatic, LOC) | Yes
|
|
132
|
-
| Pattern matching (reusable rule templates) | Yes
|
|
133
|
-
| Baseline (gradual adoption) | Yes
|
|
134
|
-
| Diff-aware / PR-only checking | Yes
|
|
135
|
-
| Watch mode | Yes
|
|
136
|
-
| Inline exclusion comments | Yes
|
|
137
|
-
| GitHub PR annotations | Yes
|
|
122
|
+
| Capability | eess-ts | [dependency-cruiser](https://github.com/sverweij/dependency-cruiser) | [eslint-plugin-boundaries](https://github.com/javierbrea/eslint-plugin-boundaries) | [Biome](https://biomejs.dev) | [ts-arch](https://github.com/ts-arch/ts-arch) |
|
|
123
|
+
| -------------------------------------------------- | ------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------- | --------------------------------------------- |
|
|
124
|
+
| Import path rules | Yes | Yes | Yes | Yes | Yes |
|
|
125
|
+
| **Body analysis** (what's called inside functions) | Yes | No | No | No | No |
|
|
126
|
+
| **Type checking** (string vs typed union) | Yes | No | No | No | No |
|
|
127
|
+
| JSX element rules | Yes | No | No | No | No |
|
|
128
|
+
| Cross-layer rules | Yes | No | No | No | Partial |
|
|
129
|
+
| Cycle detection | Yes | Yes | No | No | Yes |
|
|
130
|
+
| Code smell detection (duplicate bodies) | Yes | No | No | No | No |
|
|
131
|
+
| Code metrics (cyclomatic, LOC) | Yes | No | No | No | No |
|
|
132
|
+
| Pattern matching (reusable rule templates) | Yes | No | No | No | No |
|
|
133
|
+
| Baseline (gradual adoption) | Yes | No | No | No | No |
|
|
134
|
+
| Diff-aware / PR-only checking | Yes | No | No | No | No |
|
|
135
|
+
| Watch mode | Yes | No | No | Yes | No |
|
|
136
|
+
| Inline exclusion comments | Yes | No | Via ESLint | Yes | No |
|
|
137
|
+
| GitHub PR annotations | Yes | No | Via ESLint | No | No |
|
|
138
138
|
|
|
139
139
|
## Quick Start with Presets
|
|
140
140
|
|
|
@@ -175,7 +175,33 @@ layeredArchitecture(p, {
|
|
|
175
175
|
- `recommended(p)` — a thin, universal safety floor (no `eval`, no Function constructor, no silent catches, no empty bodies) that fires ~never on healthy code.
|
|
176
176
|
- `agentGuardrails(p, { src })` — the mistakes AI coding agents make most: generic errors, stub comments, empty bodies, copy-paste, and banned inline calls. Each rule carries `imperative` metadata for `explain --format agent`.
|
|
177
177
|
|
|
178
|
-
Every preset
|
|
178
|
+
Every preset **runs its rules and throws** on any error-severity violation by
|
|
179
|
+
default — the caller owns reporting (ADR-008). What you pass depends on where you
|
|
180
|
+
are calling it:
|
|
181
|
+
|
|
182
|
+
| where | pass | why |
|
|
183
|
+
| --------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------- |
|
|
184
|
+
| **a rule file** (`arch.rules.ts`) | `{ report: 'builders' }` | returns the builders **without running them**, so the CLI runs them, reports once, and applies `--baseline` / `--changed` |
|
|
185
|
+
| a test, or your own runner | `{ report: 'return' }` | runs the rules and hands you `ArchViolation[]` to assert on |
|
|
186
|
+
| anywhere, advisory | `{ report: 'warn' }` | reports without failing |
|
|
187
|
+
| | `{ format: 'json' }` | machine-readable output |
|
|
188
|
+
|
|
189
|
+
**`'return'` in a rule file does not work.** A rule file spreads its presets into
|
|
190
|
+
`export default [...]`, so `'return'` splats the preset's _result_ — an
|
|
191
|
+
`ArchViolation[]` — into the rules array. What happens next depends on your
|
|
192
|
+
codebase, and **both outcomes are bad**:
|
|
193
|
+
|
|
194
|
+
| your codebase | what you get |
|
|
195
|
+
| -------------- | -------------------------------------------------------------------------------------------- |
|
|
196
|
+
| has violations | the loader rejects it: `default export entry [0] is not a rule builder (got object)`, exit 1 |
|
|
197
|
+
| **is clean** | the array is **empty**, so the file exports `[]` and every rule silently disappears |
|
|
198
|
+
|
|
199
|
+
`tsc --noEmit` catches neither — a spread of the wrong array type is not a type
|
|
200
|
+
error. `check` now refuses a rule file that contributed no rules, so the clean case
|
|
201
|
+
fails too rather than printing a green tick; before that it exited 0. Use
|
|
202
|
+
`'builders'` in a rule file. `eess-ts init` scaffolds it.
|
|
203
|
+
|
|
204
|
+
Per-rule severity is tunable via `overrides`.
|
|
179
205
|
|
|
180
206
|
### Scaffold a starter setup
|
|
181
207
|
|
|
@@ -339,14 +365,14 @@ smells
|
|
|
339
365
|
|
|
340
366
|
### More Features
|
|
341
367
|
|
|
342
|
-
- **[Call matching](https://
|
|
343
|
-
- **[Scoped rules](https://
|
|
344
|
-
- **[Pattern templates](https://
|
|
345
|
-
- **[GraphQL rules](https://
|
|
346
|
-
- **[Cross-layer validation](https://
|
|
347
|
-
- **[Custom predicates and conditions](https://
|
|
348
|
-
- **[Metrics](https://
|
|
349
|
-
- **[CLI](https://
|
|
368
|
+
- **[Call matching](https://github.com/nielspeter/eess/blob/main/docs/calls.md)** — framework-agnostic route/handler inspection (Express, Fastify, Hono)
|
|
369
|
+
- **[Scoped rules](https://github.com/nielspeter/eess/blob/main/docs/body-analysis.md)** — `within(routes).functions()` for callback-level rules
|
|
370
|
+
- **[Pattern templates](https://github.com/nielspeter/eess/blob/main/docs/patterns.md)** — enforce return type shapes (`{ items, total, skip, limit }`)
|
|
371
|
+
- **[GraphQL rules](https://github.com/nielspeter/eess/blob/main/docs/graphql.md)** — schema and resolver conventions
|
|
372
|
+
- **[Cross-layer validation](https://github.com/nielspeter/eess/blob/main/docs/cross-layer.md)** — route/schema/SDK consistency
|
|
373
|
+
- **[Custom predicates and conditions](https://github.com/nielspeter/eess/blob/main/docs/custom-rules.md)** — `definePredicate()`, `defineCondition()`, `and`/`or`/`not` combinators
|
|
374
|
+
- **[Metrics](https://github.com/nielspeter/eess/blob/main/docs/metrics.md)** — cyclomatic complexity, lines of code, method count limits
|
|
375
|
+
- **[CLI](https://github.com/nielspeter/eess/blob/main/docs/cli.md)** — `check`, `baseline`, `explain`, `--watch` mode
|
|
350
376
|
|
|
351
377
|
## Entry Points
|
|
352
378
|
|
|
@@ -363,7 +389,7 @@ smells
|
|
|
363
389
|
|
|
364
390
|
## Compared to Other Tools
|
|
365
391
|
|
|
366
|
-
| Capability | ts
|
|
392
|
+
| Capability | eess-ts | [dependency-cruiser](https://github.com/sverweij/dependency-cruiser) | [ArchUnitTS](https://github.com/LukasNiessen/ArchUnitTS) | [Biome](https://biomejs.dev) | [ts-arch](https://github.com/ts-arch/ts-arch) |
|
|
367
393
|
| ------------------------------------------------- | --------------- | -------------------------------------------------------------------- | -------------------------------------------------------- | ---------------------------- | --------------------------------------------- |
|
|
368
394
|
| Import path rules | Yes | Yes | Yes | Yes (`noRestrictedImports`) | Yes |
|
|
369
395
|
| **Body analysis** (calls, access, constructors) | Yes | No | No | No | No |
|
|
@@ -390,17 +416,17 @@ smells
|
|
|
390
416
|
| License checking | No | Yes | No | No | No |
|
|
391
417
|
| Nx monorepo support | No | No | Yes | No | No |
|
|
392
418
|
|
|
393
|
-
**Use ts
|
|
419
|
+
**Use eess-ts** when you need to enforce what happens _inside_ functions — call patterns, error types, missing delegation, stub comments — and when AI agents are generating code that needs architectural guardrails. This is the only tool that catches "service calls parseInt instead of extractCount()", flags duplicate function bodies as smells, and can restrict checking to only the files changed in a PR.
|
|
394
420
|
|
|
395
421
|
**Use dependency-cruiser** when you only need import direction rules and want fast graph visualization, license compliance checking, or stability metrics. It's faster (no ts-morph project load) and has mature HTML/dot reporting.
|
|
396
422
|
|
|
397
423
|
**Use ArchUnitTS** when you need OO metrics (LCOM cohesion, coupling factor, distance from main sequence), PlantUML diagram validation, or Nx monorepo project-graph awareness.
|
|
398
424
|
|
|
399
|
-
**Use Biome** when you want a fast Rust-based lint + format toolchain and only need lint-level import restrictions (`noRestrictedImports`) — not architecture rules over class hierarchies, function bodies, or slice cycles. Pair it with ts
|
|
425
|
+
**Use Biome** when you want a fast Rust-based lint + format toolchain and only need lint-level import restrictions (`noRestrictedImports`) — not architecture rules over class hierarchies, function bodies, or slice cycles. Pair it with eess-ts if you want both.
|
|
400
426
|
|
|
401
427
|
**Use ts-arch** when you want the classic ArchUnit-style fluent API scoped to file/folder dependency rules and layered slices, and don't need body analysis, type-checker rules, or CI integrations like baselines, diff-aware runs, or GitHub annotations.
|
|
402
428
|
|
|
403
|
-
**Use ts
|
|
429
|
+
**Use eess-ts + dependency-cruiser together** if you want both body-level enforcement and dependency graph visualization.
|
|
404
430
|
|
|
405
431
|
## Install
|
|
406
432
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ArchProject } from '../core/project.js';
|
|
2
|
-
import { RuleBuilder } from '
|
|
2
|
+
import { RuleBuilder } from '../core/rule-builder.js';
|
|
3
3
|
import type { ConditionContext } from '@nielspeter/eess';
|
|
4
4
|
import type { ExpressionMatcher } from '../helpers/matchers.js';
|
|
5
5
|
import type { ArchCall } from '../models/arch-call.js';
|
|
@@ -36,53 +36,98 @@ import type { ArchCall } from '../models/arch-call.js';
|
|
|
36
36
|
* .check()
|
|
37
37
|
* ```
|
|
38
38
|
*/
|
|
39
|
-
export declare class CallRuleBuilder extends RuleBuilder<ArchCall
|
|
39
|
+
export declare class CallRuleBuilder extends RuleBuilder<ArchCall> {
|
|
40
40
|
/**
|
|
41
41
|
* Argument index to fold into the violation element/message. Set by
|
|
42
42
|
* `.identifiedByArg(index)`. Threaded into `ConditionContext.identifyByArgument`
|
|
43
43
|
* so the eight `archCall.getName()` sites in `src/conditions/call.ts`
|
|
44
44
|
* can build identity-keyed violation strings.
|
|
45
45
|
*
|
|
46
|
-
* Survives
|
|
47
|
-
*
|
|
46
|
+
* Survives a copy via `shallowClone` in `TerminalBuilder.copy` (a primitive
|
|
47
|
+
* field, so no `copy()` override is needed). See plan 0057.
|
|
48
48
|
*/
|
|
49
49
|
protected _identifyByArgument?: number;
|
|
50
50
|
protected getElements(): ArchCall[];
|
|
51
51
|
protected buildConditionContext(): ConditionContext;
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
54
|
-
*
|
|
53
|
+
* Narrows the selection to call expressions that have a name matching `pattern`.
|
|
54
|
+
*
|
|
55
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
56
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
57
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
58
|
+
* rule pass having asserted nothing.
|
|
55
59
|
*/
|
|
56
60
|
haveNameMatching(pattern: RegExp | string): this;
|
|
57
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* Narrows the selection to call expressions that have a name starting with `prefix`.
|
|
63
|
+
*
|
|
64
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
65
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
66
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
67
|
+
* rule pass having asserted nothing.
|
|
68
|
+
*/
|
|
58
69
|
haveNameStartingWith(prefix: string): this;
|
|
59
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* Narrows the selection to call expressions that have a name ending with `suffix`.
|
|
72
|
+
*
|
|
73
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
74
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
75
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
76
|
+
* rule pass having asserted nothing.
|
|
77
|
+
*/
|
|
60
78
|
haveNameEndingWith(suffix: string): this;
|
|
61
|
-
/**
|
|
79
|
+
/**
|
|
80
|
+
* Narrows the selection to call expressions that reside in a file matching `glob`.
|
|
81
|
+
*
|
|
82
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
83
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
84
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
85
|
+
* rule pass having asserted nothing.
|
|
86
|
+
*/
|
|
62
87
|
resideInFile(glob: string): this;
|
|
63
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Narrows the selection to call expressions that reside in a folder matching `glob`.
|
|
90
|
+
*
|
|
91
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
92
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
93
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
94
|
+
* rule pass having asserted nothing.
|
|
95
|
+
*/
|
|
64
96
|
resideInFolder(glob: string): this;
|
|
65
97
|
/**
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* use
|
|
98
|
+
* Narrows the selection to call expressions that are called on the object `name`.
|
|
99
|
+
*
|
|
100
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
101
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
102
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
103
|
+
* rule pass having asserted nothing.
|
|
69
104
|
*/
|
|
70
105
|
onObject(name: string): this;
|
|
71
106
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
107
|
+
* Narrows the selection to call expressions that call a method matching `nameOrRegex`.
|
|
108
|
+
*
|
|
109
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
110
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
111
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
112
|
+
* rule pass having asserted nothing.
|
|
74
113
|
*/
|
|
75
114
|
withMethod(nameOrRegex: string | RegExp): this;
|
|
76
115
|
/**
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
116
|
+
* Narrows the selection to call expressions that have argument `index` matching `pattern`.
|
|
117
|
+
*
|
|
118
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
119
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
120
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
121
|
+
* rule pass having asserted nothing.
|
|
80
122
|
*/
|
|
81
123
|
withArgMatching(index: number, pattern: string | RegExp): this;
|
|
82
124
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* never
|
|
125
|
+
* Narrows the selection to call expressions that have string argument `index` matching `glob`.
|
|
126
|
+
*
|
|
127
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
128
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
129
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
130
|
+
* rule pass having asserted nothing.
|
|
86
131
|
*/
|
|
87
132
|
withStringArg(index: number, glob: string): this;
|
|
88
133
|
/**
|
|
@@ -166,11 +211,6 @@ export declare class CallRuleBuilder extends RuleBuilder<ArchCall, ArchProject>
|
|
|
166
211
|
* Use `notHaveCallbackContaining` when you only want to search callback bodies.
|
|
167
212
|
*/
|
|
168
213
|
notHaveArgumentContaining(matcher: ExpressionMatcher): this;
|
|
169
|
-
/**
|
|
170
|
-
* Get the underlying ArchProject.
|
|
171
|
-
* Used by within() to create scoped builders.
|
|
172
|
-
*/
|
|
173
|
-
getProject(): ArchProject;
|
|
174
214
|
/**
|
|
175
215
|
* Get the ArchCall elements that match the current predicate chain.
|
|
176
216
|
* Used by within() to extract callbacks from matched calls.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/call-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"call-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/call-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AA6BtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,qBAAa,eAAgB,SAAQ,WAAW,CAAC,QAAQ,CAAC;IACxD;;;;;;;;OAQG;IACH,SAAS,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAEtC,SAAS,CAAC,WAAW,IAAI,QAAQ,EAAE;cAMhB,qBAAqB,IAAI,gBAAgB;IAS5D;;;;;;;OAOG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIhD;;;;;;;OAOG;IACH,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIxC;;;;;;;OAOG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC;;;;;;;OAOG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASlC;;;;;;;OAOG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5B;;;;;;;OAOG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI9C;;;;;;;OAOG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI9D;;;;;;;OAOG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6CG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQpC;;OAEG;IACH,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIxD;;OAEG;IACH,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAI3D;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,wBAAwB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAIlD;;OAEG;IACH,2BAA2B,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAIrD;;;;;OAKG;IACH,sBAAsB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAIxD;;;;;OAKG;IACH,yBAAyB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAM3D;;;OAGG;IACH,eAAe,IAAI,QAAQ,EAAE;CAG9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,eAAe,CAErD"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import { RuleBuilder } from '
|
|
1
|
+
import { RuleBuilder } from '../core/rule-builder.js';
|
|
2
2
|
import { collectCalls } from '../models/arch-call.js';
|
|
3
|
+
import { createElementCache, SOLE_POPULATION } from '../core/element-cache.js';
|
|
4
|
+
/** One collection per project, shared by every rule built from it (plan 0075). */
|
|
5
|
+
const cache = createElementCache();
|
|
3
6
|
import { haveNameMatching as identityHaveNameMatching, haveNameStartingWith as identityHaveNameStartingWith, haveNameEndingWith as identityHaveNameEndingWith, resideInFile as identityResideInFile, resideInFolder as identityResideInFolder, } from '../predicates/identity.js';
|
|
4
7
|
import { onObject as callOnObject, withMethod as callWithMethod, withArgMatching as callWithArgMatching, withStringArg as callWithStringArg, } from '../predicates/call.js';
|
|
5
8
|
import { haveCallbackContaining as conditionHaveCallbackContaining, notHaveCallbackContaining as conditionNotHaveCallbackContaining, notExist as callNotExist, haveArgumentWithProperty as conditionHaveArgumentWithProperty, notHaveArgumentWithProperty as conditionNotHaveArgumentWithProperty, haveArgumentContaining as conditionHaveArgumentContaining, notHaveArgumentContaining as conditionNotHaveArgumentContaining, } from '../conditions/call.js';
|
|
@@ -43,12 +46,12 @@ export class CallRuleBuilder extends RuleBuilder {
|
|
|
43
46
|
* so the eight `archCall.getName()` sites in `src/conditions/call.ts`
|
|
44
47
|
* can build identity-keyed violation strings.
|
|
45
48
|
*
|
|
46
|
-
* Survives
|
|
47
|
-
*
|
|
49
|
+
* Survives a copy via `shallowClone` in `TerminalBuilder.copy` (a primitive
|
|
50
|
+
* field, so no `copy()` override is needed). See plan 0057.
|
|
48
51
|
*/
|
|
49
52
|
_identifyByArgument;
|
|
50
53
|
getElements() {
|
|
51
|
-
return this.project.getSourceFiles().flatMap(collectCalls);
|
|
54
|
+
return cache.get(this.project, SOLE_POPULATION, () => this.project.getSourceFiles().flatMap(collectCalls));
|
|
52
55
|
}
|
|
53
56
|
buildConditionContext() {
|
|
54
57
|
return {
|
|
@@ -58,58 +61,103 @@ export class CallRuleBuilder extends RuleBuilder {
|
|
|
58
61
|
}
|
|
59
62
|
// --- Identity predicates (subset: no areExported/areNotExported) ---
|
|
60
63
|
/**
|
|
61
|
-
*
|
|
62
|
-
*
|
|
64
|
+
* Narrows the selection to call expressions that have a name matching `pattern`.
|
|
65
|
+
*
|
|
66
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
67
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
68
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
69
|
+
* rule pass having asserted nothing.
|
|
63
70
|
*/
|
|
64
71
|
haveNameMatching(pattern) {
|
|
65
72
|
return this.addPredicate(identityHaveNameMatching(pattern));
|
|
66
73
|
}
|
|
67
|
-
/**
|
|
74
|
+
/**
|
|
75
|
+
* Narrows the selection to call expressions that have a name starting with `prefix`.
|
|
76
|
+
*
|
|
77
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
78
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
79
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
80
|
+
* rule pass having asserted nothing.
|
|
81
|
+
*/
|
|
68
82
|
haveNameStartingWith(prefix) {
|
|
69
83
|
return this.addPredicate(identityHaveNameStartingWith(prefix));
|
|
70
84
|
}
|
|
71
|
-
/**
|
|
85
|
+
/**
|
|
86
|
+
* Narrows the selection to call expressions that have a name ending with `suffix`.
|
|
87
|
+
*
|
|
88
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
89
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
90
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
91
|
+
* rule pass having asserted nothing.
|
|
92
|
+
*/
|
|
72
93
|
haveNameEndingWith(suffix) {
|
|
73
94
|
return this.addPredicate(identityHaveNameEndingWith(suffix));
|
|
74
95
|
}
|
|
75
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Narrows the selection to call expressions that reside in a file matching `glob`.
|
|
98
|
+
*
|
|
99
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
100
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
101
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
102
|
+
* rule pass having asserted nothing.
|
|
103
|
+
*/
|
|
76
104
|
resideInFile(glob) {
|
|
77
105
|
return this.addPredicate(identityResideInFile(glob));
|
|
78
106
|
}
|
|
79
|
-
/**
|
|
107
|
+
/**
|
|
108
|
+
* Narrows the selection to call expressions that reside in a folder matching `glob`.
|
|
109
|
+
*
|
|
110
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
111
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
112
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
113
|
+
* rule pass having asserted nothing.
|
|
114
|
+
*/
|
|
80
115
|
resideInFolder(glob) {
|
|
81
116
|
return this.addPredicate(identityResideInFolder(glob));
|
|
82
117
|
}
|
|
83
118
|
// Note: areExported() and areNotExported() are intentionally omitted.
|
|
84
|
-
// Call expressions cannot
|
|
119
|
+
// Call expressions cannot are exported. See spec section 5.1.
|
|
85
120
|
// --- Call-specific predicates ---
|
|
86
121
|
/**
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
* use
|
|
122
|
+
* Narrows the selection to call expressions that are called on the object `name`.
|
|
123
|
+
*
|
|
124
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
125
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
126
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
127
|
+
* rule pass having asserted nothing.
|
|
90
128
|
*/
|
|
91
129
|
onObject(name) {
|
|
92
130
|
return this.addPredicate(callOnObject(name));
|
|
93
131
|
}
|
|
94
132
|
/**
|
|
95
|
-
*
|
|
96
|
-
*
|
|
133
|
+
* Narrows the selection to call expressions that call a method matching `nameOrRegex`.
|
|
134
|
+
*
|
|
135
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
136
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
137
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
138
|
+
* rule pass having asserted nothing.
|
|
97
139
|
*/
|
|
98
140
|
withMethod(nameOrRegex) {
|
|
99
141
|
return this.addPredicate(callWithMethod(nameOrRegex));
|
|
100
142
|
}
|
|
101
143
|
/**
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
144
|
+
* Narrows the selection to call expressions that have argument `index` matching `pattern`.
|
|
145
|
+
*
|
|
146
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
147
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
148
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
149
|
+
* rule pass having asserted nothing.
|
|
105
150
|
*/
|
|
106
151
|
withArgMatching(index, pattern) {
|
|
107
152
|
return this.addPredicate(callWithArgMatching(index, pattern));
|
|
108
153
|
}
|
|
109
154
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* never
|
|
155
|
+
* Narrows the selection to call expressions that have string argument `index` matching `glob`.
|
|
156
|
+
*
|
|
157
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
158
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
159
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
160
|
+
* rule pass having asserted nothing.
|
|
113
161
|
*/
|
|
114
162
|
withStringArg(index, glob) {
|
|
115
163
|
return this.addPredicate(callWithStringArg(index, glob));
|
|
@@ -162,8 +210,9 @@ export class CallRuleBuilder extends RuleBuilder {
|
|
|
162
210
|
* @param index — zero-based argument index to fold into the identity.
|
|
163
211
|
*/
|
|
164
212
|
identifiedByArg(index) {
|
|
165
|
-
|
|
166
|
-
|
|
213
|
+
const next = this.copy();
|
|
214
|
+
next._identifyByArgument = index;
|
|
215
|
+
return next;
|
|
167
216
|
}
|
|
168
217
|
// --- Condition methods ---
|
|
169
218
|
/**
|
|
@@ -215,13 +264,6 @@ export class CallRuleBuilder extends RuleBuilder {
|
|
|
215
264
|
return this.addCondition(conditionNotHaveArgumentContaining(matcher));
|
|
216
265
|
}
|
|
217
266
|
// --- Public accessors (used by plan 0015 within()) ---
|
|
218
|
-
/**
|
|
219
|
-
* Get the underlying ArchProject.
|
|
220
|
-
* Used by within() to create scoped builders.
|
|
221
|
-
*/
|
|
222
|
-
getProject() {
|
|
223
|
-
return this.project;
|
|
224
|
-
}
|
|
225
267
|
/**
|
|
226
268
|
* Get the ArchCall elements that match the current predicate chain.
|
|
227
269
|
* Used by within() to extract callbacks from matched calls.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-rule-builder.js","sourceRoot":"","sources":["../../src/builders/call-rule-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"call-rule-builder.js","sourceRoot":"","sources":["../../src/builders/call-rule-builder.ts"],"names":[],"mappings":"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"}
|