@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
package/dist/presets/layered.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { not } from '
|
|
1
|
+
import { not } from '../core/combinators.js';
|
|
2
2
|
import { resideInFolder as resideInFolderPredicate } from '../predicates/identity.js';
|
|
3
3
|
import { slices } from '../builders/slice-rule-builder.js';
|
|
4
4
|
import { modules } from '../builders/module-rule-builder.js';
|
|
5
|
-
import {
|
|
5
|
+
import { collectRule, overrideFindings, validateOverrides, declaredEmptyFindings, deliver, } from './shared.js';
|
|
6
6
|
const RULE_IDS = [
|
|
7
7
|
'preset/layered/layer-order',
|
|
8
8
|
'preset/layered/no-cycles',
|
|
@@ -13,24 +13,29 @@ const RULE_IDS = [
|
|
|
13
13
|
/**
|
|
14
14
|
* Collect violations for type-import-only rules on specified layers.
|
|
15
15
|
*/
|
|
16
|
-
function applyTypeImportRules(p, typeImportsAllowed, layerGlobs,
|
|
17
|
-
const
|
|
16
|
+
function applyTypeImportRules(p, typeImportsAllowed, layerGlobs, config, constructed) {
|
|
17
|
+
const builders = [];
|
|
18
18
|
for (const layerGlob of typeImportsAllowed) {
|
|
19
19
|
const otherLayerGlobs = layerGlobs.filter((g) => g !== layerGlob);
|
|
20
20
|
if (otherLayerGlobs.length > 0) {
|
|
21
|
-
|
|
21
|
+
builders.push(...collectRule(modules(p)
|
|
22
22
|
.that()
|
|
23
23
|
.resideInFolder(layerGlob)
|
|
24
24
|
.should()
|
|
25
|
-
.onlyHaveTypeImportsFrom(...otherLayerGlobs),
|
|
25
|
+
.onlyHaveTypeImportsFrom(...otherLayerGlobs), {
|
|
26
|
+
id: 'preset/layered/type-imports-only',
|
|
27
|
+
because: 'a runtime import from this layer creates a real dependency, where a type-only import creates none and disappears at compile time',
|
|
28
|
+
suggestion: 'Use `import type { X }` so the dependency is erased, or move the value you need into a layer this one is allowed to depend on.',
|
|
29
|
+
imperative: 'Use `import type` for cross-layer imports from this layer',
|
|
30
|
+
}, 'warn', config, constructed));
|
|
26
31
|
}
|
|
27
32
|
}
|
|
28
|
-
return
|
|
33
|
+
return builders;
|
|
29
34
|
}
|
|
30
35
|
/**
|
|
31
36
|
* Collect violations for restricted-package rules.
|
|
32
37
|
*/
|
|
33
|
-
function applyRestrictedPackages(p, restrictedPackages,
|
|
38
|
+
function applyRestrictedPackages(p, restrictedPackages, config, constructed) {
|
|
34
39
|
// Invert: for each package, find which layers are allowed
|
|
35
40
|
const packageToAllowed = new Map();
|
|
36
41
|
for (const [layerGlob, packages] of Object.entries(restrictedPackages)) {
|
|
@@ -44,60 +49,92 @@ function applyRestrictedPackages(p, restrictedPackages, overrides) {
|
|
|
44
49
|
}
|
|
45
50
|
}
|
|
46
51
|
}
|
|
47
|
-
const
|
|
52
|
+
const builders = [];
|
|
48
53
|
for (const [pkg, allowedLayers] of packageToAllowed) {
|
|
49
|
-
// Modules NOT in any allowed layer must not import this package
|
|
50
|
-
|
|
54
|
+
// Modules NOT in any allowed layer must not import this package.
|
|
55
|
+
//
|
|
56
|
+
// `builder = builder.satisfy(...)`, not a bare call: since bug 0016 a
|
|
57
|
+
// builder is immutable, so discarding the return discards the predicate.
|
|
58
|
+
// This was the only site in the codebase relying on the old mutation, and
|
|
59
|
+
// it is the reason the fix is a behaviour change rather than a refactor.
|
|
60
|
+
let builder = modules(p).that();
|
|
51
61
|
for (const allowedGlob of allowedLayers) {
|
|
52
|
-
builder.satisfy(not(resideInFolderPredicate(allowedGlob)));
|
|
62
|
+
builder = builder.satisfy(not(resideInFolderPredicate(allowedGlob)));
|
|
53
63
|
}
|
|
54
|
-
|
|
64
|
+
builders.push(...collectRule(builder.should().notImportFromWithOptions([pkg], config.importOptions ?? {}), {
|
|
65
|
+
id: 'preset/layered/restricted-packages',
|
|
66
|
+
because: 'this layer is meant to be independent of that package, so importing it here spreads the dependency past the layer that owns it',
|
|
67
|
+
suggestion: 'Move the call into the layer permitted to use the package and expose the result through a function or interface this layer may depend on.',
|
|
68
|
+
imperative: 'Do NOT import a restricted package in this layer',
|
|
69
|
+
}, 'error', config, constructed));
|
|
55
70
|
}
|
|
56
|
-
return
|
|
71
|
+
return builders;
|
|
57
72
|
}
|
|
58
|
-
/**
|
|
59
|
-
* Enforce a layered architecture: dependency direction, cycle freedom,
|
|
60
|
-
* and optional package restrictions.
|
|
61
|
-
*/
|
|
62
73
|
export function layeredArchitecture(p, options) {
|
|
63
|
-
const
|
|
64
|
-
|
|
74
|
+
const config = options;
|
|
75
|
+
const constructed = [];
|
|
76
|
+
validateOverrides(config.overrides, [...RULE_IDS]);
|
|
77
|
+
const overrideProblems = overrideFindings(config.overrides, RULE_IDS);
|
|
65
78
|
const layerNames = Object.keys(options.layers);
|
|
66
79
|
const layerGlobs = Object.values(options.layers);
|
|
67
80
|
const sharedGlobs = options.shared ?? [];
|
|
68
|
-
const
|
|
81
|
+
const builders = [];
|
|
69
82
|
// --- Layer order (slices) ---
|
|
70
83
|
const layerDef = {};
|
|
71
84
|
for (const [name, glob] of Object.entries(options.layers)) {
|
|
72
85
|
layerDef[name] = glob;
|
|
73
86
|
}
|
|
74
|
-
|
|
87
|
+
builders.push(...collectRule(slices(p)
|
|
75
88
|
.assignedFrom(layerDef)
|
|
76
89
|
.should()
|
|
77
|
-
.respectLayerOrder(
|
|
90
|
+
.respectLayerOrder(layerNames, options.importOptions ?? {}), {
|
|
91
|
+
id: 'preset/layered/layer-order',
|
|
92
|
+
because: 'an import against the declared layer order inverts the architecture — the outer layer becomes a dependency of the inner one',
|
|
93
|
+
suggestion: 'Depend inwards only. Move the shared piece into the inner layer, or invert the call with an interface the inner layer declares and the outer implements.',
|
|
94
|
+
imperative: 'Do NOT import outwards across layers — depend inwards only',
|
|
95
|
+
}, 'error', config, constructed));
|
|
78
96
|
// --- No cycles ---
|
|
79
|
-
|
|
97
|
+
builders.push(...collectRule(slices(p).assignedFrom(layerDef).should().beFreeOfCycles(options.importOptions), {
|
|
98
|
+
id: 'preset/layered/no-cycles',
|
|
99
|
+
because: 'layers in a cycle have no order, so the layering they are declared with means nothing. Since v0.48.0 a cycle formed by `export … from` (a barrel) IS detected; dynamic `import()` still is not, deliberately, because it is lazy and is usually the fix rather than the fault.',
|
|
100
|
+
suggestion: 'Break the cycle at its weakest edge: move the shared type into the inner layer, or invert one direction with an interface.',
|
|
101
|
+
imperative: 'Do NOT create an import cycle between layers',
|
|
102
|
+
}, 'error', config, constructed));
|
|
80
103
|
// --- Innermost isolation (strict mode) ---
|
|
81
104
|
if (options.strict && layerNames.length > 0) {
|
|
82
105
|
const innermostName = layerNames[layerNames.length - 1];
|
|
83
106
|
const innermostGlob = innermostName !== undefined ? options.layers[innermostName] : undefined;
|
|
84
107
|
if (innermostName && innermostGlob) {
|
|
85
108
|
const allowedGlobs = [innermostGlob, ...sharedGlobs];
|
|
86
|
-
|
|
109
|
+
builders.push(...collectRule(modules(p)
|
|
87
110
|
.that()
|
|
88
111
|
.resideInFolder(innermostGlob)
|
|
89
112
|
.should()
|
|
90
|
-
|
|
113
|
+
// Forwarded, like `respectLayerOrder` and `beFreeOfCycles`. This is
|
|
114
|
+
// an isolation rule and `docs/presets.md` promises the option reaches
|
|
115
|
+
// them; measured before the fix, `{ ignoreTypeImports: true }` cleared
|
|
116
|
+
// `layer-order` and left `innermost-isolation` reporting the SAME
|
|
117
|
+
// erased edge — one preset answering the project's one question twice.
|
|
118
|
+
.onlyImportFromWithOptions(allowedGlobs, options.importOptions ?? {}), {
|
|
119
|
+
id: 'preset/layered/innermost-isolation',
|
|
120
|
+
because: 'the innermost layer is the one everything else depends on, so any dependency it takes is inherited by the entire system',
|
|
121
|
+
suggestion: 'Keep it self-contained: move the dependency outwards, or express what it needs as an interface the innermost layer declares and an outer layer implements.',
|
|
122
|
+
imperative: 'Do NOT add dependencies to the innermost layer',
|
|
123
|
+
}, 'error', config, constructed));
|
|
91
124
|
}
|
|
92
125
|
}
|
|
93
126
|
// --- Type imports only for specified layers ---
|
|
94
127
|
if (options.typeImportsAllowed && options.typeImportsAllowed.length > 0) {
|
|
95
|
-
|
|
128
|
+
builders.push(...applyTypeImportRules(p, options.typeImportsAllowed, layerGlobs, config, constructed));
|
|
96
129
|
}
|
|
97
130
|
// --- Restricted packages ---
|
|
98
131
|
if (options.restrictedPackages) {
|
|
99
|
-
|
|
132
|
+
builders.push(...applyRestrictedPackages(p, options.restrictedPackages, config, constructed));
|
|
100
133
|
}
|
|
101
|
-
|
|
134
|
+
// Unknown override keys FIRST: they say the configuration is wrong, which
|
|
135
|
+
// the reader needs before any finding produced under it (bug 0038).
|
|
136
|
+
// Constructed, not merely known: a rule whose option was never enabled, or that
|
|
137
|
+
// was overridden `off`, is not built — so a declaration naming it is dead.
|
|
138
|
+
return deliver([...overrideProblems, ...declaredEmptyFindings(config.expectEmpty, constructed), ...builders], options);
|
|
102
139
|
}
|
|
103
140
|
//# sourceMappingURL=layered.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layered.js","sourceRoot":"","sources":["../../src/presets/layered.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"layered.js","sourceRoot":"","sources":["../../src/presets/layered.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +1,104 @@
|
|
|
1
|
+
import type { ArchViolation } from '@nielspeter/eess';
|
|
1
2
|
import type { ArchProject } from '../core/project.js';
|
|
2
|
-
import type {
|
|
3
|
+
import type { Condition } from '@nielspeter/eess';
|
|
4
|
+
import type { ArchFunction } from '../models/arch-function.js';
|
|
5
|
+
import type { RuleBuilderLike } from '@nielspeter/eess';
|
|
3
6
|
import type { PresetBaseOptions } from './shared.js';
|
|
4
|
-
export interface RecommendedOptions extends PresetBaseOptions {
|
|
7
|
+
export interface RecommendedOptions extends PresetBaseOptions<RecommendedRuleId> {
|
|
5
8
|
/**
|
|
6
9
|
* Source-file glob the rules apply to. Defaults to `'**\/src/**'`, matched
|
|
7
10
|
* against each file's absolute path (picomatch). This scopes the rules to your
|
|
8
11
|
* source tree by convention — it does NOT itself exclude `node_modules` or
|
|
9
12
|
* generated files (any `src/` segment anywhere in the path matches). Projects
|
|
10
13
|
* whose source lives outside a `src/` folder (e.g. `lib/`) should override.
|
|
14
|
+
* Note: because the match is on the absolute path, an ancestor directory named
|
|
15
|
+
* `src` (e.g. a clone under `~/src/`) widens scope — anchor with a project-root
|
|
16
|
+
* glob if that matters.
|
|
11
17
|
*/
|
|
12
18
|
include?: string;
|
|
13
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Single source of truth for the floor. `RULE_IDS` (for override validation) and
|
|
22
|
+
* the builder loop both derive from this — add a rule here and nothing else
|
|
23
|
+
* needs updating.
|
|
24
|
+
*/
|
|
25
|
+
declare const SPECS: readonly [{
|
|
26
|
+
readonly condition: Condition<ArchFunction>;
|
|
27
|
+
readonly meta: {
|
|
28
|
+
readonly id: "preset/recommended/no-eval";
|
|
29
|
+
readonly because: "eval() executes arbitrary code — a code-injection risk";
|
|
30
|
+
readonly suggestion: "remove eval(); parse or dispatch explicitly";
|
|
31
|
+
readonly imperative: "Do NOT call eval()";
|
|
32
|
+
};
|
|
33
|
+
readonly default: "error";
|
|
34
|
+
}, {
|
|
35
|
+
readonly condition: Condition<ArchFunction>;
|
|
36
|
+
readonly meta: {
|
|
37
|
+
readonly id: "preset/recommended/no-function-constructor";
|
|
38
|
+
readonly because: "the Function constructor is eval() in disguise";
|
|
39
|
+
readonly suggestion: "define the function directly instead of building it from a string";
|
|
40
|
+
readonly imperative: "Do NOT use the Function constructor";
|
|
41
|
+
};
|
|
42
|
+
readonly default: "error";
|
|
43
|
+
}, {
|
|
44
|
+
readonly condition: Condition<ArchFunction>;
|
|
45
|
+
readonly meta: {
|
|
46
|
+
readonly id: "preset/recommended/no-silent-catch";
|
|
47
|
+
readonly because: "a silent catch hides failures";
|
|
48
|
+
readonly suggestion: "handle or rethrow the caught error (reference it in the catch)";
|
|
49
|
+
readonly imperative: "Do NOT swallow errors in an empty catch";
|
|
50
|
+
};
|
|
51
|
+
readonly default: "warn";
|
|
52
|
+
}, {
|
|
53
|
+
readonly condition: Condition<ArchFunction>;
|
|
54
|
+
readonly meta: {
|
|
55
|
+
readonly id: "preset/recommended/no-empty-bodies";
|
|
56
|
+
readonly because: "an empty function body is usually an unfinished stub";
|
|
57
|
+
readonly suggestion: "implement the body or remove the function";
|
|
58
|
+
readonly imperative: "Do NOT leave a function body empty";
|
|
59
|
+
};
|
|
60
|
+
readonly default: "warn";
|
|
61
|
+
}];
|
|
62
|
+
/**
|
|
63
|
+
* Derived from `SPECS`, never restated. A hand-written union is a second list
|
|
64
|
+
* that drifts the moment a rule is added — which is the whole shape of
|
|
65
|
+
* [bug 0157](../../../../work/bugs/0157-a-typo-in-a-preset-override-key-is-a-silent-false-green.md)
|
|
66
|
+
* and of the census in plan 0078.
|
|
67
|
+
*/
|
|
68
|
+
type RecommendedRuleId = (typeof SPECS)[number]['meta']['id'];
|
|
14
69
|
/**
|
|
15
70
|
* A deliberately **thin, universal safety floor** for any TypeScript project —
|
|
16
71
|
* the handful of things dangerous regardless of project shape that fire ~never
|
|
17
72
|
* on healthy code. Not a full architecture: shape-specific rules (layer order,
|
|
18
73
|
* cycles, delegation) are yours to add.
|
|
19
74
|
*
|
|
20
|
-
* Returns
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
75
|
+
* Returns severity-carrying builders (the returning form), so spread it into a
|
|
76
|
+
* rule file: `export default [...recommended(p)]`. The two `error` rules fail
|
|
77
|
+
* the run; the two `warn` rules (silent-catch, empty-bodies) are reported but
|
|
78
|
+
* never fail **when the rule works** — they have known, suppressible false
|
|
79
|
+
* positives. A configuration finding (a rule that examined zero units, or whose
|
|
80
|
+
* glob is dead) is `error` regardless of severity and fails the build: `'warn'`
|
|
81
|
+
* grades violations, not a rule that cannot enforce anything.
|
|
27
82
|
*
|
|
28
83
|
* Overlaps `agentGuardrails` on empty bodies and `eval`. For agent-focused
|
|
29
84
|
* projects prefer `agentGuardrails` alone, or override the duplicated ids to
|
|
30
85
|
* `'off'` in one preset.
|
|
31
86
|
*/
|
|
87
|
+
/**
|
|
88
|
+
* `report` names a delivery mode; omitting it returns the un-executed builders.
|
|
89
|
+
*
|
|
90
|
+
* Overloaded so the common call keeps its exact type — a bare union would make
|
|
91
|
+
* every existing `.violations()` call site an error (26 test files, measured).
|
|
92
|
+
*
|
|
93
|
+
* **The reporting overload is declared FIRST, and that ordering is load-bearing.**
|
|
94
|
+
* `Parameters<typeof preset>[1]` resolves to the LAST overload, and several tests
|
|
95
|
+
* type their options helper that way; with the builder overload last, that helper
|
|
96
|
+
* keeps the shape callers actually use. Overload resolution still picks the
|
|
97
|
+
* reporting one for a call that names `report`, because it is the first match.
|
|
98
|
+
*/
|
|
99
|
+
export declare function recommended(p: ArchProject, options: RecommendedOptions & {
|
|
100
|
+
report: 'builders';
|
|
101
|
+
}): RuleBuilderLike[];
|
|
32
102
|
export declare function recommended(p: ArchProject, options?: RecommendedOptions): ArchViolation[];
|
|
103
|
+
export {};
|
|
33
104
|
//# sourceMappingURL=recommended.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommended.d.ts","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recommended.d.ts","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAK9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAUpD,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB,CAAC,iBAAiB,CAAC;IAC9E;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAQD;;;;GAIG;AACH,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyC6B,CAAA;AAExC;;;;;GAKG;AACH,KAAK,iBAAiB,GAAG,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAA;AAI7D;;;;;;;;;;;;;;;;;GAiBG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,kBAAkB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GACnD,eAAe,EAAE,CAAA;AACpB,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,aAAa,EAAE,CAAA"}
|
|
@@ -2,10 +2,10 @@ import { functions } from '../builders/function-rule-builder.js';
|
|
|
2
2
|
import { functionNoEval, functionNoFunctionConstructor } from '../rules/security.js';
|
|
3
3
|
import { functionNoSilentCatch } from '../rules/errors.js';
|
|
4
4
|
import { noEmptyBodies } from '../rules/hygiene.js';
|
|
5
|
-
import {
|
|
5
|
+
import { overrideFindings, validateOverrides, declareEmptyIfListed, presetDeclarationSpelling, declaredEmptyFindings, deliver, } from './shared.js';
|
|
6
6
|
/**
|
|
7
7
|
* Single source of truth for the floor. `RULE_IDS` (for override validation) and
|
|
8
|
-
* the
|
|
8
|
+
* the builder loop both derive from this — add a rule here and nothing else
|
|
9
9
|
* needs updating.
|
|
10
10
|
*/
|
|
11
11
|
const SPECS = [
|
|
@@ -51,31 +51,33 @@ const SPECS = [
|
|
|
51
51
|
},
|
|
52
52
|
];
|
|
53
53
|
const RULE_IDS = SPECS.map((s) => s.meta.id);
|
|
54
|
-
/**
|
|
55
|
-
* A deliberately **thin, universal safety floor** for any TypeScript project —
|
|
56
|
-
* the handful of things dangerous regardless of project shape that fire ~never
|
|
57
|
-
* on healthy code. Not a full architecture: shape-specific rules (layer order,
|
|
58
|
-
* cycles, delegation) are yours to add.
|
|
59
|
-
*
|
|
60
|
-
* Returns `ArchViolation[]` (the eager ADR-008 form) and ends in `finishPreset`,
|
|
61
|
-
* so a caller can `recommended(p, { report: 'return' })` to own emission, or by
|
|
62
|
-
* default let it throw on any error-severity violation. The two `warn` rules
|
|
63
|
-
* (silent-catch, empty-bodies) are reported to stderr but never fail and are NOT
|
|
64
|
-
* aggregated into the returned array — they have known, suppressible false
|
|
65
|
-
* positives; override to `'error'` to include them. Severity is tunable via
|
|
66
|
-
* `overrides`.
|
|
67
|
-
*
|
|
68
|
-
* Overlaps `agentGuardrails` on empty bodies and `eval`. For agent-focused
|
|
69
|
-
* projects prefer `agentGuardrails` alone, or override the duplicated ids to
|
|
70
|
-
* `'off'` in one preset.
|
|
71
|
-
*/
|
|
72
54
|
export function recommended(p, options = {}) {
|
|
73
55
|
const include = options.include ?? '**/src/**';
|
|
74
56
|
validateOverrides(options.overrides, RULE_IDS);
|
|
75
|
-
const
|
|
57
|
+
const overrideProblems = overrideFindings(options.overrides, RULE_IDS);
|
|
58
|
+
const builders = [];
|
|
59
|
+
const constructed = [];
|
|
76
60
|
for (const { condition, meta, default: def } of SPECS) {
|
|
77
|
-
|
|
61
|
+
const sev = options.overrides?.[meta.id] ?? def;
|
|
62
|
+
if (sev === 'off')
|
|
63
|
+
continue;
|
|
64
|
+
constructed.push(meta.id);
|
|
65
|
+
builders.push(
|
|
66
|
+
// Plan 0089's carrier. Applied at construction so it reaches every rule
|
|
67
|
+
// this preset builds, not only the ones routed through `collectRule`.
|
|
68
|
+
declareEmptyIfListed(functions(p, { includeObjectLiteralFunctions: true })
|
|
69
|
+
.that()
|
|
70
|
+
.resideInFile(include)
|
|
71
|
+
.should()
|
|
72
|
+
.satisfy(condition)
|
|
73
|
+
.rule({ ...meta, declarationSpelling: presetDeclarationSpelling(meta.id) })
|
|
74
|
+
.asSeverity(sev), meta.id, options));
|
|
78
75
|
}
|
|
79
|
-
|
|
76
|
+
// Unknown override keys FIRST: they say the configuration is wrong, which
|
|
77
|
+
// the reader needs before any finding produced under it (bug 0038).
|
|
78
|
+
// Unbound declarations sit with the unknown-override findings: both say the
|
|
79
|
+
// configuration is wrong, which the reader needs before any finding produced
|
|
80
|
+
// under it (bug 0038).
|
|
81
|
+
return deliver([...overrideProblems, ...declaredEmptyFindings(options.expectEmpty, constructed), ...builders], options);
|
|
80
82
|
}
|
|
81
83
|
//# sourceMappingURL=recommended.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recommended.js","sourceRoot":"","sources":["../../src/presets/recommended.ts"],"names":[],"mappings":"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"}
|