@nielspeter/eess-ts 0.2.0 → 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 +87 -34
- 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 -14
- 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,36 @@
|
|
|
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
|
+
|
|
16
|
+
## Quickstart — zero to a red gate
|
|
17
|
+
|
|
18
|
+
A green check you've never seen fail proves nothing. This path takes you to a
|
|
19
|
+
**real, correct violation** — timed at seconds on a warm npm cache, minutes
|
|
20
|
+
cold:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install -D @nielspeter/eess-ts # Node >= 24; your project may be ESM or CJS
|
|
24
|
+
npx eess-ts init # scaffolds arch.rules.ts — editable guardrail rules
|
|
25
|
+
npx eess-ts check # runs them against your source
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
On most existing codebases the floor fires immediately (a silent `catch {}`,
|
|
29
|
+
an empty stub body, an `eval`). If yours comes up clean — good; now **prove
|
|
30
|
+
the gate is real** the same way eess proves its own gates in CI: introduce a
|
|
31
|
+
violation, watch it go red, revert.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
echo 'export function probe(s: string): unknown { return eval(s) }' >> src/probe.ts
|
|
35
|
+
npx eess-ts check # ✗ red — preset/recommended/no-eval, with why + fix
|
|
36
|
+
rm src/probe.ts # green again — and now you trust the green
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Then wire the rules into your agent's loop — CI annotations, a Claude Code
|
|
40
|
+
hook, and an AGENTS.md block regenerated from the actual rules:
|
|
41
|
+
[agent integration recipes](https://github.com/nielspeter/eess/blob/main/docs/agent-integration.md).
|
|
15
42
|
|
|
16
43
|
## The Problem
|
|
17
44
|
|
|
@@ -29,7 +56,7 @@ Code review catches some of this. But at scale — with multiple agents generati
|
|
|
29
56
|
|
|
30
57
|
## The Solution
|
|
31
58
|
|
|
32
|
-
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.
|
|
33
60
|
|
|
34
61
|
```typescript
|
|
35
62
|
classes(p)
|
|
@@ -69,7 +96,7 @@ Every other tool (dependency-cruiser, eslint-plugin-boundaries, ts-arch) only ch
|
|
|
69
96
|
|
|
70
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.
|
|
71
98
|
|
|
72
|
-
ts
|
|
99
|
+
eess-ts checks what happens **inside** your functions:
|
|
73
100
|
|
|
74
101
|
```typescript
|
|
75
102
|
// "Services must delegate to repositories, not hardcode data"
|
|
@@ -92,22 +119,22 @@ functions(p)
|
|
|
92
119
|
.check()
|
|
93
120
|
```
|
|
94
121
|
|
|
95
|
-
| Capability | ts
|
|
96
|
-
| -------------------------------------------------- |
|
|
97
|
-
| Import path rules | Yes
|
|
98
|
-
| **Body analysis** (what's called inside functions) | Yes
|
|
99
|
-
| **Type checking** (string vs typed union) | Yes
|
|
100
|
-
| JSX element rules | Yes
|
|
101
|
-
| Cross-layer rules | Yes
|
|
102
|
-
| Cycle detection | Yes
|
|
103
|
-
| Code smell detection (duplicate bodies) | Yes
|
|
104
|
-
| Code metrics (cyclomatic, LOC) | Yes
|
|
105
|
-
| Pattern matching (reusable rule templates) | Yes
|
|
106
|
-
| Baseline (gradual adoption) | Yes
|
|
107
|
-
| Diff-aware / PR-only checking | Yes
|
|
108
|
-
| Watch mode | Yes
|
|
109
|
-
| Inline exclusion comments | Yes
|
|
110
|
-
| 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 |
|
|
111
138
|
|
|
112
139
|
## Quick Start with Presets
|
|
113
140
|
|
|
@@ -148,7 +175,33 @@ layeredArchitecture(p, {
|
|
|
148
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.
|
|
149
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`.
|
|
150
177
|
|
|
151
|
-
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`.
|
|
152
205
|
|
|
153
206
|
### Scaffold a starter setup
|
|
154
207
|
|
|
@@ -312,14 +365,14 @@ smells
|
|
|
312
365
|
|
|
313
366
|
### More Features
|
|
314
367
|
|
|
315
|
-
- **[Call matching](https://
|
|
316
|
-
- **[Scoped rules](https://
|
|
317
|
-
- **[Pattern templates](https://
|
|
318
|
-
- **[GraphQL rules](https://
|
|
319
|
-
- **[Cross-layer validation](https://
|
|
320
|
-
- **[Custom predicates and conditions](https://
|
|
321
|
-
- **[Metrics](https://
|
|
322
|
-
- **[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
|
|
323
376
|
|
|
324
377
|
## Entry Points
|
|
325
378
|
|
|
@@ -336,7 +389,7 @@ smells
|
|
|
336
389
|
|
|
337
390
|
## Compared to Other Tools
|
|
338
391
|
|
|
339
|
-
| 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) |
|
|
340
393
|
| ------------------------------------------------- | --------------- | -------------------------------------------------------------------- | -------------------------------------------------------- | ---------------------------- | --------------------------------------------- |
|
|
341
394
|
| Import path rules | Yes | Yes | Yes | Yes (`noRestrictedImports`) | Yes |
|
|
342
395
|
| **Body analysis** (calls, access, constructors) | Yes | No | No | No | No |
|
|
@@ -363,17 +416,17 @@ smells
|
|
|
363
416
|
| License checking | No | Yes | No | No | No |
|
|
364
417
|
| Nx monorepo support | No | No | Yes | No | No |
|
|
365
418
|
|
|
366
|
-
**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.
|
|
367
420
|
|
|
368
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.
|
|
369
422
|
|
|
370
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.
|
|
371
424
|
|
|
372
|
-
**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.
|
|
373
426
|
|
|
374
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.
|
|
375
428
|
|
|
376
|
-
**Use ts
|
|
429
|
+
**Use eess-ts + dependency-cruiser together** if you want both body-level enforcement and dependency graph visualization.
|
|
377
430
|
|
|
378
431
|
## Install
|
|
379
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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"}
|