driftdetect-detectors 0.1.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/dist/accessibility/alt-text.d.ts +63 -0
- package/dist/accessibility/alt-text.d.ts.map +1 -0
- package/dist/accessibility/alt-text.js +100 -0
- package/dist/accessibility/alt-text.js.map +1 -0
- package/dist/accessibility/aria-roles.d.ts +65 -0
- package/dist/accessibility/aria-roles.d.ts.map +1 -0
- package/dist/accessibility/aria-roles.js +87 -0
- package/dist/accessibility/aria-roles.js.map +1 -0
- package/dist/accessibility/focus-management.d.ts +62 -0
- package/dist/accessibility/focus-management.d.ts.map +1 -0
- package/dist/accessibility/focus-management.js +88 -0
- package/dist/accessibility/focus-management.js.map +1 -0
- package/dist/accessibility/heading-hierarchy.d.ts +66 -0
- package/dist/accessibility/heading-hierarchy.d.ts.map +1 -0
- package/dist/accessibility/heading-hierarchy.js +94 -0
- package/dist/accessibility/heading-hierarchy.js.map +1 -0
- package/dist/accessibility/index.d.ts +25 -0
- package/dist/accessibility/index.d.ts.map +1 -0
- package/dist/accessibility/index.js +21 -0
- package/dist/accessibility/index.js.map +1 -0
- package/dist/accessibility/keyboard-nav.d.ts +63 -0
- package/dist/accessibility/keyboard-nav.d.ts.map +1 -0
- package/dist/accessibility/keyboard-nav.js +86 -0
- package/dist/accessibility/keyboard-nav.js.map +1 -0
- package/dist/accessibility/semantic-html.d.ts +76 -0
- package/dist/accessibility/semantic-html.d.ts.map +1 -0
- package/dist/accessibility/semantic-html.js +204 -0
- package/dist/accessibility/semantic-html.js.map +1 -0
- package/dist/api/client-patterns.d.ts +121 -0
- package/dist/api/client-patterns.d.ts.map +1 -0
- package/dist/api/client-patterns.js +478 -0
- package/dist/api/client-patterns.js.map +1 -0
- package/dist/api/error-format.d.ts +140 -0
- package/dist/api/error-format.d.ts.map +1 -0
- package/dist/api/error-format.js +614 -0
- package/dist/api/error-format.js.map +1 -0
- package/dist/api/http-methods.d.ts +255 -0
- package/dist/api/http-methods.d.ts.map +1 -0
- package/dist/api/http-methods.js +890 -0
- package/dist/api/http-methods.js.map +1 -0
- package/dist/api/index.d.ts +16 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +37 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/pagination.d.ts +133 -0
- package/dist/api/pagination.d.ts.map +1 -0
- package/dist/api/pagination.js +521 -0
- package/dist/api/pagination.js.map +1 -0
- package/dist/api/response-envelope.d.ts +261 -0
- package/dist/api/response-envelope.d.ts.map +1 -0
- package/dist/api/response-envelope.js +1050 -0
- package/dist/api/response-envelope.js.map +1 -0
- package/dist/api/retry-patterns.d.ts +117 -0
- package/dist/api/retry-patterns.d.ts.map +1 -0
- package/dist/api/retry-patterns.js +480 -0
- package/dist/api/retry-patterns.js.map +1 -0
- package/dist/api/route-structure.d.ts +128 -0
- package/dist/api/route-structure.d.ts.map +1 -0
- package/dist/api/route-structure.js +738 -0
- package/dist/api/route-structure.js.map +1 -0
- package/dist/auth/audit-logging.d.ts +80 -0
- package/dist/auth/audit-logging.d.ts.map +1 -0
- package/dist/auth/audit-logging.js +370 -0
- package/dist/auth/audit-logging.js.map +1 -0
- package/dist/auth/index.d.ts +33 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +49 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware-usage.d.ts +65 -0
- package/dist/auth/middleware-usage.d.ts.map +1 -0
- package/dist/auth/middleware-usage.js +192 -0
- package/dist/auth/middleware-usage.js.map +1 -0
- package/dist/auth/permission-checks.d.ts +60 -0
- package/dist/auth/permission-checks.d.ts.map +1 -0
- package/dist/auth/permission-checks.js +159 -0
- package/dist/auth/permission-checks.js.map +1 -0
- package/dist/auth/rbac-patterns.d.ts +68 -0
- package/dist/auth/rbac-patterns.d.ts.map +1 -0
- package/dist/auth/rbac-patterns.js +143 -0
- package/dist/auth/rbac-patterns.js.map +1 -0
- package/dist/auth/resource-ownership.d.ts +77 -0
- package/dist/auth/resource-ownership.d.ts.map +1 -0
- package/dist/auth/resource-ownership.js +324 -0
- package/dist/auth/resource-ownership.js.map +1 -0
- package/dist/auth/token-handling.d.ts +64 -0
- package/dist/auth/token-handling.d.ts.map +1 -0
- package/dist/auth/token-handling.js +151 -0
- package/dist/auth/token-handling.js.map +1 -0
- package/dist/base/ast-detector.d.ts +421 -0
- package/dist/base/ast-detector.d.ts.map +1 -0
- package/dist/base/ast-detector.js +699 -0
- package/dist/base/ast-detector.js.map +1 -0
- package/dist/base/base-detector.d.ts +366 -0
- package/dist/base/base-detector.d.ts.map +1 -0
- package/dist/base/base-detector.js +170 -0
- package/dist/base/base-detector.js.map +1 -0
- package/dist/base/index.d.ts +12 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +17 -0
- package/dist/base/index.js.map +1 -0
- package/dist/base/regex-detector.d.ts +421 -0
- package/dist/base/regex-detector.d.ts.map +1 -0
- package/dist/base/regex-detector.js +537 -0
- package/dist/base/regex-detector.js.map +1 -0
- package/dist/base/structural-detector.d.ts +424 -0
- package/dist/base/structural-detector.d.ts.map +1 -0
- package/dist/base/structural-detector.js +731 -0
- package/dist/base/structural-detector.js.map +1 -0
- package/dist/base/types.d.ts +53 -0
- package/dist/base/types.d.ts.map +1 -0
- package/dist/base/types.js +5 -0
- package/dist/base/types.js.map +1 -0
- package/dist/components/component-structure.d.ts +163 -0
- package/dist/components/component-structure.d.ts.map +1 -0
- package/dist/components/component-structure.js +500 -0
- package/dist/components/component-structure.js.map +1 -0
- package/dist/components/composition.d.ts +287 -0
- package/dist/components/composition.d.ts.map +1 -0
- package/dist/components/composition.js +1123 -0
- package/dist/components/composition.js.map +1 -0
- package/dist/components/duplicate-detection.d.ts +251 -0
- package/dist/components/duplicate-detection.d.ts.map +1 -0
- package/dist/components/duplicate-detection.js +804 -0
- package/dist/components/duplicate-detection.js.map +1 -0
- package/dist/components/index.d.ts +16 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +51 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/near-duplicate.d.ts +402 -0
- package/dist/components/near-duplicate.d.ts.map +1 -0
- package/dist/components/near-duplicate.js +1090 -0
- package/dist/components/near-duplicate.js.map +1 -0
- package/dist/components/props-patterns.d.ts +194 -0
- package/dist/components/props-patterns.d.ts.map +1 -0
- package/dist/components/props-patterns.js +795 -0
- package/dist/components/props-patterns.js.map +1 -0
- package/dist/components/ref-forwarding.d.ts +250 -0
- package/dist/components/ref-forwarding.d.ts.map +1 -0
- package/dist/components/ref-forwarding.js +832 -0
- package/dist/components/ref-forwarding.js.map +1 -0
- package/dist/components/state-patterns.d.ts +291 -0
- package/dist/components/state-patterns.d.ts.map +1 -0
- package/dist/components/state-patterns.js +970 -0
- package/dist/components/state-patterns.js.map +1 -0
- package/dist/config/config-validation.d.ts +74 -0
- package/dist/config/config-validation.d.ts.map +1 -0
- package/dist/config/config-validation.js +446 -0
- package/dist/config/config-validation.js.map +1 -0
- package/dist/config/default-values.d.ts +72 -0
- package/dist/config/default-values.d.ts.map +1 -0
- package/dist/config/default-values.js +386 -0
- package/dist/config/default-values.js.map +1 -0
- package/dist/config/env-naming.d.ts +73 -0
- package/dist/config/env-naming.d.ts.map +1 -0
- package/dist/config/env-naming.js +429 -0
- package/dist/config/env-naming.js.map +1 -0
- package/dist/config/environment-detection.d.ts +72 -0
- package/dist/config/environment-detection.d.ts.map +1 -0
- package/dist/config/environment-detection.js +400 -0
- package/dist/config/environment-detection.js.map +1 -0
- package/dist/config/feature-flags.d.ts +72 -0
- package/dist/config/feature-flags.d.ts.map +1 -0
- package/dist/config/feature-flags.js +384 -0
- package/dist/config/feature-flags.js.map +1 -0
- package/dist/config/index.d.ts +27 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +43 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/required-optional.d.ts +71 -0
- package/dist/config/required-optional.d.ts.map +1 -0
- package/dist/config/required-optional.js +344 -0
- package/dist/config/required-optional.js.map +1 -0
- package/dist/data-access/connection-pooling.d.ts +63 -0
- package/dist/data-access/connection-pooling.d.ts.map +1 -0
- package/dist/data-access/connection-pooling.js +297 -0
- package/dist/data-access/connection-pooling.js.map +1 -0
- package/dist/data-access/dto-patterns.d.ts +64 -0
- package/dist/data-access/dto-patterns.d.ts.map +1 -0
- package/dist/data-access/dto-patterns.js +291 -0
- package/dist/data-access/dto-patterns.js.map +1 -0
- package/dist/data-access/index.d.ts +31 -0
- package/dist/data-access/index.d.ts.map +1 -0
- package/dist/data-access/index.js +49 -0
- package/dist/data-access/index.js.map +1 -0
- package/dist/data-access/n-plus-one.d.ts +60 -0
- package/dist/data-access/n-plus-one.d.ts.map +1 -0
- package/dist/data-access/n-plus-one.js +264 -0
- package/dist/data-access/n-plus-one.js.map +1 -0
- package/dist/data-access/query-patterns.d.ts +64 -0
- package/dist/data-access/query-patterns.d.ts.map +1 -0
- package/dist/data-access/query-patterns.js +314 -0
- package/dist/data-access/query-patterns.js.map +1 -0
- package/dist/data-access/repository-pattern.d.ts +62 -0
- package/dist/data-access/repository-pattern.d.ts.map +1 -0
- package/dist/data-access/repository-pattern.js +257 -0
- package/dist/data-access/repository-pattern.js.map +1 -0
- package/dist/data-access/transaction-patterns.d.ts +61 -0
- package/dist/data-access/transaction-patterns.d.ts.map +1 -0
- package/dist/data-access/transaction-patterns.js +277 -0
- package/dist/data-access/transaction-patterns.js.map +1 -0
- package/dist/data-access/validation-patterns.d.ts +62 -0
- package/dist/data-access/validation-patterns.d.ts.map +1 -0
- package/dist/data-access/validation-patterns.js +301 -0
- package/dist/data-access/validation-patterns.js.map +1 -0
- package/dist/documentation/deprecation.d.ts +62 -0
- package/dist/documentation/deprecation.d.ts.map +1 -0
- package/dist/documentation/deprecation.js +83 -0
- package/dist/documentation/deprecation.js.map +1 -0
- package/dist/documentation/example-code.d.ts +64 -0
- package/dist/documentation/example-code.d.ts.map +1 -0
- package/dist/documentation/example-code.js +79 -0
- package/dist/documentation/example-code.js.map +1 -0
- package/dist/documentation/index.d.ts +22 -0
- package/dist/documentation/index.d.ts.map +1 -0
- package/dist/documentation/index.js +19 -0
- package/dist/documentation/index.js.map +1 -0
- package/dist/documentation/jsdoc-patterns.d.ts +72 -0
- package/dist/documentation/jsdoc-patterns.d.ts.map +1 -0
- package/dist/documentation/jsdoc-patterns.js +92 -0
- package/dist/documentation/jsdoc-patterns.js.map +1 -0
- package/dist/documentation/readme-structure.d.ts +67 -0
- package/dist/documentation/readme-structure.d.ts.map +1 -0
- package/dist/documentation/readme-structure.js +76 -0
- package/dist/documentation/readme-structure.js.map +1 -0
- package/dist/documentation/todo-patterns.d.ts +67 -0
- package/dist/documentation/todo-patterns.d.ts.map +1 -0
- package/dist/documentation/todo-patterns.js +73 -0
- package/dist/documentation/todo-patterns.js.map +1 -0
- package/dist/errors/async-errors.d.ts +72 -0
- package/dist/errors/async-errors.d.ts.map +1 -0
- package/dist/errors/async-errors.js +214 -0
- package/dist/errors/async-errors.js.map +1 -0
- package/dist/errors/circuit-breaker.d.ts +53 -0
- package/dist/errors/circuit-breaker.d.ts.map +1 -0
- package/dist/errors/circuit-breaker.js +241 -0
- package/dist/errors/circuit-breaker.js.map +1 -0
- package/dist/errors/error-codes.d.ts +73 -0
- package/dist/errors/error-codes.d.ts.map +1 -0
- package/dist/errors/error-codes.js +211 -0
- package/dist/errors/error-codes.js.map +1 -0
- package/dist/errors/error-logging.d.ts +73 -0
- package/dist/errors/error-logging.d.ts.map +1 -0
- package/dist/errors/error-logging.js +256 -0
- package/dist/errors/error-logging.js.map +1 -0
- package/dist/errors/error-propagation.d.ts +73 -0
- package/dist/errors/error-propagation.d.ts.map +1 -0
- package/dist/errors/error-propagation.js +244 -0
- package/dist/errors/error-propagation.js.map +1 -0
- package/dist/errors/exception-hierarchy.d.ts +75 -0
- package/dist/errors/exception-hierarchy.d.ts.map +1 -0
- package/dist/errors/exception-hierarchy.js +259 -0
- package/dist/errors/exception-hierarchy.js.map +1 -0
- package/dist/errors/index.d.ts +31 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +49 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/try-catch-placement.d.ts +73 -0
- package/dist/errors/try-catch-placement.d.ts.map +1 -0
- package/dist/errors/try-catch-placement.js +214 -0
- package/dist/errors/try-catch-placement.js.map +1 -0
- package/dist/index.d.ts +221 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +245 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/context-fields.d.ts +48 -0
- package/dist/logging/context-fields.d.ts.map +1 -0
- package/dist/logging/context-fields.js +160 -0
- package/dist/logging/context-fields.js.map +1 -0
- package/dist/logging/correlation-ids.d.ts +44 -0
- package/dist/logging/correlation-ids.d.ts.map +1 -0
- package/dist/logging/correlation-ids.js +144 -0
- package/dist/logging/correlation-ids.js.map +1 -0
- package/dist/logging/health-checks.d.ts +45 -0
- package/dist/logging/health-checks.d.ts.map +1 -0
- package/dist/logging/health-checks.js +165 -0
- package/dist/logging/health-checks.js.map +1 -0
- package/dist/logging/index.d.ts +31 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +49 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/log-levels.d.ts +46 -0
- package/dist/logging/log-levels.d.ts.map +1 -0
- package/dist/logging/log-levels.js +178 -0
- package/dist/logging/log-levels.js.map +1 -0
- package/dist/logging/metric-naming.d.ts +46 -0
- package/dist/logging/metric-naming.d.ts.map +1 -0
- package/dist/logging/metric-naming.js +157 -0
- package/dist/logging/metric-naming.js.map +1 -0
- package/dist/logging/pii-redaction.d.ts +44 -0
- package/dist/logging/pii-redaction.d.ts.map +1 -0
- package/dist/logging/pii-redaction.js +166 -0
- package/dist/logging/pii-redaction.js.map +1 -0
- package/dist/logging/structured-format.d.ts +53 -0
- package/dist/logging/structured-format.d.ts.map +1 -0
- package/dist/logging/structured-format.js +235 -0
- package/dist/logging/structured-format.js.map +1 -0
- package/dist/performance/bundle-size.d.ts +79 -0
- package/dist/performance/bundle-size.d.ts.map +1 -0
- package/dist/performance/bundle-size.js +276 -0
- package/dist/performance/bundle-size.js.map +1 -0
- package/dist/performance/caching-patterns.d.ts +78 -0
- package/dist/performance/caching-patterns.d.ts.map +1 -0
- package/dist/performance/caching-patterns.js +257 -0
- package/dist/performance/caching-patterns.js.map +1 -0
- package/dist/performance/code-splitting.d.ts +86 -0
- package/dist/performance/code-splitting.d.ts.map +1 -0
- package/dist/performance/code-splitting.js +447 -0
- package/dist/performance/code-splitting.js.map +1 -0
- package/dist/performance/debounce-throttle.d.ts +75 -0
- package/dist/performance/debounce-throttle.d.ts.map +1 -0
- package/dist/performance/debounce-throttle.js +232 -0
- package/dist/performance/debounce-throttle.js.map +1 -0
- package/dist/performance/index.d.ts +28 -0
- package/dist/performance/index.d.ts.map +1 -0
- package/dist/performance/index.js +39 -0
- package/dist/performance/index.js.map +1 -0
- package/dist/performance/lazy-loading.d.ts +75 -0
- package/dist/performance/lazy-loading.d.ts.map +1 -0
- package/dist/performance/lazy-loading.js +233 -0
- package/dist/performance/lazy-loading.js.map +1 -0
- package/dist/performance/memoization.d.ts +75 -0
- package/dist/performance/memoization.d.ts.map +1 -0
- package/dist/performance/memoization.js +251 -0
- package/dist/performance/memoization.js.map +1 -0
- package/dist/registry/detector-registry.d.ts +266 -0
- package/dist/registry/detector-registry.d.ts.map +1 -0
- package/dist/registry/detector-registry.js +526 -0
- package/dist/registry/detector-registry.js.map +1 -0
- package/dist/registry/index.d.ts +10 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +10 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/loader.d.ts +232 -0
- package/dist/registry/loader.d.ts.map +1 -0
- package/dist/registry/loader.js +419 -0
- package/dist/registry/loader.js.map +1 -0
- package/dist/registry/types.d.ts +111 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +19 -0
- package/dist/registry/types.js.map +1 -0
- package/dist/security/csp-headers.d.ts +78 -0
- package/dist/security/csp-headers.d.ts.map +1 -0
- package/dist/security/csp-headers.js +401 -0
- package/dist/security/csp-headers.js.map +1 -0
- package/dist/security/csrf-protection.d.ts +72 -0
- package/dist/security/csrf-protection.d.ts.map +1 -0
- package/dist/security/csrf-protection.js +344 -0
- package/dist/security/csrf-protection.js.map +1 -0
- package/dist/security/index.d.ts +30 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +48 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/input-sanitization.d.ts +74 -0
- package/dist/security/input-sanitization.d.ts.map +1 -0
- package/dist/security/input-sanitization.js +373 -0
- package/dist/security/input-sanitization.js.map +1 -0
- package/dist/security/rate-limiting.d.ts +81 -0
- package/dist/security/rate-limiting.d.ts.map +1 -0
- package/dist/security/rate-limiting.js +535 -0
- package/dist/security/rate-limiting.js.map +1 -0
- package/dist/security/secret-management.d.ts +83 -0
- package/dist/security/secret-management.d.ts.map +1 -0
- package/dist/security/secret-management.js +547 -0
- package/dist/security/secret-management.js.map +1 -0
- package/dist/security/sql-injection.d.ts +76 -0
- package/dist/security/sql-injection.d.ts.map +1 -0
- package/dist/security/sql-injection.js +383 -0
- package/dist/security/sql-injection.js.map +1 -0
- package/dist/security/xss-prevention.d.ts +80 -0
- package/dist/security/xss-prevention.d.ts.map +1 -0
- package/dist/security/xss-prevention.js +416 -0
- package/dist/security/xss-prevention.js.map +1 -0
- package/dist/structural/barrel-exports.d.ts +178 -0
- package/dist/structural/barrel-exports.d.ts.map +1 -0
- package/dist/structural/barrel-exports.js +553 -0
- package/dist/structural/barrel-exports.js.map +1 -0
- package/dist/structural/circular-deps.d.ts +140 -0
- package/dist/structural/circular-deps.d.ts.map +1 -0
- package/dist/structural/circular-deps.js +422 -0
- package/dist/structural/circular-deps.js.map +1 -0
- package/dist/structural/co-location.d.ts +202 -0
- package/dist/structural/co-location.d.ts.map +1 -0
- package/dist/structural/co-location.js +640 -0
- package/dist/structural/co-location.js.map +1 -0
- package/dist/structural/directory-structure.d.ts +151 -0
- package/dist/structural/directory-structure.d.ts.map +1 -0
- package/dist/structural/directory-structure.js +457 -0
- package/dist/structural/directory-structure.js.map +1 -0
- package/dist/structural/file-naming.d.ts +61 -0
- package/dist/structural/file-naming.d.ts.map +1 -0
- package/dist/structural/file-naming.js +231 -0
- package/dist/structural/file-naming.js.map +1 -0
- package/dist/structural/import-ordering.d.ts +212 -0
- package/dist/structural/import-ordering.d.ts.map +1 -0
- package/dist/structural/import-ordering.js +821 -0
- package/dist/structural/import-ordering.js.map +1 -0
- package/dist/structural/index.d.ts +23 -0
- package/dist/structural/index.d.ts.map +1 -0
- package/dist/structural/index.js +26 -0
- package/dist/structural/index.js.map +1 -0
- package/dist/structural/module-boundaries.d.ts +164 -0
- package/dist/structural/module-boundaries.d.ts.map +1 -0
- package/dist/structural/module-boundaries.js +616 -0
- package/dist/structural/module-boundaries.js.map +1 -0
- package/dist/structural/package-boundaries.d.ts +182 -0
- package/dist/structural/package-boundaries.d.ts.map +1 -0
- package/dist/structural/package-boundaries.js +602 -0
- package/dist/structural/package-boundaries.js.map +1 -0
- package/dist/styling/class-naming.d.ts +263 -0
- package/dist/styling/class-naming.d.ts.map +1 -0
- package/dist/styling/class-naming.js +892 -0
- package/dist/styling/class-naming.js.map +1 -0
- package/dist/styling/color-usage.d.ts +213 -0
- package/dist/styling/color-usage.d.ts.map +1 -0
- package/dist/styling/color-usage.js +732 -0
- package/dist/styling/color-usage.js.map +1 -0
- package/dist/styling/design-tokens.d.ts +212 -0
- package/dist/styling/design-tokens.d.ts.map +1 -0
- package/dist/styling/design-tokens.js +748 -0
- package/dist/styling/design-tokens.js.map +1 -0
- package/dist/styling/index.d.ts +16 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/index.js +56 -0
- package/dist/styling/index.js.map +1 -0
- package/dist/styling/responsive.d.ts +304 -0
- package/dist/styling/responsive.d.ts.map +1 -0
- package/dist/styling/responsive.js +888 -0
- package/dist/styling/responsive.js.map +1 -0
- package/dist/styling/spacing-scale.d.ts +248 -0
- package/dist/styling/spacing-scale.d.ts.map +1 -0
- package/dist/styling/spacing-scale.js +865 -0
- package/dist/styling/spacing-scale.js.map +1 -0
- package/dist/styling/tailwind-patterns.d.ts +305 -0
- package/dist/styling/tailwind-patterns.d.ts.map +1 -0
- package/dist/styling/tailwind-patterns.js +1181 -0
- package/dist/styling/tailwind-patterns.js.map +1 -0
- package/dist/styling/typography.d.ts +281 -0
- package/dist/styling/typography.d.ts.map +1 -0
- package/dist/styling/typography.js +1004 -0
- package/dist/styling/typography.js.map +1 -0
- package/dist/styling/z-index-scale.d.ts +270 -0
- package/dist/styling/z-index-scale.d.ts.map +1 -0
- package/dist/styling/z-index-scale.js +714 -0
- package/dist/styling/z-index-scale.js.map +1 -0
- package/dist/testing/co-location.d.ts +42 -0
- package/dist/testing/co-location.d.ts.map +1 -0
- package/dist/testing/co-location.js +134 -0
- package/dist/testing/co-location.js.map +1 -0
- package/dist/testing/describe-naming.d.ts +47 -0
- package/dist/testing/describe-naming.d.ts.map +1 -0
- package/dist/testing/describe-naming.js +150 -0
- package/dist/testing/describe-naming.js.map +1 -0
- package/dist/testing/file-naming.d.ts +44 -0
- package/dist/testing/file-naming.d.ts.map +1 -0
- package/dist/testing/file-naming.js +131 -0
- package/dist/testing/file-naming.js.map +1 -0
- package/dist/testing/fixture-patterns.d.ts +52 -0
- package/dist/testing/fixture-patterns.d.ts.map +1 -0
- package/dist/testing/fixture-patterns.js +228 -0
- package/dist/testing/fixture-patterns.js.map +1 -0
- package/dist/testing/index.d.ts +31 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +49 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/mock-patterns.d.ts +53 -0
- package/dist/testing/mock-patterns.d.ts.map +1 -0
- package/dist/testing/mock-patterns.js +264 -0
- package/dist/testing/mock-patterns.js.map +1 -0
- package/dist/testing/setup-teardown.d.ts +55 -0
- package/dist/testing/setup-teardown.d.ts.map +1 -0
- package/dist/testing/setup-teardown.js +262 -0
- package/dist/testing/setup-teardown.js.map +1 -0
- package/dist/testing/test-structure.d.ts +51 -0
- package/dist/testing/test-structure.d.ts.map +1 -0
- package/dist/testing/test-structure.js +225 -0
- package/dist/testing/test-structure.js.map +1 -0
- package/dist/types/any-usage.d.ts +99 -0
- package/dist/types/any-usage.d.ts.map +1 -0
- package/dist/types/any-usage.js +641 -0
- package/dist/types/any-usage.js.map +1 -0
- package/dist/types/file-location.d.ts +76 -0
- package/dist/types/file-location.d.ts.map +1 -0
- package/dist/types/file-location.js +395 -0
- package/dist/types/file-location.js.map +1 -0
- package/dist/types/generic-patterns.d.ts +97 -0
- package/dist/types/generic-patterns.d.ts.map +1 -0
- package/dist/types/generic-patterns.js +615 -0
- package/dist/types/generic-patterns.js.map +1 -0
- package/dist/types/index.d.ts +31 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +43 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interface-vs-type.d.ts +81 -0
- package/dist/types/interface-vs-type.d.ts.map +1 -0
- package/dist/types/interface-vs-type.js +440 -0
- package/dist/types/interface-vs-type.js.map +1 -0
- package/dist/types/naming-conventions.d.ts +84 -0
- package/dist/types/naming-conventions.d.ts.map +1 -0
- package/dist/types/naming-conventions.js +455 -0
- package/dist/types/naming-conventions.js.map +1 -0
- package/dist/types/type-assertions.d.ts +98 -0
- package/dist/types/type-assertions.d.ts.map +1 -0
- package/dist/types/type-assertions.js +639 -0
- package/dist/types/type-assertions.js.map +1 -0
- package/dist/types/utility-types.d.ts +110 -0
- package/dist/types/utility-types.d.ts.map +1 -0
- package/dist/types/utility-types.js +547 -0
- package/dist/types/utility-types.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circular Dependencies Detector - Circular dependency detection
|
|
3
|
+
*
|
|
4
|
+
* Detects circular dependency patterns including:
|
|
5
|
+
* - Direct circular imports (A → B → A)
|
|
6
|
+
* - Indirect circular imports (A → B → C → A)
|
|
7
|
+
* - Self-imports
|
|
8
|
+
*
|
|
9
|
+
* Integrates with the core dependency graph module for cycle detection.
|
|
10
|
+
*
|
|
11
|
+
* @requirements 7.7 - THE Structural_Detector SHALL detect circular dependencies
|
|
12
|
+
*/
|
|
13
|
+
import type { Violation, QuickFix, Language } from 'driftdetect-core';
|
|
14
|
+
import { StructuralDetector, type DetectionContext, type DetectionResult } from '../base/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Type of circular dependency
|
|
17
|
+
*/
|
|
18
|
+
export type CircularDependencyType = 'self-import' | 'direct' | 'indirect';
|
|
19
|
+
/**
|
|
20
|
+
* Severity level based on cycle characteristics
|
|
21
|
+
*/
|
|
22
|
+
export type CycleSeverity = 'error' | 'warning' | 'info';
|
|
23
|
+
/**
|
|
24
|
+
* Information about a detected circular dependency
|
|
25
|
+
*/
|
|
26
|
+
export interface CircularDependencyInfo {
|
|
27
|
+
/** Type of circular dependency */
|
|
28
|
+
type: CircularDependencyType;
|
|
29
|
+
/** Files involved in the cycle (in order) */
|
|
30
|
+
cycle: string[];
|
|
31
|
+
/** Length of the cycle */
|
|
32
|
+
length: number;
|
|
33
|
+
/** Calculated severity based on cycle characteristics */
|
|
34
|
+
severity: CycleSeverity;
|
|
35
|
+
/** Human-readable description of the cycle */
|
|
36
|
+
description: string;
|
|
37
|
+
/** Suggested ways to break the cycle */
|
|
38
|
+
suggestions: string[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Analysis result for circular dependencies in a file
|
|
42
|
+
*/
|
|
43
|
+
export interface CircularDependencyAnalysis {
|
|
44
|
+
/** Whether the file is involved in any circular dependencies */
|
|
45
|
+
hasCircularDependencies: boolean;
|
|
46
|
+
/** All circular dependencies involving this file */
|
|
47
|
+
circularDependencies: CircularDependencyInfo[];
|
|
48
|
+
/** Total number of imports in the file */
|
|
49
|
+
totalImports: number;
|
|
50
|
+
/** Number of imports involved in cycles */
|
|
51
|
+
importsInCycles: number;
|
|
52
|
+
/** Self-imports detected */
|
|
53
|
+
selfImports: string[];
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Import information for cycle detection
|
|
57
|
+
*/
|
|
58
|
+
interface ImportForCycleDetection {
|
|
59
|
+
source: string;
|
|
60
|
+
resolvedPath?: string | undefined;
|
|
61
|
+
line: number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Determine the type of circular dependency based on cycle length
|
|
65
|
+
*/
|
|
66
|
+
export declare function getCycleType(cycle: string[], currentFile: string): CircularDependencyType;
|
|
67
|
+
/**
|
|
68
|
+
* Calculate severity based on cycle characteristics
|
|
69
|
+
*
|
|
70
|
+
* Severity is determined by:
|
|
71
|
+
* - Self-imports: error (always problematic)
|
|
72
|
+
* - Direct cycles (length 2): warning (common but should be fixed)
|
|
73
|
+
* - Short indirect cycles (length 3-4): warning
|
|
74
|
+
* - Long indirect cycles (length > 4): info (may be architectural)
|
|
75
|
+
*/
|
|
76
|
+
export declare function calculateCycleSeverity(type: CircularDependencyType, cycleLength: number): CycleSeverity;
|
|
77
|
+
/**
|
|
78
|
+
* Generate suggestions for breaking a circular dependency
|
|
79
|
+
*/
|
|
80
|
+
export declare function generateBreakCycleSuggestions(_cycle: string[], type: CircularDependencyType): string[];
|
|
81
|
+
/**
|
|
82
|
+
* Format a cycle as a human-readable string
|
|
83
|
+
*/
|
|
84
|
+
export declare function formatCycle(cycle: string[]): string;
|
|
85
|
+
/**
|
|
86
|
+
* Detect self-imports in a file
|
|
87
|
+
*/
|
|
88
|
+
export declare function detectSelfImports(currentFile: string, imports: ImportForCycleDetection[]): string[];
|
|
89
|
+
/**
|
|
90
|
+
* Build a local dependency graph from imports
|
|
91
|
+
*/
|
|
92
|
+
export declare function buildLocalDependencyGraph(imports: ImportForCycleDetection[]): Map<string, Set<string>>;
|
|
93
|
+
/**
|
|
94
|
+
* Detect cycles using DFS from a starting node
|
|
95
|
+
*/
|
|
96
|
+
export declare function detectCyclesFromNode(startNode: string, getDependencies: (node: string) => string[], maxDepth?: number): string[][];
|
|
97
|
+
/**
|
|
98
|
+
* Analyze circular dependencies for a file
|
|
99
|
+
*/
|
|
100
|
+
export declare function analyzeCircularDependencies(file: string, imports: ImportForCycleDetection[], getDependencies?: (file: string) => string[]): CircularDependencyAnalysis;
|
|
101
|
+
/**
|
|
102
|
+
* Detector for circular dependency patterns
|
|
103
|
+
*
|
|
104
|
+
* Identifies circular dependencies in the codebase:
|
|
105
|
+
* - Self-imports (file imports itself)
|
|
106
|
+
* - Direct circular imports (A → B → A)
|
|
107
|
+
* - Indirect circular imports (A → B → C → A)
|
|
108
|
+
*
|
|
109
|
+
* @requirements 7.7 - THE Structural_Detector SHALL detect circular dependencies
|
|
110
|
+
*/
|
|
111
|
+
export declare class CircularDependenciesDetector extends StructuralDetector {
|
|
112
|
+
readonly id = "structural/circular-deps";
|
|
113
|
+
readonly category: "structural";
|
|
114
|
+
readonly subcategory = "circular-dependencies";
|
|
115
|
+
readonly name = "Circular Dependencies Detector";
|
|
116
|
+
readonly description = "Detects circular dependency patterns including direct, indirect, and self-imports";
|
|
117
|
+
readonly supportedLanguages: Language[];
|
|
118
|
+
/**
|
|
119
|
+
* Detect circular dependencies in the project
|
|
120
|
+
*/
|
|
121
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
122
|
+
/**
|
|
123
|
+
* Generate a quick fix for circular dependency violations
|
|
124
|
+
*/
|
|
125
|
+
generateQuickFix(violation: Violation): QuickFix | null;
|
|
126
|
+
/**
|
|
127
|
+
* Extract imports from the detection context
|
|
128
|
+
*/
|
|
129
|
+
private extractImports;
|
|
130
|
+
/**
|
|
131
|
+
* Create a violation for a circular dependency
|
|
132
|
+
*/
|
|
133
|
+
private createCircularDependencyViolation;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Create a new CircularDependenciesDetector instance
|
|
137
|
+
*/
|
|
138
|
+
export declare function createCircularDependenciesDetector(): CircularDependenciesDetector;
|
|
139
|
+
export {};
|
|
140
|
+
//# sourceMappingURL=circular-deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circular-deps.d.ts","sourceRoot":"","sources":["../../src/structural/circular-deps.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circular Dependencies Detector - Circular dependency detection
|
|
3
|
+
*
|
|
4
|
+
* Detects circular dependency patterns including:
|
|
5
|
+
* - Direct circular imports (A → B → A)
|
|
6
|
+
* - Indirect circular imports (A → B → C → A)
|
|
7
|
+
* - Self-imports
|
|
8
|
+
*
|
|
9
|
+
* Integrates with the core dependency graph module for cycle detection.
|
|
10
|
+
*
|
|
11
|
+
* @requirements 7.7 - THE Structural_Detector SHALL detect circular dependencies
|
|
12
|
+
*/
|
|
13
|
+
import { StructuralDetector } from '../base/index.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Helper Functions
|
|
16
|
+
// ============================================================================
|
|
17
|
+
/**
|
|
18
|
+
* Normalize a file path for consistent comparison
|
|
19
|
+
*/
|
|
20
|
+
function normalizePath(path) {
|
|
21
|
+
return path.replace(/\\/g, '/').toLowerCase();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get the file name from a path for display
|
|
25
|
+
*/
|
|
26
|
+
function getFileName(path) {
|
|
27
|
+
// Don't normalize case for display purposes
|
|
28
|
+
const normalized = path.replace(/\\/g, '/');
|
|
29
|
+
const parts = normalized.split('/');
|
|
30
|
+
return parts[parts.length - 1] || path;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Determine the type of circular dependency based on cycle length
|
|
34
|
+
*/
|
|
35
|
+
export function getCycleType(cycle, currentFile) {
|
|
36
|
+
const normalizedCurrent = normalizePath(currentFile);
|
|
37
|
+
const normalizedCycle = cycle.map(normalizePath);
|
|
38
|
+
// Check for self-import (cycle of length 1 or file appears twice consecutively)
|
|
39
|
+
if (normalizedCycle.length === 1 && normalizedCycle[0] === normalizedCurrent) {
|
|
40
|
+
return 'self-import';
|
|
41
|
+
}
|
|
42
|
+
// Check for direct cycle (A → B → A)
|
|
43
|
+
if (normalizedCycle.length <= 3) {
|
|
44
|
+
return 'direct';
|
|
45
|
+
}
|
|
46
|
+
// Indirect cycle (longer chain)
|
|
47
|
+
return 'indirect';
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Calculate severity based on cycle characteristics
|
|
51
|
+
*
|
|
52
|
+
* Severity is determined by:
|
|
53
|
+
* - Self-imports: error (always problematic)
|
|
54
|
+
* - Direct cycles (length 2): warning (common but should be fixed)
|
|
55
|
+
* - Short indirect cycles (length 3-4): warning
|
|
56
|
+
* - Long indirect cycles (length > 4): info (may be architectural)
|
|
57
|
+
*/
|
|
58
|
+
export function calculateCycleSeverity(type, cycleLength) {
|
|
59
|
+
if (type === 'self-import') {
|
|
60
|
+
return 'error';
|
|
61
|
+
}
|
|
62
|
+
if (type === 'direct') {
|
|
63
|
+
return 'warning';
|
|
64
|
+
}
|
|
65
|
+
// Indirect cycles
|
|
66
|
+
if (cycleLength <= 4) {
|
|
67
|
+
return 'warning';
|
|
68
|
+
}
|
|
69
|
+
return 'info';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generate suggestions for breaking a circular dependency
|
|
73
|
+
*/
|
|
74
|
+
export function generateBreakCycleSuggestions(_cycle, type) {
|
|
75
|
+
const suggestions = [];
|
|
76
|
+
if (type === 'self-import') {
|
|
77
|
+
suggestions.push('Remove the self-import statement');
|
|
78
|
+
suggestions.push('Check if the import is a typo or copy-paste error');
|
|
79
|
+
return suggestions;
|
|
80
|
+
}
|
|
81
|
+
if (type === 'direct') {
|
|
82
|
+
suggestions.push('Extract shared code into a separate module that both files can import');
|
|
83
|
+
suggestions.push('Use dependency injection to break the direct coupling');
|
|
84
|
+
suggestions.push('Consider if one of the imports can be removed or made dynamic');
|
|
85
|
+
}
|
|
86
|
+
if (type === 'indirect') {
|
|
87
|
+
suggestions.push('Identify the core abstraction and extract it to a shared module');
|
|
88
|
+
suggestions.push('Use an interface/type-only import to break the runtime dependency');
|
|
89
|
+
suggestions.push('Consider restructuring the module hierarchy');
|
|
90
|
+
suggestions.push('Use lazy loading or dynamic imports for non-critical dependencies');
|
|
91
|
+
}
|
|
92
|
+
// Common suggestions
|
|
93
|
+
suggestions.push('Review the module responsibilities - circular deps often indicate unclear boundaries');
|
|
94
|
+
return suggestions;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Format a cycle as a human-readable string
|
|
98
|
+
*/
|
|
99
|
+
export function formatCycle(cycle) {
|
|
100
|
+
const fileNames = cycle.map(getFileName);
|
|
101
|
+
return fileNames.join(' → ');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Detect self-imports in a file
|
|
105
|
+
*/
|
|
106
|
+
export function detectSelfImports(currentFile, imports) {
|
|
107
|
+
const normalizedCurrent = normalizePath(currentFile);
|
|
108
|
+
const selfImports = [];
|
|
109
|
+
for (const imp of imports) {
|
|
110
|
+
const resolvedPath = imp.resolvedPath || imp.source;
|
|
111
|
+
if (normalizePath(resolvedPath) === normalizedCurrent) {
|
|
112
|
+
selfImports.push(imp.source);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return selfImports;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Build a local dependency graph from imports
|
|
119
|
+
*/
|
|
120
|
+
export function buildLocalDependencyGraph(imports) {
|
|
121
|
+
const graph = new Map();
|
|
122
|
+
for (const imp of imports) {
|
|
123
|
+
const resolvedPath = imp.resolvedPath;
|
|
124
|
+
if (resolvedPath) {
|
|
125
|
+
const normalized = normalizePath(resolvedPath);
|
|
126
|
+
if (!graph.has(normalized)) {
|
|
127
|
+
graph.set(normalized, new Set());
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return graph;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Detect cycles using DFS from a starting node
|
|
135
|
+
*/
|
|
136
|
+
export function detectCyclesFromNode(startNode, getDependencies, maxDepth = 10) {
|
|
137
|
+
const cycles = [];
|
|
138
|
+
const visited = new Set();
|
|
139
|
+
const recursionStack = new Set();
|
|
140
|
+
const path = [];
|
|
141
|
+
function dfs(node, depth) {
|
|
142
|
+
if (depth > maxDepth) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
visited.add(node);
|
|
146
|
+
recursionStack.add(node);
|
|
147
|
+
path.push(node);
|
|
148
|
+
const dependencies = getDependencies(node);
|
|
149
|
+
for (const dep of dependencies) {
|
|
150
|
+
const normalizedDep = normalizePath(dep);
|
|
151
|
+
if (!visited.has(normalizedDep)) {
|
|
152
|
+
dfs(normalizedDep, depth + 1);
|
|
153
|
+
}
|
|
154
|
+
else if (recursionStack.has(normalizedDep)) {
|
|
155
|
+
// Found a cycle
|
|
156
|
+
const cycleStart = path.indexOf(normalizedDep);
|
|
157
|
+
if (cycleStart !== -1) {
|
|
158
|
+
const cycle = [...path.slice(cycleStart), normalizedDep];
|
|
159
|
+
// Only add if this cycle includes the start node
|
|
160
|
+
if (cycle.some(n => normalizePath(n) === normalizePath(startNode))) {
|
|
161
|
+
cycles.push(cycle);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
path.pop();
|
|
167
|
+
recursionStack.delete(node);
|
|
168
|
+
}
|
|
169
|
+
dfs(normalizePath(startNode), 0);
|
|
170
|
+
return cycles;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Analyze circular dependencies for a file
|
|
174
|
+
*/
|
|
175
|
+
export function analyzeCircularDependencies(file, imports, getDependencies) {
|
|
176
|
+
const normalizedFile = normalizePath(file);
|
|
177
|
+
const circularDependencies = [];
|
|
178
|
+
// Detect self-imports
|
|
179
|
+
const selfImports = detectSelfImports(file, imports);
|
|
180
|
+
for (const selfImport of selfImports) {
|
|
181
|
+
circularDependencies.push({
|
|
182
|
+
type: 'self-import',
|
|
183
|
+
cycle: [file],
|
|
184
|
+
length: 1,
|
|
185
|
+
severity: 'error',
|
|
186
|
+
description: `File imports itself via '${selfImport}'`,
|
|
187
|
+
suggestions: generateBreakCycleSuggestions([file], 'self-import'),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
// If we have a dependency graph, use it to detect cycles
|
|
191
|
+
if (getDependencies) {
|
|
192
|
+
const cycles = detectCyclesFromNode(normalizedFile, getDependencies);
|
|
193
|
+
for (const cycle of cycles) {
|
|
194
|
+
// Skip if this is a self-import (already handled)
|
|
195
|
+
if (cycle.length <= 2 && cycle[0] === cycle[cycle.length - 1]) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const type = getCycleType(cycle, file);
|
|
199
|
+
const severity = calculateCycleSeverity(type, cycle.length - 1); // -1 because cycle includes start node twice
|
|
200
|
+
circularDependencies.push({
|
|
201
|
+
type,
|
|
202
|
+
cycle,
|
|
203
|
+
length: cycle.length - 1,
|
|
204
|
+
severity,
|
|
205
|
+
description: `Circular dependency: ${formatCycle(cycle)}`,
|
|
206
|
+
suggestions: generateBreakCycleSuggestions(cycle, type),
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Count imports involved in cycles
|
|
211
|
+
const importsInCycles = new Set();
|
|
212
|
+
for (const dep of circularDependencies) {
|
|
213
|
+
for (const cycleFile of dep.cycle) {
|
|
214
|
+
importsInCycles.add(normalizePath(cycleFile));
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
hasCircularDependencies: circularDependencies.length > 0,
|
|
219
|
+
circularDependencies,
|
|
220
|
+
totalImports: imports.length,
|
|
221
|
+
importsInCycles: importsInCycles.size,
|
|
222
|
+
selfImports,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Get the line number of an import that causes a cycle
|
|
227
|
+
*/
|
|
228
|
+
function getImportLineForCycle(imports, targetFile) {
|
|
229
|
+
const normalizedTarget = normalizePath(targetFile);
|
|
230
|
+
for (const imp of imports) {
|
|
231
|
+
const resolvedPath = imp.resolvedPath || imp.source;
|
|
232
|
+
if (normalizePath(resolvedPath) === normalizedTarget) {
|
|
233
|
+
return imp.line;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return 1; // Default to first line if not found
|
|
237
|
+
}
|
|
238
|
+
// ============================================================================
|
|
239
|
+
// Circular Dependencies Detector Class
|
|
240
|
+
// ============================================================================
|
|
241
|
+
/**
|
|
242
|
+
* Detector for circular dependency patterns
|
|
243
|
+
*
|
|
244
|
+
* Identifies circular dependencies in the codebase:
|
|
245
|
+
* - Self-imports (file imports itself)
|
|
246
|
+
* - Direct circular imports (A → B → A)
|
|
247
|
+
* - Indirect circular imports (A → B → C → A)
|
|
248
|
+
*
|
|
249
|
+
* @requirements 7.7 - THE Structural_Detector SHALL detect circular dependencies
|
|
250
|
+
*/
|
|
251
|
+
export class CircularDependenciesDetector extends StructuralDetector {
|
|
252
|
+
id = 'structural/circular-deps';
|
|
253
|
+
category = 'structural';
|
|
254
|
+
subcategory = 'circular-dependencies';
|
|
255
|
+
name = 'Circular Dependencies Detector';
|
|
256
|
+
description = 'Detects circular dependency patterns including direct, indirect, and self-imports';
|
|
257
|
+
supportedLanguages = [
|
|
258
|
+
'typescript',
|
|
259
|
+
'javascript',
|
|
260
|
+
];
|
|
261
|
+
/**
|
|
262
|
+
* Detect circular dependencies in the project
|
|
263
|
+
*/
|
|
264
|
+
async detect(context) {
|
|
265
|
+
const patterns = [];
|
|
266
|
+
const violations = [];
|
|
267
|
+
// Extract imports from context
|
|
268
|
+
const imports = this.extractImports(context);
|
|
269
|
+
if (imports.length === 0) {
|
|
270
|
+
return this.createResult(patterns, violations, 1.0);
|
|
271
|
+
}
|
|
272
|
+
// Get dependency graph from project context if available
|
|
273
|
+
const getDependencies = context.projectContext.dependencyGraph?.getDependencies;
|
|
274
|
+
// Analyze circular dependencies
|
|
275
|
+
const analysis = analyzeCircularDependencies(context.file, imports, getDependencies);
|
|
276
|
+
// If no circular dependencies, return early with a pattern indicating clean state
|
|
277
|
+
if (!analysis.hasCircularDependencies) {
|
|
278
|
+
patterns.push({
|
|
279
|
+
patternId: 'circular-deps-clean',
|
|
280
|
+
location: { file: context.file, line: 1, column: 1 },
|
|
281
|
+
confidence: 1.0,
|
|
282
|
+
isOutlier: false,
|
|
283
|
+
});
|
|
284
|
+
return this.createResult(patterns, violations, 1.0);
|
|
285
|
+
}
|
|
286
|
+
// Create violations for each circular dependency
|
|
287
|
+
for (const circDep of analysis.circularDependencies) {
|
|
288
|
+
const violation = this.createCircularDependencyViolation(context.file, circDep, imports);
|
|
289
|
+
violations.push(violation);
|
|
290
|
+
// Also create a pattern match for tracking
|
|
291
|
+
patterns.push({
|
|
292
|
+
patternId: `circular-deps-${circDep.type}`,
|
|
293
|
+
location: { file: context.file, line: violation.range.start.line + 1, column: 1 },
|
|
294
|
+
confidence: 0.9,
|
|
295
|
+
isOutlier: true, // Circular dependencies are outliers from good patterns
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
// Calculate confidence based on the ratio of clean imports
|
|
299
|
+
const cleanImportRatio = analysis.totalImports > 0
|
|
300
|
+
? (analysis.totalImports - analysis.importsInCycles) / analysis.totalImports
|
|
301
|
+
: 1.0;
|
|
302
|
+
return this.createResult(patterns, violations, cleanImportRatio);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Generate a quick fix for circular dependency violations
|
|
306
|
+
*/
|
|
307
|
+
generateQuickFix(violation) {
|
|
308
|
+
// Circular dependencies typically require manual refactoring
|
|
309
|
+
// We provide guidance but can't automatically fix them
|
|
310
|
+
if (violation.patternId === 'structural/circular-deps-self-import') {
|
|
311
|
+
return {
|
|
312
|
+
title: 'Remove self-import',
|
|
313
|
+
kind: 'quickfix',
|
|
314
|
+
edit: {
|
|
315
|
+
changes: {},
|
|
316
|
+
documentChanges: [],
|
|
317
|
+
},
|
|
318
|
+
isPreferred: true,
|
|
319
|
+
confidence: 0.9,
|
|
320
|
+
preview: 'Remove the import statement that imports the current file',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
if (violation.patternId === 'structural/circular-deps-direct' ||
|
|
324
|
+
violation.patternId === 'structural/circular-deps-indirect') {
|
|
325
|
+
return {
|
|
326
|
+
title: 'Break circular dependency',
|
|
327
|
+
kind: 'refactor',
|
|
328
|
+
edit: {
|
|
329
|
+
changes: {},
|
|
330
|
+
documentChanges: [],
|
|
331
|
+
},
|
|
332
|
+
isPreferred: false,
|
|
333
|
+
confidence: 0.5,
|
|
334
|
+
preview: violation.explanation || 'Extract shared code to break the dependency cycle',
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Extract imports from the detection context
|
|
341
|
+
*/
|
|
342
|
+
extractImports(context) {
|
|
343
|
+
const imports = [];
|
|
344
|
+
// Use imports from context if available
|
|
345
|
+
if (context.imports && context.imports.length > 0) {
|
|
346
|
+
for (const imp of context.imports) {
|
|
347
|
+
imports.push({
|
|
348
|
+
source: imp.source,
|
|
349
|
+
resolvedPath: imp.resolvedPath,
|
|
350
|
+
line: imp.line,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
return imports;
|
|
354
|
+
}
|
|
355
|
+
// Fall back to parsing content for imports
|
|
356
|
+
const importRegex = /^import\s+(?:(?:type\s+)?(?:\{[^}]*\}|\*\s+as\s+\w+|\w+(?:\s*,\s*\{[^}]*\})?)\s+from\s+)?['"]([^'"]+)['"]/gm;
|
|
357
|
+
const lines = context.content.split('\n');
|
|
358
|
+
for (let i = 0; i < lines.length; i++) {
|
|
359
|
+
const line = lines[i];
|
|
360
|
+
const match = importRegex.exec(line);
|
|
361
|
+
if (match && match[1]) {
|
|
362
|
+
imports.push({
|
|
363
|
+
source: match[1],
|
|
364
|
+
line: i + 1,
|
|
365
|
+
});
|
|
366
|
+
}
|
|
367
|
+
importRegex.lastIndex = 0; // Reset regex state
|
|
368
|
+
}
|
|
369
|
+
return imports;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Create a violation for a circular dependency
|
|
373
|
+
*/
|
|
374
|
+
createCircularDependencyViolation(file, circDep, imports) {
|
|
375
|
+
// Find the line number of the import that causes the cycle
|
|
376
|
+
const targetFile = circDep.cycle.length > 1 ? circDep.cycle[1] : circDep.cycle[0];
|
|
377
|
+
const line = targetFile ? getImportLineForCycle(imports, targetFile) : 1;
|
|
378
|
+
const range = {
|
|
379
|
+
start: { line: line - 1, character: 0 },
|
|
380
|
+
end: { line: line - 1, character: 100 },
|
|
381
|
+
};
|
|
382
|
+
const violation = {
|
|
383
|
+
id: `circular-deps-${file.replace(/[^a-zA-Z0-9]/g, '-')}-${line}`,
|
|
384
|
+
patternId: `structural/circular-deps-${circDep.type}`,
|
|
385
|
+
severity: circDep.severity,
|
|
386
|
+
file,
|
|
387
|
+
range,
|
|
388
|
+
message: circDep.description,
|
|
389
|
+
expected: 'No circular dependencies',
|
|
390
|
+
actual: `Circular dependency of length ${circDep.length}`,
|
|
391
|
+
explanation: circDep.suggestions.join('\n• '),
|
|
392
|
+
aiExplainAvailable: true,
|
|
393
|
+
aiFixAvailable: false,
|
|
394
|
+
firstSeen: new Date(),
|
|
395
|
+
occurrences: 1,
|
|
396
|
+
};
|
|
397
|
+
// Add quick fix for self-imports
|
|
398
|
+
if (circDep.type === 'self-import') {
|
|
399
|
+
violation.quickFix = {
|
|
400
|
+
title: 'Remove self-import',
|
|
401
|
+
kind: 'quickfix',
|
|
402
|
+
edit: {
|
|
403
|
+
changes: {},
|
|
404
|
+
documentChanges: [],
|
|
405
|
+
},
|
|
406
|
+
isPreferred: true,
|
|
407
|
+
confidence: 0.9,
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
return violation;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// ============================================================================
|
|
414
|
+
// Factory Function
|
|
415
|
+
// ============================================================================
|
|
416
|
+
/**
|
|
417
|
+
* Create a new CircularDependenciesDetector instance
|
|
418
|
+
*/
|
|
419
|
+
export function createCircularDependenciesDetector() {
|
|
420
|
+
return new CircularDependenciesDetector();
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=circular-deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circular-deps.js","sourceRoot":"","sources":["../../src/structural/circular-deps.ts"],"names":[],"mappings":"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"}
|