@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
|
@@ -2,8 +2,9 @@ import picomatch from 'picomatch';
|
|
|
2
2
|
import { slices } from '../builders/slice-rule-builder.js';
|
|
3
3
|
import { modules } from '../builders/module-rule-builder.js';
|
|
4
4
|
import { smells } from '../smells/index.js';
|
|
5
|
-
import {
|
|
5
|
+
import { atPath, collectRule, overrideFindings, validateOverrides, assertDiscovered, declaredEmptyFindings, deliver, } from './shared.js';
|
|
6
6
|
const RULE_IDS = [
|
|
7
|
+
'preset/boundaries/shared-discovery',
|
|
7
8
|
'preset/boundaries/no-cycles',
|
|
8
9
|
'preset/boundaries/no-cross-boundary',
|
|
9
10
|
'preset/boundaries/shared-isolation',
|
|
@@ -13,40 +14,56 @@ const RULE_IDS = [
|
|
|
13
14
|
/**
|
|
14
15
|
* Collect violations for shared-folder isolation rules.
|
|
15
16
|
*/
|
|
16
|
-
function applySharedIsolation(p, sharedGlobs, boundaryFolders,
|
|
17
|
-
const
|
|
17
|
+
function applySharedIsolation(p, sharedGlobs, boundaryFolders, config, constructed) {
|
|
18
|
+
const builders = [];
|
|
18
19
|
for (const sharedGlob of sharedGlobs) {
|
|
19
20
|
for (const dir of boundaryFolders) {
|
|
20
|
-
|
|
21
|
+
builders.push(...collectRule(modules(p)
|
|
22
|
+
.that()
|
|
23
|
+
.satisfy(atPath(sharedGlob, 'shared'))
|
|
24
|
+
.should()
|
|
25
|
+
.notImportFromWithOptions([`${dir}/**`], config.importOptions ?? {}), {
|
|
26
|
+
id: 'preset/boundaries/shared-isolation',
|
|
27
|
+
because: 'shared code is imported by every boundary, so a dependency from shared back into one of them couples all of them to it',
|
|
28
|
+
suggestion: 'Invert the dependency: move what shared needs into shared, or pass it in as a parameter or interface from the boundary that owns it.',
|
|
29
|
+
imperative: 'Do NOT import a boundary from shared code — invert the dependency',
|
|
30
|
+
}, 'error', config, constructed));
|
|
21
31
|
}
|
|
22
32
|
}
|
|
23
|
-
return
|
|
33
|
+
return builders;
|
|
24
34
|
}
|
|
25
35
|
/**
|
|
26
36
|
* Collect violations for test-isolation rules across boundaries.
|
|
27
37
|
*/
|
|
28
|
-
function applyTestIsolation(p, boundaryFolders,
|
|
29
|
-
const
|
|
38
|
+
function applyTestIsolation(p, boundaryFolders, config, constructed) {
|
|
39
|
+
const builders = [];
|
|
30
40
|
for (const dir of boundaryFolders) {
|
|
31
41
|
const testPattern = `${dir}/**/*.test.*`;
|
|
32
42
|
const otherBoundaryTests = boundaryFolders
|
|
33
43
|
.filter((d) => d !== dir)
|
|
34
44
|
.map((d) => `${d}/**/*.test.*`);
|
|
35
45
|
for (const otherTestGlob of otherBoundaryTests) {
|
|
36
|
-
|
|
46
|
+
builders.push(...collectRule(modules(p)
|
|
47
|
+
.that()
|
|
48
|
+
.resideInFile(testPattern)
|
|
49
|
+
.should()
|
|
50
|
+
.notImportFromWithOptions([otherTestGlob], config.importOptions ?? {}), {
|
|
51
|
+
id: 'preset/boundaries/test-isolation',
|
|
52
|
+
because: "one boundary's tests reaching into another's makes the two impossible to move, delete or run independently",
|
|
53
|
+
suggestion: 'Duplicate the small fixture it needs, or promote the shared helper into a test-support module both boundaries may import.',
|
|
54
|
+
imperative: "Do NOT import another boundary's tests — duplicate the fixture or share it explicitly",
|
|
55
|
+
}, 'error', config, constructed));
|
|
37
56
|
}
|
|
38
57
|
}
|
|
39
|
-
return
|
|
58
|
+
return builders;
|
|
40
59
|
}
|
|
41
|
-
/**
|
|
42
|
-
* Enforce strict module boundaries: no cycles, no cross-boundary imports,
|
|
43
|
-
* shared isolation, and optional copy-paste detection.
|
|
44
|
-
*/
|
|
45
60
|
export function strictBoundaries(p, options) {
|
|
46
|
-
const
|
|
47
|
-
|
|
61
|
+
const config = options;
|
|
62
|
+
const constructed = [];
|
|
63
|
+
validateOverrides(config.overrides, [...RULE_IDS]);
|
|
64
|
+
const overrideProblems = overrideFindings(config.overrides, RULE_IDS);
|
|
48
65
|
const sharedGlobs = options.shared ?? [];
|
|
49
|
-
const
|
|
66
|
+
const builders = [];
|
|
50
67
|
// Discover boundary folders from the glob pattern
|
|
51
68
|
const boundaryGlob = options.folders;
|
|
52
69
|
const matcher = picomatch(boundaryGlob);
|
|
@@ -63,31 +80,123 @@ export function strictBoundaries(p, options) {
|
|
|
63
80
|
const name = dir.split('/').pop() ?? dir;
|
|
64
81
|
sliceDef[name] = `${dir}/**`;
|
|
65
82
|
}
|
|
83
|
+
// --- Discovery guard: a boundaries preset that finds no boundaries is
|
|
84
|
+
// misconfigured (globs match absolute paths — a project-relative glob
|
|
85
|
+
// matches nothing). Fail loudly instead of generating zero rules
|
|
86
|
+
// (the exact false green of ADR-008 / plan 0067), rather than the old
|
|
87
|
+
// silent skip. ---
|
|
88
|
+
builders.push(...assertDiscovered(boundaryFolders, {
|
|
89
|
+
id: 'preset/boundaries/discovery',
|
|
90
|
+
glob: boundaryGlob,
|
|
91
|
+
remedy: `Boundary discovery matches absolute file paths, so '${boundaryGlob}' matched nothing. ` +
|
|
92
|
+
`Use a '**/'-prefixed glob (e.g. '**/${boundaryGlob.replace(/^[./]+/, '')}') or the absolute project path.`,
|
|
93
|
+
}));
|
|
94
|
+
// --- Discovery guard for `shared`, mirroring the one above for `folders` ---
|
|
95
|
+
//
|
|
96
|
+
// `shared` globs go RAW into `no-cross-boundary`'s allow list and are matched
|
|
97
|
+
// by picomatch against absolute resolved file paths. A glob that matches no
|
|
98
|
+
// file creates no allowance — and produced no finding at all, so the user
|
|
99
|
+
// learned about it only through false reds on the exact code the preset's own
|
|
100
|
+
// docs tell them to write. Measured on `boundaries-folder-level`:
|
|
101
|
+
//
|
|
102
|
+
// shared: ['**/src/shared/**'] shared import passes, 0 config findings
|
|
103
|
+
// shared: ['src/shared/**'] shared import FLAGGED, 0 config findings
|
|
104
|
+
// shared: ['**/no-such-dir/**'] shared import FLAGGED, 0 config findings
|
|
105
|
+
// folders: 'src/features/*' 0 rules, 1 config finding
|
|
106
|
+
//
|
|
107
|
+
// The last row is the contract `shared` was missing: `folders` fails loudly on
|
|
108
|
+
// a spelling that matches nothing, and the two options sat on one preset
|
|
109
|
+
// holding the caller to two different contracts (bug 0023). Note that the
|
|
110
|
+
// middle two rows are indistinguishable from outside — same violation count,
|
|
111
|
+
// no explanation — which is what the guard fixes.
|
|
112
|
+
//
|
|
113
|
+
// A GUARD, deliberately not normalization. `folders` is not normalized either;
|
|
114
|
+
// its remedy states the absolute-path contract and tells the caller how to
|
|
115
|
+
// spell it. Rewriting `shared` globs instead would make one option on this
|
|
116
|
+
// preset accept a spelling the other rejects, which is a worse asymmetry than
|
|
117
|
+
// the one being fixed.
|
|
118
|
+
//
|
|
119
|
+
// Matched against FILE paths, not `atPath`'s file-or-folder: the allow list is
|
|
120
|
+
// what this guard is about, and `onlyImportFrom` matches resolved file paths.
|
|
121
|
+
// `shared: ['**/src/shared']` — a folder glob with no `/**` — selects files for
|
|
122
|
+
// `shared-isolation` via `atPath` yet creates no allowance, so it is a genuine
|
|
123
|
+
// fault here and the guard must fire for it.
|
|
124
|
+
for (const sharedGlob of sharedGlobs) {
|
|
125
|
+
const matchesFile = picomatch(sharedGlob);
|
|
126
|
+
const matchedFiles = p.getSourceFiles().filter((sf) => matchesFile(sf.getFilePath()));
|
|
127
|
+
builders.push(...assertDiscovered(matchedFiles, {
|
|
128
|
+
id: 'preset/boundaries/shared-discovery',
|
|
129
|
+
glob: sharedGlob,
|
|
130
|
+
remedy: `A shared glob is matched against absolute file paths, so '${sharedGlob}' matched no file and ` +
|
|
131
|
+
`creates no allowance — every import of it is reported as a cross-boundary violation. ` +
|
|
132
|
+
`Use a '**/'-prefixed glob ending in '/**' (e.g. '**/${sharedGlob.replace(/^[./]+/, '').replace(/\/\*\*$/, '')}/**') or the absolute project path.`,
|
|
133
|
+
}));
|
|
134
|
+
}
|
|
66
135
|
// --- No cycles between boundaries ---
|
|
67
136
|
if (Object.keys(sliceDef).length > 0) {
|
|
68
|
-
|
|
137
|
+
builders.push(...collectRule(slices(p).assignedFrom(sliceDef).should().beFreeOfCycles(options.importOptions), {
|
|
138
|
+
id: 'preset/boundaries/no-cycles',
|
|
139
|
+
because: 'boundaries in a cycle cannot be built, tested, released or reasoned about separately, which is the whole point of having them. 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.',
|
|
140
|
+
suggestion: 'Break the cycle at its weakest edge: move the shared type or helper into the shared module, or invert one direction with an interface owned by the depended-on side.',
|
|
141
|
+
imperative: 'Do NOT create an import cycle between boundaries',
|
|
142
|
+
}, 'error', config, constructed));
|
|
69
143
|
}
|
|
70
144
|
// --- No cross-boundary imports ---
|
|
71
145
|
// Each boundary folder: modules in it can only import from itself + shared
|
|
72
146
|
for (const dir of boundaryFolders) {
|
|
73
147
|
const boundaryPattern = `${dir}/**`;
|
|
74
148
|
const allowedGlobs = [boundaryPattern, ...sharedGlobs];
|
|
75
|
-
|
|
149
|
+
builders.push(...collectRule(modules(p)
|
|
76
150
|
.that()
|
|
77
151
|
.resideInFolder(boundaryPattern)
|
|
78
152
|
.should()
|
|
79
|
-
|
|
153
|
+
// Forwarded, like `beFreeOfCycles`. Measured before the fix, a
|
|
154
|
+
// type-only cross-boundary edge failed this rule identically with and
|
|
155
|
+
// without `{ ignoreTypeImports: true }` — the option documented as
|
|
156
|
+
// reaching the isolation rules reached only the cycle rule.
|
|
157
|
+
.onlyImportFromWithOptions(allowedGlobs, options.importOptions ?? {}), {
|
|
158
|
+
id: 'preset/boundaries/no-cross-boundary',
|
|
159
|
+
// This rule is folder-level: the allow list is this boundary plus the
|
|
160
|
+
// shared globs, so ANY import from another boundary violates it,
|
|
161
|
+
// whichever file it names. The metadata used to describe
|
|
162
|
+
// entry-point-mediated access — a looser policy the rule does not
|
|
163
|
+
// implement — and its `Fix:` line said "import from the other
|
|
164
|
+
// boundary's entry point instead". Applied exactly, that reproduces
|
|
165
|
+
// the identical violation: measured, `reporting -> billing/index.ts`
|
|
166
|
+
// and `reporting -> billing/internal.ts` fail identically
|
|
167
|
+
// ([ts-archunit bug 0017](https://github.com/nielspeter/ts-archunit/blob/main/bugs/fixed/0017-boundaries-no-cross-boundary-message-overclaims-entry-point-enforcement.md)).
|
|
168
|
+
// An agent obeying it loops, and its only exits are unsanctioned.
|
|
169
|
+
because: 'boundaries may only depend on themselves and the shared modules — an import from another boundary couples the two, whichever file it names',
|
|
170
|
+
// COMPUTED, because no fixed string is right in both configurations.
|
|
171
|
+
// `shared` defaults to `[]`, which is legal, and there the "move it
|
|
172
|
+
// into the shared module" clause names somewhere that does not exist:
|
|
173
|
+
// measured, a boundary importing `src/shared/**` with `shared`
|
|
174
|
+
// unconfigured is itself a violation of this rule.
|
|
175
|
+
suggestion: sharedGlobs.length > 0
|
|
176
|
+
? `Move the code both boundaries need into a shared folder (${sharedGlobs.join(', ')}), or remove the dependency on the other boundary.`
|
|
177
|
+
: 'No shared folders are configured — add one to strictBoundaries({ shared }) and move the code both boundaries need there, or remove the dependency on the other boundary.',
|
|
178
|
+
imperative: 'Do NOT import a file outside this boundary or its shared modules',
|
|
179
|
+
}, 'error', config, constructed));
|
|
80
180
|
}
|
|
81
181
|
// --- Shared isolation: shared folders don't import from boundaries ---
|
|
82
|
-
|
|
182
|
+
builders.push(...applySharedIsolation(p, sharedGlobs, boundaryFolders, config, constructed));
|
|
83
183
|
// --- Test isolation ---
|
|
84
184
|
if (options.isolateTests) {
|
|
85
|
-
|
|
185
|
+
builders.push(...applyTestIsolation(p, boundaryFolders, config, constructed));
|
|
86
186
|
}
|
|
87
187
|
// --- No copy-paste across boundaries ---
|
|
88
188
|
if (options.noCopyPaste) {
|
|
89
|
-
|
|
189
|
+
builders.push(...collectRule(smells.duplicateBodies(p), {
|
|
190
|
+
id: 'preset/boundaries/no-duplicate-bodies',
|
|
191
|
+
because: 'the same body in two boundaries drifts independently, so a fix applied in one silently leaves the other wrong',
|
|
192
|
+
suggestion: 'Extract the shared logic into the shared module and call it from both. If the similarity is coincidental, raise withMinSimilarity() or exclude the pair.',
|
|
193
|
+
imperative: 'Do NOT copy a function body across boundaries — extract it into shared',
|
|
194
|
+
}, 'warn', config, constructed));
|
|
90
195
|
}
|
|
91
|
-
|
|
196
|
+
// Unknown override keys FIRST: they say the configuration is wrong, which
|
|
197
|
+
// the reader needs before any finding produced under it (bug 0038).
|
|
198
|
+
// Constructed, not merely known: a rule whose option was never enabled, or that
|
|
199
|
+
// was overridden `off`, is not built — so a declaration naming it is dead.
|
|
200
|
+
return deliver([...overrideProblems, ...declaredEmptyFindings(config.expectEmpty, constructed), ...builders], options);
|
|
92
201
|
}
|
|
93
202
|
//# sourceMappingURL=boundaries.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../src/presets/boundaries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../src/presets/boundaries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import type { ArchViolation } from '@nielspeter/eess';
|
|
1
2
|
import type { ArchProject } from '../core/project.js';
|
|
2
|
-
import type {
|
|
3
|
+
import type { RuleBuilderLike } from '@nielspeter/eess';
|
|
3
4
|
import type { PresetBaseOptions } from './shared.js';
|
|
4
|
-
|
|
5
|
+
/** This preset's rule ids, derived from `RULE_IDS` so the two cannot drift. */
|
|
6
|
+
type DataLayerIsolationRuleId = (typeof RULE_IDS)[number];
|
|
7
|
+
export interface DataLayerIsolationOptions extends PresetBaseOptions<DataLayerIsolationRuleId> {
|
|
5
8
|
/** Glob pattern for repository files */
|
|
6
9
|
repositories: string;
|
|
7
10
|
/** Base class that all repositories must extend */
|
|
@@ -9,6 +12,7 @@ export interface DataLayerIsolationOptions extends PresetBaseOptions {
|
|
|
9
12
|
/** If true, repositories must throw typed errors, not generic Error */
|
|
10
13
|
requireTypedErrors?: boolean;
|
|
11
14
|
}
|
|
15
|
+
declare const RULE_IDS: readonly ["preset/data/extend-base", "preset/data/typed-errors"];
|
|
12
16
|
/**
|
|
13
17
|
* Companion to `layeredArchitecture`. Enforces repository pattern:
|
|
14
18
|
* base class extension and typed error throwing.
|
|
@@ -16,5 +20,21 @@ export interface DataLayerIsolationOptions extends PresetBaseOptions {
|
|
|
16
20
|
* Does NOT duplicate layer ordering or import direction — those
|
|
17
21
|
* are `layeredArchitecture`'s job.
|
|
18
22
|
*/
|
|
23
|
+
/**
|
|
24
|
+
* `report` names a delivery mode; omitting it returns the un-executed builders.
|
|
25
|
+
*
|
|
26
|
+
* Overloaded so the common call keeps its exact type — a bare union would make
|
|
27
|
+
* every existing `.violations()` call site an error (26 test files, measured).
|
|
28
|
+
*
|
|
29
|
+
* **The reporting overload is declared FIRST, and that ordering is load-bearing.**
|
|
30
|
+
* `Parameters<typeof preset>[1]` resolves to the LAST overload, and several tests
|
|
31
|
+
* type their options helper that way; with the builder overload last, that helper
|
|
32
|
+
* keeps the shape callers actually use. Overload resolution still picks the
|
|
33
|
+
* reporting one for a call that names `report`, because it is the first match.
|
|
34
|
+
*/
|
|
35
|
+
export declare function dataLayerIsolation(p: ArchProject, options: DataLayerIsolationOptions & {
|
|
36
|
+
report: 'builders';
|
|
37
|
+
}): RuleBuilderLike[];
|
|
19
38
|
export declare function dataLayerIsolation(p: ArchProject, options: DataLayerIsolationOptions): ArchViolation[];
|
|
39
|
+
export {};
|
|
20
40
|
//# sourceMappingURL=data-layer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-layer.d.ts","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"data-layer.d.ts","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAGvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAWpD,+EAA+E;AAC/E,KAAK,wBAAwB,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAEzD,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB,CAAC,wBAAwB,CAAC;IAC5F,wCAAwC;IACxC,YAAY,EAAE,MAAM,CAAA;IACpB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,QAAA,MAAM,QAAQ,kEAAmE,CAAA;AAEjF;;;;;;GAMG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,yBAAyB,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAC1D,eAAe,EAAE,CAAA;AACpB,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,yBAAyB,GACjC,aAAa,EAAE,CAAA"}
|
|
@@ -1,30 +1,72 @@
|
|
|
1
1
|
import { classes } from '../builders/class-rule-builder.js';
|
|
2
2
|
import { newExpr } from '../helpers/matchers.js';
|
|
3
|
-
import {
|
|
3
|
+
import { atPath, collectRule, overrideFindings, validateOverrides, declaredEmptyFindings, assertEnabled, deliver, } from './shared.js';
|
|
4
4
|
const RULE_IDS = ['preset/data/extend-base', 'preset/data/typed-errors'];
|
|
5
|
-
/**
|
|
6
|
-
* Companion to `layeredArchitecture`. Enforces repository pattern:
|
|
7
|
-
* base class extension and typed error throwing.
|
|
8
|
-
*
|
|
9
|
-
* Does NOT duplicate layer ordering or import direction — those
|
|
10
|
-
* are `layeredArchitecture`'s job.
|
|
11
|
-
*/
|
|
12
5
|
export function dataLayerIsolation(p, options) {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
const config = options;
|
|
7
|
+
const constructed = [];
|
|
8
|
+
validateOverrides(config.overrides, [...RULE_IDS]);
|
|
9
|
+
const overrideProblems = overrideFindings(config.overrides, RULE_IDS);
|
|
10
|
+
// Plan 0100's `attempted`: both rules sit behind an independent optional
|
|
11
|
+
// flag, so — unlike `strictBoundaries`/`layeredArchitecture`, which always
|
|
12
|
+
// construct at least one rule once discovery succeeds — this can
|
|
13
|
+
// legitimately be `[]`. Computed from the options directly, before
|
|
14
|
+
// `overrides` is consulted, same as `constructed` is computed after.
|
|
15
|
+
//
|
|
16
|
+
// Kept in step with the two `if` blocks below BY HAND — the same shape of
|
|
17
|
+
// fragility `constructed` already has here (review: nothing enforces
|
|
18
|
+
// `attempted.length === 0 ⟺` no rule gets built; it holds because both
|
|
19
|
+
// conditionals are copy-derived from the same two options).
|
|
20
|
+
const attempted = [];
|
|
21
|
+
if (options.baseClass)
|
|
22
|
+
attempted.push('preset/data/extend-base');
|
|
23
|
+
if (options.requireTypedErrors)
|
|
24
|
+
attempted.push('preset/data/typed-errors');
|
|
25
|
+
const builders = [];
|
|
16
26
|
// --- Base class enforcement ---
|
|
17
27
|
if (options.baseClass) {
|
|
18
|
-
|
|
28
|
+
builders.push(...collectRule(classes(p)
|
|
29
|
+
.that()
|
|
30
|
+
.satisfy(atPath(options.repositories, 'repositories'))
|
|
31
|
+
.should()
|
|
32
|
+
.extend(options.baseClass), {
|
|
33
|
+
id: 'preset/data/extend-base',
|
|
34
|
+
because: 'a repository that does not extend the base class silently opts out of whatever the base guarantees — connection handling, tenancy scoping, error translation',
|
|
35
|
+
suggestion: 'Extend the base repository. If this one genuinely cannot, exclude it by name and record why, rather than leaving it looking conformant.',
|
|
36
|
+
imperative: 'Do NOT define a repository that does not extend the base repository',
|
|
37
|
+
}, 'error', config, constructed));
|
|
19
38
|
}
|
|
20
39
|
// --- Typed errors ---
|
|
21
40
|
if (options.requireTypedErrors) {
|
|
22
|
-
|
|
41
|
+
builders.push(...collectRule(classes(p)
|
|
23
42
|
.that()
|
|
24
|
-
.
|
|
43
|
+
.satisfy(atPath(options.repositories, 'repositories'))
|
|
25
44
|
.should()
|
|
26
|
-
.notContain(newExpr('Error')),
|
|
45
|
+
.notContain(newExpr('Error')), {
|
|
46
|
+
id: 'preset/data/typed-errors',
|
|
47
|
+
because: 'a generic Error crossing the data layer loses the information callers need to distinguish not-found from conflict from a real failure',
|
|
48
|
+
suggestion: 'Throw a domain error type instead, so the caller can branch on it and the API layer can map it to a status code.',
|
|
49
|
+
imperative: 'Do NOT throw new Error() in a repository — throw a domain error type',
|
|
50
|
+
}, 'error', config, constructed));
|
|
27
51
|
}
|
|
28
|
-
|
|
52
|
+
// Unknown override keys FIRST: they say the configuration is wrong, which
|
|
53
|
+
// the reader needs before any finding produced under it (bug 0038).
|
|
54
|
+
// Constructed, not merely known: a rule whose option was never enabled, or that
|
|
55
|
+
// was overridden `off`, is not built — so a declaration naming it is dead.
|
|
56
|
+
const otherFindings = [
|
|
57
|
+
...overrideProblems,
|
|
58
|
+
...declaredEmptyFindings(config.expectEmpty, constructed),
|
|
59
|
+
];
|
|
60
|
+
return deliver([
|
|
61
|
+
...otherFindings,
|
|
62
|
+
// Plan 0100, LAST: only when nothing above already explains the empty
|
|
63
|
+
// result does "neither flag was ever set" get to be the diagnosis.
|
|
64
|
+
...assertEnabled(attempted, otherFindings, {
|
|
65
|
+
id: 'preset/data/constructs-nothing',
|
|
66
|
+
presetName: 'dataLayerIsolation',
|
|
67
|
+
optionsHint: 'baseClass, requireTypedErrors',
|
|
68
|
+
}),
|
|
69
|
+
...builders,
|
|
70
|
+
], options);
|
|
29
71
|
}
|
|
30
72
|
//# sourceMappingURL=data-layer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-layer.js","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-layer.js","sourceRoot":"","sources":["../../src/presets/data-layer.ts"],"names":[],"mappings":"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"}
|
package/dist/presets/index.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
export type { RuleSeverity, PresetBaseOptions } from './shared.js';
|
|
2
|
-
export {
|
|
3
|
-
export type { RecommendedOptions } from './recommended.js';
|
|
4
|
-
export { recommended } from './recommended.js';
|
|
5
|
-
export type { AgentGuardrailsOptions } from './agent-guardrails.js';
|
|
6
|
-
export { agentGuardrails } from './agent-guardrails.js';
|
|
2
|
+
export { validateOverrides } from './shared.js';
|
|
7
3
|
export type { LayeredArchitectureOptions } from './layered.js';
|
|
8
4
|
export { layeredArchitecture } from './layered.js';
|
|
9
5
|
export type { DataLayerIsolationOptions } from './data-layer.js';
|
|
10
6
|
export { dataLayerIsolation } from './data-layer.js';
|
|
11
7
|
export type { StrictBoundariesOptions } from './boundaries.js';
|
|
12
8
|
export { strictBoundaries } from './boundaries.js';
|
|
9
|
+
export type { AgentGuardrailsOptions } from './agent-guardrails.js';
|
|
10
|
+
export { agentGuardrails } from './agent-guardrails.js';
|
|
11
|
+
export type { RecommendedOptions } from './recommended.js';
|
|
12
|
+
export { recommended } from './recommended.js';
|
|
13
|
+
export { dispatchRule, throwIfViolations } from '@nielspeter/eess';
|
|
14
|
+
export type { PresetDelivery } from './shared.js';
|
|
13
15
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,YAAY,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,YAAY,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEpD,YAAY,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,YAAY,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAO9C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAMlE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/presets/index.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export { recommended } from './recommended.js';
|
|
3
|
-
export { agentGuardrails } from './agent-guardrails.js';
|
|
1
|
+
export { validateOverrides } from './shared.js';
|
|
4
2
|
export { layeredArchitecture } from './layered.js';
|
|
5
3
|
export { dataLayerIsolation } from './data-layer.js';
|
|
6
4
|
export { strictBoundaries } from './boundaries.js';
|
|
5
|
+
export { agentGuardrails } from './agent-guardrails.js';
|
|
6
|
+
export { recommended } from './recommended.js';
|
|
7
|
+
// Published on the `/presets` subpath before the engine copy and dropped by it.
|
|
8
|
+
// `restore-the-published-ts-surface` audited the ROOT barrel only, so a named
|
|
9
|
+
// import of either from `@nielspeter/eess-ts/presets` was a link-time error that
|
|
10
|
+
// no changeset declared. Found by an adopter review diffing every subpath, not
|
|
11
|
+
// just `.`.
|
|
12
|
+
export { dispatchRule, throwIfViolations } from '@nielspeter/eess';
|
|
7
13
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/presets/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAG/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAE9C,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,+EAA+E;AAC/E,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import type { ArchViolation } from '@nielspeter/eess';
|
|
2
|
+
import type { ImportOptions } from '../core/import-options.js';
|
|
1
3
|
import type { ArchProject } from '../core/project.js';
|
|
2
|
-
import type {
|
|
4
|
+
import type { RuleBuilderLike } from '@nielspeter/eess';
|
|
3
5
|
import type { PresetBaseOptions } from './shared.js';
|
|
4
|
-
|
|
6
|
+
/** This preset's rule ids, derived from `RULE_IDS` so the two cannot drift. */
|
|
7
|
+
type LayeredArchitectureRuleId = (typeof RULE_IDS)[number];
|
|
8
|
+
export interface LayeredArchitectureOptions extends PresetBaseOptions<LayeredArchitectureRuleId> {
|
|
5
9
|
/** Layer name → glob pattern mapping. Order = dependency direction (first depends on second, etc.) */
|
|
6
10
|
layers: Record<string, string>;
|
|
7
11
|
/** Glob patterns for shared/utility folders accessible by all layers */
|
|
@@ -12,10 +16,50 @@ export interface LayeredArchitectureOptions extends PresetBaseOptions {
|
|
|
12
16
|
typeImportsAllowed?: string[];
|
|
13
17
|
/** Package restriction: glob → list of npm package name patterns. Only those layers may import those packages. */
|
|
14
18
|
restrictedPackages?: Record<string, string[]>;
|
|
19
|
+
/**
|
|
20
|
+
* This project's answer to "is a type-only edge a dependency?", applied to
|
|
21
|
+
* every rule this preset constructs **whose condition takes one** — plan 0089:
|
|
22
|
+
* `layer-order`, `no-cycles`, `innermost-isolation`, `restricted-packages`.
|
|
23
|
+
* `type-imports-only` is excluded because `onlyHaveTypeImportsFrom` asks about
|
|
24
|
+
* type imports *as its subject* — there is no answer for this bag to give it.
|
|
25
|
+
*
|
|
26
|
+
* The conditions disagree by default, deliberately: `beFreeOfCycles` ignores
|
|
27
|
+
* type-only imports because it asks whether the module is *evaluated*, and an
|
|
28
|
+
* erased import cannot contribute to an initialization cycle; the layer and
|
|
29
|
+
* boundary conditions count them because they ask whether the code is
|
|
30
|
+
* *coupled*. Holding a builder, that distinction is visible and you choose per
|
|
31
|
+
* condition. Through a preset it is invisible, and this option exists because
|
|
32
|
+
* a preset user could not align them even when their project wanted them
|
|
33
|
+
* aligned.
|
|
34
|
+
*
|
|
35
|
+
* So passing it moves exactly one side, and which side depends on the value:
|
|
36
|
+
* `{ ignoreTypeImports: true }` stops the layer rules counting type coupling
|
|
37
|
+
* (the cycle rule already ignored it); `{ ignoreTypeImports: false }` makes
|
|
38
|
+
* the cycle rule count type edges (the layer rules already did). `docs/presets.md`
|
|
39
|
+
* carries that table.
|
|
40
|
+
*/
|
|
41
|
+
importOptions?: ImportOptions;
|
|
15
42
|
}
|
|
43
|
+
declare const RULE_IDS: readonly ["preset/layered/layer-order", "preset/layered/no-cycles", "preset/layered/innermost-isolation", "preset/layered/type-imports-only", "preset/layered/restricted-packages"];
|
|
16
44
|
/**
|
|
17
45
|
* Enforce a layered architecture: dependency direction, cycle freedom,
|
|
18
46
|
* and optional package restrictions.
|
|
19
47
|
*/
|
|
48
|
+
/**
|
|
49
|
+
* `report` names a delivery mode; omitting it returns the un-executed builders.
|
|
50
|
+
*
|
|
51
|
+
* Overloaded so the common call keeps its exact type — a bare union would make
|
|
52
|
+
* every existing `.violations()` call site an error (26 test files, measured).
|
|
53
|
+
*
|
|
54
|
+
* **The reporting overload is declared FIRST, and that ordering is load-bearing.**
|
|
55
|
+
* `Parameters<typeof preset>[1]` resolves to the LAST overload, and several tests
|
|
56
|
+
* type their options helper that way; with the builder overload last, that helper
|
|
57
|
+
* keeps the shape callers actually use. Overload resolution still picks the
|
|
58
|
+
* reporting one for a call that names `report`, because it is the first match.
|
|
59
|
+
*/
|
|
60
|
+
export declare function layeredArchitecture(p: ArchProject, options: LayeredArchitectureOptions & {
|
|
61
|
+
report: 'builders';
|
|
62
|
+
}): RuleBuilderLike[];
|
|
20
63
|
export declare function layeredArchitecture(p: ArchProject, options: LayeredArchitectureOptions): ArchViolation[];
|
|
64
|
+
export {};
|
|
21
65
|
//# sourceMappingURL=layered.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layered.d.ts","sourceRoot":"","sources":["../../src/presets/layered.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"layered.d.ts","sourceRoot":"","sources":["../../src/presets/layered.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAKvD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AASpD,+EAA+E;AAC/E,KAAK,yBAAyB,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAE1D,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB,CAAC,yBAAyB,CAAC;IAC9F,sGAAsG;IACtG,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,wFAAwF;IACxF,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,kHAAkH;IAClH,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7C;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,aAAa,CAAC,EAAE,aAAa,CAAA;CAC9B;AAED,QAAA,MAAM,QAAQ,qLAMJ,CAAA;AAgGV;;;GAGG;AACH;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,0BAA0B,GAAG;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,GAC3D,eAAe,EAAE,CAAA;AACpB,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,WAAW,EACd,OAAO,EAAE,0BAA0B,GAClC,aAAa,EAAE,CAAA"}
|