@nielspeter/eess-ts 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -34
- package/dist/builders/call-rule-builder.d.ts +66 -26
- package/dist/builders/call-rule-builder.d.ts.map +1 -1
- package/dist/builders/call-rule-builder.js +73 -31
- package/dist/builders/call-rule-builder.js.map +1 -1
- package/dist/builders/class-rule-builder.d.ts +125 -26
- package/dist/builders/class-rule-builder.d.ts.map +1 -1
- package/dist/builders/class-rule-builder.js +134 -30
- package/dist/builders/class-rule-builder.js.map +1 -1
- package/dist/builders/correspondence-builder.d.ts +287 -0
- package/dist/builders/correspondence-builder.d.ts.map +1 -0
- package/dist/builders/correspondence-builder.js +393 -0
- package/dist/builders/correspondence-builder.js.map +1 -0
- package/dist/builders/correspondence-findings.d.ts +104 -0
- package/dist/builders/correspondence-findings.d.ts.map +1 -0
- package/dist/builders/correspondence-findings.js +301 -0
- package/dist/builders/correspondence-findings.js.map +1 -0
- package/dist/builders/cross-layer-builder.d.ts +99 -16
- package/dist/builders/cross-layer-builder.d.ts.map +1 -1
- package/dist/builders/cross-layer-builder.js +181 -35
- package/dist/builders/cross-layer-builder.js.map +1 -1
- package/dist/builders/function-rule-builder.d.ts +144 -25
- package/dist/builders/function-rule-builder.d.ts.map +1 -1
- package/dist/builders/function-rule-builder.js +173 -26
- package/dist/builders/function-rule-builder.js.map +1 -1
- package/dist/builders/jsx-rule-builder.d.ts +70 -14
- package/dist/builders/jsx-rule-builder.d.ts.map +1 -1
- package/dist/builders/jsx-rule-builder.js +73 -14
- package/dist/builders/jsx-rule-builder.js.map +1 -1
- package/dist/builders/module-rule-builder.d.ts +2 -2
- package/dist/builders/module-rule-builder.d.ts.map +1 -1
- package/dist/builders/module-rule-builder.js +12 -3
- package/dist/builders/module-rule-builder.js.map +1 -1
- package/dist/builders/scoped-function-rule-builder.d.ts +11 -0
- package/dist/builders/scoped-function-rule-builder.d.ts.map +1 -1
- package/dist/builders/scoped-function-rule-builder.js +12 -0
- package/dist/builders/scoped-function-rule-builder.js.map +1 -1
- package/dist/builders/slice-discovery-message.d.ts +36 -0
- package/dist/builders/slice-discovery-message.d.ts.map +1 -0
- package/dist/builders/slice-discovery-message.js +181 -0
- package/dist/builders/slice-discovery-message.js.map +1 -0
- package/dist/builders/slice-rule-builder.d.ts +151 -12
- package/dist/builders/slice-rule-builder.d.ts.map +1 -1
- package/dist/builders/slice-rule-builder.js +242 -35
- package/dist/builders/slice-rule-builder.js.map +1 -1
- package/dist/builders/type-rule-builder.d.ts +95 -24
- package/dist/builders/type-rule-builder.d.ts.map +1 -1
- package/dist/builders/type-rule-builder.js +105 -29
- package/dist/builders/type-rule-builder.js.map +1 -1
- package/dist/{helpers → builders}/within.d.ts +2 -2
- package/dist/builders/within.d.ts.map +1 -0
- package/dist/{helpers → builders}/within.js +1 -1
- package/dist/builders/within.js.map +1 -0
- package/dist/cli/commands/baseline.d.ts +3 -2
- package/dist/cli/commands/baseline.d.ts.map +1 -1
- package/dist/cli/commands/baseline.js +68 -6
- package/dist/cli/commands/baseline.js.map +1 -1
- package/dist/cli/commands/check.d.ts +7 -2
- package/dist/cli/commands/check.d.ts.map +1 -1
- package/dist/cli/commands/check.js +241 -45
- package/dist/cli/commands/check.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts +29 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +224 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +2 -1
- package/dist/cli/commands/explain.d.ts.map +1 -1
- package/dist/cli/commands/explain.js +19 -10
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/init.d.ts +9 -3
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +162 -137
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/import-rule-module.d.ts +29 -0
- package/dist/cli/import-rule-module.d.ts.map +1 -0
- package/dist/cli/import-rule-module.js +60 -0
- package/dist/cli/import-rule-module.js.map +1 -0
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +98 -33
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/load-rules.d.ts +6 -11
- package/dist/cli/load-rules.d.ts.map +1 -1
- package/dist/cli/load-rules.js +21 -29
- package/dist/cli/load-rules.js.map +1 -1
- package/dist/cli/resolve-config.d.ts.map +1 -1
- package/dist/cli/resolve-config.js +24 -14
- package/dist/cli/resolve-config.js.map +1 -1
- package/dist/cli/rule-file-findings.d.ts +178 -0
- package/dist/cli/rule-file-findings.d.ts.map +1 -0
- package/dist/cli/rule-file-findings.js +293 -0
- package/dist/cli/rule-file-findings.js.map +1 -0
- package/dist/cli/watch.d.ts +20 -7
- package/dist/cli/watch.d.ts.map +1 -1
- package/dist/cli/watch.js +39 -14
- package/dist/cli/watch.js.map +1 -1
- package/dist/conditions/body-analysis-function.d.ts.map +1 -1
- package/dist/conditions/body-analysis-function.js +16 -7
- package/dist/conditions/body-analysis-function.js.map +1 -1
- package/dist/conditions/body-analysis-module.d.ts.map +1 -1
- package/dist/conditions/body-analysis-module.js +14 -9
- package/dist/conditions/body-analysis-module.js.map +1 -1
- package/dist/conditions/body-analysis.d.ts.map +1 -1
- package/dist/conditions/body-analysis.js +16 -7
- package/dist/conditions/body-analysis.js.map +1 -1
- package/dist/conditions/call.d.ts.map +1 -1
- package/dist/conditions/call.js +38 -17
- package/dist/conditions/call.js.map +1 -1
- package/dist/conditions/catch-analysis.d.ts +2 -1
- package/dist/conditions/catch-analysis.d.ts.map +1 -1
- package/dist/conditions/catch-analysis.js.map +1 -1
- package/dist/conditions/cross-layer.d.ts +2 -10
- package/dist/conditions/cross-layer.d.ts.map +1 -1
- package/dist/conditions/cross-layer.js +227 -23
- package/dist/conditions/cross-layer.js.map +1 -1
- package/dist/conditions/dependency.d.ts +35 -6
- package/dist/conditions/dependency.d.ts.map +1 -1
- package/dist/conditions/dependency.js +299 -45
- package/dist/conditions/dependency.js.map +1 -1
- package/dist/conditions/exports.d.ts.map +1 -1
- package/dist/conditions/exports.js +10 -0
- package/dist/conditions/exports.js.map +1 -1
- package/dist/conditions/function.d.ts.map +1 -1
- package/dist/conditions/function.js +19 -5
- package/dist/conditions/function.js.map +1 -1
- package/dist/conditions/helpers.d.ts +2 -1
- package/dist/conditions/helpers.d.ts.map +1 -1
- package/dist/conditions/helpers.js +4 -1
- package/dist/conditions/helpers.js.map +1 -1
- package/dist/conditions/jsx.d.ts.map +1 -1
- package/dist/conditions/jsx.js +7 -2
- package/dist/conditions/jsx.js.map +1 -1
- package/dist/conditions/match-identity.d.ts +43 -0
- package/dist/conditions/match-identity.d.ts.map +1 -0
- package/dist/conditions/match-identity.js +43 -0
- package/dist/conditions/match-identity.js.map +1 -0
- package/dist/conditions/members.d.ts.map +1 -1
- package/dist/conditions/members.js +17 -4
- package/dist/conditions/members.js.map +1 -1
- package/dist/conditions/reverse-dependency.d.ts +18 -5
- package/dist/conditions/reverse-dependency.d.ts.map +1 -1
- package/dist/conditions/reverse-dependency.js +109 -92
- package/dist/conditions/reverse-dependency.js.map +1 -1
- package/dist/conditions/slice.d.ts +86 -2
- package/dist/conditions/slice.d.ts.map +1 -1
- package/dist/conditions/slice.js +234 -53
- package/dist/conditions/slice.js.map +1 -1
- package/dist/conditions/structural.d.ts.map +1 -1
- package/dist/conditions/structural.js +16 -4
- package/dist/conditions/structural.js.map +1 -1
- package/dist/core/check-all.d.ts +19 -0
- package/dist/core/check-all.d.ts.map +1 -0
- package/dist/core/check-all.js +96 -0
- package/dist/core/check-all.js.map +1 -0
- package/dist/core/combinators.d.ts +48 -0
- package/dist/core/combinators.d.ts.map +1 -0
- package/dist/core/combinators.js +56 -0
- package/dist/core/combinators.js.map +1 -0
- package/dist/core/descendant-cache.d.ts +36 -0
- package/dist/core/descendant-cache.d.ts.map +1 -0
- package/dist/core/descendant-cache.js +119 -0
- package/dist/core/descendant-cache.js.map +1 -0
- package/dist/core/diagnose.d.ts +234 -0
- package/dist/core/diagnose.d.ts.map +1 -0
- package/dist/core/diagnose.js +382 -0
- package/dist/core/diagnose.js.map +1 -0
- package/dist/core/disk-set.d.ts +48 -0
- package/dist/core/disk-set.d.ts.map +1 -0
- package/dist/core/disk-set.js +218 -0
- package/dist/core/disk-set.js.map +1 -0
- package/dist/core/element-cache.d.ts +75 -0
- package/dist/core/element-cache.d.ts.map +1 -0
- package/dist/core/element-cache.js +32 -0
- package/dist/core/element-cache.js.map +1 -0
- package/dist/core/empty-project-advice.d.ts +75 -0
- package/dist/core/empty-project-advice.d.ts.map +1 -0
- package/dist/core/empty-project-advice.js +61 -0
- package/dist/core/empty-project-advice.js.map +1 -0
- package/dist/core/exclusion-comments.d.ts +54 -0
- package/dist/core/exclusion-comments.d.ts.map +1 -0
- package/dist/core/exclusion-comments.js +310 -0
- package/dist/core/exclusion-comments.js.map +1 -0
- package/dist/core/execute-rule.d.ts +150 -0
- package/dist/core/execute-rule.d.ts.map +1 -0
- package/dist/core/execute-rule.js +580 -0
- package/dist/core/execute-rule.js.map +1 -0
- package/dist/core/glob-diagnosis.d.ts +78 -0
- package/dist/core/glob-diagnosis.d.ts.map +1 -0
- package/dist/core/glob-diagnosis.js +134 -0
- package/dist/core/glob-diagnosis.js.map +1 -0
- package/dist/core/glob-evaluator.d.ts +48 -0
- package/dist/core/glob-evaluator.d.ts.map +1 -0
- package/dist/core/glob-evaluator.js +89 -0
- package/dist/core/glob-evaluator.js.map +1 -0
- package/dist/core/import-candidates.d.ts +60 -0
- package/dist/core/import-candidates.d.ts.map +1 -0
- package/dist/core/import-candidates.js +93 -0
- package/dist/core/import-candidates.js.map +1 -0
- package/dist/core/import-options.d.ts +55 -2
- package/dist/core/import-options.d.ts.map +1 -1
- package/dist/core/import-options.js +64 -0
- package/dist/core/import-options.js.map +1 -1
- package/dist/core/line-index.d.ts +3 -0
- package/dist/core/line-index.d.ts.map +1 -0
- package/dist/core/line-index.js +229 -0
- package/dist/core/line-index.js.map +1 -0
- package/dist/core/metric-violation.d.ts +86 -0
- package/dist/core/metric-violation.d.ts.map +1 -0
- package/dist/core/metric-violation.js +132 -0
- package/dist/core/metric-violation.js.map +1 -0
- package/dist/core/module-edges.d.ts +361 -0
- package/dist/core/module-edges.d.ts.map +1 -0
- package/dist/core/module-edges.js +592 -0
- package/dist/core/module-edges.js.map +1 -0
- package/dist/core/object-literal-functions.d.ts +42 -0
- package/dist/core/object-literal-functions.d.ts.map +1 -0
- package/dist/core/object-literal-functions.js +75 -0
- package/dist/core/object-literal-functions.js.map +1 -0
- package/dist/core/orphan-exclusions.d.ts +44 -0
- package/dist/core/orphan-exclusions.d.ts.map +1 -0
- package/dist/core/orphan-exclusions.js +214 -0
- package/dist/core/orphan-exclusions.js.map +1 -0
- package/dist/core/pair-condition.d.ts +32 -3
- package/dist/core/pair-condition.d.ts.map +1 -1
- package/dist/core/path-universe.d.ts +54 -0
- package/dist/core/path-universe.d.ts.map +1 -0
- package/dist/core/path-universe.js +65 -0
- package/dist/core/path-universe.js.map +1 -0
- package/dist/core/per-root-compiler-options.d.ts +20 -0
- package/dist/core/per-root-compiler-options.d.ts.map +1 -0
- package/dist/core/per-root-compiler-options.js +57 -0
- package/dist/core/per-root-compiler-options.js.map +1 -0
- package/dist/core/project-relative.d.ts +98 -0
- package/dist/core/project-relative.d.ts.map +1 -0
- package/dist/core/project-relative.js +185 -0
- package/dist/core/project-relative.js.map +1 -0
- package/dist/core/project.d.ts +7 -1
- package/dist/core/project.d.ts.map +1 -1
- package/dist/core/project.js +24 -0
- package/dist/core/project.js.map +1 -1
- package/dist/core/rule-builder.d.ts +282 -0
- package/dist/core/rule-builder.d.ts.map +1 -0
- package/dist/core/rule-builder.js +445 -0
- package/dist/core/rule-builder.js.map +1 -0
- package/dist/core/rule-declaration.d.ts +32 -0
- package/dist/core/rule-declaration.d.ts.map +1 -0
- package/dist/core/rule-declaration.js +126 -0
- package/dist/core/rule-declaration.js.map +1 -0
- package/dist/core/terminal-builder.d.ts +625 -0
- package/dist/core/terminal-builder.d.ts.map +1 -0
- package/dist/core/terminal-builder.js +787 -0
- package/dist/core/terminal-builder.js.map +1 -0
- package/dist/core/terminal-execution.d.ts +23 -0
- package/dist/core/terminal-execution.d.ts.map +1 -0
- package/dist/core/terminal-execution.js +71 -0
- package/dist/core/terminal-execution.js.map +1 -0
- package/dist/core/vacuity-diagnosis.d.ts +103 -0
- package/dist/core/vacuity-diagnosis.d.ts.map +1 -0
- package/dist/core/vacuity-diagnosis.js +415 -0
- package/dist/core/vacuity-diagnosis.js.map +1 -0
- package/dist/core/violation.d.ts +16 -11
- package/dist/core/violation.d.ts.map +1 -1
- package/dist/core/violation.js +33 -13
- package/dist/core/violation.js.map +1 -1
- package/dist/graphql/index.js +1 -1
- package/dist/graphql/index.js.map +1 -1
- package/dist/graphql/resolver-rule-builder.d.ts +98 -23
- package/dist/graphql/resolver-rule-builder.d.ts.map +1 -1
- package/dist/graphql/resolver-rule-builder.js +151 -21
- package/dist/graphql/resolver-rule-builder.js.map +1 -1
- package/dist/graphql/schema-loader.d.ts +21 -0
- package/dist/graphql/schema-loader.d.ts.map +1 -1
- package/dist/graphql/schema-loader.js +81 -12
- package/dist/graphql/schema-loader.js.map +1 -1
- package/dist/graphql/schema-rule-builder.d.ts +57 -20
- package/dist/graphql/schema-rule-builder.d.ts.map +1 -1
- package/dist/graphql/schema-rule-builder.js +101 -25
- package/dist/graphql/schema-rule-builder.js.map +1 -1
- package/dist/helpers/baseline-diagnostics.d.ts +45 -0
- package/dist/helpers/baseline-diagnostics.d.ts.map +1 -0
- package/dist/helpers/baseline-diagnostics.js +168 -0
- package/dist/helpers/baseline-diagnostics.js.map +1 -0
- package/dist/helpers/baseline-generator.d.ts +19 -0
- package/dist/helpers/baseline-generator.d.ts.map +1 -0
- package/dist/helpers/baseline-generator.js +18 -0
- package/dist/helpers/baseline-generator.js.map +1 -0
- package/dist/helpers/baseline.d.ts +336 -0
- package/dist/helpers/baseline.d.ts.map +1 -0
- package/dist/helpers/baseline.js +664 -0
- package/dist/helpers/baseline.js.map +1 -0
- package/dist/helpers/body-traversal.d.ts +27 -2
- package/dist/helpers/body-traversal.d.ts.map +1 -1
- package/dist/helpers/body-traversal.js +122 -16
- package/dist/helpers/body-traversal.js.map +1 -1
- package/dist/helpers/callback-extractor.d.ts.map +1 -1
- package/dist/helpers/callback-extractor.js +48 -47
- package/dist/helpers/callback-extractor.js.map +1 -1
- package/dist/helpers/complexity.d.ts +13 -5
- package/dist/helpers/complexity.d.ts.map +1 -1
- package/dist/helpers/complexity.js +15 -6
- package/dist/helpers/complexity.js.map +1 -1
- package/dist/helpers/diff-aware.d.ts +44 -0
- package/dist/helpers/diff-aware.d.ts.map +1 -0
- package/dist/helpers/diff-aware.js +84 -0
- package/dist/helpers/diff-aware.js.map +1 -0
- package/dist/helpers/matchers.d.ts +68 -7
- package/dist/helpers/matchers.d.ts.map +1 -1
- package/dist/helpers/matchers.js +114 -20
- package/dist/helpers/matchers.js.map +1 -1
- package/dist/helpers/slice-graph.d.ts +100 -8
- package/dist/helpers/slice-graph.d.ts.map +1 -1
- package/dist/helpers/slice-graph.js +126 -34
- package/dist/helpers/slice-graph.js.map +1 -1
- package/dist/helpers/tarjan.d.ts +0 -14
- package/dist/helpers/tarjan.d.ts.map +1 -1
- package/dist/helpers/tarjan.js +29 -16
- package/dist/helpers/tarjan.js.map +1 -1
- package/dist/index.d.ts +56 -17
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +57 -13
- package/dist/index.js.map +1 -1
- package/dist/models/arch-call.d.ts +3 -2
- package/dist/models/arch-call.d.ts.map +1 -1
- package/dist/models/arch-call.js.map +1 -1
- package/dist/models/arch-function.d.ts +28 -6
- package/dist/models/arch-function.d.ts.map +1 -1
- package/dist/models/arch-function.js +106 -3
- package/dist/models/arch-function.js.map +1 -1
- package/dist/models/arch-jsx-element.js +2 -2
- package/dist/models/arch-jsx-element.js.map +1 -1
- package/dist/models/slice.d.ts +33 -9
- package/dist/models/slice.d.ts.map +1 -1
- package/dist/models/slice.js +129 -19
- package/dist/models/slice.js.map +1 -1
- package/dist/predicates/call.d.ts.map +1 -1
- package/dist/predicates/call.js +5 -0
- package/dist/predicates/call.js.map +1 -1
- package/dist/predicates/identity.d.ts +21 -0
- package/dist/predicates/identity.d.ts.map +1 -1
- package/dist/predicates/identity.js +75 -3
- package/dist/predicates/identity.js.map +1 -1
- package/dist/predicates/index.d.ts +1 -1
- package/dist/predicates/index.d.ts.map +1 -1
- package/dist/predicates/index.js +1 -1
- package/dist/predicates/index.js.map +1 -1
- package/dist/predicates/metrics.d.ts +4 -2
- package/dist/predicates/metrics.d.ts.map +1 -1
- package/dist/predicates/metrics.js +4 -2
- package/dist/predicates/metrics.js.map +1 -1
- package/dist/predicates/module.d.ts +4 -12
- package/dist/predicates/module.d.ts.map +1 -1
- package/dist/predicates/module.js +57 -37
- package/dist/predicates/module.js.map +1 -1
- package/dist/presets/agent-guardrails.d.ts +22 -15
- package/dist/presets/agent-guardrails.d.ts.map +1 -1
- package/dist/presets/agent-guardrails.js +124 -19
- package/dist/presets/agent-guardrails.js.map +1 -1
- package/dist/presets/boundaries.d.ts +45 -2
- package/dist/presets/boundaries.d.ts.map +1 -1
- package/dist/presets/boundaries.js +132 -23
- package/dist/presets/boundaries.js.map +1 -1
- package/dist/presets/data-layer.d.ts +22 -2
- package/dist/presets/data-layer.d.ts.map +1 -1
- package/dist/presets/data-layer.js +58 -16
- package/dist/presets/data-layer.js.map +1 -1
- package/dist/presets/index.d.ts +7 -5
- package/dist/presets/index.d.ts.map +1 -1
- package/dist/presets/index.js +9 -3
- package/dist/presets/index.js.map +1 -1
- package/dist/presets/layered.d.ts +46 -2
- package/dist/presets/layered.d.ts.map +1 -1
- package/dist/presets/layered.js +66 -29
- package/dist/presets/layered.js.map +1 -1
- package/dist/presets/recommended.d.ts +80 -9
- package/dist/presets/recommended.d.ts.map +1 -1
- package/dist/presets/recommended.js +25 -23
- package/dist/presets/recommended.js.map +1 -1
- package/dist/presets/shared.d.ts +270 -2
- package/dist/presets/shared.d.ts.map +1 -1
- package/dist/presets/shared.js +338 -4
- package/dist/presets/shared.js.map +1 -1
- package/dist/rules/code-quality.d.ts.map +1 -1
- package/dist/rules/code-quality.js +15 -6
- package/dist/rules/code-quality.js.map +1 -1
- package/dist/rules/hygiene.d.ts +1 -1
- package/dist/rules/hygiene.js +1 -1
- package/dist/rules/metrics-function.d.ts +2 -1
- package/dist/rules/metrics-function.d.ts.map +1 -1
- package/dist/rules/metrics-function.js +33 -6
- package/dist/rules/metrics-function.js.map +1 -1
- package/dist/rules/metrics.d.ts +2 -1
- package/dist/rules/metrics.d.ts.map +1 -1
- package/dist/rules/metrics.js +39 -9
- package/dist/rules/metrics.js.map +1 -1
- package/dist/smells/duplicate-bodies.d.ts +58 -5
- package/dist/smells/duplicate-bodies.d.ts.map +1 -1
- package/dist/smells/duplicate-bodies.js +137 -56
- package/dist/smells/duplicate-bodies.js.map +1 -1
- package/dist/smells/fingerprint.d.ts +8 -1
- package/dist/smells/fingerprint.d.ts.map +1 -1
- package/dist/smells/fingerprint.js +21 -3
- package/dist/smells/fingerprint.js.map +1 -1
- package/dist/smells/inconsistent-siblings.d.ts +128 -7
- package/dist/smells/inconsistent-siblings.d.ts.map +1 -1
- package/dist/smells/inconsistent-siblings.js +288 -86
- package/dist/smells/inconsistent-siblings.js.map +1 -1
- package/dist/smells/sibling-files.d.ts +47 -0
- package/dist/smells/sibling-files.d.ts.map +1 -0
- package/dist/smells/sibling-files.js +104 -0
- package/dist/smells/sibling-files.js.map +1 -0
- package/dist/smells/similar-pairs.d.ts +27 -0
- package/dist/smells/similar-pairs.d.ts.map +1 -0
- package/dist/smells/similar-pairs.js +52 -0
- package/dist/smells/similar-pairs.js.map +1 -0
- package/dist/smells/smell-builder.d.ts +57 -12
- package/dist/smells/smell-builder.d.ts.map +1 -1
- package/dist/smells/smell-builder.js +111 -14
- package/dist/smells/smell-builder.js.map +1 -1
- package/dist/tsconfig/index.d.ts +19 -0
- package/dist/tsconfig/index.d.ts.map +1 -0
- package/dist/tsconfig/index.js +20 -0
- package/dist/tsconfig/index.js.map +1 -0
- package/dist/tsconfig/tsconfig-builder.d.ts +42 -9
- package/dist/tsconfig/tsconfig-builder.d.ts.map +1 -1
- package/dist/tsconfig/tsconfig-builder.js +64 -16
- package/dist/tsconfig/tsconfig-builder.js.map +1 -1
- package/package.json +3 -2
- package/dist/core/module-dependencies.d.ts +0 -28
- package/dist/core/module-dependencies.d.ts.map +0 -1
- package/dist/core/module-dependencies.js +0 -35
- package/dist/core/module-dependencies.js.map +0 -1
- package/dist/helpers/within.d.ts.map +0 -1
- package/dist/helpers/within.js.map +0 -1
|
@@ -1,20 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { emptyDiscoveryMessage, metaViolation } from './slice-discovery-message.js';
|
|
2
|
+
import { globAnyOf, stampGlobs } from '@nielspeter/eess';
|
|
3
|
+
import { TerminalBuilder } from '../core/terminal-builder.js';
|
|
4
|
+
import { resolveByMatching, resolveByDefinition, matchingGlobPrefix, matchingGlobPattern, } from '../models/slice.js';
|
|
5
|
+
import { splitGlobArgs } from '../core/import-options.js';
|
|
3
6
|
import { beFreeOfCycles as beFreeOfCyclesCondition, respectLayerOrder as respectLayerOrderCondition, notDependOn as notDependOnCondition, } from '../conditions/slice.js';
|
|
7
|
+
import { isProjectRelative } from '../core/project-relative.js';
|
|
4
8
|
/**
|
|
5
9
|
* Rule builder for slice-level architecture rules.
|
|
6
10
|
*
|
|
7
|
-
* Unlike
|
|
8
|
-
*
|
|
9
|
-
*
|
|
11
|
+
* Unlike the builders that extend `RuleBuilder<T>`, this one has its own chain:
|
|
12
|
+
* the grouping step (`matching` / `assignedFrom`) replaces the predicate phase
|
|
13
|
+
* entirely, because a slice is defined by how files are grouped rather than by a
|
|
14
|
+
* predicate over already-selected subjects.
|
|
10
15
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
16
|
+
* ```ts
|
|
17
|
+
* slices(project).matching(glob).should().beFreeOfCycles().check()
|
|
18
|
+
* slices(project).assignedFrom(def).should().respectLayerOrder(...).check()
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* This class carried a docblock on `main` and lost it when the file was split
|
|
22
|
+
* for `eess/max-class-lines`; it is restored rather than rewritten.
|
|
14
23
|
*/
|
|
15
24
|
export class SliceRuleBuilder extends TerminalBuilder {
|
|
16
25
|
project;
|
|
17
26
|
_slices = [];
|
|
27
|
+
_discovery;
|
|
18
28
|
_conditions = [];
|
|
19
29
|
constructor(project) {
|
|
20
30
|
super();
|
|
@@ -31,8 +41,10 @@ export class SliceRuleBuilder extends TerminalBuilder {
|
|
|
31
41
|
* // Slices: auth, billing, orders, etc.
|
|
32
42
|
*/
|
|
33
43
|
matching(glob) {
|
|
34
|
-
|
|
35
|
-
|
|
44
|
+
const next = this.copy();
|
|
45
|
+
next._discovery = { mode: 'matching', glob };
|
|
46
|
+
next._slices = resolveByMatching(this.project, glob);
|
|
47
|
+
return next;
|
|
36
48
|
}
|
|
37
49
|
/**
|
|
38
50
|
* Define slices from an explicit name-to-glob mapping.
|
|
@@ -46,8 +58,74 @@ export class SliceRuleBuilder extends TerminalBuilder {
|
|
|
46
58
|
* })
|
|
47
59
|
*/
|
|
48
60
|
assignedFrom(definition) {
|
|
49
|
-
|
|
50
|
-
|
|
61
|
+
const entries = Object.entries(definition).map(([name, glob]) => ({ name, glob }));
|
|
62
|
+
const next = this.copy();
|
|
63
|
+
next._discovery = { mode: 'assignedFrom', entries };
|
|
64
|
+
next._slices = resolveByDefinition(this.project, definition);
|
|
65
|
+
return next;
|
|
66
|
+
}
|
|
67
|
+
/** The project this rule was built against. See `RuleBuilder.getProject`. */
|
|
68
|
+
getProject() {
|
|
69
|
+
return this.project;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The discovery globs this rule was scoped with.
|
|
73
|
+
*
|
|
74
|
+
* `assignedFrom` fans out into one slice per entry, so each entry is its own
|
|
75
|
+
* tree: one dead layer glob is one empty slice, and folding them into an
|
|
76
|
+
* `any` node would say "no fault unless every slice is empty" — a false
|
|
77
|
+
* green. This is the same reason a preset's option list is not an `any`
|
|
78
|
+
* node.
|
|
79
|
+
*
|
|
80
|
+
* `matching()` needs no `base` special case, because it declares the glob
|
|
81
|
+
* `parseMatchingGlob` produces rather than the one the author wrote — and
|
|
82
|
+
* that one is already anchored. Declaring the author's spelling and
|
|
83
|
+
* exempting it via `base` was the earlier design, and it reported every
|
|
84
|
+
* nested-layout rule as dead while looking correct on a flat fixture.
|
|
85
|
+
*/
|
|
86
|
+
globs() {
|
|
87
|
+
if (!this._discovery)
|
|
88
|
+
return [];
|
|
89
|
+
if (this._discovery.mode === 'matching') {
|
|
90
|
+
// Declare the glob picomatch is given, not the one the author wrote.
|
|
91
|
+
// `parseMatchingGlob` strips './' and '**/', normalises a trailing
|
|
92
|
+
// slash, and appends '*/**' — so the author's spelling is matched
|
|
93
|
+
// against nothing at runtime and declaring it reports every correct
|
|
94
|
+
// nested-layout rule as dead. `origin` keeps the spelling, which is what
|
|
95
|
+
// the reader needs to find the line.
|
|
96
|
+
const authored = this._discovery.glob;
|
|
97
|
+
// `resolveByMatching` bails before matching anything when the glob has no
|
|
98
|
+
// literal directory prefix ('*', '**', 'src'), because the slice name is
|
|
99
|
+
// the segment after that prefix and there is none. Decidable from the
|
|
100
|
+
// glob alone, so declare a glob that cannot match rather than let the
|
|
101
|
+
// pre-flight stay silent about a rule the runtime guard will fail.
|
|
102
|
+
const unresolvable = matchingGlobPrefix(authored) === '';
|
|
103
|
+
return [
|
|
104
|
+
stampGlobs(globAnyOf([unresolvable ? NEVER_MATCHES : matchingGlobPattern(authored)], 'file-path'), 'discovery', () => `matching("${authored}")`),
|
|
105
|
+
];
|
|
106
|
+
}
|
|
107
|
+
return this._discovery.entries.map((entry) => stampGlobs(
|
|
108
|
+
// `base: 'normalized'` for a project-relative glob — bug 0033. The
|
|
109
|
+
// anchor check calls an unanchored glob dead against absolute paths,
|
|
110
|
+
// and since this entry point now resolves one against the project root
|
|
111
|
+
// it stops being dead exactly when it starts working. Without this,
|
|
112
|
+
// `doctor` reds a rule that discovers slices correctly: measured, a
|
|
113
|
+
// relative `assignedFrom` glob gave 0 violations and a `dead-glob`
|
|
114
|
+
// diagnosis in the same run.
|
|
115
|
+
globAnyOf([entry.glob], 'file-path', isProjectRelative(entry.glob) ? 'normalized' : 'absolute'), 'discovery', (g) => `assignedFrom({ ${entry.name}: "${g.glob}" })`));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* An independent copy, carrying the condition list and the resolved slices.
|
|
119
|
+
*
|
|
120
|
+
* `_slices` is replaced wholesale by both discovery methods, so only the
|
|
121
|
+
* condition array needs its own copy — but it is listed here anyway, because
|
|
122
|
+
* the next person to add a field will read this method, not the two callers.
|
|
123
|
+
*/
|
|
124
|
+
copy() {
|
|
125
|
+
const clone = super.copy();
|
|
126
|
+
clone._slices = [...this._slices];
|
|
127
|
+
clone._conditions = [...this._conditions];
|
|
128
|
+
return clone;
|
|
51
129
|
}
|
|
52
130
|
/**
|
|
53
131
|
* Begin the condition phase. Returns `this` for chaining.
|
|
@@ -64,39 +142,154 @@ export class SliceRuleBuilder extends TerminalBuilder {
|
|
|
64
142
|
/**
|
|
65
143
|
* Assert that no circular dependencies exist between slices.
|
|
66
144
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
145
|
+
/**
|
|
146
|
+
* @param options - `ignoreTypeImports` defaults to **true**: a type-only import
|
|
147
|
+
* is erased at compile time and creates no runtime dependency, so counting it
|
|
148
|
+
* as a cycle edge reports cycles that cannot exist (plan 0084). Pass
|
|
149
|
+
* `{ ignoreTypeImports: false }` to count type-only edges too.
|
|
150
|
+
* NOT a way back to the pre-0.47 graph: since v0.48.0 re-exports are counted as
|
|
151
|
+
* well, so type edges plus re-export edges is WIDER than 0.46.1 ever was.
|
|
152
|
+
*/
|
|
153
|
+
beFreeOfCycles(options) {
|
|
154
|
+
const next = this.copy();
|
|
155
|
+
next._conditions.push(beFreeOfCyclesCondition(options));
|
|
156
|
+
return next;
|
|
70
157
|
}
|
|
71
158
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
159
|
+
* Asserts that imports between the named slices flow in the declared order —
|
|
160
|
+
* outermost first — so no inner layer depends on an outer one.
|
|
74
161
|
*
|
|
75
|
-
*
|
|
162
|
+
* Variadic, with an optional trailing `ImportOptions`.
|
|
76
163
|
*/
|
|
77
|
-
respectLayerOrder(...
|
|
78
|
-
|
|
79
|
-
|
|
164
|
+
respectLayerOrder(...args) {
|
|
165
|
+
// Split and re-dispatch rather than spreading `args` straight through: TypeScript
|
|
166
|
+
// cannot match a tuple-union spread to an overload, and ADR-005 bars the `as` that
|
|
167
|
+
// would force it. `splitGlobArgs` exists for exactly this (it removed ten casts).
|
|
168
|
+
const { globs: layers, options } = splitGlobArgs(args);
|
|
169
|
+
const next = this.copy();
|
|
170
|
+
next._conditions.push(options === undefined
|
|
171
|
+
? respectLayerOrderCondition(...layers)
|
|
172
|
+
: respectLayerOrderCondition(layers, options));
|
|
173
|
+
return next;
|
|
80
174
|
}
|
|
81
175
|
/**
|
|
82
|
-
*
|
|
176
|
+
* Asserts that the selected slices import nothing from the named slices.
|
|
83
177
|
*
|
|
84
|
-
*
|
|
178
|
+
* Variadic, with an optional trailing `ImportOptions`.
|
|
85
179
|
*/
|
|
86
|
-
notDependOn(...
|
|
87
|
-
|
|
88
|
-
|
|
180
|
+
notDependOn(...args) {
|
|
181
|
+
const { globs: sliceNames, options } = splitGlobArgs(args);
|
|
182
|
+
const next = this.copy();
|
|
183
|
+
next._conditions.push(options === undefined
|
|
184
|
+
? notDependOnCondition(...sliceNames)
|
|
185
|
+
: notDependOnCondition(sliceNames, options));
|
|
186
|
+
return next;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Whether this rule states an assertion at all — the assertion gate's question.
|
|
190
|
+
*
|
|
191
|
+
* True once a condition has been added; a slice selection with none can never fail.
|
|
192
|
+
*
|
|
193
|
+
* Overrides the `TerminalBuilder` default (`true`), whose JSDoc carries the
|
|
194
|
+
* contract and the reason this is public rather than protected.
|
|
195
|
+
*/
|
|
196
|
+
assertsSomething() {
|
|
197
|
+
return this._conditions.length > 0;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* The remedy for this builder's assertion-less state, as one string.
|
|
201
|
+
*
|
|
202
|
+
* One channel, so `diagnose()`'s advice and the finding's own message cannot
|
|
203
|
+
* disagree. Overrides `TerminalBuilder`'s generic text with wording specific to
|
|
204
|
+
* what this builder is missing.
|
|
205
|
+
*/
|
|
206
|
+
assertionAdvice() {
|
|
207
|
+
return ('this rule has no condition, so it asserts nothing and can never fail. Add a ' +
|
|
208
|
+
'condition after .should(), e.g. beFreeOfCycles(), respectLayerOrder(...) or ' +
|
|
209
|
+
'notDependOn(...).');
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Named by id when one is set, else by the rule description (plan 0070 §4).
|
|
213
|
+
* The inherited root version says 'unnamed' for every id-less rule, which
|
|
214
|
+
* made three of the assertion hooks unlocatable in a doctor report.
|
|
215
|
+
*/
|
|
216
|
+
describeRule() {
|
|
217
|
+
// The rule's own description, not a call-site locator. An earlier revision
|
|
218
|
+
// derived a bounded name from `_discovery` so the withdrawn runtime
|
|
219
|
+
// warning would not carry ten filenames — but `explain --format agent`
|
|
220
|
+
// reads this field, and consumers commit that output into their agent's
|
|
221
|
+
// prompt, so bounding it stripped the condition (the only architectural
|
|
222
|
+
// imperative in the line) from every id-less slice rule.
|
|
223
|
+
return {
|
|
224
|
+
...super.describeRule(),
|
|
225
|
+
rule: this._metadata?.id ?? this.buildRuleDescription(),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Slice discovery is not per-tree, so the gate must stay out (plan 0080).
|
|
230
|
+
*
|
|
231
|
+
* `assignedFrom` fans out one glob tree per entry, and a single dead entry among
|
|
232
|
+
* populated siblings is a dead *tree* — which the gate would report. That guard
|
|
233
|
+
* was written and **withdrawn before release** for firing on legitimate
|
|
234
|
+
* projects (see `collectViolations` below): a layer not created yet, and the
|
|
235
|
+
* `strict-boundaries` scaffold itself.
|
|
236
|
+
*
|
|
237
|
+
* The all-empty case is handled here too, with a message the gate cannot match
|
|
238
|
+
* — it names the discovery mode and its remedy (bug 0009's corpus). So this
|
|
239
|
+
* builder owns both halves.
|
|
240
|
+
*
|
|
241
|
+
* **Why this is a builder-level `true` while `PairFinalBuilder` asks its
|
|
242
|
+
* condition** (`owns-empty-discovery.ts`, plan 0081): there, ownership varies by
|
|
243
|
+
* condition, and a blanket `true` once suppressed the gate for the one condition
|
|
244
|
+
* that did not self-report. Here nothing varies — the reason is a property of
|
|
245
|
+
* `assignedFrom`'s fan-out, identical for every condition reachable through this
|
|
246
|
+
* builder. The asymmetry reflects the discovery models, not an oversight.
|
|
247
|
+
*/
|
|
248
|
+
ownsDiscoveryDiagnosis() {
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Slices holding at least one file — plan 0098.
|
|
253
|
+
*
|
|
254
|
+
* Counting `_slices.length` would count the SHAPE of the discovery rather than
|
|
255
|
+
* what was examined: `assignedFrom()` returns one slice per key whether or not
|
|
256
|
+
* anything matched, so the empty case is "every slice has no files", never "no
|
|
257
|
+
* slices" (arch-014 I1) — which is the same condition this family already
|
|
258
|
+
* fails closed on.
|
|
259
|
+
*/
|
|
260
|
+
examinedUnits() {
|
|
261
|
+
return this._slices.filter((slice) => slice.files.length > 0).length;
|
|
89
262
|
}
|
|
90
263
|
collectViolations() {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
264
|
+
// Discovery non-vacuity (ADR-008 / plan 0067): a slice selection that
|
|
265
|
+
// resolved to no slices — or slices that matched no files — discovered
|
|
266
|
+
// nothing, so it enforces nothing. Fail with a config-level meta-finding
|
|
267
|
+
// (bypasses diff/baseline) rather than passing vacuously. `assignedFrom()`
|
|
268
|
+
// returns one slice per key regardless of matches, so the empty case is
|
|
269
|
+
// "every slice has no files", not "no slices" (arch-014 I1).
|
|
270
|
+
if (this._slices.length === 0 || this._slices.every((slice) => slice.files.length === 0)) {
|
|
271
|
+
// Plan 0098: this family ALREADY fails closed here, and has since 0067 —
|
|
272
|
+
// a config-level meta-finding, not a vacuous pass. The floor 0099 adds is a
|
|
273
|
+
// generalisation of this branch, not an invention. `examined` is 0 on the
|
|
274
|
+
// same condition that produces the finding.
|
|
275
|
+
return { violations: [this.emptyDiscoveryViolation()], examined: 0 };
|
|
99
276
|
}
|
|
277
|
+
// Every slice condition is a statement about relationships BETWEEN slices, so a
|
|
278
|
+
// single slice makes all of them unfalsifiable: `beFreeOfCycles` drops
|
|
279
|
+
// intra-slice edges, and `respectLayerOrder` / `notDependOn` have no second
|
|
280
|
+
// slice to relate to. This is not a hypothetical — a glob that silently
|
|
281
|
+
// collapsed to one mega-slice turned a real cycle green twice while every other
|
|
282
|
+
// guard stayed quiet, so the count itself has to be a finding (ADR-008).
|
|
283
|
+
// NOTE: two further guards were prototyped here — failing when discovery yields
|
|
284
|
+
// exactly one non-empty slice (every inter-slice condition is then
|
|
285
|
+
// unfalsifiable), and when one slice is empty among populated siblings (the
|
|
286
|
+
// conditions silently skip names they cannot resolve). Both catch real
|
|
287
|
+
// false-greens, and both were withdrawn before release: they fire on
|
|
288
|
+
// legitimate projects (a one-feature repo, a layer not created yet, and the
|
|
289
|
+
// `strict-boundaries` scaffold itself) with no opt-out, and their remedies were
|
|
290
|
+
// written for one input and emitted for all of them. They return once the
|
|
291
|
+
// remedy is executable data and an opt-out exists, mirroring
|
|
292
|
+
// `crossProject().allowEmpty(name)`.
|
|
100
293
|
const context = {
|
|
101
294
|
rule: this.buildRuleDescription(),
|
|
102
295
|
because: this._reason,
|
|
@@ -108,13 +301,21 @@ export class SliceRuleBuilder extends TerminalBuilder {
|
|
|
108
301
|
for (const condition of this._conditions) {
|
|
109
302
|
violations.push(...condition.evaluate(this._slices, context));
|
|
110
303
|
}
|
|
111
|
-
|
|
304
|
+
// Slices holding at least one file. Counting `_slices.length` would count the
|
|
305
|
+
// shape of the discovery rather than what was examined: `assignedFrom()`
|
|
306
|
+
// returns one slice per key whether or not anything matched, so the empty
|
|
307
|
+
// case is "every slice has no files", never "no slices" (arch-014 I1).
|
|
308
|
+
return { violations, examined: this.examinedUnits() };
|
|
112
309
|
}
|
|
113
310
|
buildRuleDescription() {
|
|
114
311
|
const sliceDesc = this._slices.map((s) => s.name).join(', ');
|
|
115
312
|
const conditionDesc = this._conditions.map((c) => c.description).join(' and ');
|
|
116
313
|
return `slices [${sliceDesc}] should ${conditionDesc}`;
|
|
117
314
|
}
|
|
315
|
+
/** Config-level meta-finding for empty slice discovery (plan 0067). */
|
|
316
|
+
emptyDiscoveryViolation() {
|
|
317
|
+
return metaViolation(emptyDiscoveryMessage(this.project, this._discovery), this._metadata, this._reason);
|
|
318
|
+
}
|
|
118
319
|
}
|
|
119
320
|
/**
|
|
120
321
|
* Entry point: create a slice-level rule builder.
|
|
@@ -131,4 +332,10 @@ export class SliceRuleBuilder extends TerminalBuilder {
|
|
|
131
332
|
export function slices(p) {
|
|
132
333
|
return new SliceRuleBuilder(p);
|
|
133
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* A glob no path can match, for declaring a discovery that cannot resolve for
|
|
337
|
+
* a reason the glob itself does not express. Anchored, so it is reported as
|
|
338
|
+
* `no-match` rather than as a syntax fault whose remedy would be nonsense.
|
|
339
|
+
*/
|
|
340
|
+
const NEVER_MATCHES = '**/\u0000never-matches';
|
|
134
341
|
//# sourceMappingURL=slice-rule-builder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slice-rule-builder.js","sourceRoot":"","sources":["../../src/builders/slice-rule-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"slice-rule-builder.js","sourceRoot":"","sources":["../../src/builders/slice-rule-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ArchProject } from '../core/project.js';
|
|
2
|
-
import { RuleBuilder } from '
|
|
2
|
+
import { RuleBuilder } from '../core/rule-builder.js';
|
|
3
3
|
import type { TypeMatcher } from '../helpers/type-matchers.js';
|
|
4
4
|
import { type TypeDeclaration } from '../predicates/type.js';
|
|
5
5
|
/**
|
|
@@ -15,65 +15,136 @@ import { type TypeDeclaration } from '../predicates/type.js';
|
|
|
15
15
|
* .because('sortBy must be a union of literals, not bare string')
|
|
16
16
|
* .check()
|
|
17
17
|
*/
|
|
18
|
-
export declare class TypeRuleBuilder extends RuleBuilder<TypeDeclaration
|
|
18
|
+
export declare class TypeRuleBuilder extends RuleBuilder<TypeDeclaration> {
|
|
19
19
|
constructor(project: ArchProject);
|
|
20
20
|
/**
|
|
21
21
|
* Collect all InterfaceDeclarations and TypeAliasDeclarations
|
|
22
22
|
* from all source files in the project.
|
|
23
23
|
*/
|
|
24
24
|
protected getElements(): TypeDeclaration[];
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Narrows the selection to types that are interfaces.
|
|
27
|
+
*
|
|
28
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
29
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
30
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
31
|
+
* rule pass having asserted nothing.
|
|
32
|
+
*/
|
|
26
33
|
areInterfaces(): this;
|
|
27
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Narrows the selection to types that are type aliases.
|
|
36
|
+
*
|
|
37
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
38
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
39
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
40
|
+
* rule pass having asserted nothing.
|
|
41
|
+
*/
|
|
28
42
|
areTypeAliases(): this;
|
|
29
43
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
44
|
+
* Narrows the selection to types that have a property named `name`.
|
|
45
|
+
*
|
|
46
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
47
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
48
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
49
|
+
* rule pass having asserted nothing.
|
|
32
50
|
*/
|
|
33
51
|
haveProperty(name: string): this;
|
|
34
52
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
53
|
+
* Narrows the selection to types that have property `name` of a type matching `matcher`.
|
|
54
|
+
*
|
|
55
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
56
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
57
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
58
|
+
* rule pass having asserted nothing.
|
|
37
59
|
*/
|
|
38
60
|
havePropertyOfType(name: string, matcher: TypeMatcher): this;
|
|
39
61
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
62
|
+
* Narrows the selection to types that extend the type `name`.
|
|
63
|
+
*
|
|
64
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
65
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
66
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
67
|
+
* rule pass having asserted nothing.
|
|
43
68
|
*/
|
|
44
69
|
extendType(name: string): this;
|
|
45
70
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
71
|
+
* Asserts that the selected types have property `name` of a type matching `matcher`.
|
|
72
|
+
*
|
|
73
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
49
74
|
*/
|
|
50
75
|
havePropertyType(name: string, matcher: TypeMatcher): this;
|
|
51
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* Asserts that the selected types are exported.
|
|
78
|
+
*
|
|
79
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
80
|
+
*/
|
|
52
81
|
beExported(): this;
|
|
53
|
-
/**
|
|
82
|
+
/**
|
|
83
|
+
* Asserts that the selected types do not exist.
|
|
84
|
+
*
|
|
85
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
86
|
+
*/
|
|
54
87
|
notExist(): this;
|
|
55
88
|
/** @deprecated Use `haveNameMatching()` after `.should()` instead. */
|
|
56
89
|
conditionHaveNameMatching(pattern: RegExp): this;
|
|
57
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* Asserts that the selected types have a property named by each of `names`.
|
|
92
|
+
*
|
|
93
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
94
|
+
*/
|
|
58
95
|
havePropertyNamed(...names: string[]): this;
|
|
59
|
-
/**
|
|
96
|
+
/**
|
|
97
|
+
* Asserts that the selected types do not have a property named by any of `names`.
|
|
98
|
+
*
|
|
99
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
100
|
+
*/
|
|
60
101
|
notHavePropertyNamed(...names: string[]): this;
|
|
61
|
-
/**
|
|
102
|
+
/**
|
|
103
|
+
* Asserts that the selected types have a property matching `pattern`.
|
|
104
|
+
*
|
|
105
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
106
|
+
*/
|
|
62
107
|
havePropertyMatching(pattern: RegExp): this;
|
|
63
|
-
/**
|
|
108
|
+
/**
|
|
109
|
+
* Asserts that the selected types do not have a property matching `pattern`.
|
|
110
|
+
*
|
|
111
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
112
|
+
*/
|
|
64
113
|
notHavePropertyMatching(pattern: RegExp): this;
|
|
65
|
-
/**
|
|
114
|
+
/**
|
|
115
|
+
* Asserts that the selected types have only readonly properties.
|
|
116
|
+
*
|
|
117
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
118
|
+
*/
|
|
66
119
|
haveOnlyReadonlyProperties(): this;
|
|
67
|
-
/**
|
|
120
|
+
/**
|
|
121
|
+
* Asserts that the selected types have at most `max` properties.
|
|
122
|
+
*
|
|
123
|
+
* **Condition only** — this is the assertion, so it belongs after `.should()`.
|
|
124
|
+
*/
|
|
68
125
|
maxProperties(max: number): this;
|
|
69
126
|
/**
|
|
70
127
|
* After `.that()`: filter types whose name matches the pattern.
|
|
71
128
|
* After `.should()`: assert matched types have names matching the pattern.
|
|
72
129
|
*/
|
|
73
130
|
haveNameMatching(pattern: RegExp | string): this;
|
|
74
|
-
/**
|
|
131
|
+
/**
|
|
132
|
+
* Narrows the selection to types that are exported.
|
|
133
|
+
*
|
|
134
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
135
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
136
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
137
|
+
* rule pass having asserted nothing.
|
|
138
|
+
*/
|
|
75
139
|
areExported(): this;
|
|
76
|
-
/**
|
|
140
|
+
/**
|
|
141
|
+
* Narrows the selection to types that are not exported.
|
|
142
|
+
*
|
|
143
|
+
* **Predicate only**, unlike the dual-use methods on this builder: it never
|
|
144
|
+
* becomes an assertion. Written after `.should()` it still filters, and the
|
|
145
|
+
* assertion gate reports it as a misplaced predicate rather than letting the
|
|
146
|
+
* rule pass having asserted nothing.
|
|
147
|
+
*/
|
|
77
148
|
areNotExported(): this;
|
|
78
149
|
/**
|
|
79
150
|
* After `.that()`: filter types in a file matching the glob.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/type-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"type-rule-builder.d.ts","sourceRoot":"","sources":["../../src/builders/type-rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,EAML,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAA;AA6B9B;;;;;;;;;;;;GAYG;AACH,qBAAa,eAAgB,SAAQ,WAAW,CAAC,eAAe,CAAC;gBACnD,OAAO,EAAE,WAAW;IAIhC;;;OAGG;IACH,SAAS,CAAC,WAAW,IAAI,eAAe,EAAE;IAa1C;;;;;;;OAOG;IACH,aAAa,IAAI,IAAI;IAIrB;;;;;;;OAOG;IACH,cAAc,IAAI,IAAI;IAItB;;;;;;;OAOG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC;;;;;;;OAOG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAI5D;;;;;;;OAOG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM9B;;;;OAIG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI;IAI1D;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAIlB;;;;OAIG;IACH,QAAQ,IAAI,IAAI;IAIhB,sEAAsE;IACtE,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMhD;;;;OAIG;IACH,iBAAiB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAI3C;;;;OAIG;IACH,oBAAoB,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI;IAI9C;;;;OAIG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3C;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9C;;;;OAIG;IACH,0BAA0B,IAAI,IAAI;IAIlC;;;;OAIG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMhC;;;OAGG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQhD;;;;;;;OAOG;IACH,WAAW,IAAI,IAAI;IAInB;;;;;;;OAOG;IACH,cAAc,IAAI,IAAI;IAItB;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAMnC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,eAAe,CAErD"}
|