@nielspeter/eess-ts 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -35
- package/dist/builders/call-rule-builder.d.ts +66 -26
- package/dist/builders/call-rule-builder.d.ts.map +1 -1
- package/dist/builders/call-rule-builder.js +73 -31
- package/dist/builders/call-rule-builder.js.map +1 -1
- package/dist/builders/class-rule-builder.d.ts +125 -26
- package/dist/builders/class-rule-builder.d.ts.map +1 -1
- package/dist/builders/class-rule-builder.js +134 -30
- package/dist/builders/class-rule-builder.js.map +1 -1
- package/dist/builders/correspondence-builder.d.ts +287 -0
- package/dist/builders/correspondence-builder.d.ts.map +1 -0
- package/dist/builders/correspondence-builder.js +393 -0
- package/dist/builders/correspondence-builder.js.map +1 -0
- package/dist/builders/correspondence-findings.d.ts +104 -0
- package/dist/builders/correspondence-findings.d.ts.map +1 -0
- package/dist/builders/correspondence-findings.js +301 -0
- package/dist/builders/correspondence-findings.js.map +1 -0
- package/dist/builders/cross-layer-builder.d.ts +99 -16
- package/dist/builders/cross-layer-builder.d.ts.map +1 -1
- package/dist/builders/cross-layer-builder.js +181 -35
- package/dist/builders/cross-layer-builder.js.map +1 -1
- package/dist/builders/function-rule-builder.d.ts +144 -25
- package/dist/builders/function-rule-builder.d.ts.map +1 -1
- package/dist/builders/function-rule-builder.js +173 -26
- package/dist/builders/function-rule-builder.js.map +1 -1
- package/dist/builders/jsx-rule-builder.d.ts +70 -14
- package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
- package/dist/builders/jsx-rule-builder.js +73 -14
- package/dist/builders/jsx-rule-builder.js.map +1 -1
- package/dist/builders/module-rule-builder.d.ts +2 -2
- package/dist/builders/module-rule-builder.d.ts.map +1 -1
- package/dist/builders/module-rule-builder.js +12 -3
- package/dist/builders/module-rule-builder.js.map +1 -1
- package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
- package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
- package/dist/builders/scoped-function-rule-builder.js +12 -0
- package/dist/builders/scoped-function-rule-builder.js.map +1 -1
- package/dist/builders/slice-discovery-message.d.ts +36 -0
- package/dist/builders/slice-discovery-message.d.ts.map +1 -0
- package/dist/builders/slice-discovery-message.js +181 -0
- package/dist/builders/slice-discovery-message.js.map +1 -0
- package/dist/builders/slice-rule-builder.d.ts +151 -12
- package/dist/builders/slice-rule-builder.d.ts.map +1 -1
- package/dist/builders/slice-rule-builder.js +242 -35
- package/dist/builders/slice-rule-builder.js.map +1 -1
- package/dist/builders/type-rule-builder.d.ts +95 -24
- package/dist/builders/type-rule-builder.d.ts.map +1 -1
- package/dist/builders/type-rule-builder.js +105 -29
- package/dist/builders/type-rule-builder.js.map +1 -1
- package/dist/{helpers → builders}/within.d.ts +2 -2
- package/dist/builders/within.d.ts.map +1 -0
- package/dist/{helpers → builders}/within.js +1 -1
- package/dist/builders/within.js.map +1 -0
- package/dist/cli/commands/baseline.d.ts +3 -2
- package/dist/cli/commands/baseline.d.ts.map +1 -1
- package/dist/cli/commands/baseline.js +68 -6
- package/dist/cli/commands/baseline.js.map +1 -1
- package/dist/cli/commands/check.d.ts +7 -2
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +241 -45
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +224 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +2 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +19 -10
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/init.d.ts +9 -3
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +162 -137
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/import-rule-module.d.ts +29 -0
- package/dist/cli/import-rule-module.d.ts.map +1 -0
- package/dist/cli/import-rule-module.js +60 -0
- package/dist/cli/import-rule-module.js.map +1 -0
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +98 -33
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/load-rules.d.ts +6 -11
- package/dist/cli/load-rules.d.ts.map +1 -1
- package/dist/cli/load-rules.js +21 -29
- package/dist/cli/load-rules.js.map +1 -1
- package/dist/cli/resolve-config.d.ts.map +1 -1
- package/dist/cli/resolve-config.js +24 -24
- package/dist/cli/resolve-config.js.map +1 -1
- package/dist/cli/rule-file-findings.d.ts +178 -0
- package/dist/cli/rule-file-findings.d.ts.map +1 -0
- package/dist/cli/rule-file-findings.js +293 -0
- package/dist/cli/rule-file-findings.js.map +1 -0
- package/dist/cli/watch.d.ts +20 -7
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +39 -14
- package/dist/cli/watch.js.map +1 -1
- package/dist/conditions/body-analysis-function.d.ts.map +1 -1
- package/dist/conditions/body-analysis-function.js +16 -7
- package/dist/conditions/body-analysis-function.js.map +1 -1
- package/dist/conditions/body-analysis-module.d.ts.map +1 -1
- package/dist/conditions/body-analysis-module.js +14 -9
- package/dist/conditions/body-analysis-module.js.map +1 -1
- package/dist/conditions/body-analysis.d.ts.map +1 -1
- package/dist/conditions/body-analysis.js +16 -7
- package/dist/conditions/body-analysis.js.map +1 -1
- package/dist/conditions/call.d.ts.map +1 -1
- package/dist/conditions/call.js +38 -17
- package/dist/conditions/call.js.map +1 -1
- package/dist/conditions/catch-analysis.d.ts +2 -1
- package/dist/conditions/catch-analysis.d.ts.map +1 -1
- package/dist/conditions/catch-analysis.js.map +1 -1
- package/dist/conditions/cross-layer.d.ts +2 -10
- package/dist/conditions/cross-layer.d.ts.map +1 -1
- package/dist/conditions/cross-layer.js +227 -23
- package/dist/conditions/cross-layer.js.map +1 -1
- package/dist/conditions/dependency.d.ts +35 -6
- package/dist/conditions/dependency.d.ts.map +1 -1
- package/dist/conditions/dependency.js +299 -45
- package/dist/conditions/dependency.js.map +1 -1
- package/dist/conditions/exports.d.ts.map +1 -1
- package/dist/conditions/exports.js +10 -0
- package/dist/conditions/exports.js.map +1 -1
- package/dist/conditions/function.d.ts.map +1 -1
- package/dist/conditions/function.js +19 -5
- package/dist/conditions/function.js.map +1 -1
- package/dist/conditions/helpers.d.ts +2 -1
- package/dist/conditions/helpers.d.ts.map +1 -1
- package/dist/conditions/helpers.js +4 -1
- package/dist/conditions/helpers.js.map +1 -1
- package/dist/conditions/jsx.d.ts.map +1 -1
- package/dist/conditions/jsx.js +7 -2
- package/dist/conditions/jsx.js.map +1 -1
- package/dist/conditions/match-identity.d.ts +43 -0
- package/dist/conditions/match-identity.d.ts.map +1 -0
- package/dist/conditions/match-identity.js +43 -0
- package/dist/conditions/match-identity.js.map +1 -0
- package/dist/conditions/members.d.ts.map +1 -1
- package/dist/conditions/members.js +17 -4
- package/dist/conditions/members.js.map +1 -1
- package/dist/conditions/reverse-dependency.d.ts +18 -5
- package/dist/conditions/reverse-dependency.d.ts.map +1 -1
- package/dist/conditions/reverse-dependency.js +109 -92
- package/dist/conditions/reverse-dependency.js.map +1 -1
- package/dist/conditions/slice.d.ts +86 -2
- package/dist/conditions/slice.d.ts.map +1 -1
- package/dist/conditions/slice.js +234 -53
- package/dist/conditions/slice.js.map +1 -1
- package/dist/conditions/structural.d.ts.map +1 -1
- package/dist/conditions/structural.js +16 -4
- package/dist/conditions/structural.js.map +1 -1
- package/dist/core/check-all.d.ts +19 -0
- package/dist/core/check-all.d.ts.map +1 -0
- package/dist/core/check-all.js +96 -0
- package/dist/core/check-all.js.map +1 -0
- package/dist/core/combinators.d.ts +48 -0
- package/dist/core/combinators.d.ts.map +1 -0
- package/dist/core/combinators.js +56 -0
- package/dist/core/combinators.js.map +1 -0
- package/dist/core/descendant-cache.d.ts +36 -0
- package/dist/core/descendant-cache.d.ts.map +1 -0
- package/dist/core/descendant-cache.js +119 -0
- package/dist/core/descendant-cache.js.map +1 -0
- package/dist/core/diagnose.d.ts +234 -0
- package/dist/core/diagnose.d.ts.map +1 -0
- package/dist/core/diagnose.js +382 -0
- package/dist/core/diagnose.js.map +1 -0
- package/dist/core/disk-set.d.ts +48 -0
- package/dist/core/disk-set.d.ts.map +1 -0
- package/dist/core/disk-set.js +218 -0
- package/dist/core/disk-set.js.map +1 -0
- package/dist/core/element-cache.d.ts +75 -0
- package/dist/core/element-cache.d.ts.map +1 -0
- package/dist/core/element-cache.js +32 -0
- package/dist/core/element-cache.js.map +1 -0
- package/dist/core/empty-project-advice.d.ts +75 -0
- package/dist/core/empty-project-advice.d.ts.map +1 -0
- package/dist/core/empty-project-advice.js +61 -0
- package/dist/core/empty-project-advice.js.map +1 -0
- package/dist/core/exclusion-comments.d.ts +54 -0
- package/dist/core/exclusion-comments.d.ts.map +1 -0
- package/dist/core/exclusion-comments.js +310 -0
- package/dist/core/exclusion-comments.js.map +1 -0
- package/dist/core/execute-rule.d.ts +150 -0
- package/dist/core/execute-rule.d.ts.map +1 -0
- package/dist/core/execute-rule.js +580 -0
- package/dist/core/execute-rule.js.map +1 -0
- package/dist/core/glob-diagnosis.d.ts +78 -0
- package/dist/core/glob-diagnosis.d.ts.map +1 -0
- package/dist/core/glob-diagnosis.js +134 -0
- package/dist/core/glob-diagnosis.js.map +1 -0
- package/dist/core/glob-evaluator.d.ts +48 -0
- package/dist/core/glob-evaluator.d.ts.map +1 -0
- package/dist/core/glob-evaluator.js +89 -0
- package/dist/core/glob-evaluator.js.map +1 -0
- package/dist/core/import-candidates.d.ts +60 -0
- package/dist/core/import-candidates.d.ts.map +1 -0
- package/dist/core/import-candidates.js +93 -0
- package/dist/core/import-candidates.js.map +1 -0
- package/dist/core/import-options.d.ts +55 -2
- package/dist/core/import-options.d.ts.map +1 -1
- package/dist/core/import-options.js +64 -0
- package/dist/core/import-options.js.map +1 -1
- package/dist/core/line-index.d.ts +3 -0
- package/dist/core/line-index.d.ts.map +1 -0
- package/dist/core/line-index.js +229 -0
- package/dist/core/line-index.js.map +1 -0
- package/dist/core/metric-violation.d.ts +86 -0
- package/dist/core/metric-violation.d.ts.map +1 -0
- package/dist/core/metric-violation.js +132 -0
- package/dist/core/metric-violation.js.map +1 -0
- package/dist/core/module-edges.d.ts +361 -0
- package/dist/core/module-edges.d.ts.map +1 -0
- package/dist/core/module-edges.js +592 -0
- package/dist/core/module-edges.js.map +1 -0
- package/dist/core/object-literal-functions.d.ts +42 -0
- package/dist/core/object-literal-functions.d.ts.map +1 -0
- package/dist/core/object-literal-functions.js +75 -0
- package/dist/core/object-literal-functions.js.map +1 -0
- package/dist/core/orphan-exclusions.d.ts +44 -0
- package/dist/core/orphan-exclusions.d.ts.map +1 -0
- package/dist/core/orphan-exclusions.js +214 -0
- package/dist/core/orphan-exclusions.js.map +1 -0
- package/dist/core/pair-condition.d.ts +32 -3
- package/dist/core/pair-condition.d.ts.map +1 -1
- package/dist/core/path-universe.d.ts +54 -0
- package/dist/core/path-universe.d.ts.map +1 -0
- package/dist/core/path-universe.js +65 -0
- package/dist/core/path-universe.js.map +1 -0
- package/dist/core/per-root-compiler-options.d.ts +20 -0
- package/dist/core/per-root-compiler-options.d.ts.map +1 -0
- package/dist/core/per-root-compiler-options.js +57 -0
- package/dist/core/per-root-compiler-options.js.map +1 -0
- package/dist/core/project-relative.d.ts +98 -0
- package/dist/core/project-relative.d.ts.map +1 -0
- package/dist/core/project-relative.js +185 -0
- package/dist/core/project-relative.js.map +1 -0
- package/dist/core/project.d.ts +7 -1
- package/dist/core/project.d.ts.map +1 -1
- package/dist/core/project.js +24 -0
- package/dist/core/project.js.map +1 -1
- package/dist/core/rule-builder.d.ts +282 -0
- package/dist/core/rule-builder.d.ts.map +1 -0
- package/dist/core/rule-builder.js +445 -0
- package/dist/core/rule-builder.js.map +1 -0
- package/dist/core/rule-declaration.d.ts +32 -0
- package/dist/core/rule-declaration.d.ts.map +1 -0
- package/dist/core/rule-declaration.js +126 -0
- package/dist/core/rule-declaration.js.map +1 -0
- package/dist/core/terminal-builder.d.ts +625 -0
- package/dist/core/terminal-builder.d.ts.map +1 -0
- package/dist/core/terminal-builder.js +787 -0
- package/dist/core/terminal-builder.js.map +1 -0
- package/dist/core/terminal-execution.d.ts +23 -0
- package/dist/core/terminal-execution.d.ts.map +1 -0
- package/dist/core/terminal-execution.js +71 -0
- package/dist/core/terminal-execution.js.map +1 -0
- package/dist/core/vacuity-diagnosis.d.ts +103 -0
- package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
- package/dist/core/vacuity-diagnosis.js +415 -0
- package/dist/core/vacuity-diagnosis.js.map +1 -0
- package/dist/core/violation.d.ts +16 -11
- package/dist/core/violation.d.ts.map +1 -1
- package/dist/core/violation.js +33 -13
- package/dist/core/violation.js.map +1 -1
- package/dist/graphql/index.js +1 -1
- package/dist/graphql/index.js.map +1 -1
- package/dist/graphql/resolver-rule-builder.d.ts +98 -23
- package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
- package/dist/graphql/resolver-rule-builder.js +151 -21
- package/dist/graphql/resolver-rule-builder.js.map +1 -1
- package/dist/graphql/schema-loader.d.ts +21 -0
- package/dist/graphql/schema-loader.d.ts.map +1 -1
- package/dist/graphql/schema-loader.js +81 -12
- package/dist/graphql/schema-loader.js.map +1 -1
- package/dist/graphql/schema-rule-builder.d.ts +57 -20
- package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
- package/dist/graphql/schema-rule-builder.js +101 -25
- package/dist/graphql/schema-rule-builder.js.map +1 -1
- package/dist/helpers/baseline-diagnostics.d.ts +45 -0
- package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
- package/dist/helpers/baseline-diagnostics.js +168 -0
- package/dist/helpers/baseline-diagnostics.js.map +1 -0
- package/dist/helpers/baseline-generator.d.ts +19 -0
- package/dist/helpers/baseline-generator.d.ts.map +1 -0
- package/dist/helpers/baseline-generator.js +18 -0
- package/dist/helpers/baseline-generator.js.map +1 -0
- package/dist/helpers/baseline.d.ts +336 -0
- package/dist/helpers/baseline.d.ts.map +1 -0
- package/dist/helpers/baseline.js +664 -0
- package/dist/helpers/baseline.js.map +1 -0
- package/dist/helpers/body-traversal.d.ts +27 -2
- package/dist/helpers/body-traversal.d.ts.map +1 -1
- package/dist/helpers/body-traversal.js +122 -16
- package/dist/helpers/body-traversal.js.map +1 -1
- package/dist/helpers/callback-extractor.d.ts.map +1 -1
- package/dist/helpers/callback-extractor.js +48 -47
- package/dist/helpers/callback-extractor.js.map +1 -1
- package/dist/helpers/complexity.d.ts +13 -5
- package/dist/helpers/complexity.d.ts.map +1 -1
- package/dist/helpers/complexity.js +15 -6
- package/dist/helpers/complexity.js.map +1 -1
- package/dist/helpers/diff-aware.d.ts +44 -0
- package/dist/helpers/diff-aware.d.ts.map +1 -0
- package/dist/helpers/diff-aware.js +84 -0
- package/dist/helpers/diff-aware.js.map +1 -0
- package/dist/helpers/matchers.d.ts +68 -7
- package/dist/helpers/matchers.d.ts.map +1 -1
- package/dist/helpers/matchers.js +114 -20
- package/dist/helpers/matchers.js.map +1 -1
- package/dist/helpers/slice-graph.d.ts +100 -8
- package/dist/helpers/slice-graph.d.ts.map +1 -1
- package/dist/helpers/slice-graph.js +126 -34
- package/dist/helpers/slice-graph.js.map +1 -1
- package/dist/helpers/tarjan.d.ts +0 -14
- package/dist/helpers/tarjan.d.ts.map +1 -1
- package/dist/helpers/tarjan.js +29 -16
- package/dist/helpers/tarjan.js.map +1 -1
- package/dist/index.d.ts +56 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -13
- package/dist/index.js.map +1 -1
- package/dist/models/arch-call.d.ts +3 -2
- package/dist/models/arch-call.d.ts.map +1 -1
- package/dist/models/arch-call.js.map +1 -1
- package/dist/models/arch-function.d.ts +28 -6
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +106 -3
- package/dist/models/arch-function.js.map +1 -1
- package/dist/models/arch-jsx-element.js +2 -2
- package/dist/models/arch-jsx-element.js.map +1 -1
- package/dist/models/slice.d.ts +33 -9
- package/dist/models/slice.d.ts.map +1 -1
- package/dist/models/slice.js +129 -19
- package/dist/models/slice.js.map +1 -1
- package/dist/predicates/call.d.ts.map +1 -1
- package/dist/predicates/call.js +5 -0
- package/dist/predicates/call.js.map +1 -1
- package/dist/predicates/identity.d.ts +21 -0
- package/dist/predicates/identity.d.ts.map +1 -1
- package/dist/predicates/identity.js +75 -3
- package/dist/predicates/identity.js.map +1 -1
- package/dist/predicates/index.d.ts +1 -1
- package/dist/predicates/index.d.ts.map +1 -1
- package/dist/predicates/index.js +1 -1
- package/dist/predicates/index.js.map +1 -1
- package/dist/predicates/metrics.d.ts +4 -2
- package/dist/predicates/metrics.d.ts.map +1 -1
- package/dist/predicates/metrics.js +4 -2
- package/dist/predicates/metrics.js.map +1 -1
- package/dist/predicates/module.d.ts +4 -12
- package/dist/predicates/module.d.ts.map +1 -1
- package/dist/predicates/module.js +57 -37
- package/dist/predicates/module.js.map +1 -1
- package/dist/presets/agent-guardrails.d.ts +22 -15
- package/dist/presets/agent-guardrails.d.ts.map +1 -1
- package/dist/presets/agent-guardrails.js +124 -19
- package/dist/presets/agent-guardrails.js.map +1 -1
- package/dist/presets/boundaries.d.ts +45 -2
- package/dist/presets/boundaries.d.ts.map +1 -1
- package/dist/presets/boundaries.js +132 -23
- package/dist/presets/boundaries.js.map +1 -1
- package/dist/presets/data-layer.d.ts +22 -2
- package/dist/presets/data-layer.d.ts.map +1 -1
- package/dist/presets/data-layer.js +58 -16
- package/dist/presets/data-layer.js.map +1 -1
- package/dist/presets/index.d.ts +7 -5
- package/dist/presets/index.d.ts.map +1 -1
- package/dist/presets/index.js +9 -3
- package/dist/presets/index.js.map +1 -1
- package/dist/presets/layered.d.ts +46 -2
- package/dist/presets/layered.d.ts.map +1 -1
- package/dist/presets/layered.js +66 -29
- package/dist/presets/layered.js.map +1 -1
- package/dist/presets/recommended.d.ts +80 -9
- package/dist/presets/recommended.d.ts.map +1 -1
- package/dist/presets/recommended.js +25 -23
- package/dist/presets/recommended.js.map +1 -1
- package/dist/presets/shared.d.ts +270 -2
- package/dist/presets/shared.d.ts.map +1 -1
- package/dist/presets/shared.js +338 -4
- package/dist/presets/shared.js.map +1 -1
- package/dist/rules/code-quality.d.ts.map +1 -1
- package/dist/rules/code-quality.js +15 -6
- package/dist/rules/code-quality.js.map +1 -1
- package/dist/rules/hygiene.d.ts +1 -1
- package/dist/rules/hygiene.js +1 -1
- package/dist/rules/metrics-function.d.ts +2 -1
- package/dist/rules/metrics-function.d.ts.map +1 -1
- package/dist/rules/metrics-function.js +33 -6
- package/dist/rules/metrics-function.js.map +1 -1
- package/dist/rules/metrics.d.ts +2 -1
- package/dist/rules/metrics.d.ts.map +1 -1
- package/dist/rules/metrics.js +39 -9
- package/dist/rules/metrics.js.map +1 -1
- package/dist/smells/duplicate-bodies.d.ts +58 -5
- package/dist/smells/duplicate-bodies.d.ts.map +1 -1
- package/dist/smells/duplicate-bodies.js +137 -56
- package/dist/smells/duplicate-bodies.js.map +1 -1
- package/dist/smells/fingerprint.d.ts +8 -1
- package/dist/smells/fingerprint.d.ts.map +1 -1
- package/dist/smells/fingerprint.js +21 -3
- package/dist/smells/fingerprint.js.map +1 -1
- package/dist/smells/inconsistent-siblings.d.ts +128 -7
- package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
- package/dist/smells/inconsistent-siblings.js +288 -86
- package/dist/smells/inconsistent-siblings.js.map +1 -1
- package/dist/smells/sibling-files.d.ts +47 -0
- package/dist/smells/sibling-files.d.ts.map +1 -0
- package/dist/smells/sibling-files.js +104 -0
- package/dist/smells/sibling-files.js.map +1 -0
- package/dist/smells/similar-pairs.d.ts +27 -0
- package/dist/smells/similar-pairs.d.ts.map +1 -0
- package/dist/smells/similar-pairs.js +52 -0
- package/dist/smells/similar-pairs.js.map +1 -0
- package/dist/smells/smell-builder.d.ts +57 -12
- package/dist/smells/smell-builder.d.ts.map +1 -1
- package/dist/smells/smell-builder.js +111 -14
- package/dist/smells/smell-builder.js.map +1 -1
- package/dist/tsconfig/index.d.ts +19 -0
- package/dist/tsconfig/index.d.ts.map +1 -0
- package/dist/tsconfig/index.js +20 -0
- package/dist/tsconfig/index.js.map +1 -0
- package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
- package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
- package/dist/tsconfig/tsconfig-builder.js +64 -16
- package/dist/tsconfig/tsconfig-builder.js.map +1 -1
- package/package.json +3 -2
- package/dist/core/module-dependencies.d.ts +0 -28
- package/dist/core/module-dependencies.d.ts.map +0 -1
- package/dist/core/module-dependencies.js +0 -35
- package/dist/core/module-dependencies.js.map +0 -1
- package/dist/helpers/within.d.ts.map +0 -1
- package/dist/helpers/within.js.map +0 -1
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { RuleBuilder } from '
|
|
1
|
+
import { RuleBuilder } from '../core/rule-builder.js';
|
|
2
2
|
import { resideInFile as resideInFilePredicate, resideInFolder as resideInFolderPredicate, } from '../predicates/identity.js';
|
|
3
|
-
import { importFrom as importFromPredicate, notImportFrom as notImportFromPredicate, exportSymbolNamed as exportSymbolNamedPredicate,
|
|
3
|
+
import { importFrom as importFromPredicate, notImportFrom as notImportFromPredicate, exportSymbolNamed as exportSymbolNamedPredicate, } from '../predicates/module.js';
|
|
4
|
+
import { havePathMatching as havePathMatchingPredicate } from '../predicates/identity.js';
|
|
4
5
|
import { onlyImportFrom as onlyImportFromCondition, notImportFrom as notImportFromCondition, onlyHaveTypeImportsFrom as onlyHaveTypeImportsFromCondition, notHaveAliasedImports as notHaveAliasedImportsCondition, } from '../conditions/dependency.js';
|
|
5
6
|
import { notExist, resideInFile as resideInFileCondition, resideInFolder as resideInFolderCondition, } from '../conditions/structural.js';
|
|
7
|
+
import { createElementCache, SOLE_POPULATION } from '../core/element-cache.js';
|
|
8
|
+
/** One collection per project, shared by every rule built from it (plan 0075). */
|
|
9
|
+
const cache = createElementCache();
|
|
6
10
|
import { moduleContain, moduleNotContain, moduleUseInsteadOf, } from '../conditions/body-analysis-module.js';
|
|
7
11
|
import { notHaveDefaultExport as notHaveDefaultExportCondition, haveDefaultExport as haveDefaultExportCondition, haveMaxExports as haveMaxExportsCondition, } from '../conditions/exports.js';
|
|
8
12
|
import { onlyBeImportedVia as onlyBeImportedViaCondition, beImported as beImportedCondition, haveNoUnusedExports as haveNoUnusedExportsCondition, } from '../conditions/reverse-dependency.js';
|
|
@@ -21,7 +25,12 @@ import { onlyBeImportedVia as onlyBeImportedViaCondition, beImported as beImport
|
|
|
21
25
|
*/
|
|
22
26
|
export class ModuleRuleBuilder extends RuleBuilder {
|
|
23
27
|
getElements() {
|
|
24
|
-
|
|
28
|
+
// Cached for uniformity rather than for speed: measured, 5 × `modules()`
|
|
29
|
+
// issues zero descendant queries and costs ~1ms, because this is a direct
|
|
30
|
+
// read of ts-morph's own accessor. Included so the population rule is
|
|
31
|
+
// "every RuleBuilder subclass that derives elements from the project",
|
|
32
|
+
// which a test can check, rather than a judgement call per builder.
|
|
33
|
+
return cache.get(this.project, SOLE_POPULATION, () => this.project.getSourceFiles());
|
|
25
34
|
}
|
|
26
35
|
// --- Identity predicates (from predicates/identity.ts) ---
|
|
27
36
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-rule-builder.js","sourceRoot":"","sources":["../../src/builders/module-rule-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"module-rule-builder.js","sourceRoot":"","sources":["../../src/builders/module-rule-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { FunctionRuleBuilder } from './function-rule-builder.js';
|
|
2
2
|
import type { CallRuleBuilder } from './call-rule-builder.js';
|
|
3
3
|
import type { ArchFunction } from '../models/arch-function.js';
|
|
4
|
+
import type { GlobNode } from '@nielspeter/eess';
|
|
4
5
|
/**
|
|
5
6
|
* A FunctionRuleBuilder that only examines callback functions
|
|
6
7
|
* inside matched call expressions.
|
|
@@ -17,5 +18,15 @@ export declare class ScopedFunctionRuleBuilder extends FunctionRuleBuilder {
|
|
|
17
18
|
* from the matched call expressions.
|
|
18
19
|
*/
|
|
19
20
|
protected getElements(): ArchFunction[];
|
|
21
|
+
/**
|
|
22
|
+
* This builder's own globs, plus the wrapped call selection's.
|
|
23
|
+
*
|
|
24
|
+
* `within(selection).functions()` draws its subjects from `selection`, so a
|
|
25
|
+
* dead glob in the selection empties this rule just as surely as a dead
|
|
26
|
+
* glob on the rule itself — and inheriting `RuleBuilder.globs()` unchanged
|
|
27
|
+
* would report only half of that. The composition follows the element
|
|
28
|
+
* source, which is what `getElements()` above already does for subjects.
|
|
29
|
+
*/
|
|
30
|
+
globs(): readonly GlobNode[];
|
|
20
31
|
}
|
|
21
32
|
//# sourceMappingURL=scoped-function-rule-builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoped-function-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"scoped-function-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhD;;;;;;;GAOG;AACH,qBAAa,yBAA0B,SAAQ,mBAAmB;IAChE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;gBAEnC,aAAa,EAAE,eAAe;IAK1C;;;OAGG;cACgB,WAAW,IAAI,YAAY,EAAE;IAOhD;;;;;;;;OAQG;IACM,KAAK,IAAI,SAAS,QAAQ,EAAE;CAGtC"}
|
|
@@ -22,5 +22,17 @@ export class ScopedFunctionRuleBuilder extends FunctionRuleBuilder {
|
|
|
22
22
|
const matchedCalls = this.callSelection.getMatchedCalls();
|
|
23
23
|
return matchedCalls.flatMap((archCall) => extractCallbacks(archCall.getNode()).map((ec) => ec.fn));
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* This builder's own globs, plus the wrapped call selection's.
|
|
27
|
+
*
|
|
28
|
+
* `within(selection).functions()` draws its subjects from `selection`, so a
|
|
29
|
+
* dead glob in the selection empties this rule just as surely as a dead
|
|
30
|
+
* glob on the rule itself — and inheriting `RuleBuilder.globs()` unchanged
|
|
31
|
+
* would report only half of that. The composition follows the element
|
|
32
|
+
* source, which is what `getElements()` above already does for subjects.
|
|
33
|
+
*/
|
|
34
|
+
globs() {
|
|
35
|
+
return [...this.callSelection.globs(), ...super.globs()];
|
|
36
|
+
}
|
|
25
37
|
}
|
|
26
38
|
//# sourceMappingURL=scoped-function-rule-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoped-function-rule-builder.js","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"scoped-function-rule-builder.js","sourceRoot":"","sources":["../../src/builders/scoped-function-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAIhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAEnE;;;;;;;GAOG;AACH,MAAM,OAAO,yBAA0B,SAAQ,mBAAmB;IAC/C,aAAa,CAAiB;IAE/C,YAAY,aAA8B;QACxC,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAA;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;IACpC,CAAC;IAED;;;OAGG;IACgB,WAAW;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE,CAAA;QACzD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CACvC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CACxD,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACM,KAAK;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,CAAA;IAC1D,CAAC;CACF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ArchViolation } from '@nielspeter/eess';
|
|
2
|
+
import type { ArchProject } from '../core/project.js';
|
|
3
|
+
import type { DiscoverySource } from './slice-rule-builder.js';
|
|
4
|
+
/**
|
|
5
|
+
* What a slice rule says when its discovery found nothing.
|
|
6
|
+
*
|
|
7
|
+
* Split from the builder because composing the explanation is not deciding one
|
|
8
|
+
* is warranted — and it is the larger half. The two inputs the family reads,
|
|
9
|
+
* the project and the discovery declaration, arrive as arguments.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The remedy for empty discovery, derived from how slices were sourced *and*
|
|
13
|
+
* from the globs actually given.
|
|
14
|
+
*
|
|
15
|
+
* Bug 0009 was a single hardcoded remedy that was correct for one source and
|
|
16
|
+
* false for the other. Branching only on the source is not enough: telling a
|
|
17
|
+
* caller to add a `**\/` prefix they already have, or to check a directory that
|
|
18
|
+
* plainly exists, is the same defect one level down. So each branch below is
|
|
19
|
+
* reachable only when its advice is actually true (ADR-008).
|
|
20
|
+
*/
|
|
21
|
+
export declare function emptyDiscoveryMessage(project: ArchProject, discovery: DiscoverySource | undefined): string;
|
|
22
|
+
/**
|
|
23
|
+
* A config-level finding: the rule is misconfigured, so it checks nothing.
|
|
24
|
+
*
|
|
25
|
+
* Deliberately does NOT carry the rule author's `suggestion`/`docs`. Those
|
|
26
|
+
* describe how to fix a *real* violation of the rule ("Split the cycle"), and the
|
|
27
|
+
* formatter renders `suggestion` under `Fix:` — the field an agent obeys. Pairing
|
|
28
|
+
* a configuration message with an unrelated `Fix:` is a false remedy by
|
|
29
|
+
* juxtaposition, no matter how accurate each half is on its own.
|
|
30
|
+
*/
|
|
31
|
+
export declare function metaViolation(message: string, metadata: {
|
|
32
|
+
id?: string;
|
|
33
|
+
suggestion?: string;
|
|
34
|
+
docs?: string;
|
|
35
|
+
} | undefined, reason: string | undefined): ArchViolation;
|
|
36
|
+
//# sourceMappingURL=slice-discovery-message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice-discovery-message.d.ts","sourceRoot":"","sources":["../../src/builders/slice-discovery-message.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AA0B9D;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,eAAe,GAAG,SAAS,GACrC,MAAM,CA0BR;AAwHD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EACzE,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,aAAa,CAuBf"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { emptyProjectAdvice, loadedNothing } from '../core/empty-project-advice.js';
|
|
2
|
+
import { matchingGlobPrefix } from '../models/slice.js';
|
|
3
|
+
import { FAULT_ADVICE, GLOB_DOCS, syntacticFault } from '../core/glob-diagnosis.js';
|
|
4
|
+
import { isProjectRelative } from '../core/project-relative.js';
|
|
5
|
+
/** How many causes a group names before it summarises the rest. */
|
|
6
|
+
const MAX_NAMED_CAUSES_PER_GROUP = 4;
|
|
7
|
+
/**
|
|
8
|
+
* Rule builder for slice-level architecture rules.
|
|
9
|
+
*
|
|
10
|
+
* Unlike other builders that extend RuleBuilder<T>, SliceRuleBuilder
|
|
11
|
+
* has its own chain because the grouping step (matching/assignedFrom)
|
|
12
|
+
* replaces the predicate phase entirely.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* slices(project).matching(glob).should().beFreeOfCycles().check()
|
|
16
|
+
* slices(project).assignedFrom(def).should().respectLayerOrder(...).check()
|
|
17
|
+
*/
|
|
18
|
+
/** The shared advice starts lowercase for `diagnose`; here it opens a sentence. */
|
|
19
|
+
function capitalize(text) {
|
|
20
|
+
return text.charAt(0).toUpperCase() + text.slice(1);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* What a slice rule says when its discovery found nothing.
|
|
24
|
+
*
|
|
25
|
+
* Split from the builder because composing the explanation is not deciding one
|
|
26
|
+
* is warranted — and it is the larger half. The two inputs the family reads,
|
|
27
|
+
* the project and the discovery declaration, arrive as arguments.
|
|
28
|
+
*/
|
|
29
|
+
/**
|
|
30
|
+
* The remedy for empty discovery, derived from how slices were sourced *and*
|
|
31
|
+
* from the globs actually given.
|
|
32
|
+
*
|
|
33
|
+
* Bug 0009 was a single hardcoded remedy that was correct for one source and
|
|
34
|
+
* false for the other. Branching only on the source is not enough: telling a
|
|
35
|
+
* caller to add a `**\/` prefix they already have, or to check a directory that
|
|
36
|
+
* plainly exists, is the same defect one level down. So each branch below is
|
|
37
|
+
* reachable only when its advice is actually true (ADR-008).
|
|
38
|
+
*/
|
|
39
|
+
export function emptyDiscoveryMessage(project, discovery) {
|
|
40
|
+
const tail = 'A slice rule that discovers nothing enforces nothing.';
|
|
41
|
+
if (!discovery) {
|
|
42
|
+
return ('No slice source: call .matching(glob) or .assignedFrom(definition) ' +
|
|
43
|
+
`before .should(). ${tail}`);
|
|
44
|
+
}
|
|
45
|
+
// Nothing can match when the project loaded no files at all — blaming the
|
|
46
|
+
// glob would send the caller to the wrong file entirely.
|
|
47
|
+
if (loadedNothing(project)) {
|
|
48
|
+
// The SAME string `diagnose()` reports, from the one place that owns it.
|
|
49
|
+
// These were two texts for one state and had already diverged: this copy
|
|
50
|
+
// said only "check that this tsconfig includes your sources", which is
|
|
51
|
+
// not actionable for a config that has no `include` at all — and this is
|
|
52
|
+
// the copy a failing build prints.
|
|
53
|
+
return `${capitalize(emptyProjectAdvice(project))}. ${tail}`;
|
|
54
|
+
}
|
|
55
|
+
if (discovery.mode === 'matching') {
|
|
56
|
+
return matchingDiscoveryMessage(project, discovery.glob, tail);
|
|
57
|
+
}
|
|
58
|
+
return assignedFromDiscoveryMessage(discovery.entries, tail);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Why a `matching(glob)` discovery resolved no slices.
|
|
62
|
+
*
|
|
63
|
+
* Its own method because the two discovery modes are two independent fault
|
|
64
|
+
* ladders that share only the closing sentence — `emptyDiscoveryMessage` was
|
|
65
|
+
* both of them plus the guards, and read as one method only by adjacency.
|
|
66
|
+
*
|
|
67
|
+
* Takes the glob rather than re-reading `discovery`: the caller has
|
|
68
|
+
* already narrowed the mode, and narrowing twice is how the two copies drift.
|
|
69
|
+
*/
|
|
70
|
+
function matchingDiscoveryMessage(project, glob, tail) {
|
|
71
|
+
const prefix = matchingGlobPrefix(glob);
|
|
72
|
+
// No literal directory prefix at all ('src', '*', '{a,b}/x/*'). Telling the
|
|
73
|
+
// caller to "check the prefix" would send them to inspect something that does
|
|
74
|
+
// not exist — the false-remedy shape this guard keeps relapsing into.
|
|
75
|
+
if (prefix === '') {
|
|
76
|
+
return (`matching(${JSON.stringify(glob)}) has no literal directory prefix, so there is ` +
|
|
77
|
+
'nothing to locate in your file paths. It needs at least one plain directory ' +
|
|
78
|
+
`segment before the wildcard, e.g. "src/features/*". ${tail}`);
|
|
79
|
+
}
|
|
80
|
+
// Check the claim before making it. The prefix is located with a literal
|
|
81
|
+
// `indexOf` while the pattern goes through picomatch, and the two disagree
|
|
82
|
+
// for prefixes containing `(`, `{` or `!` — so "the prefix was not found"
|
|
83
|
+
// was a verifiable falsehood on exactly the route-group directory names this
|
|
84
|
+
// parser is careful to treat as literal elsewhere.
|
|
85
|
+
const prefixExists = project.getSourceFiles().some((file) => file.getFilePath().includes(prefix));
|
|
86
|
+
if (prefixExists) {
|
|
87
|
+
return (`matching(${JSON.stringify(glob)}) resolved no slices even though the prefix ` +
|
|
88
|
+
`${JSON.stringify(prefix)} does occur in this project's files, so the rest of the ` +
|
|
89
|
+
'glob matched nothing. If a path segment contains "(", ")", "{", "}" or "!", those ' +
|
|
90
|
+
'are pattern syntax rather than literal characters here — match that level with ' +
|
|
91
|
+
`"*" instead. ${tail}`);
|
|
92
|
+
}
|
|
93
|
+
return (`matching(${JSON.stringify(glob)}) resolved no slices: the prefix ` +
|
|
94
|
+
`${JSON.stringify(prefix)} was not found in any of this project's ` +
|
|
95
|
+
`${String(project.getSourceFiles().length)} file paths. Compare it against a ` +
|
|
96
|
+
'real path — the segment after the prefix names each slice (a directory when files ' +
|
|
97
|
+
`are nested under it, otherwise each matching file name). ${tail}`);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Why an `assignedFrom(...)` discovery resolved no slices.
|
|
101
|
+
*
|
|
102
|
+
* Reports EVERY entry, grouped by its own cause — reporting one group and
|
|
103
|
+
* stopping, or applying one group's advice to all of them, is what made each
|
|
104
|
+
* earlier version of this message false for somebody.
|
|
105
|
+
*/
|
|
106
|
+
function assignedFromDiscoveryMessage(entries, tail) {
|
|
107
|
+
if (entries.length === 0) {
|
|
108
|
+
return ('assignedFrom() was given no entries, so there are no slices to check. Pass at ' +
|
|
109
|
+
`least one name-to-glob mapping, e.g. { services: "**/src/services/**" }. ${tail}`);
|
|
110
|
+
}
|
|
111
|
+
// Every entry is at fault (all slices are empty), so every entry is reported,
|
|
112
|
+
// grouped by its own cause. Reporting one group and stopping — or applying one
|
|
113
|
+
// group's advice to all of them — is what made each earlier version of this
|
|
114
|
+
// message false for somebody.
|
|
115
|
+
const clauses = faultGroups(entries).map((group) => {
|
|
116
|
+
// Cap per group, never across groups, so no cause is hidden entirely — and
|
|
117
|
+
// always keep an entry whose key the docs single out as error-prone.
|
|
118
|
+
const notable = group.list.filter((entry) => /shared/i.test(entry.name));
|
|
119
|
+
const ordered = [...notable, ...group.list.filter((entry) => !notable.includes(entry))];
|
|
120
|
+
const head = ordered.slice(0, MAX_NAMED_CAUSES_PER_GROUP);
|
|
121
|
+
const rest = ordered.length - head.length;
|
|
122
|
+
const named = head.map((entry) => `${entry.name}: ${JSON.stringify(entry.glob)}`).join(', ') +
|
|
123
|
+
(rest > 0 ? `, and ${String(rest)} more` : '');
|
|
124
|
+
return `${FAULT_ADVICE[group.fault]}: ${named}`;
|
|
125
|
+
});
|
|
126
|
+
return `Every slice in assignedFrom(...) is empty. ${clauses.join('. Separately, ')}. ${tail}`;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The entries, grouped by the fault that explains them, in reporting order.
|
|
130
|
+
*
|
|
131
|
+
* Syntactic only: this runs while explaining why EVERY slice is empty, so
|
|
132
|
+
* "matched no file" is already established and the useful split is between the
|
|
133
|
+
* two causes with a verifiable fix.
|
|
134
|
+
*/
|
|
135
|
+
function faultGroups(entries) {
|
|
136
|
+
const FAULT_ORDER = ['dot-segment', 'unanchored', 'no-match'];
|
|
137
|
+
return FAULT_ORDER.map((fault) => ({
|
|
138
|
+
fault,
|
|
139
|
+
list: entries.filter((entry) =>
|
|
140
|
+
// The SAME base the declaration uses (bug 0033). With the default
|
|
141
|
+
// `'absolute'`, a project-relative glob is classified `unanchored` and
|
|
142
|
+
// the message tells the author to prefix `"**/"` — advice that stopped
|
|
143
|
+
// being true when this entry point started resolving one against the
|
|
144
|
+
// project root. It would now send them to change a glob whose spelling
|
|
145
|
+
// is fine and whose folder is simply missing.
|
|
146
|
+
(syntacticFault(entry.glob, 'file-path', isProjectRelative(entry.glob) ? 'normalized' : 'absolute') ?? 'no-match') === fault),
|
|
147
|
+
})).filter((group) => group.list.length > 0);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* A config-level finding: the rule is misconfigured, so it checks nothing.
|
|
151
|
+
*
|
|
152
|
+
* Deliberately does NOT carry the rule author's `suggestion`/`docs`. Those
|
|
153
|
+
* describe how to fix a *real* violation of the rule ("Split the cycle"), and the
|
|
154
|
+
* formatter renders `suggestion` under `Fix:` — the field an agent obeys. Pairing
|
|
155
|
+
* a configuration message with an unrelated `Fix:` is a false remedy by
|
|
156
|
+
* juxtaposition, no matter how accurate each half is on its own.
|
|
157
|
+
*/
|
|
158
|
+
export function metaViolation(message, metadata, reason) {
|
|
159
|
+
const id = metadata?.id ?? 'slices';
|
|
160
|
+
return {
|
|
161
|
+
rule: id,
|
|
162
|
+
ruleId: metadata?.id,
|
|
163
|
+
element: id,
|
|
164
|
+
file: '',
|
|
165
|
+
line: 0,
|
|
166
|
+
message,
|
|
167
|
+
because: reason,
|
|
168
|
+
// Its own remedy, not the rule author's (bug 0021). Deliberately generic:
|
|
169
|
+
// the specific, per-branch diagnosis is already in `message`, where
|
|
170
|
+
// `emptyDiscoveryMessage` derives it and — per the comment there — each
|
|
171
|
+
// branch is reachable only when its advice is actually true. Restating that
|
|
172
|
+
// in `suggestion` would mean two texts to keep in agreement, which is the
|
|
173
|
+
// drift this project keeps paying for. So the `Fix:` line names the two
|
|
174
|
+
// actions that hold in every branch and points at the diagnosis.
|
|
175
|
+
suggestion: 'A slice rule that discovers nothing cannot enforce anything: correct the cause ' +
|
|
176
|
+
'named in the message, or remove the rule.',
|
|
177
|
+
docs: GLOB_DOCS,
|
|
178
|
+
bypassFilters: true,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=slice-discovery-message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice-discovery-message.js","sourceRoot":"","sources":["../../src/builders/slice-discovery-message.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAEnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAE/D,mEAAmE;AACnE,MAAM,0BAA0B,GAAG,CAAC,CAAA;AAEpC;;;;;;;;;;GAUG;AACH,mFAAmF;AACnF,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC;AAED;;;;;;GAMG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAoB,EACpB,SAAsC;IAEtC,MAAM,IAAI,GAAG,uDAAuD,CAAA;IAEpE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CACL,qEAAqE;YACrE,qBAAqB,IAAI,EAAE,CAC5B,CAAA;IACH,CAAC;IAED,0EAA0E;IAC1E,yDAAyD;IACzD,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,yEAAyE;QACzE,yEAAyE;QACzE,uEAAuE;QACvE,yEAAyE;QACzE,mCAAmC;QACnC,OAAO,GAAG,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAA;IAC9D,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,wBAAwB,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAChE,CAAC;IAED,OAAO,4BAA4B,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,wBAAwB,CAAC,OAAoB,EAAE,IAAY,EAAE,IAAY;IAChF,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAEvC,4EAA4E;IAC5E,8EAA8E;IAC9E,sEAAsE;IACtE,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,OAAO,CACL,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iDAAiD;YACjF,8EAA8E;YAC9E,uDAAuD,IAAI,EAAE,CAC9D,CAAA;IACH,CAAC;IAED,yEAAyE;IACzE,2EAA2E;IAC3E,0EAA0E;IAC1E,6EAA6E;IAC7E,mDAAmD;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;IAEjG,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CACL,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,8CAA8C;YAC9E,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0DAA0D;YACnF,oFAAoF;YACpF,iFAAiF;YACjF,gBAAgB,IAAI,EAAE,CACvB,CAAA;IACH,CAAC;IAED,OAAO,CACL,YAAY,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mCAAmC;QACnE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,0CAA0C;QACnE,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,oCAAoC;QAC9E,oFAAoF;QACpF,4DAA4D,IAAI,EAAE,CACnE,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,4BAA4B,CACnC,OAAoE,EACpE,IAAY;IAEZ,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CACL,gFAAgF;YAChF,4EAA4E,IAAI,EAAE,CACnF,CAAA;IACH,CAAC;IAED,8EAA8E;IAC9E,+EAA+E;IAC/E,4EAA4E;IAC5E,8BAA8B;IAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACjD,2EAA2E;QAC3E,qEAAqE;QACrE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QACxE,MAAM,OAAO,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACvF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QACzC,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC9E,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChD,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,EAAE,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,OAAO,8CAA8C,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE,CAAA;AAChG,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAClB,OAAoE;IAEpE,MAAM,WAAW,GAAyB,CAAC,aAAa,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;IACnF,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK;QACL,IAAI,EAAE,OAAO,CAAC,MAAM,CAClB,CAAC,KAAK,EAAE,EAAE;QACR,kEAAkE;QAClE,uEAAuE;QACvE,uEAAuE;QACvE,qEAAqE;QACrE,uEAAuE;QACvE,8CAA8C;QAC9C,CAAC,cAAc,CACb,KAAK,CAAC,IAAI,EACV,WAAW,EACX,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAC1D,IAAI,UAAU,CAAC,KAAK,KAAK,CAC7B;KACF,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AAC9C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAe,EACf,QAAyE,EACzE,MAA0B;IAE1B,MAAM,EAAE,GAAG,QAAQ,EAAE,EAAE,IAAI,QAAQ,CAAA;IACnC,OAAO;QACL,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,QAAQ,EAAE,EAAE;QACpB,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,CAAC;QACP,OAAO;QACP,OAAO,EAAE,MAAM;QACf,0EAA0E;QAC1E,oEAAoE;QACpE,wEAAwE;QACxE,4EAA4E;QAC5E,0EAA0E;QAC1E,wEAAwE;QACxE,iEAAiE;QACjE,UAAU,EACR,iFAAiF;YACjF,2CAA2C;QAC7C,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,IAAI;KACpB,CAAA;AACH,CAAC"}
|
|
@@ -1,22 +1,55 @@
|
|
|
1
|
+
import type { RuleDescription } from '@nielspeter/eess';
|
|
2
|
+
import type { CollectResult } from '../core/terminal-builder.js';
|
|
1
3
|
import type { ArchProject } from '../core/project.js';
|
|
2
|
-
import type {
|
|
3
|
-
import { TerminalBuilder } from '
|
|
4
|
+
import type { GlobNode } from '@nielspeter/eess';
|
|
5
|
+
import { TerminalBuilder } from '../core/terminal-builder.js';
|
|
4
6
|
import type { SliceDefinition } from '../models/slice.js';
|
|
7
|
+
import type { ImportOptions } from '../core/import-options.js';
|
|
8
|
+
/**
|
|
9
|
+
* How many causes one group names before it truncates to "and N more".
|
|
10
|
+
*
|
|
11
|
+
* Per GROUP, never across groups, so no cause is hidden entirely — see the call
|
|
12
|
+
* site. Four is a readability budget, not a semantic limit.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* How slices were sourced. Recorded so an empty-discovery failure can state the
|
|
16
|
+
* remedy that actually works: `matching()` takes one glob whose literal prefix
|
|
17
|
+
* locates the slices, `assignedFrom()` takes globs matched against the whole
|
|
18
|
+
* absolute path, and their failure modes differ — so one generic hint would
|
|
19
|
+
* misdirect half of all callers (ADR-008 — a failure must carry its sanctioned
|
|
20
|
+
* fix). Declared before the class's own doc block so it does not detach it.
|
|
21
|
+
*/
|
|
22
|
+
export type DiscoverySource = {
|
|
23
|
+
readonly mode: 'matching';
|
|
24
|
+
readonly glob: string;
|
|
25
|
+
} | {
|
|
26
|
+
readonly mode: 'assignedFrom';
|
|
27
|
+
readonly entries: readonly {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly glob: string;
|
|
30
|
+
}[];
|
|
31
|
+
};
|
|
5
32
|
/**
|
|
6
33
|
* Rule builder for slice-level architecture rules.
|
|
7
34
|
*
|
|
8
|
-
* Unlike
|
|
9
|
-
*
|
|
10
|
-
*
|
|
35
|
+
* Unlike the builders that extend `RuleBuilder<T>`, this one has its own chain:
|
|
36
|
+
* the grouping step (`matching` / `assignedFrom`) replaces the predicate phase
|
|
37
|
+
* entirely, because a slice is defined by how files are grouped rather than by a
|
|
38
|
+
* predicate over already-selected subjects.
|
|
11
39
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
40
|
+
* ```ts
|
|
41
|
+
* slices(project).matching(glob).should().beFreeOfCycles().check()
|
|
42
|
+
* slices(project).assignedFrom(def).should().respectLayerOrder(...).check()
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* This class carried a docblock on `main` and lost it when the file was split
|
|
46
|
+
* for `eess/max-class-lines`; it is restored rather than rewritten.
|
|
15
47
|
*/
|
|
16
48
|
export declare class SliceRuleBuilder extends TerminalBuilder {
|
|
17
49
|
private readonly project;
|
|
18
50
|
private _slices;
|
|
19
|
-
private
|
|
51
|
+
private _discovery?;
|
|
52
|
+
private _conditions;
|
|
20
53
|
constructor(project: ArchProject);
|
|
21
54
|
/**
|
|
22
55
|
* Define slices by glob matching. Each directory matching the glob
|
|
@@ -41,6 +74,32 @@ export declare class SliceRuleBuilder extends TerminalBuilder {
|
|
|
41
74
|
* })
|
|
42
75
|
*/
|
|
43
76
|
assignedFrom(definition: SliceDefinition): this;
|
|
77
|
+
/** The project this rule was built against. See `RuleBuilder.getProject`. */
|
|
78
|
+
getProject(): ArchProject;
|
|
79
|
+
/**
|
|
80
|
+
* The discovery globs this rule was scoped with.
|
|
81
|
+
*
|
|
82
|
+
* `assignedFrom` fans out into one slice per entry, so each entry is its own
|
|
83
|
+
* tree: one dead layer glob is one empty slice, and folding them into an
|
|
84
|
+
* `any` node would say "no fault unless every slice is empty" — a false
|
|
85
|
+
* green. This is the same reason a preset's option list is not an `any`
|
|
86
|
+
* node.
|
|
87
|
+
*
|
|
88
|
+
* `matching()` needs no `base` special case, because it declares the glob
|
|
89
|
+
* `parseMatchingGlob` produces rather than the one the author wrote — and
|
|
90
|
+
* that one is already anchored. Declaring the author's spelling and
|
|
91
|
+
* exempting it via `base` was the earlier design, and it reported every
|
|
92
|
+
* nested-layout rule as dead while looking correct on a flat fixture.
|
|
93
|
+
*/
|
|
94
|
+
globs(): readonly GlobNode[];
|
|
95
|
+
/**
|
|
96
|
+
* An independent copy, carrying the condition list and the resolved slices.
|
|
97
|
+
*
|
|
98
|
+
* `_slices` is replaced wholesale by both discovery methods, so only the
|
|
99
|
+
* condition array needs its own copy — but it is listed here anyway, because
|
|
100
|
+
* the next person to add a field will read this method, not the two callers.
|
|
101
|
+
*/
|
|
102
|
+
protected copy(): this;
|
|
44
103
|
/**
|
|
45
104
|
* Begin the condition phase. Returns `this` for chaining.
|
|
46
105
|
*/
|
|
@@ -52,22 +111,102 @@ export declare class SliceRuleBuilder extends TerminalBuilder {
|
|
|
52
111
|
/**
|
|
53
112
|
* Assert that no circular dependencies exist between slices.
|
|
54
113
|
*/
|
|
55
|
-
|
|
114
|
+
/**
|
|
115
|
+
* @param options - `ignoreTypeImports` defaults to **true**: a type-only import
|
|
116
|
+
* is erased at compile time and creates no runtime dependency, so counting it
|
|
117
|
+
* as a cycle edge reports cycles that cannot exist (plan 0084). Pass
|
|
118
|
+
* `{ ignoreTypeImports: false }` to count type-only edges too.
|
|
119
|
+
* NOT a way back to the pre-0.47 graph: since v0.48.0 re-exports are counted as
|
|
120
|
+
* well, so type edges plus re-export edges is WIDER than 0.46.1 ever was.
|
|
121
|
+
*/
|
|
122
|
+
beFreeOfCycles(options?: ImportOptions): this;
|
|
56
123
|
/**
|
|
57
124
|
* Assert that slices respect a layered dependency order.
|
|
58
125
|
* Layer N may depend on layers N+1, N+2, ... but NOT on layers with lower index.
|
|
59
126
|
*
|
|
60
127
|
* @param layers - Ordered layer names from highest to lowest
|
|
61
128
|
*/
|
|
129
|
+
respectLayerOrder(layers: string[], options: ImportOptions): this;
|
|
62
130
|
respectLayerOrder(...layers: string[]): this;
|
|
63
131
|
/**
|
|
64
132
|
* Assert that no slice depends on any of the listed slices.
|
|
65
133
|
*
|
|
66
|
-
*
|
|
134
|
+
* **Type-only edges COUNT by default here**, unlike `beFreeOfCycles()`. It looks
|
|
135
|
+
* inconsistent and it is deliberate: a cycle is about runtime module-initialization
|
|
136
|
+
* order, so an erased edge cannot contribute to one — but isolation is about
|
|
137
|
+
* *coupling*, and a type-only dependency on `legacy` is still a dependency on
|
|
138
|
+
* `legacy` that breaks when `legacy` is deleted. This matches `dependOn` and
|
|
139
|
+
* `notImportFrom` as shipped. Pass `{ ignoreTypeImports: true }` to disagree.
|
|
140
|
+
*
|
|
141
|
+
* Counts every edge kind `notImportFrom()` counts, including `import('…')` and
|
|
142
|
+
* `type X = import('…').Y`. `require()` is not counted (ESM-only, ADR-004).
|
|
143
|
+
*
|
|
144
|
+
* @param args - Forbidden slice names, or `(names[], options)`
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* .should().notDependOn('legacy', 'deprecated')
|
|
148
|
+
* .should().notDependOn(['legacy'], { ignoreTypeImports: true })
|
|
67
149
|
*/
|
|
150
|
+
notDependOn(sliceNames: string[], options: ImportOptions): this;
|
|
68
151
|
notDependOn(...sliceNames: string[]): this;
|
|
69
|
-
|
|
152
|
+
/**
|
|
153
|
+
* Whether this rule states an assertion at all — the assertion gate's question.
|
|
154
|
+
*
|
|
155
|
+
* True once a condition has been added; a slice selection with none can never fail.
|
|
156
|
+
*
|
|
157
|
+
* Overrides the `TerminalBuilder` default (`true`), whose JSDoc carries the
|
|
158
|
+
* contract and the reason this is public rather than protected.
|
|
159
|
+
*/
|
|
160
|
+
assertsSomething(): boolean;
|
|
161
|
+
/**
|
|
162
|
+
* The remedy for this builder's assertion-less state, as one string.
|
|
163
|
+
*
|
|
164
|
+
* One channel, so `diagnose()`'s advice and the finding's own message cannot
|
|
165
|
+
* disagree. Overrides `TerminalBuilder`'s generic text with wording specific to
|
|
166
|
+
* what this builder is missing.
|
|
167
|
+
*/
|
|
168
|
+
assertionAdvice(): string;
|
|
169
|
+
/**
|
|
170
|
+
* Named by id when one is set, else by the rule description (plan 0070 §4).
|
|
171
|
+
* The inherited root version says 'unnamed' for every id-less rule, which
|
|
172
|
+
* made three of the assertion hooks unlocatable in a doctor report.
|
|
173
|
+
*/
|
|
174
|
+
describeRule(): RuleDescription;
|
|
175
|
+
/**
|
|
176
|
+
* Slice discovery is not per-tree, so the gate must stay out (plan 0080).
|
|
177
|
+
*
|
|
178
|
+
* `assignedFrom` fans out one glob tree per entry, and a single dead entry among
|
|
179
|
+
* populated siblings is a dead *tree* — which the gate would report. That guard
|
|
180
|
+
* was written and **withdrawn before release** for firing on legitimate
|
|
181
|
+
* projects (see `collectViolations` below): a layer not created yet, and the
|
|
182
|
+
* `strict-boundaries` scaffold itself.
|
|
183
|
+
*
|
|
184
|
+
* The all-empty case is handled here too, with a message the gate cannot match
|
|
185
|
+
* — it names the discovery mode and its remedy (bug 0009's corpus). So this
|
|
186
|
+
* builder owns both halves.
|
|
187
|
+
*
|
|
188
|
+
* **Why this is a builder-level `true` while `PairFinalBuilder` asks its
|
|
189
|
+
* condition** (`owns-empty-discovery.ts`, plan 0081): there, ownership varies by
|
|
190
|
+
* condition, and a blanket `true` once suppressed the gate for the one condition
|
|
191
|
+
* that did not self-report. Here nothing varies — the reason is a property of
|
|
192
|
+
* `assignedFrom`'s fan-out, identical for every condition reachable through this
|
|
193
|
+
* builder. The asymmetry reflects the discovery models, not an oversight.
|
|
194
|
+
*/
|
|
195
|
+
protected ownsDiscoveryDiagnosis(): boolean;
|
|
196
|
+
/**
|
|
197
|
+
* Slices holding at least one file — plan 0098.
|
|
198
|
+
*
|
|
199
|
+
* Counting `_slices.length` would count the SHAPE of the discovery rather than
|
|
200
|
+
* what was examined: `assignedFrom()` returns one slice per key whether or not
|
|
201
|
+
* anything matched, so the empty case is "every slice has no files", never "no
|
|
202
|
+
* slices" (arch-014 I1) — which is the same condition this family already
|
|
203
|
+
* fails closed on.
|
|
204
|
+
*/
|
|
205
|
+
examinedUnits(): number;
|
|
206
|
+
protected collectViolations(): CollectResult;
|
|
70
207
|
private buildRuleDescription;
|
|
208
|
+
/** Config-level meta-finding for empty slice discovery (plan 0067). */
|
|
209
|
+
private emptyDiscoveryViolation;
|
|
71
210
|
}
|
|
72
211
|
/**
|
|
73
212
|
* Entry point: create a slice-level rule builder.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slice-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/slice-rule-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slice-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/slice-rule-builder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,EAAS,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAOhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAS9D;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpD;IACE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC9E,CAAA;AAEL;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;IAKvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAiB;IACpC,OAAO,CAAC,WAAW,CAAyB;gBAEf,OAAO,EAAE,WAAW;IAIjD;;;;;;;;;OASG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAO5B;;;;;;;;;;OAUG;IACH,YAAY,CAAC,UAAU,EAAE,eAAe,GAAG,IAAI;IAQ/C,6EAA6E;IAC7E,UAAU,IAAI,WAAW;IAIzB;;;;;;;;;;;;;;OAcG;IACM,KAAK,IAAI,SAAS,QAAQ,EAAE;IA4CrC;;;;;;OAMG;cACgB,IAAI,IAAI,IAAI;IAO/B;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH;;;;;;;OAOG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,IAAI;IAM7C;;;;;OAKG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IACjE,iBAAiB,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAqB5C;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAC/D,WAAW,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI;IAiB1C;;;;;;;OAOG;IACM,gBAAgB,IAAI,OAAO;IAIpC;;;;;;OAMG;IACM,eAAe,IAAI,MAAM;IAQlC;;;;OAIG;IACM,YAAY,IAAI,eAAe;IAaxC;;;;;;;;;;;;;;;;;;;OAmBG;cACgB,sBAAsB,IAAI,OAAO;IAIpD;;;;;;;;OAQG;IACH,aAAa,IAAI,MAAM;IAIvB,SAAS,CAAC,iBAAiB,IAAI,aAAa;IAmD5C,OAAO,CAAC,oBAAoB;IAM5B,uEAAuE;IACvE,OAAO,CAAC,uBAAuB;CAOhC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,WAAW,GAAG,gBAAgB,CAEvD"}
|