@nielspeter/eess-ts 0.2.1 → 0.5.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 +75 -32
- 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 +141 -55
- 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 +385 -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 +182 -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 +177 -39
- 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 +16 -19
- 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 +243 -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 +109 -42
- 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 +8 -3
- package/dist/cli/commands/baseline.d.ts.map +1 -1
- package/dist/cli/commands/baseline.js +111 -7
- 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 +385 -47
- 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 +47 -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 +101 -43
- 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 +25 -32
- package/dist/cli/load-rules.js.map +1 -1
- package/dist/cli/resolve-config.d.ts +0 -8
- package/dist/cli/resolve-config.d.ts.map +1 -1
- package/dist/cli/resolve-config.js +25 -55
- 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 +351 -0
- package/dist/cli/rule-file-findings.js.map +1 -0
- package/dist/cli/watch.d.ts +17 -34
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +14 -129
- 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 +41 -19
- 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 +41 -37
- 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 +20 -6
- 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 +155 -93
- 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 +150 -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 +49 -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 +117 -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 +390 -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 +19 -0
- package/dist/core/exclusion-comments.d.ts.map +1 -0
- package/dist/core/exclusion-comments.js +7 -0
- package/dist/core/exclusion-comments.js.map +1 -0
- package/dist/core/execute-rule.d.ts +158 -0
- package/dist/core/execute-rule.d.ts.map +1 -0
- package/dist/core/execute-rule.js +666 -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/invalidate-on-modify.d.ts +20 -0
- package/dist/core/invalidate-on-modify.d.ts.map +1 -0
- package/dist/core/invalidate-on-modify.js +26 -0
- package/dist/core/invalidate-on-modify.js.map +1 -0
- package/dist/core/line-index.d.ts +3 -0
- package/dist/core/line-index.d.ts.map +1 -0
- package/dist/core/line-index.js +227 -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 +593 -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 +224 -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 +22 -0
- package/dist/core/path-universe.d.ts.map +1 -0
- package/dist/core/path-universe.js +45 -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 +29 -4
- package/dist/core/project.js.map +1 -1
- package/dist/core/rule-builder.d.ts +303 -0
- package/dist/core/rule-builder.d.ts.map +1 -0
- package/dist/core/rule-builder.js +463 -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 +88 -0
- package/dist/core/rule-declaration.js.map +1 -0
- package/dist/core/terminal-builder.d.ts +629 -0
- package/dist/core/terminal-builder.d.ts.map +1 -0
- package/dist/core/terminal-builder.js +807 -0
- package/dist/core/terminal-builder.js.map +1 -0
- package/dist/core/terminal-execution.d.ts +39 -0
- package/dist/core/terminal-execution.d.ts.map +1 -0
- package/dist/core/terminal-execution.js +103 -0
- package/dist/core/terminal-execution.js.map +1 -0
- package/dist/core/ts-comment-mask.d.ts +2 -0
- package/dist/core/ts-comment-mask.d.ts.map +1 -0
- package/dist/core/ts-comment-mask.js +102 -0
- package/dist/core/ts-comment-mask.js.map +1 -0
- package/dist/core/vacuity-diagnosis.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/graphql-rule-builder.d.ts +95 -0
- package/dist/graphql/graphql-rule-builder.d.ts.map +1 -0
- package/dist/graphql/graphql-rule-builder.js +127 -0
- package/dist/graphql/graphql-rule-builder.js.map +1 -0
- package/dist/graphql/index.d.ts +1 -0
- package/dist/graphql/index.d.ts.map +1 -1
- package/dist/graphql/index.js +2 -1
- package/dist/graphql/index.js.map +1 -1
- package/dist/graphql/resolver-rule-builder.d.ts +44 -23
- package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
- package/dist/graphql/resolver-rule-builder.js +80 -72
- 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 +82 -12
- package/dist/graphql/schema-loader.js.map +1 -1
- package/dist/graphql/schema-predicates.d.ts.map +1 -1
- package/dist/graphql/schema-predicates.js +17 -12
- package/dist/graphql/schema-predicates.js.map +1 -1
- package/dist/graphql/schema-rule-builder.d.ts +15 -24
- package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
- package/dist/graphql/schema-rule-builder.js +39 -77
- 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 +28 -0
- package/dist/helpers/baseline-generator.d.ts.map +1 -0
- package/dist/helpers/baseline-generator.js +27 -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 +135 -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 +53 -84
- 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 +16 -0
- package/dist/helpers/diff-aware.d.ts.map +1 -0
- package/dist/helpers/diff-aware.js +16 -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 +164 -86
- 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 +55 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +67 -15
- 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 +54 -8
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +145 -8
- package/dist/models/arch-function.js.map +1 -1
- package/dist/models/arch-jsx-element.d.ts.map +1 -1
- package/dist/models/arch-jsx-element.js +18 -19
- 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/jsx.d.ts.map +1 -1
- package/dist/predicates/jsx.js +2 -1
- package/dist/predicates/jsx.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 +49 -16
- package/dist/presets/agent-guardrails.d.ts.map +1 -1
- package/dist/presets/agent-guardrails.js +308 -19
- package/dist/presets/agent-guardrails.js.map +1 -1
- package/dist/presets/boundaries.d.ts +46 -3
- 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 +23 -3
- 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 +10 -5
- package/dist/presets/index.d.ts.map +1 -1
- package/dist/presets/index.js +19 -3
- package/dist/presets/index.js.map +1 -1
- package/dist/presets/layered.d.ts +47 -3
- 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 +81 -10
- 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 +267 -2
- package/dist/presets/shared.d.ts.map +1 -1
- package/dist/presets/shared.js +367 -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 +63 -39
- 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 +80 -47
- package/dist/rules/metrics.js.map +1 -1
- package/dist/smells/clusters.d.ts +78 -0
- package/dist/smells/clusters.d.ts.map +1 -0
- package/dist/smells/clusters.js +124 -0
- package/dist/smells/clusters.js.map +1 -0
- package/dist/smells/duplicate-bodies.d.ts +92 -5
- package/dist/smells/duplicate-bodies.d.ts.map +1 -1
- package/dist/smells/duplicate-bodies.js +203 -73
- package/dist/smells/duplicate-bodies.js.map +1 -1
- package/dist/smells/duplicate-report.d.ts +90 -0
- package/dist/smells/duplicate-report.d.ts.map +1 -0
- package/dist/smells/duplicate-report.js +344 -0
- package/dist/smells/duplicate-report.js.map +1 -0
- package/dist/smells/fingerprint.d.ts +20 -1
- package/dist/smells/fingerprint.d.ts.map +1 -1
- package/dist/smells/fingerprint.js +27 -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 +28 -0
- package/dist/smells/similar-pairs.d.ts.map +1 -0
- package/dist/smells/similar-pairs.js +134 -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 +112 -14
- package/dist/smells/smell-builder.js.map +1 -1
- package/dist/smells/variation.d.ts +47 -0
- package/dist/smells/variation.d.ts.map +1 -0
- package/dist/smells/variation.js +90 -0
- package/dist/smells/variation.js.map +1 -0
- package/dist/tsconfig/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 +65 -16
- package/dist/tsconfig/tsconfig-builder.js.map +1 -1
- package/package.json +4 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/presets/shared.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/presets/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-quality.d.ts","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAuBzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,IAAI,SAAS,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"code-quality.d.ts","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AAInE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAuBzE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,cAAc,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAoC5D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,CAAC,gBAAgB,CAAC,CA8B5F"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SyntaxKind } from 'ts-morph';
|
|
1
|
+
import { Node, SyntaxKind } from 'ts-morph';
|
|
2
2
|
import { createViolation } from '../core/violation.js';
|
|
3
3
|
/**
|
|
4
4
|
* All public methods must have JSDoc comments.
|
|
@@ -55,15 +55,24 @@ export function noPublicFields() {
|
|
|
55
55
|
const violations = [];
|
|
56
56
|
for (const cls of elements) {
|
|
57
57
|
for (const prop of cls.getProperties()) {
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
|
|
58
|
+
// An ECMAScript `#private` field FIRST, because `getScope()` cannot see
|
|
59
|
+
// it: `#name` carries no TypeScript accessibility modifier, so the scope
|
|
60
|
+
// reads `'public'` and the field was reported. That is a false positive
|
|
61
|
+
// whose remedy — "use private + getter/setter" — is strictly backwards:
|
|
62
|
+
// `#` is private at RUNTIME, while `private` is erased at compile time.
|
|
63
|
+
// Measured on `ArchRuleError.#violations` (plan 0165).
|
|
64
|
+
if (Node.isPrivateIdentifier(prop.getNameNode()))
|
|
61
65
|
continue;
|
|
62
66
|
const scope = prop.getScope();
|
|
63
67
|
if (scope !== undefined && String(scope) !== 'public')
|
|
64
68
|
continue;
|
|
65
|
-
//
|
|
66
|
-
|
|
69
|
+
// `readonly` is not mutable — which is what this rule is named for.
|
|
70
|
+
// It previously accepted only `static readonly`, so a public
|
|
71
|
+
// `readonly` INSTANCE field was reported with the remedy "use private
|
|
72
|
+
// + getter/setter": advice that removes nothing (the field already
|
|
73
|
+
// cannot be reassigned) and that the rule's own description does not
|
|
74
|
+
// support. Measured on `DiffFilter.baseBranch` (plan 0165).
|
|
75
|
+
if (prop.isReadonly())
|
|
67
76
|
continue;
|
|
68
77
|
violations.push(createViolation(prop, `${cls.getName() ?? '<anonymous>'}.${prop.getName()} is a public field — use private + getter/setter`, context));
|
|
69
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-quality.js","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"code-quality.js","sourceRoot":"","sources":["../../src/rules/code-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAI3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,CAAC,QAA4B,EAAE,OAAyB;YAC9D,MAAM,UAAU,GAAoB,EAAE,CAAA;YACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;oBACtC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAA;oBAC/B,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAA;oBAClE,IAAI,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChD,UAAU,CAAC,IAAI,CACb,eAAe,CACb,MAAM,EACN,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,aAAa,IAAI,MAAM,CAAC,OAAO,EAAE,6BAA6B,EAClF,OAAO,CACR,CACF,CAAA;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,WAAW,EAAE,+BAA+B;QAC5C,QAAQ,CAAC,QAA4B,EAAE,OAAyB;YAC9D,MAAM,UAAU,GAAoB,EAAE,CAAA;YACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC;oBACvC,wEAAwE;oBACxE,yEAAyE;oBACzE,wEAAwE;oBACxE,wEAAwE;oBACxE,wEAAwE;oBACxE,uDAAuD;oBACvD,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;wBAAE,SAAQ;oBAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;oBAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ;wBAAE,SAAQ;oBAC/D,oEAAoE;oBACpE,6DAA6D;oBAC7D,sEAAsE;oBACtE,mEAAmE;oBACnE,qEAAqE;oBACrE,4DAA4D;oBAC5D,IAAI,IAAI,CAAC,UAAU,EAAE;wBAAE,SAAQ;oBAE/B,UAAU,CAAC,IAAI,CACb,eAAe,CACb,IAAI,EACJ,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,kDAAkD,EACrG,OAAO,CACR,CACF,CAAA;gBACH,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgC;IAC7D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAA;IAEtE,OAAO;QACL,WAAW,EAAE,wCAAwC;QACrD,QAAQ,CAAC,QAA4B,EAAE,OAAyB;YAC9D,MAAM,UAAU,GAAoB,EAAE,CAAA;YACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAA;oBAC7B,IAAI,CAAC,IAAI;wBAAE,SAAQ;oBAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;oBACrE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;wBAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;wBACnC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC3B,UAAU,CAAC,IAAI,CACb,eAAe,CACb,GAAG,EACH,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,aAAa,IAAI,MAAM,CAAC,OAAO,EAAE,0BAA0B,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAC5H,OAAO,CACR,CACF,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,UAAU,CAAA;QACnB,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/rules/hygiene.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export declare function noDeadModules(): Condition<SourceFile>;
|
|
|
27
27
|
*/
|
|
28
28
|
export declare function noUnusedExports(): Condition<SourceFile>;
|
|
29
29
|
/**
|
|
30
|
-
* No stub or deferred-work comments in function
|
|
30
|
+
* No stub or deferred-work comments in a function's body OR its own leading docstring.
|
|
31
31
|
* Catches common markers (see STUB_PATTERNS) and phrases like
|
|
32
32
|
* "not implemented" or "coming soon".
|
|
33
33
|
*
|
package/dist/rules/hygiene.js
CHANGED
|
@@ -31,7 +31,7 @@ export function noUnusedExports() {
|
|
|
31
31
|
return haveNoUnusedExports();
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
|
-
* No stub or deferred-work comments in function
|
|
34
|
+
* No stub or deferred-work comments in a function's body OR its own leading docstring.
|
|
35
35
|
* Catches common markers (see STUB_PATTERNS) and phrases like
|
|
36
36
|
* "not implemented" or "coming soon".
|
|
37
37
|
*
|
|
@@ -17,7 +17,8 @@ import type { Condition } from '@nielspeter/eess';
|
|
|
17
17
|
*/
|
|
18
18
|
export declare function maxFunctionComplexity(threshold: number): Condition<ArchFunction>;
|
|
19
19
|
/**
|
|
20
|
-
* Function must not exceed the given number of lines
|
|
20
|
+
* Function must not exceed the given number of CODE lines — comments and blank
|
|
21
|
+
* lines are not counted (bug 0170).
|
|
21
22
|
*
|
|
22
23
|
* @example
|
|
23
24
|
* ```ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-function.d.ts","sourceRoot":"","sources":["../../src/rules/metrics-function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"metrics-function.d.ts","sourceRoot":"","sources":["../../src/rules/metrics-function.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AA6DnE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAQhF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAU3E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,CAQhF"}
|
|
@@ -1,5 +1,46 @@
|
|
|
1
|
-
import { createViolation } from '../core/violation.js';
|
|
2
1
|
import { cyclomaticComplexity, linesOfCode } from '../helpers/complexity.js';
|
|
2
|
+
import { metricViolation } from '../core/metric-violation.js';
|
|
3
|
+
/**
|
|
4
|
+
* A ceiling on one measurement of every function.
|
|
5
|
+
*
|
|
6
|
+
* `maxFunctionComplexity`, `maxFunctionLines` and `maxFunctionParameters` were
|
|
7
|
+
* the same walk three times over — `no-copy-paste` reported them at 96% — and
|
|
8
|
+
* `rules/metrics.ts` carries the class-member twin of this helper.
|
|
9
|
+
*
|
|
10
|
+
* `name` is derived ONCE and used for the message and the identity alike. Two
|
|
11
|
+
* expressions that agree in every branch but one is how bug 0068 happened:
|
|
12
|
+
* `fn.getName() ?? '<anonymous>'` beside a bare `fn.getName()` disagree for an
|
|
13
|
+
* anonymous function, which would have reproduced that defect inside its own
|
|
14
|
+
* fix. One derivation in one place is what makes them unable to disagree.
|
|
15
|
+
*
|
|
16
|
+
* `unit` is threaded rather than derived from `metric`: `lines` kept its name
|
|
17
|
+
* when `linesOfCode` stopped counting comments, and the baseline refuses to
|
|
18
|
+
* compare across a unit change precisely so that silent loosening cannot
|
|
19
|
+
* happen again (bug 0171).
|
|
20
|
+
*/
|
|
21
|
+
function functionCeiling(threshold, spec) {
|
|
22
|
+
return {
|
|
23
|
+
description: spec.description,
|
|
24
|
+
evaluate(elements, context) {
|
|
25
|
+
const violations = [];
|
|
26
|
+
for (const fn of elements) {
|
|
27
|
+
const value = spec.measure(fn);
|
|
28
|
+
if (value <= threshold)
|
|
29
|
+
continue;
|
|
30
|
+
const name = fn.getName() ?? '<anonymous>';
|
|
31
|
+
violations.push(metricViolation(fn.getNode(), {
|
|
32
|
+
metric: spec.metric,
|
|
33
|
+
...(spec.unit === undefined ? {} : { unit: spec.unit }),
|
|
34
|
+
// Long-hand, not `measured,` — see the note in `rules/metrics.ts`.
|
|
35
|
+
measured: value,
|
|
36
|
+
message: spec.message(name, value),
|
|
37
|
+
qualifiedName: name,
|
|
38
|
+
}, context));
|
|
39
|
+
}
|
|
40
|
+
return violations;
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
3
44
|
/**
|
|
4
45
|
* Function must not exceed the given cyclomatic complexity.
|
|
5
46
|
*
|
|
@@ -16,22 +57,16 @@ import { cyclomaticComplexity, linesOfCode } from '../helpers/complexity.js';
|
|
|
16
57
|
* ```
|
|
17
58
|
*/
|
|
18
59
|
export function maxFunctionComplexity(threshold) {
|
|
19
|
-
return {
|
|
60
|
+
return functionCeiling(threshold, {
|
|
20
61
|
description: `have cyclomatic complexity <= ${String(threshold)}`,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if (cc > threshold) {
|
|
26
|
-
violations.push(createViolation(fn.getNode(), `${fn.getName() ?? '<anonymous>'} has cyclomatic complexity ${String(cc)} (max: ${String(threshold)})`, context));
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return violations;
|
|
30
|
-
},
|
|
31
|
-
};
|
|
62
|
+
metric: 'complexity',
|
|
63
|
+
measure: (fn) => cyclomaticComplexity(fn.getBody()),
|
|
64
|
+
message: (name, cc) => `${name} has cyclomatic complexity ${String(cc)} (max: ${String(threshold)})`,
|
|
65
|
+
});
|
|
32
66
|
}
|
|
33
67
|
/**
|
|
34
|
-
* Function must not exceed the given number of lines
|
|
68
|
+
* Function must not exceed the given number of CODE lines — comments and blank
|
|
69
|
+
* lines are not counted (bug 0170).
|
|
35
70
|
*
|
|
36
71
|
* @example
|
|
37
72
|
* ```ts
|
|
@@ -41,19 +76,15 @@ export function maxFunctionComplexity(threshold) {
|
|
|
41
76
|
* ```
|
|
42
77
|
*/
|
|
43
78
|
export function maxFunctionLines(threshold) {
|
|
44
|
-
return {
|
|
45
|
-
description: `have no more than ${String(threshold)} lines`,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
return violations;
|
|
55
|
-
},
|
|
56
|
-
};
|
|
79
|
+
return functionCeiling(threshold, {
|
|
80
|
+
description: `have no more than ${String(threshold)} code lines`,
|
|
81
|
+
metric: 'lines',
|
|
82
|
+
// `code-lines` since bug 0170 — the metric kept its name when it stopped
|
|
83
|
+
// counting comments, and the baseline must not compare across that.
|
|
84
|
+
unit: 'code-lines',
|
|
85
|
+
measure: (fn) => linesOfCode(fn.getNode()),
|
|
86
|
+
message: (name, loc) => `${name} has ${String(loc)} code lines (max: ${String(threshold)})`,
|
|
87
|
+
});
|
|
57
88
|
}
|
|
58
89
|
/**
|
|
59
90
|
* Function must not have more than the given number of parameters.
|
|
@@ -70,18 +101,11 @@ export function maxFunctionLines(threshold) {
|
|
|
70
101
|
* ```
|
|
71
102
|
*/
|
|
72
103
|
export function maxFunctionParameters(threshold) {
|
|
73
|
-
return {
|
|
104
|
+
return functionCeiling(threshold, {
|
|
74
105
|
description: `have no more than ${String(threshold)} parameters`,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (params > threshold) {
|
|
80
|
-
violations.push(createViolation(fn.getNode(), `${fn.getName() ?? '<anonymous>'} has ${String(params)} parameters (max: ${String(threshold)}) — use an options object`, context));
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return violations;
|
|
84
|
-
},
|
|
85
|
-
};
|
|
106
|
+
metric: 'parameters',
|
|
107
|
+
measure: (fn) => fn.getParameters().length,
|
|
108
|
+
message: (name, params) => `${name} has ${String(params)} parameters (max: ${String(threshold)}) — use an options object`,
|
|
109
|
+
});
|
|
86
110
|
}
|
|
87
111
|
//# sourceMappingURL=metrics-function.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-function.js","sourceRoot":"","sources":["../../src/rules/metrics-function.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"metrics-function.js","sourceRoot":"","sources":["../../src/rules/metrics-function.ts"],"names":[],"mappings":"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"}
|
package/dist/rules/metrics.d.ts
CHANGED
|
@@ -13,7 +13,8 @@ import type { Condition } from '@nielspeter/eess';
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function maxCyclomaticComplexity(threshold: number): Condition<ClassDeclaration>;
|
|
15
15
|
/**
|
|
16
|
-
* No class may exceed the given number of lines
|
|
16
|
+
* No class may exceed the given number of CODE lines — comments and blank
|
|
17
|
+
* lines are not counted (bug 0170).
|
|
17
18
|
*
|
|
18
19
|
* @example
|
|
19
20
|
* ```ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/rules/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAKjB,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/rules/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAKjB,MAAM,UAAU,CAAA;AACjB,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,kBAAkB,CAAA;AA0FnE;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAQtF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CA2B5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAU7E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAwBzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAQ5E;AAGD,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,GACtB,MAAM,uBAAuB,CAAA"}
|
package/dist/rules/metrics.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { createViolation } from '../core/violation.js';
|
|
2
1
|
import { cyclomaticComplexity, linesOfCode } from '../helpers/complexity.js';
|
|
2
|
+
import { metricViolation } from '../core/metric-violation.js';
|
|
3
3
|
function getClassMembers(cls) {
|
|
4
4
|
return [
|
|
5
5
|
...cls.getMethods(),
|
|
@@ -17,27 +17,44 @@ function getMemberName(cls, member) {
|
|
|
17
17
|
return `${clsName}.constructor`;
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
*
|
|
21
|
-
* cyclomatic complexity.
|
|
20
|
+
* A ceiling on one measurement of every callable member of every class.
|
|
22
21
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* `maxCyclomaticComplexity`, `maxMethodLines` and `maxParameters` were the same
|
|
23
|
+
* nested walk three times over — `no-copy-paste` reported them at 98% — and the
|
|
24
|
+
* walk is the part that must not drift: a metric that visited methods but not
|
|
25
|
+
* accessors would report a clean ceiling for a class whose getter breaches it,
|
|
26
|
+
* which is a pass constructed from a partial scan (ADR-010).
|
|
26
27
|
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
28
|
+
* `unit` is threaded rather than derived from `metric`: `lines` kept its name
|
|
29
|
+
* when `linesOfCode` stopped counting comments, and the baseline refuses to
|
|
30
|
+
* compare across a unit change precisely so that silent tripling cannot happen
|
|
31
|
+
* again (bug 0171). A metric whose name already says what it counts passes
|
|
32
|
+
* nothing here.
|
|
29
33
|
*/
|
|
30
|
-
|
|
34
|
+
function memberCeiling(threshold, spec) {
|
|
31
35
|
return {
|
|
32
|
-
description:
|
|
36
|
+
description: spec.description,
|
|
33
37
|
evaluate(elements, context) {
|
|
34
38
|
const violations = [];
|
|
35
39
|
for (const cls of elements) {
|
|
36
40
|
for (const member of getClassMembers(cls)) {
|
|
37
|
-
const
|
|
38
|
-
if (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
const value = spec.measure(member);
|
|
42
|
+
if (value <= threshold)
|
|
43
|
+
continue;
|
|
44
|
+
const name = getMemberName(cls, member);
|
|
45
|
+
violations.push(metricViolation(member, {
|
|
46
|
+
metric: spec.metric,
|
|
47
|
+
...(spec.unit === undefined ? {} : { unit: spec.unit }),
|
|
48
|
+
// Written long-hand deliberately: `measured,` is a
|
|
49
|
+
// ShorthandPropertyAssignment, and the producer census in
|
|
50
|
+
// `every-metric-finding-carries-its-unit.test.ts` walks
|
|
51
|
+
// PropertyAssignment. Shorthand here made this producer
|
|
52
|
+
// invisible to it — the census now sees both kinds, and this
|
|
53
|
+
// spelling keeps the two from having to agree twice.
|
|
54
|
+
measured: value,
|
|
55
|
+
qualifiedName: name,
|
|
56
|
+
message: spec.message(name, value),
|
|
57
|
+
}, context));
|
|
41
58
|
}
|
|
42
59
|
}
|
|
43
60
|
return violations;
|
|
@@ -45,7 +62,27 @@ export function maxCyclomaticComplexity(threshold) {
|
|
|
45
62
|
};
|
|
46
63
|
}
|
|
47
64
|
/**
|
|
48
|
-
* No class may exceed the given
|
|
65
|
+
* No method/constructor/getter/setter in the class may exceed the given
|
|
66
|
+
* cyclomatic complexity.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { maxCyclomaticComplexity } from '@nielspeter/eess-ts/rules/metrics'
|
|
71
|
+
*
|
|
72
|
+
* classes(p).should().satisfy(maxCyclomaticComplexity(15)).check()
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export function maxCyclomaticComplexity(threshold) {
|
|
76
|
+
return memberCeiling(threshold, {
|
|
77
|
+
description: `have no method with cyclomatic complexity > ${String(threshold)}`,
|
|
78
|
+
metric: 'complexity',
|
|
79
|
+
measure: (member) => cyclomaticComplexity(member.getBody()),
|
|
80
|
+
message: (name, cc) => `${name} has cyclomatic complexity ${String(cc)} (max: ${String(threshold)}) — split into smaller methods`,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* No class may exceed the given number of CODE lines — comments and blank
|
|
85
|
+
* lines are not counted (bug 0170).
|
|
49
86
|
*
|
|
50
87
|
* @example
|
|
51
88
|
* ```ts
|
|
@@ -56,13 +93,20 @@ export function maxCyclomaticComplexity(threshold) {
|
|
|
56
93
|
*/
|
|
57
94
|
export function maxClassLines(threshold) {
|
|
58
95
|
return {
|
|
59
|
-
description: `have no more than ${String(threshold)} lines`,
|
|
96
|
+
description: `have no more than ${String(threshold)} code lines`,
|
|
60
97
|
evaluate(elements, context) {
|
|
61
98
|
const violations = [];
|
|
62
99
|
for (const cls of elements) {
|
|
63
100
|
const loc = linesOfCode(cls);
|
|
64
101
|
if (loc > threshold) {
|
|
65
|
-
violations.push(
|
|
102
|
+
violations.push(metricViolation(cls, {
|
|
103
|
+
metric: 'lines',
|
|
104
|
+
// `code-lines` since bug 0170 — the metric kept its name when it stopped
|
|
105
|
+
// counting comments, and the baseline must not compare across that.
|
|
106
|
+
unit: 'code-lines',
|
|
107
|
+
measured: loc,
|
|
108
|
+
message: `${cls.getName() ?? '<anonymous>'} has ${String(loc)} code lines (max: ${String(threshold)}) — consider splitting into focused classes`,
|
|
109
|
+
}, context));
|
|
66
110
|
}
|
|
67
111
|
}
|
|
68
112
|
return violations;
|
|
@@ -80,21 +124,15 @@ export function maxClassLines(threshold) {
|
|
|
80
124
|
* ```
|
|
81
125
|
*/
|
|
82
126
|
export function maxMethodLines(threshold) {
|
|
83
|
-
return {
|
|
84
|
-
description: `have no method longer than ${String(threshold)} lines`,
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return violations;
|
|
96
|
-
},
|
|
97
|
-
};
|
|
127
|
+
return memberCeiling(threshold, {
|
|
128
|
+
description: `have no method longer than ${String(threshold)} code lines`,
|
|
129
|
+
metric: 'lines',
|
|
130
|
+
// `code-lines` since bug 0170 — the metric kept its name when it stopped
|
|
131
|
+
// counting comments, and the baseline must not compare across that.
|
|
132
|
+
unit: 'code-lines',
|
|
133
|
+
measure: (member) => linesOfCode(member),
|
|
134
|
+
message: (name, loc) => `${name} has ${String(loc)} code lines (max: ${String(threshold)})`,
|
|
135
|
+
});
|
|
98
136
|
}
|
|
99
137
|
/**
|
|
100
138
|
* No class may have more than the given number of methods.
|
|
@@ -116,7 +154,11 @@ export function maxMethods(threshold) {
|
|
|
116
154
|
for (const cls of elements) {
|
|
117
155
|
const count = cls.getMethods().length;
|
|
118
156
|
if (count > threshold) {
|
|
119
|
-
violations.push(
|
|
157
|
+
violations.push(metricViolation(cls, {
|
|
158
|
+
metric: 'methods',
|
|
159
|
+
measured: count,
|
|
160
|
+
message: `${cls.getName() ?? '<anonymous>'} has ${String(count)} methods (max: ${String(threshold)}) — consider splitting into focused classes`,
|
|
161
|
+
}, context));
|
|
120
162
|
}
|
|
121
163
|
}
|
|
122
164
|
return violations;
|
|
@@ -136,21 +178,12 @@ export function maxMethods(threshold) {
|
|
|
136
178
|
* ```
|
|
137
179
|
*/
|
|
138
180
|
export function maxParameters(threshold) {
|
|
139
|
-
return {
|
|
181
|
+
return memberCeiling(threshold, {
|
|
140
182
|
description: `have no method with more than ${String(threshold)} parameters`,
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
const params = member.getParameters().length;
|
|
146
|
-
if (params > threshold) {
|
|
147
|
-
violations.push(createViolation(member, `${getMemberName(cls, member)} has ${String(params)} parameters (max: ${String(threshold)}) — use an options object`, context));
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
return violations;
|
|
152
|
-
},
|
|
153
|
-
};
|
|
183
|
+
metric: 'parameters',
|
|
184
|
+
measure: (member) => member.getParameters().length,
|
|
185
|
+
message: (name, params) => `${name} has ${String(params)} parameters (max: ${String(threshold)}) — use an options object`,
|
|
186
|
+
});
|
|
154
187
|
}
|
|
155
188
|
// Re-export function-level metric conditions from the same sub-path
|
|
156
189
|
export { maxFunctionComplexity, maxFunctionLines, maxFunctionParameters, } from './metrics-function.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/rules/metrics.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/rules/metrics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { ArchFunction } from '../models/arch-function.js';
|
|
2
|
+
import type { SimilarPair } from './similar-pairs.js';
|
|
3
|
+
/**
|
|
4
|
+
* At least two bodies — a cluster is built from a pair, so it can never hold
|
|
5
|
+
* fewer.
|
|
6
|
+
*
|
|
7
|
+
* Typed rather than asserted so `clusterViolation` can be TOTAL. It used to
|
|
8
|
+
* return `ArchViolation | undefined` on a lookup that cannot fail, and the
|
|
9
|
+
* caller dropped that with `if (violation)` — a finding vanishing with no
|
|
10
|
+
* diagnostic. Architecture review of bug 0242 pointed out that the file
|
|
11
|
+
* rejected exactly that shape for `pairViolation` one screen above, with the
|
|
12
|
+
* argument that applies here word for word: unreachable today is not a defence,
|
|
13
|
+
* the type is what stops it becoming reachable.
|
|
14
|
+
*/
|
|
15
|
+
type NonEmptyMembers = readonly [ArchFunction, ArchFunction, ...ArchFunction[]];
|
|
16
|
+
/** A group of bodies that are mutually reachable through reported similarity. */
|
|
17
|
+
export interface SimilarCluster {
|
|
18
|
+
/**
|
|
19
|
+
* Members, in first-seen order — i.e. the source walk's, which is a property
|
|
20
|
+
* of the filesystem.
|
|
21
|
+
*
|
|
22
|
+
* The first is NOT what the violation anchors to; it was until bug 0242, and
|
|
23
|
+
* this comment said so for as long. `clusterViolation` picks the anchor by
|
|
24
|
+
* path then line, and sorts the members it shows, precisely so neither depends
|
|
25
|
+
* on this order.
|
|
26
|
+
*/
|
|
27
|
+
readonly members: NonEmptyMembers;
|
|
28
|
+
/** The pairs that put these members in one group. */
|
|
29
|
+
readonly pairs: readonly SimilarPair[];
|
|
30
|
+
/** Highest similarity among {@link pairs}. */
|
|
31
|
+
readonly peakSimilarity: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Group reported pairs into connected components.
|
|
35
|
+
*
|
|
36
|
+
* A pair is the wrong unit of report and it is not a close call. Measured on a
|
|
37
|
+
* ~5,600-file production monorepo: 407 clusters produced **4,770** pair
|
|
38
|
+
* findings, the eight largest clusters alone produced 49% of them, one cluster
|
|
39
|
+
* of 89 members produced 398, and the worst single function was named 29 times.
|
|
40
|
+
*
|
|
41
|
+
* Every one of those findings can be true and the output is still unreadable,
|
|
42
|
+
* because N mutually-similar bodies carry ONE observation and emit N^2/2 lines
|
|
43
|
+
* of it. The observation is "these 89 share a shape", which is also the unit a
|
|
44
|
+
* reader can act on. That is what this returns.
|
|
45
|
+
*/
|
|
46
|
+
export declare function clusterPairs(pairs: readonly SimilarPair[]): SimilarCluster[];
|
|
47
|
+
/**
|
|
48
|
+
* How likely a cluster is to be worth acting on, highest first.
|
|
49
|
+
*
|
|
50
|
+
* Not a filter and deliberately not a score change — the similarity number is
|
|
51
|
+
* left exactly as it was. This decides only what a reader sees first, because at
|
|
52
|
+
* 4,770 findings the order IS the product.
|
|
53
|
+
*
|
|
54
|
+
* The signal is the one the fingerprint throws away: a body's identifiers are
|
|
55
|
+
* ignored by design (that is what makes the score a type-2 clone score), and so
|
|
56
|
+
* is the DECLARATION's own name, which is where the evidence was. Measured over
|
|
57
|
+
* that same corpus, bucketed by how the two names relate:
|
|
58
|
+
*
|
|
59
|
+
* | bucket | share | reading |
|
|
60
|
+
* | ----------------------------- | ----- | -------------------------- |
|
|
61
|
+
* | different file, different name | 56% | convergent idiom |
|
|
62
|
+
* | same class | 20% | siblings, often extractable |
|
|
63
|
+
* | different file, SAME name | 14% | a COPY of one function |
|
|
64
|
+
* | same file, different class | 10% | co-located |
|
|
65
|
+
*
|
|
66
|
+
* Two pairs from that run, both scored 100%: `timestampPrefix` in two files (a
|
|
67
|
+
* literal copy) and two unrelated SDK wrapper methods (a shared idiom). Same
|
|
68
|
+
* number on screen, opposite verdicts, and the thing that separates them costs
|
|
69
|
+
* nothing to compute.
|
|
70
|
+
*
|
|
71
|
+
* **It is a ranking and not a filter on purpose.** Dropping the different-name
|
|
72
|
+
* bucket would discard real same-class duplication — one repository in that
|
|
73
|
+
* corpus has six `exists*` methods differing only in a table name. Dropping
|
|
74
|
+
* cross-file would have discarded the finding that led to bug 0227.
|
|
75
|
+
*/
|
|
76
|
+
export declare function clusterRank(cluster: SimilarCluster): number;
|
|
77
|
+
export {};
|
|
78
|
+
//# sourceMappingURL=clusters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clusters.d.ts","sourceRoot":"","sources":["../../src/smells/clusters.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD;;;;;;;;;;;GAWG;AACH,KAAK,eAAe,GAAG,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAAC,CAAA;AAE/E,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC7B;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IACjC,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAA;IACtC,8CAA8C;IAC9C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;CAChC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,cAAc,EAAE,CAkE5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAa3D"}
|