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,232 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debounce Throttle Detector - Debounce and throttle pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects debounce and throttle patterns including:
|
|
5
|
+
* - Lodash debounce/throttle
|
|
6
|
+
* - Custom implementations
|
|
7
|
+
* - React hooks (useDebounce, useThrottle)
|
|
8
|
+
* - Event handler optimization
|
|
9
|
+
*
|
|
10
|
+
* @requirements 19.5 - Debounce and throttle patterns
|
|
11
|
+
*/
|
|
12
|
+
import { RegexDetector } from '../base/regex-detector.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Constants
|
|
15
|
+
// ============================================================================
|
|
16
|
+
export const LODASH_DEBOUNCE_PATTERNS = [
|
|
17
|
+
/_.debounce\s*\(/g,
|
|
18
|
+
/debounce\s*\(\s*\w+\s*,\s*\d+/g,
|
|
19
|
+
/from\s+['"`]lodash\/debounce['"`]/g,
|
|
20
|
+
/import\s+\{\s*debounce\s*\}\s+from\s+['"`]lodash['"`]/g,
|
|
21
|
+
];
|
|
22
|
+
export const LODASH_THROTTLE_PATTERNS = [
|
|
23
|
+
/_.throttle\s*\(/g,
|
|
24
|
+
/throttle\s*\(\s*\w+\s*,\s*\d+/g,
|
|
25
|
+
/from\s+['"`]lodash\/throttle['"`]/g,
|
|
26
|
+
/import\s+\{\s*throttle\s*\}\s+from\s+['"`]lodash['"`]/g,
|
|
27
|
+
];
|
|
28
|
+
export const CUSTOM_DEBOUNCE_PATTERNS = [
|
|
29
|
+
/function\s+debounce\s*\(/g,
|
|
30
|
+
/const\s+debounce\s*=\s*\(/g,
|
|
31
|
+
/let\s+debounce\s*=\s*\(/g,
|
|
32
|
+
/clearTimeout\s*\([^)]*\)\s*;\s*\w+\s*=\s*setTimeout/g,
|
|
33
|
+
];
|
|
34
|
+
export const CUSTOM_THROTTLE_PATTERNS = [
|
|
35
|
+
/function\s+throttle\s*\(/g,
|
|
36
|
+
/const\s+throttle\s*=\s*\(/g,
|
|
37
|
+
/let\s+throttle\s*=\s*\(/g,
|
|
38
|
+
/Date\.now\s*\(\)\s*-\s*\w+\s*[<>]=?\s*\d+/g,
|
|
39
|
+
];
|
|
40
|
+
export const USE_DEBOUNCE_PATTERNS = [
|
|
41
|
+
/useDebounce\s*\(/g,
|
|
42
|
+
/useDebouncedValue\s*\(/g,
|
|
43
|
+
/useDebouncedCallback\s*\(/g,
|
|
44
|
+
/use-debounce/g,
|
|
45
|
+
];
|
|
46
|
+
export const USE_THROTTLE_PATTERNS = [
|
|
47
|
+
/useThrottle\s*\(/g,
|
|
48
|
+
/useThrottledValue\s*\(/g,
|
|
49
|
+
/useThrottledCallback\s*\(/g,
|
|
50
|
+
];
|
|
51
|
+
export const REQUEST_ANIMATION_FRAME_PATTERNS = [
|
|
52
|
+
/requestAnimationFrame\s*\(/g,
|
|
53
|
+
/cancelAnimationFrame\s*\(/g,
|
|
54
|
+
/window\.requestAnimationFrame/g,
|
|
55
|
+
];
|
|
56
|
+
export const SET_TIMEOUT_DEBOUNCE_PATTERNS = [
|
|
57
|
+
/setTimeout\s*\([^)]+,\s*\d+\s*\)/g,
|
|
58
|
+
/clearTimeout\s*\(/g,
|
|
59
|
+
];
|
|
60
|
+
export const MISSING_DEBOUNCE_PATTERNS = [
|
|
61
|
+
/onScroll\s*=\s*\{[^}]*\}/g,
|
|
62
|
+
/onResize\s*=\s*\{[^}]*\}/g,
|
|
63
|
+
/onInput\s*=\s*\{[^}]*\}/g,
|
|
64
|
+
/onChange\s*=\s*\{[^}]*fetch/gi,
|
|
65
|
+
];
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Analysis Functions
|
|
68
|
+
// ============================================================================
|
|
69
|
+
export function shouldExcludeFile(filePath) {
|
|
70
|
+
const excludePatterns = [
|
|
71
|
+
/\.test\.[jt]sx?$/,
|
|
72
|
+
/\.spec\.[jt]sx?$/,
|
|
73
|
+
/__tests__\//,
|
|
74
|
+
/node_modules\//,
|
|
75
|
+
/\.min\.[jt]s$/,
|
|
76
|
+
];
|
|
77
|
+
return excludePatterns.some((p) => p.test(filePath));
|
|
78
|
+
}
|
|
79
|
+
function detectPatterns(content, filePath, patterns, type) {
|
|
80
|
+
const results = [];
|
|
81
|
+
const lines = content.split('\n');
|
|
82
|
+
for (let i = 0; i < lines.length; i++) {
|
|
83
|
+
const line = lines[i];
|
|
84
|
+
for (const pattern of patterns) {
|
|
85
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
86
|
+
let match;
|
|
87
|
+
while ((match = regex.exec(line)) !== null) {
|
|
88
|
+
const delayMatch = match[0].match(/,\s*(\d+)/);
|
|
89
|
+
results.push({
|
|
90
|
+
type,
|
|
91
|
+
file: filePath,
|
|
92
|
+
line: i + 1,
|
|
93
|
+
column: match.index + 1,
|
|
94
|
+
matchedText: match[0],
|
|
95
|
+
delay: delayMatch ? parseInt(delayMatch[1], 10) : undefined,
|
|
96
|
+
context: line.trim(),
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
export function detectLodashDebounce(content, filePath) {
|
|
104
|
+
return detectPatterns(content, filePath, LODASH_DEBOUNCE_PATTERNS, 'lodash-debounce');
|
|
105
|
+
}
|
|
106
|
+
export function detectLodashThrottle(content, filePath) {
|
|
107
|
+
return detectPatterns(content, filePath, LODASH_THROTTLE_PATTERNS, 'lodash-throttle');
|
|
108
|
+
}
|
|
109
|
+
export function detectCustomDebounce(content, filePath) {
|
|
110
|
+
return detectPatterns(content, filePath, CUSTOM_DEBOUNCE_PATTERNS, 'custom-debounce');
|
|
111
|
+
}
|
|
112
|
+
export function detectCustomThrottle(content, filePath) {
|
|
113
|
+
return detectPatterns(content, filePath, CUSTOM_THROTTLE_PATTERNS, 'custom-throttle');
|
|
114
|
+
}
|
|
115
|
+
export function detectUseDebounce(content, filePath) {
|
|
116
|
+
return detectPatterns(content, filePath, USE_DEBOUNCE_PATTERNS, 'use-debounce');
|
|
117
|
+
}
|
|
118
|
+
export function detectUseThrottle(content, filePath) {
|
|
119
|
+
return detectPatterns(content, filePath, USE_THROTTLE_PATTERNS, 'use-throttle');
|
|
120
|
+
}
|
|
121
|
+
export function detectRequestAnimationFrame(content, filePath) {
|
|
122
|
+
return detectPatterns(content, filePath, REQUEST_ANIMATION_FRAME_PATTERNS, 'request-animation-frame');
|
|
123
|
+
}
|
|
124
|
+
export function detectSetTimeoutDebounce(content, filePath) {
|
|
125
|
+
return detectPatterns(content, filePath, SET_TIMEOUT_DEBOUNCE_PATTERNS, 'set-timeout-debounce');
|
|
126
|
+
}
|
|
127
|
+
export function detectMissingDebounceViolations(content, filePath) {
|
|
128
|
+
const results = [];
|
|
129
|
+
const lines = content.split('\n');
|
|
130
|
+
// Check if file already uses debounce/throttle
|
|
131
|
+
const hasDebounce = /debounce|throttle/i.test(content);
|
|
132
|
+
if (hasDebounce)
|
|
133
|
+
return results;
|
|
134
|
+
for (let i = 0; i < lines.length; i++) {
|
|
135
|
+
const line = lines[i];
|
|
136
|
+
for (const pattern of MISSING_DEBOUNCE_PATTERNS) {
|
|
137
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
138
|
+
let match;
|
|
139
|
+
while ((match = regex.exec(line)) !== null) {
|
|
140
|
+
results.push({
|
|
141
|
+
type: 'missing-debounce',
|
|
142
|
+
file: filePath,
|
|
143
|
+
line: i + 1,
|
|
144
|
+
column: match.index + 1,
|
|
145
|
+
matchedText: match[0],
|
|
146
|
+
issue: 'High-frequency event handler without debounce/throttle',
|
|
147
|
+
suggestedFix: 'Add debounce or throttle to prevent performance issues',
|
|
148
|
+
severity: 'medium',
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return results;
|
|
154
|
+
}
|
|
155
|
+
export function analyzeDebounceThrottle(content, filePath) {
|
|
156
|
+
if (shouldExcludeFile(filePath)) {
|
|
157
|
+
return {
|
|
158
|
+
patterns: [],
|
|
159
|
+
violations: [],
|
|
160
|
+
debounceCount: 0,
|
|
161
|
+
throttleCount: 0,
|
|
162
|
+
usesRAF: false,
|
|
163
|
+
confidence: 1.0,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const patterns = [
|
|
167
|
+
...detectLodashDebounce(content, filePath),
|
|
168
|
+
...detectLodashThrottle(content, filePath),
|
|
169
|
+
...detectCustomDebounce(content, filePath),
|
|
170
|
+
...detectCustomThrottle(content, filePath),
|
|
171
|
+
...detectUseDebounce(content, filePath),
|
|
172
|
+
...detectUseThrottle(content, filePath),
|
|
173
|
+
...detectRequestAnimationFrame(content, filePath),
|
|
174
|
+
...detectSetTimeoutDebounce(content, filePath),
|
|
175
|
+
];
|
|
176
|
+
const violations = [
|
|
177
|
+
...detectMissingDebounceViolations(content, filePath),
|
|
178
|
+
];
|
|
179
|
+
const debounceCount = patterns.filter((p) => p.type.includes('debounce')).length;
|
|
180
|
+
const throttleCount = patterns.filter((p) => p.type.includes('throttle')).length;
|
|
181
|
+
const usesRAF = patterns.some((p) => p.type === 'request-animation-frame');
|
|
182
|
+
let confidence = 0.7;
|
|
183
|
+
if (patterns.length > 0)
|
|
184
|
+
confidence += 0.15;
|
|
185
|
+
if (violations.length === 0)
|
|
186
|
+
confidence += 0.1;
|
|
187
|
+
confidence = Math.min(confidence, 0.95);
|
|
188
|
+
return {
|
|
189
|
+
patterns,
|
|
190
|
+
violations,
|
|
191
|
+
debounceCount,
|
|
192
|
+
throttleCount,
|
|
193
|
+
usesRAF,
|
|
194
|
+
confidence,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
// ============================================================================
|
|
198
|
+
// Detector Class
|
|
199
|
+
// ============================================================================
|
|
200
|
+
export class DebounceThrottleDetector extends RegexDetector {
|
|
201
|
+
id = 'performance/debounce-throttle';
|
|
202
|
+
name = 'Debounce Throttle Detector';
|
|
203
|
+
description = 'Detects debounce and throttle patterns for event optimization';
|
|
204
|
+
category = 'performance';
|
|
205
|
+
subcategory = 'debounce-throttle';
|
|
206
|
+
supportedLanguages = ['typescript', 'javascript'];
|
|
207
|
+
async detect(context) {
|
|
208
|
+
if (!this.supportsLanguage(context.language)) {
|
|
209
|
+
return this.createEmptyResult();
|
|
210
|
+
}
|
|
211
|
+
const analysis = analyzeDebounceThrottle(context.content, context.file);
|
|
212
|
+
if (analysis.patterns.length === 0 && analysis.violations.length === 0) {
|
|
213
|
+
return this.createEmptyResult();
|
|
214
|
+
}
|
|
215
|
+
return this.createResult([], [], analysis.confidence, {
|
|
216
|
+
custom: {
|
|
217
|
+
patterns: analysis.patterns,
|
|
218
|
+
violations: analysis.violations,
|
|
219
|
+
debounceCount: analysis.debounceCount,
|
|
220
|
+
throttleCount: analysis.throttleCount,
|
|
221
|
+
usesRAF: analysis.usesRAF,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
generateQuickFix(_violation) {
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
export function createDebounceThrottleDetector() {
|
|
230
|
+
return new DebounceThrottleDetector();
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=debounce-throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debounce-throttle.js","sourceRoot":"","sources":["../../src/performance/debounce-throttle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Detectors - Performance pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Exports all performance-related detectors for detecting optimization patterns.
|
|
5
|
+
*
|
|
6
|
+
* @requirements 19.1-19.6 - Performance pattern detection
|
|
7
|
+
*/
|
|
8
|
+
export { CodeSplittingDetector, createCodeSplittingDetector, analyzeCodeSplitting, shouldExcludeFile as shouldExcludeCodeSplitting, detectDynamicImports, detectReactLazy, detectNextDynamic, detectRouteSplitting, detectComponentSplitting, detectVendorChunk, detectWebpackMagicComment, detectSuspenseBoundary, detectLoadableComponent, detectPrefetchHint, detectMissingSuspenseViolations, detectEagerImportViolations, DYNAMIC_IMPORT_PATTERNS, REACT_LAZY_PATTERNS, NEXT_DYNAMIC_PATTERNS, SUSPENSE_BOUNDARY_PATTERNS, WEBPACK_MAGIC_COMMENT_PATTERNS, } from './code-splitting.js';
|
|
9
|
+
export type { CodeSplittingPatternType, CodeSplittingViolationType, CodeSplittingPatternInfo, CodeSplittingViolationInfo, CodeSplittingAnalysis, } from './code-splitting.js';
|
|
10
|
+
export { LazyLoadingDetector, createLazyLoadingDetector, analyzeLazyLoading, shouldExcludeFile as shouldExcludeLazyLoading, detectImageLazy, detectNativeLazy, detectIntersectionObserver, detectVirtualScroll, detectInfiniteScroll, detectLazyComponent, detectPlaceholderLoading, detectSkeletonLoading, detectMissingLazyImageViolations, IMAGE_LAZY_PATTERNS, NATIVE_LAZY_PATTERNS, INTERSECTION_OBSERVER_PATTERNS, VIRTUAL_SCROLL_PATTERNS, INFINITE_SCROLL_PATTERNS, } from './lazy-loading.js';
|
|
11
|
+
export type { LazyLoadingPatternType, LazyLoadingViolationType, LazyLoadingPatternInfo, LazyLoadingViolationInfo, LazyLoadingAnalysis, } from './lazy-loading.js';
|
|
12
|
+
export { MemoizationDetector, createMemoizationDetector, analyzeMemoization, shouldExcludeFile as shouldExcludeMemoization, detectReactMemo, detectUseMemo, detectUseCallback, detectReselect, detectCustomMemoize, detectLodashMemoize, detectMemoOne, detectEmptyDepsViolations, detectInlineObjectDepsViolations, REACT_MEMO_PATTERNS, USE_MEMO_PATTERNS, USE_CALLBACK_PATTERNS, RESELECT_PATTERNS, } from './memoization.js';
|
|
13
|
+
export type { MemoizationPatternType, MemoizationViolationType, MemoizationPatternInfo, MemoizationViolationInfo, MemoizationAnalysis, } from './memoization.js';
|
|
14
|
+
export { CachingPatternsDetector, createCachingPatternsDetector, analyzeCachingPatterns, shouldExcludeFile as shouldExcludeCachingPatterns, detectHttpCacheControl, detectEtag, detectServiceWorker, detectReactQuery, detectSWR, detectRedisCache, detectMemoryCache, detectLocalStorage, detectSessionStorage, detectIndexedDB, HTTP_CACHE_CONTROL_PATTERNS, REACT_QUERY_PATTERNS, SWR_PATTERNS, SERVICE_WORKER_PATTERNS, } from './caching-patterns.js';
|
|
15
|
+
export type { CachingPatternType, CachingViolationType, CachingPatternInfo, CachingViolationInfo, CachingPatternsAnalysis, } from './caching-patterns.js';
|
|
16
|
+
export { DebounceThrottleDetector, createDebounceThrottleDetector, analyzeDebounceThrottle, shouldExcludeFile as shouldExcludeDebounceThrottle, detectLodashDebounce, detectLodashThrottle, detectCustomDebounce, detectCustomThrottle, detectUseDebounce, detectUseThrottle, detectRequestAnimationFrame, detectSetTimeoutDebounce, detectMissingDebounceViolations, LODASH_DEBOUNCE_PATTERNS, LODASH_THROTTLE_PATTERNS, USE_DEBOUNCE_PATTERNS, USE_THROTTLE_PATTERNS, REQUEST_ANIMATION_FRAME_PATTERNS, } from './debounce-throttle.js';
|
|
17
|
+
export type { DebounceThrottlePatternType, DebounceThrottleViolationType, DebounceThrottlePatternInfo, DebounceThrottleViolationInfo, DebounceThrottleAnalysis, } from './debounce-throttle.js';
|
|
18
|
+
export { BundleSizeDetector, createBundleSizeDetector, analyzeBundleSize, shouldExcludeFile as shouldExcludeBundleSize, detectTreeShakeableImport, detectNamespaceImport, detectSideEffectImport, detectDynamicImport, detectExternalConfig, detectBundleAnalyzer, detectSourceMapConfig, detectFullLodashImportViolations, detectMomentImportViolations, detectBarrelImportViolations, TREE_SHAKEABLE_IMPORT_PATTERNS, NAMESPACE_IMPORT_PATTERNS, DYNAMIC_IMPORT_PATTERNS as BUNDLE_DYNAMIC_IMPORT_PATTERNS, FULL_LODASH_IMPORT_PATTERNS, MOMENT_IMPORT_PATTERNS, } from './bundle-size.js';
|
|
19
|
+
export type { BundleSizePatternType, BundleSizeViolationType, BundleSizePatternInfo, BundleSizeViolationInfo, BundleSizeAnalysis, } from './bundle-size.js';
|
|
20
|
+
import { CodeSplittingDetector } from './code-splitting.js';
|
|
21
|
+
import { LazyLoadingDetector } from './lazy-loading.js';
|
|
22
|
+
import { MemoizationDetector } from './memoization.js';
|
|
23
|
+
import { CachingPatternsDetector } from './caching-patterns.js';
|
|
24
|
+
import { DebounceThrottleDetector } from './debounce-throttle.js';
|
|
25
|
+
import { BundleSizeDetector } from './bundle-size.js';
|
|
26
|
+
export type PerformanceDetector = CodeSplittingDetector | LazyLoadingDetector | MemoizationDetector | CachingPatternsDetector | DebounceThrottleDetector | BundleSizeDetector;
|
|
27
|
+
export declare function createPerformanceDetectors(): PerformanceDetector[];
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Performance Detectors - Performance pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Exports all performance-related detectors for detecting optimization patterns.
|
|
5
|
+
*
|
|
6
|
+
* @requirements 19.1-19.6 - Performance pattern detection
|
|
7
|
+
*/
|
|
8
|
+
// Code Splitting Detector
|
|
9
|
+
export { CodeSplittingDetector, createCodeSplittingDetector, analyzeCodeSplitting, shouldExcludeFile as shouldExcludeCodeSplitting, detectDynamicImports, detectReactLazy, detectNextDynamic, detectRouteSplitting, detectComponentSplitting, detectVendorChunk, detectWebpackMagicComment, detectSuspenseBoundary, detectLoadableComponent, detectPrefetchHint, detectMissingSuspenseViolations, detectEagerImportViolations, DYNAMIC_IMPORT_PATTERNS, REACT_LAZY_PATTERNS, NEXT_DYNAMIC_PATTERNS, SUSPENSE_BOUNDARY_PATTERNS, WEBPACK_MAGIC_COMMENT_PATTERNS, } from './code-splitting.js';
|
|
10
|
+
// Lazy Loading Detector
|
|
11
|
+
export { LazyLoadingDetector, createLazyLoadingDetector, analyzeLazyLoading, shouldExcludeFile as shouldExcludeLazyLoading, detectImageLazy, detectNativeLazy, detectIntersectionObserver, detectVirtualScroll, detectInfiniteScroll, detectLazyComponent, detectPlaceholderLoading, detectSkeletonLoading, detectMissingLazyImageViolations, IMAGE_LAZY_PATTERNS, NATIVE_LAZY_PATTERNS, INTERSECTION_OBSERVER_PATTERNS, VIRTUAL_SCROLL_PATTERNS, INFINITE_SCROLL_PATTERNS, } from './lazy-loading.js';
|
|
12
|
+
// Memoization Detector
|
|
13
|
+
export { MemoizationDetector, createMemoizationDetector, analyzeMemoization, shouldExcludeFile as shouldExcludeMemoization, detectReactMemo, detectUseMemo, detectUseCallback, detectReselect, detectCustomMemoize, detectLodashMemoize, detectMemoOne, detectEmptyDepsViolations, detectInlineObjectDepsViolations, REACT_MEMO_PATTERNS, USE_MEMO_PATTERNS, USE_CALLBACK_PATTERNS, RESELECT_PATTERNS, } from './memoization.js';
|
|
14
|
+
// Caching Patterns Detector
|
|
15
|
+
export { CachingPatternsDetector, createCachingPatternsDetector, analyzeCachingPatterns, shouldExcludeFile as shouldExcludeCachingPatterns, detectHttpCacheControl, detectEtag, detectServiceWorker, detectReactQuery, detectSWR, detectRedisCache, detectMemoryCache, detectLocalStorage, detectSessionStorage, detectIndexedDB, HTTP_CACHE_CONTROL_PATTERNS, REACT_QUERY_PATTERNS, SWR_PATTERNS, SERVICE_WORKER_PATTERNS, } from './caching-patterns.js';
|
|
16
|
+
// Debounce Throttle Detector
|
|
17
|
+
export { DebounceThrottleDetector, createDebounceThrottleDetector, analyzeDebounceThrottle, shouldExcludeFile as shouldExcludeDebounceThrottle, detectLodashDebounce, detectLodashThrottle, detectCustomDebounce, detectCustomThrottle, detectUseDebounce, detectUseThrottle, detectRequestAnimationFrame, detectSetTimeoutDebounce, detectMissingDebounceViolations, LODASH_DEBOUNCE_PATTERNS, LODASH_THROTTLE_PATTERNS, USE_DEBOUNCE_PATTERNS, USE_THROTTLE_PATTERNS, REQUEST_ANIMATION_FRAME_PATTERNS, } from './debounce-throttle.js';
|
|
18
|
+
// Bundle Size Detector
|
|
19
|
+
export { BundleSizeDetector, createBundleSizeDetector, analyzeBundleSize, shouldExcludeFile as shouldExcludeBundleSize, detectTreeShakeableImport, detectNamespaceImport, detectSideEffectImport, detectDynamicImport, detectExternalConfig, detectBundleAnalyzer, detectSourceMapConfig, detectFullLodashImportViolations, detectMomentImportViolations, detectBarrelImportViolations, TREE_SHAKEABLE_IMPORT_PATTERNS, NAMESPACE_IMPORT_PATTERNS, DYNAMIC_IMPORT_PATTERNS as BUNDLE_DYNAMIC_IMPORT_PATTERNS, FULL_LODASH_IMPORT_PATTERNS, MOMENT_IMPORT_PATTERNS, } from './bundle-size.js';
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Factory Function
|
|
22
|
+
// ============================================================================
|
|
23
|
+
import { CodeSplittingDetector } from './code-splitting.js';
|
|
24
|
+
import { LazyLoadingDetector } from './lazy-loading.js';
|
|
25
|
+
import { MemoizationDetector } from './memoization.js';
|
|
26
|
+
import { CachingPatternsDetector } from './caching-patterns.js';
|
|
27
|
+
import { DebounceThrottleDetector } from './debounce-throttle.js';
|
|
28
|
+
import { BundleSizeDetector } from './bundle-size.js';
|
|
29
|
+
export function createPerformanceDetectors() {
|
|
30
|
+
return [
|
|
31
|
+
new CodeSplittingDetector(),
|
|
32
|
+
new LazyLoadingDetector(),
|
|
33
|
+
new MemoizationDetector(),
|
|
34
|
+
new CachingPatternsDetector(),
|
|
35
|
+
new DebounceThrottleDetector(),
|
|
36
|
+
new BundleSizeDetector(),
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/performance/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy Loading Detector - Lazy loading pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects lazy loading patterns including:
|
|
5
|
+
* - Image lazy loading
|
|
6
|
+
* - Component lazy loading
|
|
7
|
+
* - Intersection Observer usage
|
|
8
|
+
* - Virtual scrolling
|
|
9
|
+
* - Infinite scroll patterns
|
|
10
|
+
*
|
|
11
|
+
* @requirements 19.2 - Lazy loading patterns
|
|
12
|
+
*/
|
|
13
|
+
import type { Violation, QuickFix, PatternCategory, Language } from 'driftdetect-core';
|
|
14
|
+
import { RegexDetector } from '../base/regex-detector.js';
|
|
15
|
+
import type { DetectionContext, DetectionResult } from '../base/base-detector.js';
|
|
16
|
+
export type LazyLoadingPatternType = 'image-lazy' | 'native-lazy' | 'intersection-observer' | 'virtual-scroll' | 'infinite-scroll' | 'lazy-component' | 'placeholder-loading' | 'skeleton-loading';
|
|
17
|
+
export type LazyLoadingViolationType = 'missing-lazy-image' | 'missing-placeholder' | 'eager-above-fold';
|
|
18
|
+
export interface LazyLoadingPatternInfo {
|
|
19
|
+
type: LazyLoadingPatternType;
|
|
20
|
+
file: string;
|
|
21
|
+
line: number;
|
|
22
|
+
column: number;
|
|
23
|
+
matchedText: string;
|
|
24
|
+
context?: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
export interface LazyLoadingViolationInfo {
|
|
27
|
+
type: LazyLoadingViolationType;
|
|
28
|
+
file: string;
|
|
29
|
+
line: number;
|
|
30
|
+
column: number;
|
|
31
|
+
matchedText: string;
|
|
32
|
+
issue: string;
|
|
33
|
+
suggestedFix?: string | undefined;
|
|
34
|
+
severity: 'high' | 'medium' | 'low';
|
|
35
|
+
}
|
|
36
|
+
export interface LazyLoadingAnalysis {
|
|
37
|
+
patterns: LazyLoadingPatternInfo[];
|
|
38
|
+
violations: LazyLoadingViolationInfo[];
|
|
39
|
+
lazyImageCount: number;
|
|
40
|
+
usesIntersectionObserver: boolean;
|
|
41
|
+
usesVirtualScroll: boolean;
|
|
42
|
+
confidence: number;
|
|
43
|
+
}
|
|
44
|
+
export declare const IMAGE_LAZY_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp];
|
|
45
|
+
export declare const NATIVE_LAZY_PATTERNS: readonly [RegExp, RegExp];
|
|
46
|
+
export declare const INTERSECTION_OBSERVER_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
47
|
+
export declare const VIRTUAL_SCROLL_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
48
|
+
export declare const INFINITE_SCROLL_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
49
|
+
export declare const LAZY_COMPONENT_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp];
|
|
50
|
+
export declare const PLACEHOLDER_LOADING_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp];
|
|
51
|
+
export declare const SKELETON_LOADING_PATTERNS: readonly [RegExp, RegExp, RegExp, RegExp, RegExp];
|
|
52
|
+
export declare const MISSING_LAZY_IMAGE_PATTERNS: readonly [RegExp];
|
|
53
|
+
export declare function shouldExcludeFile(filePath: string): boolean;
|
|
54
|
+
export declare function detectImageLazy(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
55
|
+
export declare function detectNativeLazy(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
56
|
+
export declare function detectIntersectionObserver(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
57
|
+
export declare function detectVirtualScroll(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
58
|
+
export declare function detectInfiniteScroll(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
59
|
+
export declare function detectLazyComponent(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
60
|
+
export declare function detectPlaceholderLoading(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
61
|
+
export declare function detectSkeletonLoading(content: string, filePath: string): LazyLoadingPatternInfo[];
|
|
62
|
+
export declare function detectMissingLazyImageViolations(content: string, filePath: string): LazyLoadingViolationInfo[];
|
|
63
|
+
export declare function analyzeLazyLoading(content: string, filePath: string): LazyLoadingAnalysis;
|
|
64
|
+
export declare class LazyLoadingDetector extends RegexDetector {
|
|
65
|
+
readonly id = "performance/lazy-loading";
|
|
66
|
+
readonly name = "Lazy Loading Detector";
|
|
67
|
+
readonly description = "Detects lazy loading patterns for images and components";
|
|
68
|
+
readonly category: PatternCategory;
|
|
69
|
+
readonly subcategory = "lazy-loading";
|
|
70
|
+
readonly supportedLanguages: Language[];
|
|
71
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
72
|
+
generateQuickFix(_violation: Violation): QuickFix | null;
|
|
73
|
+
}
|
|
74
|
+
export declare function createLazyLoadingDetector(): LazyLoadingDetector;
|
|
75
|
+
//# sourceMappingURL=lazy-loading.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-loading.d.ts","sourceRoot":"","sources":["../../src/performance/lazy-loading.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lazy Loading Detector - Lazy loading pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects lazy loading patterns including:
|
|
5
|
+
* - Image lazy loading
|
|
6
|
+
* - Component lazy loading
|
|
7
|
+
* - Intersection Observer usage
|
|
8
|
+
* - Virtual scrolling
|
|
9
|
+
* - Infinite scroll patterns
|
|
10
|
+
*
|
|
11
|
+
* @requirements 19.2 - Lazy loading patterns
|
|
12
|
+
*/
|
|
13
|
+
import { RegexDetector } from '../base/regex-detector.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// ============================================================================
|
|
17
|
+
export const IMAGE_LAZY_PATTERNS = [
|
|
18
|
+
/loading\s*=\s*['"`]lazy['"`]/g,
|
|
19
|
+
/data-src\s*=/g,
|
|
20
|
+
/lazyload/gi,
|
|
21
|
+
/lazy-load/gi,
|
|
22
|
+
];
|
|
23
|
+
export const NATIVE_LAZY_PATTERNS = [
|
|
24
|
+
/<img[^>]*loading\s*=\s*['"`]lazy['"`]/gi,
|
|
25
|
+
/<iframe[^>]*loading\s*=\s*['"`]lazy['"`]/gi,
|
|
26
|
+
];
|
|
27
|
+
export const INTERSECTION_OBSERVER_PATTERNS = [
|
|
28
|
+
/new\s+IntersectionObserver/g,
|
|
29
|
+
/IntersectionObserver\s*\(/g,
|
|
30
|
+
/useIntersectionObserver/g,
|
|
31
|
+
/useInView/g,
|
|
32
|
+
/react-intersection-observer/g,
|
|
33
|
+
];
|
|
34
|
+
export const VIRTUAL_SCROLL_PATTERNS = [
|
|
35
|
+
/react-window/g,
|
|
36
|
+
/react-virtualized/g,
|
|
37
|
+
/react-virtual/g,
|
|
38
|
+
/VirtualList/g,
|
|
39
|
+
/FixedSizeList/g,
|
|
40
|
+
/VariableSizeList/g,
|
|
41
|
+
/useVirtualizer/g,
|
|
42
|
+
/@tanstack\/react-virtual/g,
|
|
43
|
+
];
|
|
44
|
+
export const INFINITE_SCROLL_PATTERNS = [
|
|
45
|
+
/react-infinite-scroll/g,
|
|
46
|
+
/InfiniteScroll/g,
|
|
47
|
+
/useInfiniteQuery/g,
|
|
48
|
+
/fetchNextPage/g,
|
|
49
|
+
/hasNextPage/g,
|
|
50
|
+
/isFetchingNextPage/g,
|
|
51
|
+
];
|
|
52
|
+
export const LAZY_COMPONENT_PATTERNS = [
|
|
53
|
+
/React\.lazy/g,
|
|
54
|
+
/lazy\s*\(\s*\(\)\s*=>/g,
|
|
55
|
+
/dynamic\s*\(\s*\(\)\s*=>/g,
|
|
56
|
+
/Loadable\s*\(/g,
|
|
57
|
+
];
|
|
58
|
+
export const PLACEHOLDER_LOADING_PATTERNS = [
|
|
59
|
+
/placeholder\s*=/g,
|
|
60
|
+
/blurDataURL/g,
|
|
61
|
+
/placeholderSrc/g,
|
|
62
|
+
/lowQualityPlaceholder/g,
|
|
63
|
+
];
|
|
64
|
+
export const SKELETON_LOADING_PATTERNS = [
|
|
65
|
+
/Skeleton/g,
|
|
66
|
+
/skeleton/g,
|
|
67
|
+
/ContentLoader/g,
|
|
68
|
+
/react-content-loader/g,
|
|
69
|
+
/shimmer/gi,
|
|
70
|
+
];
|
|
71
|
+
export const MISSING_LAZY_IMAGE_PATTERNS = [
|
|
72
|
+
/<img[^>]*src\s*=\s*['"`][^'"`]+['"`][^>]*(?!loading)/gi,
|
|
73
|
+
];
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// Analysis Functions
|
|
76
|
+
// ============================================================================
|
|
77
|
+
export function shouldExcludeFile(filePath) {
|
|
78
|
+
const excludePatterns = [
|
|
79
|
+
/\.test\.[jt]sx?$/,
|
|
80
|
+
/\.spec\.[jt]sx?$/,
|
|
81
|
+
/__tests__\//,
|
|
82
|
+
/node_modules\//,
|
|
83
|
+
/\.min\.[jt]s$/,
|
|
84
|
+
];
|
|
85
|
+
return excludePatterns.some((p) => p.test(filePath));
|
|
86
|
+
}
|
|
87
|
+
function detectPatterns(content, filePath, patterns, type) {
|
|
88
|
+
const results = [];
|
|
89
|
+
const lines = content.split('\n');
|
|
90
|
+
for (let i = 0; i < lines.length; i++) {
|
|
91
|
+
const line = lines[i];
|
|
92
|
+
for (const pattern of patterns) {
|
|
93
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
94
|
+
let match;
|
|
95
|
+
while ((match = regex.exec(line)) !== null) {
|
|
96
|
+
results.push({
|
|
97
|
+
type,
|
|
98
|
+
file: filePath,
|
|
99
|
+
line: i + 1,
|
|
100
|
+
column: match.index + 1,
|
|
101
|
+
matchedText: match[0],
|
|
102
|
+
context: line.trim(),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return results;
|
|
108
|
+
}
|
|
109
|
+
export function detectImageLazy(content, filePath) {
|
|
110
|
+
return detectPatterns(content, filePath, IMAGE_LAZY_PATTERNS, 'image-lazy');
|
|
111
|
+
}
|
|
112
|
+
export function detectNativeLazy(content, filePath) {
|
|
113
|
+
return detectPatterns(content, filePath, NATIVE_LAZY_PATTERNS, 'native-lazy');
|
|
114
|
+
}
|
|
115
|
+
export function detectIntersectionObserver(content, filePath) {
|
|
116
|
+
return detectPatterns(content, filePath, INTERSECTION_OBSERVER_PATTERNS, 'intersection-observer');
|
|
117
|
+
}
|
|
118
|
+
export function detectVirtualScroll(content, filePath) {
|
|
119
|
+
return detectPatterns(content, filePath, VIRTUAL_SCROLL_PATTERNS, 'virtual-scroll');
|
|
120
|
+
}
|
|
121
|
+
export function detectInfiniteScroll(content, filePath) {
|
|
122
|
+
return detectPatterns(content, filePath, INFINITE_SCROLL_PATTERNS, 'infinite-scroll');
|
|
123
|
+
}
|
|
124
|
+
export function detectLazyComponent(content, filePath) {
|
|
125
|
+
return detectPatterns(content, filePath, LAZY_COMPONENT_PATTERNS, 'lazy-component');
|
|
126
|
+
}
|
|
127
|
+
export function detectPlaceholderLoading(content, filePath) {
|
|
128
|
+
return detectPatterns(content, filePath, PLACEHOLDER_LOADING_PATTERNS, 'placeholder-loading');
|
|
129
|
+
}
|
|
130
|
+
export function detectSkeletonLoading(content, filePath) {
|
|
131
|
+
return detectPatterns(content, filePath, SKELETON_LOADING_PATTERNS, 'skeleton-loading');
|
|
132
|
+
}
|
|
133
|
+
export function detectMissingLazyImageViolations(content, filePath) {
|
|
134
|
+
const results = [];
|
|
135
|
+
const lines = content.split('\n');
|
|
136
|
+
for (let i = 0; i < lines.length; i++) {
|
|
137
|
+
const line = lines[i];
|
|
138
|
+
// Check for img tags without loading attribute
|
|
139
|
+
if (/<img[^>]*src\s*=/.test(line) && !/loading\s*=/.test(line)) {
|
|
140
|
+
results.push({
|
|
141
|
+
type: 'missing-lazy-image',
|
|
142
|
+
file: filePath,
|
|
143
|
+
line: i + 1,
|
|
144
|
+
column: 1,
|
|
145
|
+
matchedText: line.trim(),
|
|
146
|
+
issue: 'Image without lazy loading attribute',
|
|
147
|
+
suggestedFix: 'Add loading="lazy" to defer off-screen images',
|
|
148
|
+
severity: 'low',
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return results;
|
|
153
|
+
}
|
|
154
|
+
export function analyzeLazyLoading(content, filePath) {
|
|
155
|
+
if (shouldExcludeFile(filePath)) {
|
|
156
|
+
return {
|
|
157
|
+
patterns: [],
|
|
158
|
+
violations: [],
|
|
159
|
+
lazyImageCount: 0,
|
|
160
|
+
usesIntersectionObserver: false,
|
|
161
|
+
usesVirtualScroll: false,
|
|
162
|
+
confidence: 1.0,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const patterns = [
|
|
166
|
+
...detectImageLazy(content, filePath),
|
|
167
|
+
...detectNativeLazy(content, filePath),
|
|
168
|
+
...detectIntersectionObserver(content, filePath),
|
|
169
|
+
...detectVirtualScroll(content, filePath),
|
|
170
|
+
...detectInfiniteScroll(content, filePath),
|
|
171
|
+
...detectLazyComponent(content, filePath),
|
|
172
|
+
...detectPlaceholderLoading(content, filePath),
|
|
173
|
+
...detectSkeletonLoading(content, filePath),
|
|
174
|
+
];
|
|
175
|
+
const violations = [
|
|
176
|
+
...detectMissingLazyImageViolations(content, filePath),
|
|
177
|
+
];
|
|
178
|
+
const lazyImageCount = patterns.filter((p) => p.type === 'image-lazy' || p.type === 'native-lazy').length;
|
|
179
|
+
const usesIntersectionObserver = patterns.some((p) => p.type === 'intersection-observer');
|
|
180
|
+
const usesVirtualScroll = patterns.some((p) => p.type === 'virtual-scroll');
|
|
181
|
+
let confidence = 0.7;
|
|
182
|
+
if (patterns.length > 0)
|
|
183
|
+
confidence += 0.15;
|
|
184
|
+
if (usesIntersectionObserver)
|
|
185
|
+
confidence += 0.05;
|
|
186
|
+
if (violations.length === 0)
|
|
187
|
+
confidence += 0.05;
|
|
188
|
+
confidence = Math.min(confidence, 0.95);
|
|
189
|
+
return {
|
|
190
|
+
patterns,
|
|
191
|
+
violations,
|
|
192
|
+
lazyImageCount,
|
|
193
|
+
usesIntersectionObserver,
|
|
194
|
+
usesVirtualScroll,
|
|
195
|
+
confidence,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// ============================================================================
|
|
199
|
+
// Detector Class
|
|
200
|
+
// ============================================================================
|
|
201
|
+
export class LazyLoadingDetector extends RegexDetector {
|
|
202
|
+
id = 'performance/lazy-loading';
|
|
203
|
+
name = 'Lazy Loading Detector';
|
|
204
|
+
description = 'Detects lazy loading patterns for images and components';
|
|
205
|
+
category = 'performance';
|
|
206
|
+
subcategory = 'lazy-loading';
|
|
207
|
+
supportedLanguages = ['typescript', 'javascript'];
|
|
208
|
+
async detect(context) {
|
|
209
|
+
if (!this.supportsLanguage(context.language)) {
|
|
210
|
+
return this.createEmptyResult();
|
|
211
|
+
}
|
|
212
|
+
const analysis = analyzeLazyLoading(context.content, context.file);
|
|
213
|
+
if (analysis.patterns.length === 0 && analysis.violations.length === 0) {
|
|
214
|
+
return this.createEmptyResult();
|
|
215
|
+
}
|
|
216
|
+
return this.createResult([], [], analysis.confidence, {
|
|
217
|
+
custom: {
|
|
218
|
+
patterns: analysis.patterns,
|
|
219
|
+
violations: analysis.violations,
|
|
220
|
+
lazyImageCount: analysis.lazyImageCount,
|
|
221
|
+
usesIntersectionObserver: analysis.usesIntersectionObserver,
|
|
222
|
+
usesVirtualScroll: analysis.usesVirtualScroll,
|
|
223
|
+
},
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
generateQuickFix(_violation) {
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export function createLazyLoadingDetector() {
|
|
231
|
+
return new LazyLoadingDetector();
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=lazy-loading.js.map
|