@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,75 +1,410 @@
|
|
|
1
|
-
import { detectFormat
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { detectFormat } from '@nielspeter/eess';
|
|
2
|
+
import { applyFixes } from '@nielspeter/eess/internal';
|
|
3
|
+
import { withBaseline } from '../../helpers/baseline.js';
|
|
4
|
+
import { diffAware } from '../../helpers/diff-aware.js';
|
|
5
|
+
import { finishPreset, isArchRuleError } from '@nielspeter/eess';
|
|
6
|
+
import { isEmitterFinding } from '@nielspeter/eess/internal';
|
|
7
|
+
import { withCallerAggregating, violationsWritten, writeReport } from '../../core/execute-rule.js';
|
|
8
|
+
import { suppressionNotice } from '@nielspeter/eess/internal';
|
|
9
|
+
import { edgeCoverageNotice, resetEdgeCoverage, untestedRules } from '@nielspeter/eess/internal';
|
|
10
|
+
import { commentSuppressionNotice, resetCommentSuppression } from '@nielspeter/eess/internal';
|
|
11
|
+
import { writeStderr } from '@nielspeter/eess/internal';
|
|
5
12
|
import { loadRuleFiles } from '../load-rules.js';
|
|
13
|
+
import { dedupeConfigFindings } from '@nielspeter/eess/internal';
|
|
14
|
+
import { attributeToRuleFile, baselineNotApplied, failureOrViolations, ruleFileContributedNoRules, ruleFileTruncated, } from '../rule-file-findings.js';
|
|
6
15
|
/**
|
|
7
16
|
* Run architecture rules from the specified rule files.
|
|
8
17
|
*
|
|
9
|
-
*
|
|
18
|
+
* Unified pipeline (plan 0060): collect `.violations()` across every builder
|
|
19
|
+
* (each stamped with its severity), apply baseline/diff, report ONCE, and set
|
|
20
|
+
* the exit code from the error-severity count. Warns are reported but do not
|
|
21
|
+
* fail. A rule file that throws `ArchRuleError` on import (a bare self-executing
|
|
22
|
+
* preset call) is handled by a best-effort catch — error-severity only.
|
|
10
23
|
*/
|
|
11
24
|
export async function runCheck(args) {
|
|
25
|
+
// Per run: the tally is module state (the `diff-disclosure` pattern), and a
|
|
26
|
+
// second `runCheck` in one process — the CLI's watch loop, or a test — must
|
|
27
|
+
// not inherit the first run's rules.
|
|
28
|
+
resetEdgeCoverage();
|
|
29
|
+
resetCommentSuppression();
|
|
12
30
|
const started = Date.now();
|
|
13
31
|
const format = args.format === 'auto' ? detectFormat() : args.format;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
options.diff = diffAware(args.base);
|
|
20
|
-
}
|
|
21
|
-
const builders = await loadRuleFiles(args.ruleFiles, { fresh: args.fresh });
|
|
32
|
+
// `--fix` short-circuits the reporting pipeline: it renders what it changed
|
|
33
|
+
// (or would change) instead of the findings, and its exit code is the count
|
|
34
|
+
// of violations that have NO automatic fix — the real remaining failures.
|
|
35
|
+
// eess's own capability (plan 0066); upstream has no equivalent and plan
|
|
36
|
+
// 0165's engine copy dropped it. Restored in Phase 3.
|
|
22
37
|
if (args.fix === true) {
|
|
23
|
-
return runFix(
|
|
38
|
+
return await runFix(args.ruleFiles, { format }, args.apply === true, args.fresh);
|
|
24
39
|
}
|
|
25
|
-
|
|
26
|
-
|
|
40
|
+
// This command reports once, at the end, across every rule file. So a
|
|
41
|
+
// self-executing rule file's own terminals must not also write the findings that
|
|
42
|
+
// travel on their thrown error — see `withCallerAggregating`.
|
|
43
|
+
//
|
|
44
|
+
// A SCOPED extent, not a latch. It used to be a bare
|
|
45
|
+
// a bare flag-set that nothing ever reset, which was harmless
|
|
46
|
+
// while `executeCheck` was the only reader and stopped being harmless the moment
|
|
47
|
+
// presets and `checkAll()` read it too: a preset called directly after a
|
|
48
|
+
// `runCheck` in the same process went silent for the rest of that process.
|
|
49
|
+
return withCallerAggregating(async () => runCheckInner(args, format, started));
|
|
50
|
+
}
|
|
51
|
+
async function runCheckInner(args, format, started) {
|
|
52
|
+
const baseline = args.baseline !== undefined ? withBaseline(args.baseline) : undefined;
|
|
53
|
+
const diff = args.changed ? diffAware(args.base) : undefined;
|
|
54
|
+
let collected = [];
|
|
55
|
+
const total = args.ruleFiles.length;
|
|
56
|
+
// The denominator for the summary line below. Accumulated here rather than
|
|
57
|
+
// derived from `collected`, which counts violations and cannot distinguish
|
|
58
|
+
// "20 rules, none failing" from "no rules loaded" — the whole point of the line.
|
|
59
|
+
let ruleCount = 0;
|
|
60
|
+
let failedRules = 0;
|
|
61
|
+
for (const file of args.ruleFiles) {
|
|
62
|
+
// TWO catches, at the two boundaries that can fail independently. Loading is
|
|
63
|
+
// per file and can only be attributed to the file; evaluating is per builder,
|
|
64
|
+
// so a single malformed rule must not take its twenty siblings in the same
|
|
65
|
+
// file down with it — which one catch around the whole file would do
|
|
66
|
+
// (bug 0025).
|
|
67
|
+
let builders;
|
|
68
|
+
// Read before the module evaluates, so the delta below describes THIS file.
|
|
69
|
+
const writtenBefore = violationsWritten();
|
|
27
70
|
try {
|
|
28
|
-
|
|
71
|
+
builders = await loadRuleFiles([file], { fresh: args.fresh });
|
|
29
72
|
}
|
|
30
73
|
catch (error) {
|
|
31
|
-
|
|
32
|
-
|
|
74
|
+
// A user rule file that self-executes a throwing `.check()` at import
|
|
75
|
+
// surfaces its violations rather than crashing. (Presets no longer throw
|
|
76
|
+
// at import — they return builders.)
|
|
77
|
+
collected.push(...failureOrViolations(file, error, total));
|
|
78
|
+
// …and, for a thrown TERMINAL, say that the file stopped there — the part R3a
|
|
79
|
+
// specified and did not build (bug 0029). A throw during import aborts the
|
|
80
|
+
// module, so any rule declared after it never ran and its violations are not
|
|
81
|
+
// in this report, while the run is red for the thrown finding so nothing else
|
|
82
|
+
// reveals the gap.
|
|
83
|
+
//
|
|
84
|
+
// **Only for an `ArchRuleError`**, which is the signal that a terminal fired:
|
|
85
|
+
// rules before it DID run and report, rules after did not. For any other error
|
|
86
|
+
// — a syntax error, a missing dependency — nothing ran at all, and
|
|
87
|
+
// `ruleFileFailure` already says the file could not be evaluated. Adding
|
|
88
|
+
// "the rules after this never ran" there would imply some had, and point at a
|
|
89
|
+
// "finding above" that is an error rather than a finding. Three of bug 0025's
|
|
90
|
+
// own tests caught exactly that when this fired unconditionally.
|
|
91
|
+
//
|
|
92
|
+
// Only at THIS boundary either way. A throw from `builder.violations()` below
|
|
93
|
+
// happens after the module finished, so nothing was truncated, and the
|
|
94
|
+
// `export default [rule1, rule2]` shape never reaches here at all — an array
|
|
95
|
+
// export builds every rule before any of them runs.
|
|
96
|
+
if (isArchRuleError(error)) {
|
|
97
|
+
collected.push(ruleFileTruncated(file, total));
|
|
98
|
+
// Bug 0199 — the same boundary, the other consequence.
|
|
99
|
+
//
|
|
100
|
+
// `failureOrViolations` above DID collect this error's violations and
|
|
101
|
+
// `baseline.filterNew` below DOES filter them. What escaped is the rule
|
|
102
|
+
// file's OWN printing: `executeCheck` calls `writeReport` unconditionally
|
|
103
|
+
// one line before it throws (`core/execute-rule.ts`), so a `.check()`
|
|
104
|
+
// at module scope prints its findings before the CLI can filter anything.
|
|
105
|
+
// the aggregation flag does not stop it — that flag is read only by
|
|
106
|
+
// `executeWarn` (`:526`). Root cause is bug 0201.
|
|
107
|
+
//
|
|
108
|
+
// **Only when something was actually printed.** `executeWarn` throws the
|
|
109
|
+
// same error type, and when the CLI is aggregating it writes only the
|
|
110
|
+
// non-`bypassFilters` entries — for a configuration finding that is
|
|
111
|
+
// nothing at all. Firing on the bare `isArchRuleError` condition claimed a
|
|
112
|
+
// leak that did not happen, over a finding whose own text says a baseline
|
|
113
|
+
// can never suppress it: ADR-009 rule 2, a failure asserting a cause it
|
|
114
|
+
// cannot verify. Measured by review; `it('does not fire when the throw
|
|
115
|
+
// carried nothing the rule file could print')` holds it.
|
|
116
|
+
//
|
|
117
|
+
// **Only when output actually leaked**, measured rather than inferred.
|
|
118
|
+
//
|
|
119
|
+
// More than two paths reach this catch and they do not agree on whether
|
|
120
|
+
// they printed: a `.check()` (silent since bug 0201), a preset via the
|
|
121
|
+
// kernel's `reportViolations`, `checkAll()`, and a `.warn()` with a live
|
|
122
|
+
// selector. So the notice asks the only question it may assert — *did
|
|
123
|
+
// anything emit while this module was loading?* — by reading a delta over
|
|
124
|
+
// both emitters.
|
|
125
|
+
//
|
|
126
|
+
// **The first version inverted this and it was a measured defect.** It
|
|
127
|
+
// counted the writes `executeCheck` SUPPRESSED and read the absence of a
|
|
128
|
+
// suppression as "nothing leaked". A file that suppresses one terminal
|
|
129
|
+
// while leaking through another satisfies that and leaks: measured, a
|
|
130
|
+
// `report: 'warn'` preset beside a silenced `.check()` leaked 7 violation
|
|
131
|
+
// blocks in total silence. A silence built on a stale signal is worse than
|
|
132
|
+
// the false claim it replaced, because the run says nothing at all.
|
|
133
|
+
const leaked = violationsWritten() > writtenBefore;
|
|
134
|
+
const printedUnfiltered = error.violations.some((v) => v.bypassFilters !== true);
|
|
135
|
+
const filtering = args.baseline !== undefined || args.changed;
|
|
136
|
+
if (filtering && printedUnfiltered && leaked) {
|
|
137
|
+
collected.push(baselineNotApplied(file, { baseline: args.baseline, changed: args.changed }));
|
|
138
|
+
}
|
|
33
139
|
}
|
|
34
|
-
|
|
35
|
-
|
|
140
|
+
failedRules++;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// A file that loaded cleanly and produced nothing is the alarm value the
|
|
144
|
+
// summary line exists to print — and `check` used to print `✓ … 0 rules` over
|
|
145
|
+
// it while `doctor` refused the same file. See `ruleFileContributedNoRules`.
|
|
146
|
+
if (builders.length === 0) {
|
|
147
|
+
collected.push(ruleFileContributedNoRules(file));
|
|
148
|
+
failedRules++;
|
|
149
|
+
}
|
|
150
|
+
ruleCount += builders.length;
|
|
151
|
+
for (const builder of builders) {
|
|
152
|
+
try {
|
|
153
|
+
// Attributed here, where the rule file is known. A builder cannot do it
|
|
154
|
+
// — the same builder is legal in a test file, where vitest supplies the
|
|
155
|
+
// frame instead (bug 0026).
|
|
156
|
+
// **The gate runs HERE, per builder, where the receipt and the rule file
|
|
157
|
+
// are both in hand.** Plan 0263 Phase 2, corrected after review.
|
|
158
|
+
//
|
|
159
|
+
// The first cut kept a parallel array of raw receipts, merged them after
|
|
160
|
+
// the loop and re-injected the emitter findings. Three defects followed
|
|
161
|
+
// from that one choice, all measured: the finding named no rule file
|
|
162
|
+
// (`file: ''`, at the one seam in this package that exists to attribute
|
|
163
|
+
// it — bug 0026); an `emitter/*` id arriving from INSIDE a member was
|
|
164
|
+
// reported twice, because the identity guard compared against
|
|
165
|
+
// `collected`, whose entries `attributeToRuleFile` had already copied;
|
|
166
|
+
// and `failedRules` was incremented twice for one builder, printing
|
|
167
|
+
// `2 of 1 rule failing`.
|
|
168
|
+
//
|
|
169
|
+
// Gating here is also strictly stronger than the run-wide merge, not
|
|
170
|
+
// weaker: `mergeCollectResults` reds once per run for the dead-member
|
|
171
|
+
// case, while this names every dead builder — three in one rule file are
|
|
172
|
+
// three findings, measured.
|
|
173
|
+
//
|
|
174
|
+
// **That last clause depends on the kernel and was false when written.**
|
|
175
|
+
// `dedupeConfigFindings` keys on `(file, id, element)`, and an emitter
|
|
176
|
+
// finding sets `element` to its own id and `file` to `''`, so all three
|
|
177
|
+
// collapsed into one whose note said they were "one edit". `keyFor` now
|
|
178
|
+
// returns no key for the emitter ids. If that guard goes, this sentence
|
|
179
|
+
// goes with it.
|
|
180
|
+
//
|
|
181
|
+
// It does not red an honest
|
|
182
|
+
// rule — one that examined zero already carries its own finding, so
|
|
183
|
+
// `withEvidenceGate` returns at its violations check, and a
|
|
184
|
+
// `.notExist()`-shaped rule over zero subjects is stamped
|
|
185
|
+
// `declaredEmpty`. Only a genuinely evidence-free builder is caught,
|
|
186
|
+
// which is the target.
|
|
187
|
+
//
|
|
188
|
+
// ADR-008: this command owns its reporting, so the gate runs under
|
|
189
|
+
// `report: 'return'`. Its findings carry `bypassFilters`, so the
|
|
190
|
+
// baseline and the diff filter keep them, and they are error-severity,
|
|
191
|
+
// so they set the exit code.
|
|
192
|
+
const found = attributeToRuleFile(finishPreset(builder.violations(), { report: 'return' }), file);
|
|
193
|
+
if (found.length > 0)
|
|
194
|
+
failedRules++;
|
|
195
|
+
collected.push(...found);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
failedRules++;
|
|
199
|
+
collected.push(...failureOrViolations(file, error, total));
|
|
36
200
|
}
|
|
37
201
|
}
|
|
38
202
|
}
|
|
203
|
+
// One option, one finding (plan 0074) — after the per-file loop, because the
|
|
204
|
+
// key includes the rule file: two files with the same bad preset option are
|
|
205
|
+
// two edits and must both be reported.
|
|
206
|
+
collected = dedupeConfigFindings(collected);
|
|
207
|
+
let filtered = collected;
|
|
208
|
+
if (baseline)
|
|
209
|
+
filtered = baseline.filterNew(filtered);
|
|
210
|
+
// The one surface that can count. `filterToChanged` runs once here over every
|
|
211
|
+
// collected violation, so `before - after` is the whole run's suppression —
|
|
212
|
+
// unlike the per-rule terminals, which see one rule each (plan 0071,
|
|
213
|
+
// `core/diff-disclosure.ts`). Derived by subtraction rather than asked of the
|
|
214
|
+
// filter, so it holds for a caller-supplied `DiffFilterLike` too.
|
|
215
|
+
let notice;
|
|
216
|
+
if (diff) {
|
|
217
|
+
const before = filtered.length;
|
|
218
|
+
filtered = diff.filterToChanged(filtered);
|
|
219
|
+
notice = suppressionNotice(before - filtered.length, diff.size, diff.baseBranch);
|
|
220
|
+
if (notice !== undefined)
|
|
221
|
+
writeStderr(notice);
|
|
222
|
+
}
|
|
223
|
+
// writeReport handles empties: json always emits one document (so a clean run
|
|
224
|
+
// is still parseable), terminal/github emit nothing. The notice rides along as
|
|
225
|
+
// `summary.reason` so a `--format json` consumer reading only stdout still
|
|
226
|
+
// learns the report is partial — stderr and stdout are different streams, and
|
|
227
|
+
// an agent piping one of them would otherwise see `total: 0` and stop.
|
|
228
|
+
// `reason` is rendered as each violation's "Why:" line on the terminal path
|
|
229
|
+
// (`format.ts`: `v.because ?? reason`), so a RUN-level notice must not travel
|
|
230
|
+
// that way — it would appear as the justification for an unrelated finding.
|
|
231
|
+
// `summary.reason` in JSON is genuinely run-level, so it goes there, and
|
|
232
|
+
// stderr carries it for every other format. Found by sabotage: removing the
|
|
233
|
+
// `writeStderr` call left the tests green because the notice was reaching
|
|
234
|
+
// stderr through the "Why:" line instead.
|
|
235
|
+
writeReport(filtered, format, format === 'json' ? notice : undefined, untestedRules());
|
|
236
|
+
// Bug 0015, and it goes AFTER the report so it reads as a footnote rather than
|
|
237
|
+
// as part of the findings. JSON carries the same information structurally in
|
|
238
|
+
// `summary.untestedAllowlists`, so emitting the prose there too would duplicate
|
|
239
|
+
// it into a document a consumer parses.
|
|
240
|
+
if (format !== 'json') {
|
|
241
|
+
const coverage = edgeCoverageNotice();
|
|
242
|
+
if (coverage !== undefined)
|
|
243
|
+
writeStderr(`${coverage}\n`);
|
|
244
|
+
}
|
|
245
|
+
// Inline exclusion comments, same footnote position and the same reason. Kept
|
|
246
|
+
// out of the JSON prose for the same reason coverage is: a consumer parsing
|
|
247
|
+
// that document gets the identities structurally, not as a sentence to grep.
|
|
248
|
+
if (format !== 'json') {
|
|
249
|
+
const suppressed = commentSuppressionNotice();
|
|
250
|
+
if (suppressed !== undefined)
|
|
251
|
+
writeStderr(`${suppressed}\n`);
|
|
252
|
+
}
|
|
39
253
|
// Report the denominator so a fast green is provably non-vacuous, not silence.
|
|
40
254
|
// Terminal only — JSON/GitHub-annotation output on stdout stays machine-clean.
|
|
255
|
+
//
|
|
256
|
+
// Present on `main` and dropped by plan 0165's engine copy (`9489684`), which
|
|
257
|
+
// overwrote this file wholesale. Restored here rather than treated as the
|
|
258
|
+
// never-had-it gap bug 0174 filed it as: published `eess-ts@0.2.1` ships it,
|
|
259
|
+
// so its absence was a regression, and a green run that prints nothing cannot
|
|
260
|
+
// be told apart from a run that loaded no rules — the ADR-009/010 failure this
|
|
261
|
+
// package exists to prevent, arriving through its own CLI.
|
|
41
262
|
if (format === 'terminal') {
|
|
42
263
|
const ms = Date.now() - started;
|
|
43
|
-
const time = ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(2)}s`;
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
264
|
+
const time = ms < 1000 ? `${String(ms)}ms` : `${(ms / 1000).toFixed(2)}s`;
|
|
265
|
+
const scope = `${String(ruleCount)} rule${ruleCount === 1 ? '' : 's'} across ${String(total)} file${total === 1 ? '' : 's'}`;
|
|
266
|
+
// **The symbol is computed from exactly what the exit code is computed from**
|
|
267
|
+
// — the error-severity count after filtering. Two ways this line lied before,
|
|
268
|
+
// both measured on the documented on-ramp:
|
|
269
|
+
//
|
|
270
|
+
// - keyed on the RAW failure tally, a baseline that suppressed everything
|
|
271
|
+
// printed `✗ … · 0 violations` beside `exit 0`;
|
|
272
|
+
// - keyed on `filtered.length`, a warn-only run printed `✗` beside `exit 0`,
|
|
273
|
+
// because warnings are advisory and never fail (which the scaffold's own
|
|
274
|
+
// output tells the adopter).
|
|
275
|
+
//
|
|
276
|
+
// The symbol, the count and the exit code are three renderings of one fact.
|
|
277
|
+
// Warnings are disclosed alongside rather than folded in or dropped — a run
|
|
278
|
+
// with warnings is not failing, and is not the same as a silent one.
|
|
279
|
+
//
|
|
280
|
+
// `failedRules` is still counted because it answers a different question —
|
|
281
|
+
// how many RULES failed, versus how many violations there were — and a run
|
|
282
|
+
// where one rule produced forty is worth telling apart from forty rules
|
|
283
|
+
// producing one each.
|
|
284
|
+
const errors = filtered.filter((v) => (v.severity ?? 'error') === 'error').length;
|
|
285
|
+
const warns = filtered.length - errors;
|
|
286
|
+
const warnNote = warns === 0 ? '' : ` · ${String(warns)} warning${warns === 1 ? '' : 's'}`;
|
|
287
|
+
writeStderr(errors === 0
|
|
288
|
+
? `\n✓ eess-ts — ${scope} · 0 failing${warnNote} (${time})\n`
|
|
289
|
+
: `\n✗ eess-ts — ${scope} · ${String(failedRules)} of ${String(ruleCount)} rule${ruleCount === 1 ? '' : 's'} failing · ${String(errors)} violation${errors === 1 ? '' : 's'}${warnNote} (${time})\n`);
|
|
65
290
|
}
|
|
291
|
+
// Exit code = error-severity count; warns are reported but never fail.
|
|
292
|
+
return filtered.filter((v) => (v.severity ?? 'error') === 'error').length;
|
|
66
293
|
}
|
|
67
294
|
/**
|
|
68
295
|
* Apply deterministic fixes (plan 0066). Dry-run unless `write`. Returns the
|
|
69
|
-
* count of violations that have no automatic fix
|
|
296
|
+
* count of violations that have no automatic fix.
|
|
297
|
+
*
|
|
298
|
+
* The remaining-count IS the exit code, deliberately: a run that fixed
|
|
299
|
+
* everything it could and still leaves real findings must not exit 0 just
|
|
300
|
+
* because it did some work. `applyFixes` skips overlapping edits rather than
|
|
301
|
+
* guessing, and says how many it skipped — a silently-dropped edit would leave
|
|
302
|
+
* the file half-repaired with a green run to match.
|
|
303
|
+
*
|
|
304
|
+
* **Clamped at 255, defensively.** `process.exitCode = 256` exits **0**
|
|
305
|
+
* (measured), so a count assigned straight to `process.exitCode` wraps. That
|
|
306
|
+
* cannot happen through today's wiring — `handleCheck` normalises this to `1`
|
|
307
|
+
* (`packages/ts/src/cli/index.ts`) and neither `runCheck` nor `runFix` is
|
|
308
|
+
* exported — so the clamp is defence for a future direct caller, not a hole
|
|
309
|
+
* being closed. An earlier version of this note claimed the fail-open was live
|
|
310
|
+
* at this door; two reviewers measured that it is not, and a comment that
|
|
311
|
+
* manufactures a fail-open is the mirror image of the sin this repo exists to
|
|
312
|
+
* catch.
|
|
313
|
+
*
|
|
314
|
+
* **Loads per rule file, like `runBaseline`** — plan 0263 Phase 2, third pass.
|
|
315
|
+
* It used to take a flat `RuleBuilderLike[]` that `runCheck` had already
|
|
316
|
+
* flattened, so the emitter finding printed as ` :0 …` with no path: bug
|
|
317
|
+
* 0026's seam, reopened at the one door the phase claimed had closed it. Six
|
|
318
|
+
* reviewers measured it independently. The file is in hand here for the same
|
|
319
|
+
* reason it is in `runCheck`, and for the same purpose.
|
|
70
320
|
*/
|
|
71
|
-
function runFix(
|
|
72
|
-
|
|
321
|
+
async function runFix(ruleFiles, options, write, fresh) {
|
|
322
|
+
// **The gate runs here too** — plan 0263 Phase 2, after review. An earlier cut
|
|
323
|
+
// of this phase excused `--fix` from ADR-014's clause on the grounds that it
|
|
324
|
+
// "returns before any verdict". Measured, that was false: it calls
|
|
325
|
+
// `violations()` on every builder, so it reaches exactly the same verdict
|
|
326
|
+
// `runCheck` does, and a rule file exporting an evidence-free builder ran
|
|
327
|
+
// through `--fix` to `0 fix(es)` and exit 0.
|
|
328
|
+
// Three buckets, because they have three different consequences.
|
|
329
|
+
//
|
|
330
|
+
// `accepted` — violations from a builder whose receipt passed the gate. Their
|
|
331
|
+
// fixes are trustworthy and get applied.
|
|
332
|
+
// `refused` — emitter findings. The builder that produced them certified
|
|
333
|
+
// nothing, so every edit derived from THAT receipt is dropped.
|
|
334
|
+
// `noRules` — a rule file that loaded and contributed zero builders. There
|
|
335
|
+
// are no fixes to drop; it reds the run, as it already does under
|
|
336
|
+
// `check`.
|
|
337
|
+
const accepted = [];
|
|
338
|
+
const refused = [];
|
|
339
|
+
const noRules = [];
|
|
340
|
+
for (const file of ruleFiles) {
|
|
341
|
+
let builders;
|
|
342
|
+
try {
|
|
343
|
+
builders = await loadRuleFiles([file], { fresh });
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
refused.push(...failureOrViolations(file, error, ruleFiles.length));
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
// Parity with `runCheckInner`, which has had this guard since bug 0025's
|
|
350
|
+
// sibling: a rule file that loads and exports `[]` enforces nothing.
|
|
351
|
+
// Measured before this was ported, `--fix` and `baseline` both exited 0 over
|
|
352
|
+
// exactly that file while `check` reddened — the "two commands in one CLI
|
|
353
|
+
// disagreeing about whether 'no rules' is an error" that
|
|
354
|
+
// `ruleFileContributedNoRules` exists to end, true again at two doors.
|
|
355
|
+
if (builders.length === 0) {
|
|
356
|
+
noRules.push(ruleFileContributedNoRules(file));
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
for (const builder of builders) {
|
|
360
|
+
try {
|
|
361
|
+
const gated = attributeToRuleFile(finishPreset(builder.violations(), { report: 'return' }), file);
|
|
362
|
+
// **Per builder, not per run.** ADR-014 §7's rule is that a door which
|
|
363
|
+
// can name the member never bundles, and this door loads per rule file
|
|
364
|
+
// precisely so it can. Refusing the whole run on one bad receipt bundles
|
|
365
|
+
// it back together: measured, a healthy rule's real fix was withheld
|
|
366
|
+
// because an unrelated rule in the same file had a dead glob.
|
|
367
|
+
//
|
|
368
|
+
// Scoped to the emitter's findings, not to `bypassFilters`. That flag
|
|
369
|
+
// marks every configuration finding — a dead selector, a stale
|
|
370
|
+
// exclusion — and those say the rule matched nothing, not that its
|
|
371
|
+
// verdict is unreadable. Refusing on them made `--fix --apply` a
|
|
372
|
+
// permanent no-op in any project with one mis-globbed preset option,
|
|
373
|
+
// which is a red that should be green shipped inside the change arguing
|
|
374
|
+
// fail-closed.
|
|
375
|
+
const emitterFindings = gated.filter((v) => isEmitterFinding(v));
|
|
376
|
+
if (emitterFindings.length > 0) {
|
|
377
|
+
refused.push(...emitterFindings);
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
accepted.push(...gated);
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
refused.push(...failureOrViolations(file, error, ruleFiles.length));
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// **Refuse BEFORE writing** — the whole point of gating this door. An earlier
|
|
388
|
+
// cut produced the finding and then let `applyFixes` run anyway: measured under
|
|
389
|
+
// `--apply`, a source file was rewritten while the same run printed
|
|
390
|
+
// `emitter/no-receipt` and exited 1. A fix is an edit derived from a verdict,
|
|
391
|
+
// so a refused verdict refuses the edits computed from it — the same principle
|
|
392
|
+
// `runBaseline` applies to a persisted one.
|
|
393
|
+
const blocked = [...refused, ...noRules];
|
|
394
|
+
if (blocked.length > 0) {
|
|
395
|
+
// Same wording as `runBaseline`'s header, and for the reason recorded there:
|
|
396
|
+
// "enforces nothing" is false of a builder that found real violations and
|
|
397
|
+
// merely handed back no evidence, and of a rule file that could not be
|
|
398
|
+
// evaluated at all.
|
|
399
|
+
writeStderr(`eess-ts check --fix: ${String(blocked.length)} finding(s) report a rule whose verdict ` +
|
|
400
|
+
`cannot be checked, so the fixes computed from it are not applied. Fix these first:\n`);
|
|
401
|
+
for (const v of blocked) {
|
|
402
|
+
const where = v.file === '' ? '' : `${v.file}: `;
|
|
403
|
+
writeStderr(` - ${where}${v.ruleId ?? v.rule}: ${v.message}\n`);
|
|
404
|
+
}
|
|
405
|
+
// The other builders' fixes still apply below — they were each verified.
|
|
406
|
+
}
|
|
407
|
+
const all = accepted;
|
|
73
408
|
const fixable = all.filter((v) => v.fix !== undefined);
|
|
74
409
|
const result = applyFixes(fixable, { write });
|
|
75
410
|
const header = write
|
|
@@ -89,6 +424,9 @@ function runFix(builders, options, write) {
|
|
|
89
424
|
for (const v of remaining)
|
|
90
425
|
process.stdout.write(` ${v.file}:${v.line} ${v.message.split('\n')[0]}\n`);
|
|
91
426
|
}
|
|
92
|
-
|
|
427
|
+
// Blocked builders red the run whatever the fixable ones did.
|
|
428
|
+
if (blocked.length > 0)
|
|
429
|
+
return 1;
|
|
430
|
+
return Math.min(remaining.length, 255);
|
|
93
431
|
}
|
|
94
432
|
//# sourceMappingURL=check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/cli/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
interface DoctorArgs {
|
|
2
|
+
ruleFiles: string[];
|
|
3
|
+
format: 'terminal' | 'json';
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Report what each rule cannot enforce, without evaluating their conditions.
|
|
7
|
+
*
|
|
8
|
+
* It DOES materialize each rule's selection, as of plan 0096: "this rule examined
|
|
9
|
+
* nothing" is a fact about the selection, and the preview for 0098's floor has to
|
|
10
|
+
* read the same computation the floor will. The docstring used to say "without
|
|
11
|
+
* running any of them" and that stopped being true.
|
|
12
|
+
*
|
|
13
|
+
* **Supported and scoped** since plan 0077, which settled the keep-or-retire
|
|
14
|
+
* question 0069 left open. It diagnoses rule files the CLI can **load** — the
|
|
15
|
+
* `arch.rules.ts` shape `init` scaffolds, which `getting-started.md` calls the
|
|
16
|
+
* default path. Rules hosted in a vitest or jest file cannot be imported outside
|
|
17
|
+
* their runner; `diagnose()` is the answer there and reports the same findings.
|
|
18
|
+
*
|
|
19
|
+
* **Why the command earns its slot:** a **dead glob**. A rule whose selector can
|
|
20
|
+
* never match certifies nothing, and `check` never calls `diagnose()` — measured,
|
|
21
|
+
* `check` exits 0 with no output on such a rule while this reports it and exits
|
|
22
|
+
* 1. Until 0069's R3b turns that into a check-time failure, this and `diagnose()`
|
|
23
|
+
* are the only surfaces that see it.
|
|
24
|
+
*
|
|
25
|
+
* Not a build gate (0069): `check` is the gate.
|
|
26
|
+
*/
|
|
27
|
+
export declare function runDoctor(args: DoctorArgs): Promise<number>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAOA,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,MAAM,EAAE,UAAU,GAAG,MAAM,CAAA;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAyIjE"}
|