@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
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { duplicateKeyFindings, materializeSides, resolveSides, emptinessFindings, matchFindings, unboundDeclarationFindings, } from './correspondence-findings.js';
|
|
2
|
+
import { selectionMemo } from '@nielspeter/eess';
|
|
3
|
+
import { RuleBuilder } from '../core/rule-builder.js';
|
|
4
|
+
import { TerminalBuilder } from '../core/terminal-builder.js';
|
|
5
|
+
import { setCorrespondence } from '@nielspeter/eess';
|
|
6
|
+
function toKeyArray(key) {
|
|
7
|
+
return typeof key === 'string' ? [key] : key;
|
|
8
|
+
}
|
|
9
|
+
/** Model wrappers (ArchCall, ArchFunction, …) expose getNode(): Node. */
|
|
10
|
+
function keyedFromSelection(source, keyFn) {
|
|
11
|
+
const map = new Map();
|
|
12
|
+
for (const subject of source.subjects()) {
|
|
13
|
+
for (const key of toKeyArray(keyFn(subject))) {
|
|
14
|
+
const bucket = map.get(key);
|
|
15
|
+
if (bucket)
|
|
16
|
+
bucket.push(subject);
|
|
17
|
+
else
|
|
18
|
+
map.set(key, [subject]);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return map;
|
|
22
|
+
}
|
|
23
|
+
function keyedFromKeys(keys) {
|
|
24
|
+
const map = new Map();
|
|
25
|
+
for (const key of keys) {
|
|
26
|
+
if (!map.has(key))
|
|
27
|
+
map.set(key, []);
|
|
28
|
+
}
|
|
29
|
+
return map;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Assert a correspondence between two independently-derived key sets:
|
|
33
|
+
* "every X has a matching Y" (and/or the reverse). This is ADR-008 Rule 5 as a
|
|
34
|
+
* primitive — two derivations plus a disagreement test — so identity-not-count
|
|
35
|
+
* and non-vacuity are impossible to get wrong.
|
|
36
|
+
*
|
|
37
|
+
* The chain: `.side()` twice → `.beComplete()` / `.haveNoOrphans()` /
|
|
38
|
+
* `.beBijective()` → `.check()`.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* crossProject(p)
|
|
42
|
+
* .side('routes', calls(p).that().onObject('app'), byArg(0))
|
|
43
|
+
* .side('matrix', Object.keys(ROUTE_PERMISSIONS))
|
|
44
|
+
* .should()
|
|
45
|
+
* .beComplete()
|
|
46
|
+
* .rule({ id: 'auth/route-matrix', suggestion: 'Add the route to ROUTE_PERMISSIONS.' })
|
|
47
|
+
* .check()
|
|
48
|
+
*/
|
|
49
|
+
export const sidesOf = selectionMemo();
|
|
50
|
+
/**
|
|
51
|
+
* The two-sided join: bind two artifacts by key and fail on the difference.
|
|
52
|
+
*
|
|
53
|
+
* Where every other builder selects subjects and asserts something about each,
|
|
54
|
+
* this one declares two (or more) named SIDES, derives a key set from each, and
|
|
55
|
+
* reports the set difference. It is the kernel's answer to "these two things must
|
|
56
|
+
* agree" — a route table against its permission map, a diagram against the code,
|
|
57
|
+
* a README table against the workspace.
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* crossProject(project)
|
|
61
|
+
* .side('routes', classes(project).that().haveDecorator('Controller'), routeKey)
|
|
62
|
+
* .side('matrix', Object.keys(ROUTE_PERMISSIONS))
|
|
63
|
+
* .should()
|
|
64
|
+
* .beComplete()
|
|
65
|
+
* .check()
|
|
66
|
+
* ```
|
|
67
|
+
*
|
|
68
|
+
* `beComplete()` reports keys the second side is missing, `haveNoOrphans()` the
|
|
69
|
+
* reverse, and `beBijective()` both. A builder with fewer than two sides has
|
|
70
|
+
* compared nothing, and `examinedUnits()` reports that as zero rather than
|
|
71
|
+
* letting it pass vacuously (ADR-010).
|
|
72
|
+
*/
|
|
73
|
+
export class CrossProjectBuilder extends TerminalBuilder {
|
|
74
|
+
_sides = [];
|
|
75
|
+
_checkComplete = false;
|
|
76
|
+
_checkNoOrphans = false;
|
|
77
|
+
_expectEmptySides = new Set();
|
|
78
|
+
_distinctKeys = new Set();
|
|
79
|
+
// `_project` is accepted for API symmetry with the other entry points
|
|
80
|
+
// (modules/classes/…); crossProject's sides carry their own project.
|
|
81
|
+
constructor(_project) {
|
|
82
|
+
super();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Declare one side of the pairing.
|
|
86
|
+
*
|
|
87
|
+
* `source` is either a `RuleBuilder` selection — in which case `keyFn` is
|
|
88
|
+
* REQUIRED, because a subject has no inherent key and guessing one silently
|
|
89
|
+
* mis-joins the two sides — or a ready-made key source.
|
|
90
|
+
*
|
|
91
|
+
* Call it twice; a builder with fewer than two sides has compared nothing,
|
|
92
|
+
* which `examinedUnits()` reports as zero rather than passing vacuously.
|
|
93
|
+
*/
|
|
94
|
+
side(name, source, keyFn) {
|
|
95
|
+
const next = this.copy();
|
|
96
|
+
if (source instanceof RuleBuilder) {
|
|
97
|
+
if (!keyFn) {
|
|
98
|
+
throw new TypeError(`crossProject side '${name}' from a selection requires a keyFn (subject -> key).`);
|
|
99
|
+
}
|
|
100
|
+
next._sides.push({ name, materialize: () => keyedFromSelection(source, keyFn) });
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
next._sides.push({ name, materialize: () => keyedFromKeys(source) });
|
|
104
|
+
}
|
|
105
|
+
return next;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* An independent copy, carrying the sides and both opt-out sets.
|
|
109
|
+
*
|
|
110
|
+
* `collectViolations` throws unless there are exactly two sides, so a leaked
|
|
111
|
+
* `_sides` push does not fail silently here — but a leaked declaration does:
|
|
112
|
+
* it is what stands between a vacuous side and a finding, and inheriting it
|
|
113
|
+
* turns a later rule's empty side green.
|
|
114
|
+
*/
|
|
115
|
+
copy() {
|
|
116
|
+
const clone = super.copy();
|
|
117
|
+
clone._sides = [...this._sides];
|
|
118
|
+
clone._expectEmptySides = new Set(this._expectEmptySides);
|
|
119
|
+
clone._distinctKeys = new Set(this._distinctKeys);
|
|
120
|
+
return clone;
|
|
121
|
+
}
|
|
122
|
+
/** Optional readability markers — the assertion terminals may be called directly. */
|
|
123
|
+
should() {
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Reads as English between two conditions (`.beComplete().andShould()…`) and
|
|
128
|
+
* changes nothing — the builder is already in its condition phase.
|
|
129
|
+
*/
|
|
130
|
+
andShould() {
|
|
131
|
+
return this;
|
|
132
|
+
}
|
|
133
|
+
/** Every key of the first side must have a match in the second (A ⊆ B). */
|
|
134
|
+
beComplete() {
|
|
135
|
+
const next = this.copy();
|
|
136
|
+
next._checkComplete = true;
|
|
137
|
+
return next;
|
|
138
|
+
}
|
|
139
|
+
/** Every key of the second side must have a source in the first (B ⊆ A). */
|
|
140
|
+
haveNoOrphans() {
|
|
141
|
+
const next = this.copy();
|
|
142
|
+
next._checkNoOrphans = true;
|
|
143
|
+
return next;
|
|
144
|
+
}
|
|
145
|
+
/** Both directions — the two key sets must be identical. */
|
|
146
|
+
beBijective() {
|
|
147
|
+
const next = this.copy();
|
|
148
|
+
next._checkComplete = true;
|
|
149
|
+
next._checkNoOrphans = true;
|
|
150
|
+
return next;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Declare that a NAMED side is empty — plan 0097, replacing `allowEmpty()`.
|
|
154
|
+
*
|
|
155
|
+
* The difference is the whole point, and it is not a rename. `allowEmpty()`
|
|
156
|
+
* PERMITTED a side to be empty and never spoke again: a permanent, silent
|
|
157
|
+
* opt-out that stayed green the day the side filled up and the rule started
|
|
158
|
+
* certifying nothing about it. This ASSERTS the side is empty, and fails the
|
|
159
|
+
* day it stops being — an intent that expires and reports itself, which is
|
|
160
|
+
* the property ADR-010 part 3 requires of every declaration. Plan 0069's
|
|
161
|
+
* appendix rejected the permanent form for the rule family with receipts; a
|
|
162
|
+
* sibling family had it shipped and documented.
|
|
163
|
+
*
|
|
164
|
+
* **The zero-argument form throws here**, and that is the correction of a
|
|
165
|
+
* defect this method shipped with. The parameter has to be optional — a
|
|
166
|
+
* required one is not a valid override of `TerminalBuilder`'s zero-arg
|
|
167
|
+
* `expectEmpty()` — but the OVERRIDE VALIDITY argument justifies the
|
|
168
|
+
* signature, not the semantics. Inheriting the base meaning gave
|
|
169
|
+
* `crossProject().expectEmpty()` a whole-rule flag that suppressed the
|
|
170
|
+
* empty-side finding for BOTH sides and that the expiry branch never read:
|
|
171
|
+
* `allowEmpty` restored, permanent and silent, in fewer characters than
|
|
172
|
+
* before, on the release that deleted it. Measured green over two populated
|
|
173
|
+
* sides, forever.
|
|
174
|
+
*
|
|
175
|
+
* A crossProject compares two named sides, so "this rule is empty" has no
|
|
176
|
+
* meaning that is not per-side. Refusing at build time is the same answer
|
|
177
|
+
* this class already gives a contradiction, and it is loud where the
|
|
178
|
+
* inherited semantics were silent.
|
|
179
|
+
*/
|
|
180
|
+
expectEmpty(side) {
|
|
181
|
+
if (side === undefined) {
|
|
182
|
+
throw new TypeError('crossProject() declares emptiness per side: call .expectEmpty(sideName) for each side ' +
|
|
183
|
+
'you expect to be empty. A crossProject compares two named sides, so a whole-rule ' +
|
|
184
|
+
'declaration would suppress both and expire on neither.');
|
|
185
|
+
}
|
|
186
|
+
const next = this.copy();
|
|
187
|
+
next._expectEmptySides.add(side);
|
|
188
|
+
return next;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Units this rule examined — plan 0096: the keys of both sides, summed.
|
|
192
|
+
*
|
|
193
|
+
* Zero means the comparison had nothing to compare, which for this family is
|
|
194
|
+
* two empty sides. One empty side is already its own finding and is not this
|
|
195
|
+
* question.
|
|
196
|
+
*/
|
|
197
|
+
/**
|
|
198
|
+
* This family counts keys — the keys of both sides, summed.
|
|
199
|
+
*
|
|
200
|
+
* Plan 0099: `CollectResult.examined` is unit-typed per family (ADR-009 part
|
|
201
|
+
* 1), and the zero-examined message prints the noun. Inheriting the base
|
|
202
|
+
* `'subjects'` is a category error in a sentence whose whole job is naming what
|
|
203
|
+
* was and was not looked at.
|
|
204
|
+
*/
|
|
205
|
+
examinedUnitNoun() {
|
|
206
|
+
return 'keys';
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* How many units this rule actually examined — ADR-010's evidence that a pass
|
|
210
|
+
* was constructed rather than defaulted.
|
|
211
|
+
*
|
|
212
|
+
* Both materialized sides, summed — zero until two sides are declared, which is itself the evidence that nothing was compared.
|
|
213
|
+
*/
|
|
214
|
+
examinedUnits() {
|
|
215
|
+
const [first, second] = this._sides;
|
|
216
|
+
// Zero is the honest answer for an under-declared pairing: nothing was
|
|
217
|
+
// compared, and ADR-010 wants that visible rather than defaulted away.
|
|
218
|
+
if (first === undefined || second === undefined)
|
|
219
|
+
return 0;
|
|
220
|
+
const [a, b] = materializeSides(this, first, second);
|
|
221
|
+
return a.size + b.size;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Declared when EVERY side is — plan 0097.
|
|
225
|
+
*
|
|
226
|
+
* The base implementation reads the whole-rule flag, which this class refuses
|
|
227
|
+
* to let anyone set. Without this override, 0098's floor would red a rule
|
|
228
|
+
* whose every side the author declared, with a finding telling them to
|
|
229
|
+
* declare. The per-side loop in `collectViolations` does not need this — its
|
|
230
|
+
* membership test covers each side directly — which is exactly why the
|
|
231
|
+
* previous private version was dead code and was removed. This one is for
|
|
232
|
+
* the root, which asks the question about the rule rather than about a side.
|
|
233
|
+
*
|
|
234
|
+
* **This was recorded as unobservable-until-0098, and that equivalence EXPIRED**
|
|
235
|
+
* the moment plan 0096 made `diagnose()` its first reader. Reverting this
|
|
236
|
+
* override to the base body — which for this class can never be true, since the
|
|
237
|
+
* zero-arg `expectEmpty()` throws — makes a rule whose every side is declared
|
|
238
|
+
* report `zero-subjects` again, telling the author to declare what they
|
|
239
|
+
* declared. A recorded equivalence is a claim with a lifetime, and this one's
|
|
240
|
+
* ended one commit after it was written; it is guarded now.
|
|
241
|
+
*/
|
|
242
|
+
emptyDeclarationAdvice() {
|
|
243
|
+
return '.expectEmpty(sideName) for each side';
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Whether the author declared this rule's empty result intentional.
|
|
247
|
+
*
|
|
248
|
+
* Overrides `TerminalBuilder`'s `.expectEmpty()` reading, because this builder
|
|
249
|
+
* has more than one side and each can be declared empty independently.
|
|
250
|
+
*/
|
|
251
|
+
declaresEmpty() {
|
|
252
|
+
return this._sides.length > 0 && this._sides.every((s) => this._expectEmptySides.has(s.name));
|
|
253
|
+
}
|
|
254
|
+
/** Fail if a side maps two distinct subjects to one key (over-normalization guard). */
|
|
255
|
+
distinctKeysOn(sideName) {
|
|
256
|
+
const next = this.copy();
|
|
257
|
+
next._distinctKeys.add(sideName);
|
|
258
|
+
return next;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Wrong arity counts as asserting nothing, **whatever assertion was chosen**.
|
|
262
|
+
*
|
|
263
|
+
* `.beComplete()` on a one-sided crossProject cannot assert anything: there
|
|
264
|
+
* is no second side to compare against, so the call is a claim about a
|
|
265
|
+
* comparison that does not exist. Reading only the assertion flags let that
|
|
266
|
+
* pair through the gate and into `collectViolations()`, where the arity check
|
|
267
|
+
* throws a `RangeError` — and until bug 0025 that error escaped the CLI and
|
|
268
|
+
* dropped every remaining rule file's findings.
|
|
269
|
+
*
|
|
270
|
+
* So the same fault now reports the same way whether or not an assertion was
|
|
271
|
+
* chosen, and `assertionAdvice()` below already names the right remedy for it
|
|
272
|
+
* (another `.side(...)`, never `.beComplete()`). The arity throw stays as an
|
|
273
|
+
* invariant on `collectViolations()`, unreachable through the terminals.
|
|
274
|
+
*/
|
|
275
|
+
assertsSomething() {
|
|
276
|
+
return this._sides.length === 2 && (this._checkComplete || this._checkNoOrphans);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* The remedy for this builder's assertion-less state, as one string.
|
|
280
|
+
*
|
|
281
|
+
* One channel, so `diagnose()`'s advice and the finding's own message cannot
|
|
282
|
+
* disagree. Overrides `TerminalBuilder`'s generic text with wording specific to
|
|
283
|
+
* what this builder is missing.
|
|
284
|
+
*/
|
|
285
|
+
assertionAdvice() {
|
|
286
|
+
// Two distinct faults reach here, and naming the wrong one is the ADR-008
|
|
287
|
+
// rule 2 defect this plan is partly about: with fewer than two sides the
|
|
288
|
+
// fix is another `.side(...)`, not an assertion — adding `.beComplete()`
|
|
289
|
+
// would leave the rule exactly as broken (measured in review).
|
|
290
|
+
if (this._sides.length !== 2) {
|
|
291
|
+
return (`this crossProject has ${String(this._sides.length)} side(s) and needs exactly two, ` +
|
|
292
|
+
'so it compares nothing. Add the missing .side(name, ...) call.');
|
|
293
|
+
}
|
|
294
|
+
return 'this crossProject asserts nothing: call .beComplete(), .haveNoOrphans(), or .beBijective().';
|
|
295
|
+
}
|
|
296
|
+
/** Named by id or by its sides, not 'unnamed' (plan 0070 §4). */
|
|
297
|
+
describeRule() {
|
|
298
|
+
const sides = this._sides.map((side) => side.name).join(' <-> ');
|
|
299
|
+
return {
|
|
300
|
+
...super.describeRule(),
|
|
301
|
+
rule: this._metadata?.id ?? (sides ? `crossProject [${sides}]` : 'crossProject'),
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/** What this rule declared, as a value the findings functions can read. */
|
|
305
|
+
declared() {
|
|
306
|
+
return {
|
|
307
|
+
sides: this._sides,
|
|
308
|
+
distinctKeys: this._distinctKeys,
|
|
309
|
+
expectEmptySides: this._expectEmptySides,
|
|
310
|
+
checkComplete: this._checkComplete,
|
|
311
|
+
checkNoOrphans: this._checkNoOrphans,
|
|
312
|
+
metadata: this._metadata,
|
|
313
|
+
reason: this._reason,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
/** Materialize both sides and pair their keys — the input every finding reads. */
|
|
317
|
+
pairingFor(sideA, sideB, meta) {
|
|
318
|
+
const [aKeyed, bKeyed] = materializeSides(this, sideA, sideB);
|
|
319
|
+
return {
|
|
320
|
+
sideA,
|
|
321
|
+
sideB,
|
|
322
|
+
aKeyed,
|
|
323
|
+
bKeyed,
|
|
324
|
+
result: setCorrespondence(aKeyed.keys(), bKeyed.keys()),
|
|
325
|
+
meta,
|
|
326
|
+
declared: this.declared(),
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
collectViolations() {
|
|
330
|
+
const { sideA, sideB, meta } = resolveSides(this._sides, this._reason, this._metadata);
|
|
331
|
+
const unbound = unboundDeclarationFindings(this.declared(), sideA, sideB);
|
|
332
|
+
// A configuration fault: the sides were never materialized, so nothing was
|
|
333
|
+
// examined. Plan 0098 — 0 here is the honest number, not a placeholder.
|
|
334
|
+
if (unbound.length > 0)
|
|
335
|
+
return { violations: unbound, examined: 0 };
|
|
336
|
+
const pairing = this.pairingFor(sideA, sideB, meta);
|
|
337
|
+
// Emptiness first: a side that resolved nothing makes every later question
|
|
338
|
+
// vacuous, so its finding replaces them rather than joining them.
|
|
339
|
+
const { emptyFindings, falseDeclarations } = emptinessFindings(pairing);
|
|
340
|
+
if (emptyFindings.length > 0) {
|
|
341
|
+
return {
|
|
342
|
+
violations: [...emptyFindings, ...falseDeclarations],
|
|
343
|
+
examined: this.examinedUnits(),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
violations: [
|
|
348
|
+
...falseDeclarations,
|
|
349
|
+
...matchFindings(pairing),
|
|
350
|
+
...duplicateKeyFindings(pairing),
|
|
351
|
+
],
|
|
352
|
+
examined: this.examinedUnits(),
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Entry point: assert a correspondence between two independently-derived key
|
|
358
|
+
* sets. Call `.side(...)` twice, then an assertion terminal.
|
|
359
|
+
*/
|
|
360
|
+
export function crossProject(p) {
|
|
361
|
+
return new CrossProjectBuilder(p);
|
|
362
|
+
}
|
|
363
|
+
// --- keyFn vocabulary (the common cases; keyFn stays a raw escape hatch) ---
|
|
364
|
+
/** Key a subject by its name (`getName()`); anonymous subjects fall back to `<anonymous>`. */
|
|
365
|
+
export function byName() {
|
|
366
|
+
return (subject) => subject.getName() ?? '<anonymous>';
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Key a call-like subject by its argument at `index`. String/template literal
|
|
370
|
+
* arguments are unquoted so keys match plain sides (e.g. `Object.keys(map)`) —
|
|
371
|
+
* `app.get("/x", …)` keys as `/x`, not `"/x"`. Non-literal args key by raw text.
|
|
372
|
+
*/
|
|
373
|
+
export function byArg(index) {
|
|
374
|
+
return (subject) => {
|
|
375
|
+
const arg = subject.getArguments()[index];
|
|
376
|
+
return arg ? unquote(arg.getText()) : '<no-arg>';
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
/** Strip a single pair of matching surrounding quotes/backticks, if present. */
|
|
380
|
+
function unquote(text) {
|
|
381
|
+
const first = text[0];
|
|
382
|
+
if ((first === '"' || first === "'" || first === '`') &&
|
|
383
|
+
text.length >= 2 &&
|
|
384
|
+
text.endsWith(first)) {
|
|
385
|
+
return text.slice(1, -1);
|
|
386
|
+
}
|
|
387
|
+
return text;
|
|
388
|
+
}
|
|
389
|
+
/** Key a type-like subject by each of its property names (one subject → many keys). */
|
|
390
|
+
export function byPropertyNames() {
|
|
391
|
+
return (subject) => subject.getProperties().map((property) => property.getName());
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=correspondence-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correspondence-builder.js","sourceRoot":"","sources":["../../src/builders/correspondence-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { ArchViolation } from '@nielspeter/eess';
|
|
2
|
+
import type { Declared, Pairing, Side } from './correspondence-builder.js';
|
|
3
|
+
export interface ViolationMeta {
|
|
4
|
+
readonly rule: string;
|
|
5
|
+
readonly because?: string;
|
|
6
|
+
readonly ruleId?: string;
|
|
7
|
+
readonly suggestion?: string;
|
|
8
|
+
readonly docs?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Declarations — `.expectEmpty(name)` / `.withDistinctKeys(name)` — that name a
|
|
12
|
+
* side this crossProject does not have.
|
|
13
|
+
*
|
|
14
|
+
* A declaration that binds to no side is a configuration finding, not a no-op
|
|
15
|
+
* (plan 0097, correcting the same defect the shipped version had).
|
|
16
|
+
* `.expectEmpty('servcies')` was accepted silently and asserted nothing
|
|
17
|
+
* forever: the exact hazard this class's own docstring rejects the permanent
|
|
18
|
+
* form for ("one word, silent forever, TYPO OR NOT, and nothing revisits it"),
|
|
19
|
+
* inherited whole by the replacement.
|
|
20
|
+
*
|
|
21
|
+
* ADR-010 part 3 already ruled the structurally identical preset case — a
|
|
22
|
+
* declaration binding to no constructed rule is a FAILING finding, never a
|
|
23
|
+
* warning — so this follows settled precedent rather than deciding anew.
|
|
24
|
+
*
|
|
25
|
+
* Here rather than in the setter: `.expectEmpty(name)` may legally precede
|
|
26
|
+
* `.side(name, …)`, so the setter cannot know yet.
|
|
27
|
+
*
|
|
28
|
+
* A Set, not a concatenation: a name in BOTH sets produced two findings with
|
|
29
|
+
* identical element, message, file and line — the identity shape bugs 0064,
|
|
30
|
+
* 0065 and 0067 were filed for. And membership is tested against the side LIST
|
|
31
|
+
* rather than two name comparisons, so it cannot rot if arity ever changes.
|
|
32
|
+
*/
|
|
33
|
+
export declare function unboundDeclarationFindings(declared: Declared, sideA: Side, sideB: Side): ArchViolation[];
|
|
34
|
+
/**
|
|
35
|
+
* Findings about each side being empty, and about a declaration that says so
|
|
36
|
+
* while the side is not.
|
|
37
|
+
*/
|
|
38
|
+
export declare function emptinessFindings(p: Pairing): {
|
|
39
|
+
emptyFindings: ArchViolation[];
|
|
40
|
+
falseDeclarations: ArchViolation[];
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Findings from the pairing itself — keys on one side with no partner
|
|
44
|
+
* on the other, in whichever directions the rule asked about.
|
|
45
|
+
*/
|
|
46
|
+
export declare function matchFindings(p: Pairing): ArchViolation[];
|
|
47
|
+
/**
|
|
48
|
+
* Findings for a side whose key function maps several distinct subjects onto
|
|
49
|
+
* one key — over-normalization can mask a real mismatch.
|
|
50
|
+
*/
|
|
51
|
+
export declare function duplicateKeyFindings(p: Pairing): ArchViolation[];
|
|
52
|
+
/**
|
|
53
|
+
* Run the pairing and collect its findings, in four phases:
|
|
54
|
+
* unbound declarations, emptiness, the match itself, then duplicate keys.
|
|
55
|
+
*
|
|
56
|
+
* ## The arity throw is an invariant, not an error path
|
|
57
|
+
*
|
|
58
|
+
* Unreachable through `.check()` / `.warn()` / `.violations()` as of the
|
|
59
|
+
* bug-0025 fix: `assertsSomething()` is false for wrong arity, so the gate
|
|
60
|
+
* reports it as a configuration finding before this method is called. Kept as
|
|
61
|
+
* the invariant it always was — this method indexes `_sides[0]` and
|
|
62
|
+
* `_sides[1]` below, and a direct subclass caller deserves the named error
|
|
63
|
+
* rather than an undefined read. Do not treat it as the answer to "what
|
|
64
|
+
* happens with the wrong number of sides": the loud answer is the gate, and if
|
|
65
|
+
* this ever throws again through a terminal, the gate is gone.
|
|
66
|
+
*
|
|
67
|
+
* There is deliberately NO missing-assertion throw: the gate reports that as a
|
|
68
|
+
* configuration finding before this runs (bug 0019), which is why the gate sits
|
|
69
|
+
* ahead of this method — a `RangeError` from here escaped the CLI's
|
|
70
|
+
* `ArchRuleError`-only catch and dropped every remaining rule file. The
|
|
71
|
+
* sides-count check stays, because wrong arity is a different fault from a
|
|
72
|
+
* missing assertion and its remedy is another `.side(...)`.
|
|
73
|
+
*/
|
|
74
|
+
/**
|
|
75
|
+
* The two sides and the metadata every finding from them carries.
|
|
76
|
+
*
|
|
77
|
+
* Extracted so `collectViolations` reads as the decision sequence it is —
|
|
78
|
+
* unbound, then emptiness, then matching — rather than opening with a guard
|
|
79
|
+
* and a literal. The arity check lives here because it is the precondition
|
|
80
|
+
* for the metadata: the rule name is built from both side names.
|
|
81
|
+
*/
|
|
82
|
+
export declare function resolveSides(sides: readonly Side[], reason: string | undefined, metadata: {
|
|
83
|
+
id?: string;
|
|
84
|
+
suggestion?: string;
|
|
85
|
+
docs?: string;
|
|
86
|
+
} | undefined): {
|
|
87
|
+
sideA: Side;
|
|
88
|
+
sideB: Side;
|
|
89
|
+
meta: ViolationMeta;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Both sides, materialized once — plan 0096, and the ONE method both readers
|
|
93
|
+
* call.
|
|
94
|
+
*
|
|
95
|
+
* CrossProject has no corpus of its own: its sides ARE its input, so the
|
|
96
|
+
* examined unit is their keys and the "selection" is the materialization
|
|
97
|
+
* itself. Sharing it matters more here than anywhere else, because
|
|
98
|
+
* `Side.materialize` is a bare closure over a user-supplied `keyFn` and a full
|
|
99
|
+
* rule selection — so a second derivation would re-run arbitrary user code,
|
|
100
|
+
* and `diagnose()` calling the accessor before `check()` would pay for the
|
|
101
|
+
* whole thing twice.
|
|
102
|
+
*/
|
|
103
|
+
export declare function materializeSides(owner: object, a: Side, b: Side): [Map<string, unknown[]>, Map<string, unknown[]>];
|
|
104
|
+
//# sourceMappingURL=correspondence-findings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"correspondence-findings.d.ts","sourceRoot":"","sources":["../../src/builders/correspondence-findings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAyB1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CACvB;AAoJD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,IAAI,GACV,aAAa,EAAE,CAOjB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG;IAC7C,aAAa,EAAE,aAAa,EAAE,CAAA;IAC9B,iBAAiB,EAAE,aAAa,EAAE,CAAA;CACnC,CA2BA;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,EAAE,CAsBzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,GAAG,aAAa,EAAE,CA8BhE;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACxE;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAkBnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,IAAI,EACP,CAAC,EAAE,IAAI,GACN,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAclD"}
|