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,640 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Co-location Detector - Test and style co-location detection
|
|
3
|
+
*
|
|
4
|
+
* Detects test co-location patterns (tests next to source vs separate directories)
|
|
5
|
+
* and style co-location patterns (styles next to components vs separate directories).
|
|
6
|
+
*
|
|
7
|
+
* @requirements 7.3 - THE Structural_Detector SHALL detect co-location patterns (tests next to source vs separate)
|
|
8
|
+
*/
|
|
9
|
+
import { StructuralDetector } from '../base/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Common test file patterns
|
|
12
|
+
*/
|
|
13
|
+
export const TEST_FILE_PATTERNS = [
|
|
14
|
+
/\.test\.[jt]sx?$/,
|
|
15
|
+
/\.spec\.[jt]sx?$/,
|
|
16
|
+
/_test\.[jt]sx?$/,
|
|
17
|
+
/_spec\.[jt]sx?$/,
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* Common test directory names
|
|
21
|
+
*/
|
|
22
|
+
export const TEST_DIRECTORIES = [
|
|
23
|
+
'__tests__',
|
|
24
|
+
'tests',
|
|
25
|
+
'test',
|
|
26
|
+
'__test__',
|
|
27
|
+
'spec',
|
|
28
|
+
'specs',
|
|
29
|
+
'__specs__',
|
|
30
|
+
];
|
|
31
|
+
/**
|
|
32
|
+
* Common style file patterns
|
|
33
|
+
*/
|
|
34
|
+
export const STYLE_FILE_PATTERNS = [
|
|
35
|
+
/\.module\.css$/,
|
|
36
|
+
/\.module\.scss$/,
|
|
37
|
+
/\.module\.sass$/,
|
|
38
|
+
/\.module\.less$/,
|
|
39
|
+
/\.styles?\.[jt]sx?$/,
|
|
40
|
+
/\.css$/,
|
|
41
|
+
/\.scss$/,
|
|
42
|
+
/\.sass$/,
|
|
43
|
+
/\.less$/,
|
|
44
|
+
/\.styled\.[jt]sx?$/,
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* Common style directory names
|
|
48
|
+
*/
|
|
49
|
+
export const STYLE_DIRECTORIES = [
|
|
50
|
+
'styles',
|
|
51
|
+
'style',
|
|
52
|
+
'css',
|
|
53
|
+
'scss',
|
|
54
|
+
'__styles__',
|
|
55
|
+
];
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Helper Functions
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Check if a file is a test file
|
|
61
|
+
*/
|
|
62
|
+
export function isTestFile(filePath) {
|
|
63
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
64
|
+
const fileName = normalizedPath.split('/').pop() || '';
|
|
65
|
+
// Check file name patterns
|
|
66
|
+
for (const pattern of TEST_FILE_PATTERNS) {
|
|
67
|
+
if (pattern.test(fileName)) {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a file is in a test directory
|
|
75
|
+
*/
|
|
76
|
+
export function isInTestDirectory(filePath) {
|
|
77
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
78
|
+
const segments = normalizedPath.split('/');
|
|
79
|
+
for (const segment of segments) {
|
|
80
|
+
const lowerSegment = segment.toLowerCase();
|
|
81
|
+
if (TEST_DIRECTORIES.some(dir => lowerSegment === dir.toLowerCase())) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the test directory from a file path (if any)
|
|
89
|
+
*/
|
|
90
|
+
export function getTestDirectory(filePath) {
|
|
91
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
92
|
+
const segments = normalizedPath.split('/');
|
|
93
|
+
for (let i = 0; i < segments.length; i++) {
|
|
94
|
+
const segment = segments[i];
|
|
95
|
+
const lowerSegment = segment.toLowerCase();
|
|
96
|
+
if (TEST_DIRECTORIES.some(dir => lowerSegment === dir.toLowerCase())) {
|
|
97
|
+
return segments.slice(0, i + 1).join('/');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if a file is a style file
|
|
104
|
+
*/
|
|
105
|
+
export function isStyleFile(filePath) {
|
|
106
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
107
|
+
const fileName = normalizedPath.split('/').pop() || '';
|
|
108
|
+
// Check file name patterns
|
|
109
|
+
for (const pattern of STYLE_FILE_PATTERNS) {
|
|
110
|
+
if (pattern.test(fileName)) {
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Check if a file is in a style directory
|
|
118
|
+
*/
|
|
119
|
+
export function isInStyleDirectory(filePath) {
|
|
120
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
121
|
+
const segments = normalizedPath.split('/');
|
|
122
|
+
for (const segment of segments) {
|
|
123
|
+
const lowerSegment = segment.toLowerCase();
|
|
124
|
+
if (STYLE_DIRECTORIES.some(dir => lowerSegment === dir.toLowerCase())) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get the style directory from a file path (if any)
|
|
132
|
+
*/
|
|
133
|
+
export function getStyleDirectory(filePath) {
|
|
134
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
135
|
+
const segments = normalizedPath.split('/');
|
|
136
|
+
for (let i = 0; i < segments.length; i++) {
|
|
137
|
+
const segment = segments[i];
|
|
138
|
+
const lowerSegment = segment.toLowerCase();
|
|
139
|
+
if (STYLE_DIRECTORIES.some(dir => lowerSegment === dir.toLowerCase())) {
|
|
140
|
+
return segments.slice(0, i + 1).join('/');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Extract the base name from a test file (remove test suffix)
|
|
147
|
+
*/
|
|
148
|
+
export function extractTestBaseName(testFile) {
|
|
149
|
+
const normalizedPath = testFile.replace(/\\/g, '/');
|
|
150
|
+
const fileName = normalizedPath.split('/').pop() || '';
|
|
151
|
+
// Remove test suffixes
|
|
152
|
+
let baseName = fileName
|
|
153
|
+
.replace(/\.test\.[jt]sx?$/, '')
|
|
154
|
+
.replace(/\.spec\.[jt]sx?$/, '')
|
|
155
|
+
.replace(/_test\.[jt]sx?$/, '')
|
|
156
|
+
.replace(/_spec\.[jt]sx?$/, '');
|
|
157
|
+
return baseName;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extract the base name from a style file (remove style suffix)
|
|
161
|
+
*/
|
|
162
|
+
export function extractStyleBaseName(styleFile) {
|
|
163
|
+
const normalizedPath = styleFile.replace(/\\/g, '/');
|
|
164
|
+
const fileName = normalizedPath.split('/').pop() || '';
|
|
165
|
+
// Remove style suffixes
|
|
166
|
+
let baseName = fileName
|
|
167
|
+
.replace(/\.module\.css$/, '')
|
|
168
|
+
.replace(/\.module\.scss$/, '')
|
|
169
|
+
.replace(/\.module\.sass$/, '')
|
|
170
|
+
.replace(/\.module\.less$/, '')
|
|
171
|
+
.replace(/\.styles?\.[jt]sx?$/, '')
|
|
172
|
+
.replace(/\.styled\.[jt]sx?$/, '')
|
|
173
|
+
.replace(/\.css$/, '')
|
|
174
|
+
.replace(/\.scss$/, '')
|
|
175
|
+
.replace(/\.sass$/, '')
|
|
176
|
+
.replace(/\.less$/, '');
|
|
177
|
+
return baseName;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get the directory of a file
|
|
181
|
+
*/
|
|
182
|
+
export function getFileDirectory(filePath) {
|
|
183
|
+
const normalizedPath = filePath.replace(/\\/g, '/');
|
|
184
|
+
const lastSlash = normalizedPath.lastIndexOf('/');
|
|
185
|
+
return lastSlash === -1 ? '' : normalizedPath.slice(0, lastSlash);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Find the corresponding source file for a test file
|
|
189
|
+
*/
|
|
190
|
+
export function findSourceFileForTest(testFile, allFiles) {
|
|
191
|
+
const baseName = extractTestBaseName(testFile);
|
|
192
|
+
const testDir = getFileDirectory(testFile);
|
|
193
|
+
const testDirName = getTestDirectory(testFile);
|
|
194
|
+
// Common source file extensions
|
|
195
|
+
const sourceExtensions = ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'];
|
|
196
|
+
// First, look in the same directory (co-located)
|
|
197
|
+
for (const ext of sourceExtensions) {
|
|
198
|
+
const candidate = `${testDir}/${baseName}${ext}`;
|
|
199
|
+
if (allFiles.some(f => f.replace(/\\/g, '/') === candidate)) {
|
|
200
|
+
return candidate;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// If test is in a test directory, look in parent or sibling directories
|
|
204
|
+
if (testDirName) {
|
|
205
|
+
// Get the path before the test directory
|
|
206
|
+
const parentPath = testDirName.split('/').slice(0, -1).join('/');
|
|
207
|
+
for (const ext of sourceExtensions) {
|
|
208
|
+
// Check parent directory
|
|
209
|
+
const parentCandidate = parentPath ? `${parentPath}/${baseName}${ext}` : `${baseName}${ext}`;
|
|
210
|
+
if (allFiles.some(f => f.replace(/\\/g, '/') === parentCandidate)) {
|
|
211
|
+
return parentCandidate;
|
|
212
|
+
}
|
|
213
|
+
// Check src sibling directory
|
|
214
|
+
const srcCandidate = parentPath ? `${parentPath}/src/${baseName}${ext}` : `src/${baseName}${ext}`;
|
|
215
|
+
if (allFiles.some(f => f.replace(/\\/g, '/') === srcCandidate)) {
|
|
216
|
+
return srcCandidate;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Search for any file with the same base name
|
|
221
|
+
for (const file of allFiles) {
|
|
222
|
+
const normalizedFile = file.replace(/\\/g, '/');
|
|
223
|
+
const fileName = normalizedFile.split('/').pop() || '';
|
|
224
|
+
for (const ext of sourceExtensions) {
|
|
225
|
+
if (fileName === `${baseName}${ext}` && !isTestFile(normalizedFile)) {
|
|
226
|
+
return normalizedFile;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Find the corresponding component file for a style file
|
|
234
|
+
*/
|
|
235
|
+
export function findComponentFileForStyle(styleFile, allFiles) {
|
|
236
|
+
const baseName = extractStyleBaseName(styleFile);
|
|
237
|
+
const styleDir = getFileDirectory(styleFile);
|
|
238
|
+
const styleDirName = getStyleDirectory(styleFile);
|
|
239
|
+
// Common component file extensions
|
|
240
|
+
const componentExtensions = ['.tsx', '.jsx', '.ts', '.js'];
|
|
241
|
+
// First, look in the same directory (co-located)
|
|
242
|
+
for (const ext of componentExtensions) {
|
|
243
|
+
const candidate = `${styleDir}/${baseName}${ext}`;
|
|
244
|
+
if (allFiles.some(f => f.replace(/\\/g, '/') === candidate)) {
|
|
245
|
+
return candidate;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// If style is in a style directory, look in parent or sibling directories
|
|
249
|
+
if (styleDirName) {
|
|
250
|
+
// Get the path before the style directory
|
|
251
|
+
const parentPath = styleDirName.split('/').slice(0, -1).join('/');
|
|
252
|
+
for (const ext of componentExtensions) {
|
|
253
|
+
// Check parent directory
|
|
254
|
+
const parentCandidate = parentPath ? `${parentPath}/${baseName}${ext}` : `${baseName}${ext}`;
|
|
255
|
+
if (allFiles.some(f => f.replace(/\\/g, '/') === parentCandidate)) {
|
|
256
|
+
return parentCandidate;
|
|
257
|
+
}
|
|
258
|
+
// Check components sibling directory
|
|
259
|
+
const componentsCandidate = parentPath ? `${parentPath}/components/${baseName}${ext}` : `components/${baseName}${ext}`;
|
|
260
|
+
if (allFiles.some(f => f.replace(/\\/g, '/') === componentsCandidate)) {
|
|
261
|
+
return componentsCandidate;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Search for any file with the same base name
|
|
266
|
+
for (const file of allFiles) {
|
|
267
|
+
const normalizedFile = file.replace(/\\/g, '/');
|
|
268
|
+
const fileName = normalizedFile.split('/').pop() || '';
|
|
269
|
+
for (const ext of componentExtensions) {
|
|
270
|
+
if (fileName === `${baseName}${ext}` && !isStyleFile(normalizedFile)) {
|
|
271
|
+
return normalizedFile;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Analyze test co-location patterns in a project
|
|
279
|
+
*/
|
|
280
|
+
export function analyzeTestCoLocation(files) {
|
|
281
|
+
const testFiles = files.filter(f => isTestFile(f));
|
|
282
|
+
const coLocatedTests = [];
|
|
283
|
+
const separateTests = [];
|
|
284
|
+
for (const testFile of testFiles) {
|
|
285
|
+
const normalizedPath = testFile.replace(/\\/g, '/');
|
|
286
|
+
const sourceFile = findSourceFileForTest(testFile, files);
|
|
287
|
+
const testDirectory = getTestDirectory(testFile);
|
|
288
|
+
const isInTestDir = isInTestDirectory(testFile);
|
|
289
|
+
// A test is co-located if it's NOT in a test directory
|
|
290
|
+
// and is in the same directory as its source file
|
|
291
|
+
const testDir = getFileDirectory(normalizedPath);
|
|
292
|
+
const sourceDir = sourceFile ? getFileDirectory(sourceFile) : null;
|
|
293
|
+
const isCoLocated = !isInTestDir && (sourceDir === null || testDir === sourceDir);
|
|
294
|
+
const info = {
|
|
295
|
+
testFile: normalizedPath,
|
|
296
|
+
sourceFile,
|
|
297
|
+
isCoLocated,
|
|
298
|
+
testDirectory,
|
|
299
|
+
};
|
|
300
|
+
if (isCoLocated) {
|
|
301
|
+
coLocatedTests.push(info);
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
separateTests.push(info);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const totalTestFiles = testFiles.length;
|
|
308
|
+
const coLocationRatio = totalTestFiles > 0 ? coLocatedTests.length / totalTestFiles : 0;
|
|
309
|
+
// Determine pattern type
|
|
310
|
+
let pattern;
|
|
311
|
+
let confidence;
|
|
312
|
+
if (totalTestFiles === 0) {
|
|
313
|
+
pattern = 'unknown';
|
|
314
|
+
confidence = 0;
|
|
315
|
+
}
|
|
316
|
+
else if (coLocationRatio >= 0.8) {
|
|
317
|
+
pattern = 'co-located';
|
|
318
|
+
confidence = coLocationRatio;
|
|
319
|
+
}
|
|
320
|
+
else if (coLocationRatio <= 0.2) {
|
|
321
|
+
pattern = 'separate';
|
|
322
|
+
confidence = 1 - coLocationRatio;
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
pattern = 'mixed';
|
|
326
|
+
confidence = 0.5 + Math.abs(coLocationRatio - 0.5);
|
|
327
|
+
}
|
|
328
|
+
return {
|
|
329
|
+
pattern,
|
|
330
|
+
confidence,
|
|
331
|
+
coLocatedTests,
|
|
332
|
+
separateTests,
|
|
333
|
+
totalTestFiles,
|
|
334
|
+
coLocationRatio,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Analyze style co-location patterns in a project
|
|
339
|
+
*/
|
|
340
|
+
export function analyzeStyleCoLocation(files) {
|
|
341
|
+
const styleFiles = files.filter(f => isStyleFile(f));
|
|
342
|
+
const coLocatedStyles = [];
|
|
343
|
+
const separateStyles = [];
|
|
344
|
+
for (const styleFile of styleFiles) {
|
|
345
|
+
const normalizedPath = styleFile.replace(/\\/g, '/');
|
|
346
|
+
const componentFile = findComponentFileForStyle(styleFile, files);
|
|
347
|
+
const styleDirectory = getStyleDirectory(styleFile);
|
|
348
|
+
const isInStyleDir = isInStyleDirectory(styleFile);
|
|
349
|
+
// A style is co-located if it's NOT in a style directory
|
|
350
|
+
// and is in the same directory as its component file
|
|
351
|
+
const styleDir = getFileDirectory(normalizedPath);
|
|
352
|
+
const componentDir = componentFile ? getFileDirectory(componentFile) : null;
|
|
353
|
+
const isCoLocated = !isInStyleDir && (componentDir === null || styleDir === componentDir);
|
|
354
|
+
const info = {
|
|
355
|
+
styleFile: normalizedPath,
|
|
356
|
+
componentFile,
|
|
357
|
+
isCoLocated,
|
|
358
|
+
styleDirectory,
|
|
359
|
+
};
|
|
360
|
+
if (isCoLocated) {
|
|
361
|
+
coLocatedStyles.push(info);
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
separateStyles.push(info);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
const totalStyleFiles = styleFiles.length;
|
|
368
|
+
const coLocationRatio = totalStyleFiles > 0 ? coLocatedStyles.length / totalStyleFiles : 0;
|
|
369
|
+
// Determine pattern type
|
|
370
|
+
let pattern;
|
|
371
|
+
let confidence;
|
|
372
|
+
if (totalStyleFiles === 0) {
|
|
373
|
+
pattern = 'unknown';
|
|
374
|
+
confidence = 0;
|
|
375
|
+
}
|
|
376
|
+
else if (coLocationRatio >= 0.8) {
|
|
377
|
+
pattern = 'co-located';
|
|
378
|
+
confidence = coLocationRatio;
|
|
379
|
+
}
|
|
380
|
+
else if (coLocationRatio <= 0.2) {
|
|
381
|
+
pattern = 'separate';
|
|
382
|
+
confidence = 1 - coLocationRatio;
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
pattern = 'mixed';
|
|
386
|
+
confidence = 0.5 + Math.abs(coLocationRatio - 0.5);
|
|
387
|
+
}
|
|
388
|
+
return {
|
|
389
|
+
pattern,
|
|
390
|
+
confidence,
|
|
391
|
+
coLocatedStyles,
|
|
392
|
+
separateStyles,
|
|
393
|
+
totalStyleFiles,
|
|
394
|
+
coLocationRatio,
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Analyze all co-location patterns in a project
|
|
399
|
+
*/
|
|
400
|
+
export function analyzeCoLocation(files) {
|
|
401
|
+
const tests = analyzeTestCoLocation(files);
|
|
402
|
+
const styles = analyzeStyleCoLocation(files);
|
|
403
|
+
// Calculate overall confidence as weighted average
|
|
404
|
+
const totalFiles = tests.totalTestFiles + styles.totalStyleFiles;
|
|
405
|
+
let confidence;
|
|
406
|
+
if (totalFiles === 0) {
|
|
407
|
+
confidence = 0;
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
const testWeight = tests.totalTestFiles / totalFiles;
|
|
411
|
+
const styleWeight = styles.totalStyleFiles / totalFiles;
|
|
412
|
+
confidence = tests.confidence * testWeight + styles.confidence * styleWeight;
|
|
413
|
+
}
|
|
414
|
+
return {
|
|
415
|
+
tests,
|
|
416
|
+
styles,
|
|
417
|
+
confidence,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
// ============================================================================
|
|
421
|
+
// Co-location Detector Class
|
|
422
|
+
// ============================================================================
|
|
423
|
+
/**
|
|
424
|
+
* Detector for co-location patterns
|
|
425
|
+
*
|
|
426
|
+
* Identifies whether a project uses co-located tests/styles (next to source)
|
|
427
|
+
* or separate directories for tests and styles.
|
|
428
|
+
*
|
|
429
|
+
* @requirements 7.3 - THE Structural_Detector SHALL detect co-location patterns
|
|
430
|
+
*/
|
|
431
|
+
export class CoLocationDetector extends StructuralDetector {
|
|
432
|
+
id = 'structural/co-location';
|
|
433
|
+
category = 'structural';
|
|
434
|
+
subcategory = 'co-location';
|
|
435
|
+
name = 'Co-location Detector';
|
|
436
|
+
description = 'Detects test and style co-location patterns (co-located vs separate directories)';
|
|
437
|
+
supportedLanguages = [
|
|
438
|
+
'typescript',
|
|
439
|
+
'javascript',
|
|
440
|
+
'css',
|
|
441
|
+
'scss',
|
|
442
|
+
];
|
|
443
|
+
/**
|
|
444
|
+
* Detect co-location patterns in the project
|
|
445
|
+
*/
|
|
446
|
+
async detect(context) {
|
|
447
|
+
const patterns = [];
|
|
448
|
+
const violations = [];
|
|
449
|
+
// Analyze the entire project's co-location patterns
|
|
450
|
+
const analysis = analyzeCoLocation(context.projectContext.files);
|
|
451
|
+
// Create pattern matches for detected patterns
|
|
452
|
+
if (analysis.tests.pattern !== 'unknown') {
|
|
453
|
+
patterns.push(this.createTestCoLocationPattern(context.file, analysis.tests));
|
|
454
|
+
}
|
|
455
|
+
if (analysis.styles.pattern !== 'unknown') {
|
|
456
|
+
patterns.push(this.createStyleCoLocationPattern(context.file, analysis.styles));
|
|
457
|
+
}
|
|
458
|
+
// Generate violations for inconsistent co-location
|
|
459
|
+
const testViolation = this.checkTestCoLocationConsistency(context.file, analysis.tests);
|
|
460
|
+
if (testViolation) {
|
|
461
|
+
violations.push(testViolation);
|
|
462
|
+
}
|
|
463
|
+
const styleViolation = this.checkStyleCoLocationConsistency(context.file, analysis.styles);
|
|
464
|
+
if (styleViolation) {
|
|
465
|
+
violations.push(styleViolation);
|
|
466
|
+
}
|
|
467
|
+
return this.createResult(patterns, violations, analysis.confidence);
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Generate a quick fix for co-location violations
|
|
471
|
+
*/
|
|
472
|
+
generateQuickFix(violation) {
|
|
473
|
+
// Co-location violations typically require manual refactoring
|
|
474
|
+
if (violation.patternId === 'structural/co-location-test-inconsistency') {
|
|
475
|
+
return {
|
|
476
|
+
title: 'Move test file to follow project pattern',
|
|
477
|
+
kind: 'refactor',
|
|
478
|
+
edit: {
|
|
479
|
+
changes: {},
|
|
480
|
+
documentChanges: [],
|
|
481
|
+
},
|
|
482
|
+
isPreferred: false,
|
|
483
|
+
confidence: 0.5,
|
|
484
|
+
preview: `Consider moving test file to follow the ${violation.expected} pattern`,
|
|
485
|
+
};
|
|
486
|
+
}
|
|
487
|
+
if (violation.patternId === 'structural/co-location-style-inconsistency') {
|
|
488
|
+
return {
|
|
489
|
+
title: 'Move style file to follow project pattern',
|
|
490
|
+
kind: 'refactor',
|
|
491
|
+
edit: {
|
|
492
|
+
changes: {},
|
|
493
|
+
documentChanges: [],
|
|
494
|
+
},
|
|
495
|
+
isPreferred: false,
|
|
496
|
+
confidence: 0.5,
|
|
497
|
+
preview: `Consider moving style file to follow the ${violation.expected} pattern`,
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
return null;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Create a pattern match for test co-location
|
|
504
|
+
*/
|
|
505
|
+
createTestCoLocationPattern(file, analysis) {
|
|
506
|
+
return {
|
|
507
|
+
patternId: `co-location-test-${analysis.pattern}`,
|
|
508
|
+
location: { file, line: 1, column: 1 },
|
|
509
|
+
confidence: analysis.confidence,
|
|
510
|
+
isOutlier: false,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
/**
|
|
514
|
+
* Create a pattern match for style co-location
|
|
515
|
+
*/
|
|
516
|
+
createStyleCoLocationPattern(file, analysis) {
|
|
517
|
+
return {
|
|
518
|
+
patternId: `co-location-style-${analysis.pattern}`,
|
|
519
|
+
location: { file, line: 1, column: 1 },
|
|
520
|
+
confidence: analysis.confidence,
|
|
521
|
+
isOutlier: false,
|
|
522
|
+
};
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Check if the current file follows the project's test co-location pattern
|
|
526
|
+
*/
|
|
527
|
+
checkTestCoLocationConsistency(file, analysis) {
|
|
528
|
+
// Only check test files
|
|
529
|
+
if (!isTestFile(file)) {
|
|
530
|
+
return null;
|
|
531
|
+
}
|
|
532
|
+
// Skip if pattern is unknown or mixed (no clear pattern to enforce)
|
|
533
|
+
if (analysis.pattern === 'unknown' || analysis.pattern === 'mixed') {
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
const normalizedPath = file.replace(/\\/g, '/');
|
|
537
|
+
const isInTestDir = isInTestDirectory(file);
|
|
538
|
+
const isFileCoLocated = !isInTestDir;
|
|
539
|
+
// Check if file follows the dominant pattern
|
|
540
|
+
const followsPattern = (analysis.pattern === 'co-located' && isFileCoLocated) ||
|
|
541
|
+
(analysis.pattern === 'separate' && !isFileCoLocated);
|
|
542
|
+
if (followsPattern) {
|
|
543
|
+
return null;
|
|
544
|
+
}
|
|
545
|
+
const range = {
|
|
546
|
+
start: { line: 1, character: 1 },
|
|
547
|
+
end: { line: 1, character: 1 },
|
|
548
|
+
};
|
|
549
|
+
let message;
|
|
550
|
+
let expected;
|
|
551
|
+
let actual;
|
|
552
|
+
if (analysis.pattern === 'co-located') {
|
|
553
|
+
message = `Test file '${normalizedPath}' is in a separate test directory but project uses co-located tests. Consider moving it next to its source file.`;
|
|
554
|
+
expected = 'co-located tests (test files next to source files)';
|
|
555
|
+
actual = 'test file in separate test directory';
|
|
556
|
+
}
|
|
557
|
+
else {
|
|
558
|
+
message = `Test file '${normalizedPath}' is co-located with source but project uses separate test directories. Consider moving it to a test directory.`;
|
|
559
|
+
expected = 'separate test directories (__tests__/, tests/)';
|
|
560
|
+
actual = 'test file co-located with source';
|
|
561
|
+
}
|
|
562
|
+
return {
|
|
563
|
+
id: `co-location-test-${normalizedPath.replace(/[^a-zA-Z0-9]/g, '-')}`,
|
|
564
|
+
patternId: 'structural/co-location-test-inconsistency',
|
|
565
|
+
severity: 'info',
|
|
566
|
+
file,
|
|
567
|
+
range,
|
|
568
|
+
message,
|
|
569
|
+
expected,
|
|
570
|
+
actual,
|
|
571
|
+
aiExplainAvailable: true,
|
|
572
|
+
aiFixAvailable: false,
|
|
573
|
+
firstSeen: new Date(),
|
|
574
|
+
occurrences: 1,
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
/**
|
|
578
|
+
* Check if the current file follows the project's style co-location pattern
|
|
579
|
+
*/
|
|
580
|
+
checkStyleCoLocationConsistency(file, analysis) {
|
|
581
|
+
// Only check style files
|
|
582
|
+
if (!isStyleFile(file)) {
|
|
583
|
+
return null;
|
|
584
|
+
}
|
|
585
|
+
// Skip if pattern is unknown or mixed (no clear pattern to enforce)
|
|
586
|
+
if (analysis.pattern === 'unknown' || analysis.pattern === 'mixed') {
|
|
587
|
+
return null;
|
|
588
|
+
}
|
|
589
|
+
const normalizedPath = file.replace(/\\/g, '/');
|
|
590
|
+
const isInStyleDir = isInStyleDirectory(file);
|
|
591
|
+
const isFileCoLocated = !isInStyleDir;
|
|
592
|
+
// Check if file follows the dominant pattern
|
|
593
|
+
const followsPattern = (analysis.pattern === 'co-located' && isFileCoLocated) ||
|
|
594
|
+
(analysis.pattern === 'separate' && !isFileCoLocated);
|
|
595
|
+
if (followsPattern) {
|
|
596
|
+
return null;
|
|
597
|
+
}
|
|
598
|
+
const range = {
|
|
599
|
+
start: { line: 1, character: 1 },
|
|
600
|
+
end: { line: 1, character: 1 },
|
|
601
|
+
};
|
|
602
|
+
let message;
|
|
603
|
+
let expected;
|
|
604
|
+
let actual;
|
|
605
|
+
if (analysis.pattern === 'co-located') {
|
|
606
|
+
message = `Style file '${normalizedPath}' is in a separate styles directory but project uses co-located styles. Consider moving it next to its component.`;
|
|
607
|
+
expected = 'co-located styles (style files next to components)';
|
|
608
|
+
actual = 'style file in separate styles directory';
|
|
609
|
+
}
|
|
610
|
+
else {
|
|
611
|
+
message = `Style file '${normalizedPath}' is co-located with component but project uses separate style directories. Consider moving it to a styles directory.`;
|
|
612
|
+
expected = 'separate style directories (styles/, css/)';
|
|
613
|
+
actual = 'style file co-located with component';
|
|
614
|
+
}
|
|
615
|
+
return {
|
|
616
|
+
id: `co-location-style-${normalizedPath.replace(/[^a-zA-Z0-9]/g, '-')}`,
|
|
617
|
+
patternId: 'structural/co-location-style-inconsistency',
|
|
618
|
+
severity: 'info',
|
|
619
|
+
file,
|
|
620
|
+
range,
|
|
621
|
+
message,
|
|
622
|
+
expected,
|
|
623
|
+
actual,
|
|
624
|
+
aiExplainAvailable: true,
|
|
625
|
+
aiFixAvailable: false,
|
|
626
|
+
firstSeen: new Date(),
|
|
627
|
+
occurrences: 1,
|
|
628
|
+
};
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
// ============================================================================
|
|
632
|
+
// Factory Function
|
|
633
|
+
// ============================================================================
|
|
634
|
+
/**
|
|
635
|
+
* Create a new CoLocationDetector instance
|
|
636
|
+
*/
|
|
637
|
+
export function createCoLocationDetector() {
|
|
638
|
+
return new CoLocationDetector();
|
|
639
|
+
}
|
|
640
|
+
//# sourceMappingURL=co-location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"co-location.js","sourceRoot":"","sources":["../../src/structural/co-location.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,kBAAkB,EAA+C,MAAM,kBAAkB,CAAC;AAWnG;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB;IACjB,iBAAiB;CACT,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,OAAO;IACP,MAAM;IACN,UAAU;IACV,MAAM;IACN,OAAO;IACP,WAAW;CACH,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,gBAAgB;IAChB,iBAAiB;IACjB,iBAAiB;IACjB,iBAAiB;IACjB,qBAAqB;IACrB,QAAQ;IACR,SAAS;IACT,SAAS;IACT,SAAS;IACT,oBAAoB;CACZ,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ;IACR,OAAO;IACP,KAAK;IACL,MAAM;IACN,YAAY;CACJ,CAAC;AA8EX,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAEvD,2BAA2B;IAC3B,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACrE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAEvD,2BAA2B;IAC3B,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;QAC1C,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACtE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB;IAClD,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAEvD,uBAAuB;IACvB,IAAI,QAAQ,GAAG,QAAQ;SACpB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IAElC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;IAEvD,wBAAwB;IACxB,IAAI,QAAQ,GAAG,QAAQ;SACpB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;SAC7B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC;SAClC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC;SACjC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAE1B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,QAAkB;IACxE,MAAM,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE/C,gCAAgC;IAChC,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAExE,iDAAiD;IACjD,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,GAAG,OAAO,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;YAC5D,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,IAAI,WAAW,EAAE,CAAC;QAChB,yCAAyC;QACzC,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjE,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,yBAAyB;YACzB,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC;YAC7F,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,eAAe,CAAC,EAAE,CAAC;gBAClE,OAAO,eAAe,CAAC;YACzB,CAAC;YAED,8BAA8B;YAC9B,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,QAAQ,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,QAAQ,GAAG,GAAG,EAAE,CAAC;YAClG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,YAAY,CAAC,EAAE,CAAC;gBAC/D,OAAO,YAAY,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAEvD,KAAK,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;YACnC,IAAI,QAAQ,KAAK,GAAG,QAAQ,GAAG,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBACpE,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,SAAiB,EAAE,QAAkB;IAC7E,MAAM,QAAQ,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,YAAY,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAElD,mCAAmC;IACnC,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAE3D,iDAAiD;IACjD,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,GAAG,QAAQ,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;QAClD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;YAC5D,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,IAAI,YAAY,EAAE,CAAC;QACjB,0CAA0C;QAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAElE,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,yBAAyB;YACzB,MAAM,eAAe,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC;YAC7F,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,eAAe,CAAC,EAAE,CAAC;gBAClE,OAAO,eAAe,CAAC;YACzB,CAAC;YAED,qCAAqC;YACrC,MAAM,mBAAmB,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,eAAe,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,cAAc,QAAQ,GAAG,GAAG,EAAE,CAAC;YACvH,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,mBAAmB,CAAC,EAAE,CAAC;gBACtE,OAAO,mBAAmB,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QAEvD,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,IAAI,QAAQ,KAAK,GAAG,QAAQ,GAAG,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrE,OAAO,cAAc,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAe;IACnD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,cAAc,GAAmB,EAAE,CAAC;IAC1C,MAAM,aAAa,GAAmB,EAAE,CAAC;IAEzC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAEhD,uDAAuD;QACvD,kDAAkD;QAClD,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,MAAM,WAAW,GAAG,CAAC,WAAW,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,CAAC,CAAC;QAElF,MAAM,IAAI,GAAiB;YACzB,QAAQ,EAAE,cAAc;YACxB,UAAU;YACV,WAAW;YACX,aAAa;SACd,CAAC;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;IACxC,MAAM,eAAe,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAExF,yBAAyB;IACzB,IAAI,OAA0B,CAAC;IAC/B,IAAI,UAAkB,CAAC;IAEvB,IAAI,cAAc,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,SAAS,CAAC;QACpB,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;SAAM,IAAI,eAAe,IAAI,GAAG,EAAE,CAAC;QAClC,OAAO,GAAG,YAAY,CAAC;QACvB,UAAU,GAAG,eAAe,CAAC;IAC/B,CAAC;SAAM,IAAI,eAAe,IAAI,GAAG,EAAE,CAAC;QAClC,OAAO,GAAG,UAAU,CAAC;QACrB,UAAU,GAAG,CAAC,GAAG,eAAe,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,OAAO,CAAC;QAClB,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,OAAO;QACP,UAAU;QACV,cAAc;QACd,aAAa;QACb,cAAc;QACd,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAe;IACpD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,eAAe,GAAoB,EAAE,CAAC;IAC5C,MAAM,cAAc,GAAoB,EAAE,CAAC;IAE3C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACrD,MAAM,aAAa,GAAG,yBAAyB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEnD,yDAAyD;QACzD,qDAAqD;QACrD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5E,MAAM,WAAW,GAAG,CAAC,YAAY,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,QAAQ,KAAK,YAAY,CAAC,CAAC;QAE1F,MAAM,IAAI,GAAkB;YAC1B,SAAS,EAAE,cAAc;YACzB,aAAa;YACb,WAAW;YACX,cAAc;SACf,CAAC;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,CAAC,MAAM,CAAC;IAC1C,MAAM,eAAe,GAAG,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,yBAAyB;IACzB,IAAI,OAA0B,CAAC;IAC/B,IAAI,UAAkB,CAAC;IAEvB,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,SAAS,CAAC;QACpB,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;SAAM,IAAI,eAAe,IAAI,GAAG,EAAE,CAAC;QAClC,OAAO,GAAG,YAAY,CAAC;QACvB,UAAU,GAAG,eAAe,CAAC;IAC/B,CAAC;SAAM,IAAI,eAAe,IAAI,GAAG,EAAE,CAAC;QAClC,OAAO,GAAG,UAAU,CAAC;QACrB,UAAU,GAAG,CAAC,GAAG,eAAe,CAAC;IACnC,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,OAAO,CAAC;QAClB,UAAU,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;QACL,OAAO;QACP,UAAU;QACV,eAAe;QACf,cAAc;QACd,eAAe;QACf,eAAe;KAChB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAe;IAC/C,MAAM,KAAK,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE7C,mDAAmD;IACnD,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;IACjE,IAAI,UAAkB,CAAC;IAEvB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,UAAU,GAAG,CAAC,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,GAAG,UAAU,CAAC;QACxD,UAAU,GAAG,KAAK,CAAC,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC,UAAU,GAAG,WAAW,CAAC;IAC/E,CAAC;IAED,OAAO;QACL,KAAK;QACL,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IAC/C,EAAE,GAAG,wBAAwB,CAAC;IAC9B,QAAQ,GAAG,YAAqB,CAAC;IACjC,WAAW,GAAG,aAAa,CAAC;IAC5B,IAAI,GAAG,sBAAsB,CAAC;IAC9B,WAAW,GAAG,kFAAkF,CAAC;IACjG,kBAAkB,GAAe;QACxC,YAAY;QACZ,YAAY;QACZ,KAAK;QACL,MAAM;KACP,CAAC;IAEF;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,OAAyB;QACpC,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAgB,EAAE,CAAC;QAEnC,oDAAoD;QACpD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAEjE,+CAA+C;QAC/C,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACzC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,mDAAmD;QACnD,MAAM,aAAa,GAAG,IAAI,CAAC,8BAA8B,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxF,IAAI,aAAa,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3F,IAAI,cAAc,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,SAAoB;QACnC,8DAA8D;QAC9D,IAAI,SAAS,CAAC,SAAS,KAAK,2CAA2C,EAAE,CAAC;YACxE,OAAO;gBACL,KAAK,EAAE,0CAA0C;gBACjD,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE;oBACJ,OAAO,EAAE,EAAE;oBACX,eAAe,EAAE,EAAE;iBACpB;gBACD,WAAW,EAAE,KAAK;gBAClB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,2CAA2C,SAAS,CAAC,QAAQ,UAAU;aACjF,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,CAAC,SAAS,KAAK,4CAA4C,EAAE,CAAC;YACzE,OAAO;gBACL,KAAK,EAAE,2CAA2C;gBAClD,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE;oBACJ,OAAO,EAAE,EAAE;oBACX,eAAe,EAAE,EAAE;iBACpB;gBACD,WAAW,EAAE,KAAK;gBAClB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,4CAA4C,SAAS,CAAC,QAAQ,UAAU;aAClF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,2BAA2B,CACjC,IAAY,EACZ,QAAgC;QAEhC,OAAO;YACL,SAAS,EAAE,oBAAoB,QAAQ,CAAC,OAAO,EAAE;YACjD,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YACtC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,4BAA4B,CAClC,IAAY,EACZ,QAAiC;QAEjC,OAAO;YACL,SAAS,EAAE,qBAAqB,QAAQ,CAAC,OAAO,EAAE;YAClD,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;YACtC,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,8BAA8B,CACpC,IAAY,EACZ,QAAgC;QAEhC,wBAAwB;QACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oEAAoE;QACpE,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,CAAC,WAAW,CAAC;QAErC,6CAA6C;QAC7C,MAAM,cAAc,GAClB,CAAC,QAAQ,CAAC,OAAO,KAAK,YAAY,IAAI,eAAe,CAAC;YACtD,CAAC,QAAQ,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,eAAe,CAAC,CAAC;QAExD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAU;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;YAChC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;SAC/B,CAAC;QAEF,IAAI,OAAe,CAAC;QACpB,IAAI,QAAgB,CAAC;QACrB,IAAI,MAAc,CAAC;QAEnB,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;YACtC,OAAO,GAAG,cAAc,cAAc,kHAAkH,CAAC;YACzJ,QAAQ,GAAG,oDAAoD,CAAC;YAChE,MAAM,GAAG,sCAAsC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,cAAc,cAAc,iHAAiH,CAAC;YACxJ,QAAQ,GAAG,gDAAgD,CAAC;YAC5D,MAAM,GAAG,kCAAkC,CAAC;QAC9C,CAAC;QAED,OAAO;YACL,EAAE,EAAE,oBAAoB,cAAc,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE;YACtE,SAAS,EAAE,2CAA2C;YACtD,QAAQ,EAAE,MAAM;YAChB,IAAI;YACJ,KAAK;YACL,OAAO;YACP,QAAQ;YACR,MAAM;YACN,kBAAkB,EAAE,IAAI;YACxB,cAAc,EAAE,KAAK;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,WAAW,EAAE,CAAC;SACf,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,+BAA+B,CACrC,IAAY,EACZ,QAAiC;QAEjC,yBAAyB;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,oEAAoE;QACpE,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,CAAC,YAAY,CAAC;QAEtC,6CAA6C;QAC7C,MAAM,cAAc,GAClB,CAAC,QAAQ,CAAC,OAAO,KAAK,YAAY,IAAI,eAAe,CAAC;YACtD,CAAC,QAAQ,CAAC,OAAO,KAAK,UAAU,IAAI,CAAC,eAAe,CAAC,CAAC;QAExD,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,GAAU;YACnB,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;YAChC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE;SAC/B,CAAC;QAEF,IAAI,OAAe,CAAC;QACpB,IAAI,QAAgB,CAAC;QACrB,IAAI,MAAc,CAAC;QAEnB,IAAI,QAAQ,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;YACtC,OAAO,GAAG,eAAe,cAAc,mHAAmH,CAAC;YAC3J,QAAQ,GAAG,oDAAoD,CAAC;YAChE,MAAM,GAAG,yCAAyC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,eAAe,cAAc,uHAAuH,CAAC;YAC/J,QAAQ,GAAG,4CAA4C,CAAC;YACxD,MAAM,GAAG,sCAAsC,CAAC;QAClD,CAAC;QAED,OAAO;YACL,EAAE,EAAE,qBAAqB,cAAc,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE;YACvE,SAAS,EAAE,4CAA4C;YACvD,QAAQ,EAAE,MAAM;YAChB,IAAI;YACJ,KAAK;YACL,OAAO;YACP,QAAQ;YACR,MAAM;YACN,kBAAkB,EAAE,IAAI;YACxB,cAAc,EAAE,KAAK;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,WAAW,EAAE,CAAC;SACf,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC"}
|