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,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XSS Prevention Detector - Cross-Site Scripting prevention pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects XSS prevention patterns including:
|
|
5
|
+
* - HTML encoding/escaping
|
|
6
|
+
* - Content sanitization (DOMPurify, sanitize-html)
|
|
7
|
+
* - React's built-in XSS protection
|
|
8
|
+
* - CSP nonce usage
|
|
9
|
+
* - Dangerous patterns (innerHTML, dangerouslySetInnerHTML)
|
|
10
|
+
*
|
|
11
|
+
* @requirements 16.3 - XSS prevention patterns
|
|
12
|
+
*/
|
|
13
|
+
import { RegexDetector } from '../base/regex-detector.js';
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Constants
|
|
16
|
+
// ============================================================================
|
|
17
|
+
export const HTML_ESCAPE_PATTERNS = [
|
|
18
|
+
// TypeScript/JavaScript patterns
|
|
19
|
+
/escapeHtml\s*\(/gi,
|
|
20
|
+
/htmlEscape\s*\(/gi,
|
|
21
|
+
/encodeHTML\s*\(/gi,
|
|
22
|
+
/htmlEncode\s*\(/gi,
|
|
23
|
+
/escape\s*\(\s*['"`]html['"`]/gi,
|
|
24
|
+
/he\.encode\s*\(/gi,
|
|
25
|
+
/entities\.encode\s*\(/gi,
|
|
26
|
+
/\.replace\s*\(\s*\/[<>&'"]/gi,
|
|
27
|
+
// Python patterns - html.escape, markupsafe
|
|
28
|
+
/html\.escape\s*\(/gi,
|
|
29
|
+
/markupsafe\.escape\s*\(/gi,
|
|
30
|
+
/Markup\s*\(/gi,
|
|
31
|
+
/escape_html\s*\(/gi,
|
|
32
|
+
/cgi\.escape\s*\(/gi,
|
|
33
|
+
];
|
|
34
|
+
export const DOMPURIFY_PATTERNS = [
|
|
35
|
+
/DOMPurify\.sanitize\s*\(/gi,
|
|
36
|
+
/purify\.sanitize\s*\(/gi,
|
|
37
|
+
/createDOMPurify\s*\(/gi,
|
|
38
|
+
/import.*DOMPurify/gi,
|
|
39
|
+
/require\s*\(\s*['"`]dompurify['"`]\s*\)/gi,
|
|
40
|
+
];
|
|
41
|
+
export const SANITIZE_HTML_PATTERNS = [
|
|
42
|
+
/sanitizeHtml\s*\(/gi,
|
|
43
|
+
/sanitize-html/gi,
|
|
44
|
+
/xss\s*\(/gi,
|
|
45
|
+
/filterXSS\s*\(/gi,
|
|
46
|
+
/import.*sanitize-html/gi,
|
|
47
|
+
/import.*xss/gi,
|
|
48
|
+
];
|
|
49
|
+
export const REACT_ESCAPE_PATTERNS = [
|
|
50
|
+
/React\.createElement\s*\(/gi,
|
|
51
|
+
/jsx\s*\(/gi,
|
|
52
|
+
/\{[^}]+\}/g, // JSX expressions (auto-escaped)
|
|
53
|
+
/createTextNode\s*\(/gi,
|
|
54
|
+
];
|
|
55
|
+
export const CSP_NONCE_PATTERNS = [
|
|
56
|
+
/nonce\s*[=:]\s*['"`][^'"`]+['"`]/gi,
|
|
57
|
+
/nonce-[a-zA-Z0-9+/=]+/gi,
|
|
58
|
+
/script-src[^;]*'nonce-/gi,
|
|
59
|
+
/style-src[^;]*'nonce-/gi,
|
|
60
|
+
];
|
|
61
|
+
export const ENCODE_URI_PATTERNS = [
|
|
62
|
+
/encodeURIComponent\s*\(/gi,
|
|
63
|
+
/encodeURI\s*\(/gi,
|
|
64
|
+
/escape\s*\(/gi,
|
|
65
|
+
/urlEncode\s*\(/gi,
|
|
66
|
+
];
|
|
67
|
+
export const TEXT_CONTENT_PATTERNS = [
|
|
68
|
+
/\.textContent\s*=/gi,
|
|
69
|
+
/\.innerText\s*=/gi,
|
|
70
|
+
/createTextNode\s*\(/gi,
|
|
71
|
+
];
|
|
72
|
+
export const DANGEROUS_INNER_HTML_PATTERNS = [
|
|
73
|
+
/dangerouslySetInnerHTML\s*=\s*\{\s*\{/gi,
|
|
74
|
+
/dangerouslySetInnerHTML:\s*\{/gi,
|
|
75
|
+
];
|
|
76
|
+
export const DOCUMENT_WRITE_PATTERNS = [
|
|
77
|
+
/document\.write\s*\(/gi,
|
|
78
|
+
/document\.writeln\s*\(/gi,
|
|
79
|
+
];
|
|
80
|
+
export const EVAL_USAGE_PATTERNS = [
|
|
81
|
+
// TypeScript/JavaScript patterns
|
|
82
|
+
/\beval\s*\(/gi,
|
|
83
|
+
/new\s+Function\s*\(/gi,
|
|
84
|
+
/setTimeout\s*\(\s*['"`]/gi,
|
|
85
|
+
/setInterval\s*\(\s*['"`]/gi,
|
|
86
|
+
// Python patterns - exec, eval
|
|
87
|
+
/\bexec\s*\(/gi,
|
|
88
|
+
/\beval\s*\(/gi,
|
|
89
|
+
/compile\s*\([^)]*,\s*['"`]\w+['"`]\s*,\s*['"`]exec['"`]/gi,
|
|
90
|
+
];
|
|
91
|
+
export const INNER_HTML_ASSIGNMENT_PATTERNS = [
|
|
92
|
+
/\.innerHTML\s*=/gi,
|
|
93
|
+
/\.innerHTML\s*\+=/gi,
|
|
94
|
+
];
|
|
95
|
+
export const OUTER_HTML_ASSIGNMENT_PATTERNS = [
|
|
96
|
+
/\.outerHTML\s*=/gi,
|
|
97
|
+
];
|
|
98
|
+
export const SCRIPT_INJECTION_PATTERNS = [
|
|
99
|
+
/createElement\s*\(\s*['"`]script['"`]\s*\)/gi,
|
|
100
|
+
/insertAdjacentHTML\s*\(/gi,
|
|
101
|
+
/\.html\s*\(\s*[^)]+\)/gi,
|
|
102
|
+
];
|
|
103
|
+
// ============================================================================
|
|
104
|
+
// Analysis Functions
|
|
105
|
+
// ============================================================================
|
|
106
|
+
export function shouldExcludeFile(filePath) {
|
|
107
|
+
const excludePatterns = [
|
|
108
|
+
/\.test\.[jt]sx?$/,
|
|
109
|
+
/\.spec\.[jt]sx?$/,
|
|
110
|
+
/__tests__\//,
|
|
111
|
+
/\.d\.ts$/,
|
|
112
|
+
/node_modules\//,
|
|
113
|
+
/\.min\.[jt]s$/,
|
|
114
|
+
];
|
|
115
|
+
return excludePatterns.some((p) => p.test(filePath));
|
|
116
|
+
}
|
|
117
|
+
export function detectHTMLEscape(content, filePath) {
|
|
118
|
+
const results = [];
|
|
119
|
+
const lines = content.split('\n');
|
|
120
|
+
for (let i = 0; i < lines.length; i++) {
|
|
121
|
+
const line = lines[i];
|
|
122
|
+
for (const pattern of HTML_ESCAPE_PATTERNS) {
|
|
123
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
124
|
+
let match;
|
|
125
|
+
while ((match = regex.exec(line)) !== null) {
|
|
126
|
+
results.push({
|
|
127
|
+
type: 'html-escape',
|
|
128
|
+
file: filePath,
|
|
129
|
+
line: i + 1,
|
|
130
|
+
column: match.index + 1,
|
|
131
|
+
matchedText: match[0],
|
|
132
|
+
context: line.trim(),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return results;
|
|
138
|
+
}
|
|
139
|
+
export function detectDOMPurifySanitize(content, filePath) {
|
|
140
|
+
const results = [];
|
|
141
|
+
const lines = content.split('\n');
|
|
142
|
+
for (let i = 0; i < lines.length; i++) {
|
|
143
|
+
const line = lines[i];
|
|
144
|
+
for (const pattern of DOMPURIFY_PATTERNS) {
|
|
145
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
146
|
+
let match;
|
|
147
|
+
while ((match = regex.exec(line)) !== null) {
|
|
148
|
+
results.push({
|
|
149
|
+
type: 'dompurify-sanitize',
|
|
150
|
+
file: filePath,
|
|
151
|
+
line: i + 1,
|
|
152
|
+
column: match.index + 1,
|
|
153
|
+
matchedText: match[0],
|
|
154
|
+
library: 'dompurify',
|
|
155
|
+
context: line.trim(),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return results;
|
|
161
|
+
}
|
|
162
|
+
export function detectSanitizeHTML(content, filePath) {
|
|
163
|
+
const results = [];
|
|
164
|
+
const lines = content.split('\n');
|
|
165
|
+
for (let i = 0; i < lines.length; i++) {
|
|
166
|
+
const line = lines[i];
|
|
167
|
+
for (const pattern of SANITIZE_HTML_PATTERNS) {
|
|
168
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
169
|
+
let match;
|
|
170
|
+
while ((match = regex.exec(line)) !== null) {
|
|
171
|
+
results.push({
|
|
172
|
+
type: 'sanitize-html',
|
|
173
|
+
file: filePath,
|
|
174
|
+
line: i + 1,
|
|
175
|
+
column: match.index + 1,
|
|
176
|
+
matchedText: match[0],
|
|
177
|
+
library: 'sanitize-html',
|
|
178
|
+
context: line.trim(),
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return results;
|
|
184
|
+
}
|
|
185
|
+
export function detectCSPNonce(content, filePath) {
|
|
186
|
+
const results = [];
|
|
187
|
+
const lines = content.split('\n');
|
|
188
|
+
for (let i = 0; i < lines.length; i++) {
|
|
189
|
+
const line = lines[i];
|
|
190
|
+
for (const pattern of CSP_NONCE_PATTERNS) {
|
|
191
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
192
|
+
let match;
|
|
193
|
+
while ((match = regex.exec(line)) !== null) {
|
|
194
|
+
results.push({
|
|
195
|
+
type: 'csp-nonce',
|
|
196
|
+
file: filePath,
|
|
197
|
+
line: i + 1,
|
|
198
|
+
column: match.index + 1,
|
|
199
|
+
matchedText: match[0],
|
|
200
|
+
context: line.trim(),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return results;
|
|
206
|
+
}
|
|
207
|
+
export function detectEncodeURI(content, filePath) {
|
|
208
|
+
const results = [];
|
|
209
|
+
const lines = content.split('\n');
|
|
210
|
+
for (let i = 0; i < lines.length; i++) {
|
|
211
|
+
const line = lines[i];
|
|
212
|
+
for (const pattern of ENCODE_URI_PATTERNS) {
|
|
213
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
214
|
+
let match;
|
|
215
|
+
while ((match = regex.exec(line)) !== null) {
|
|
216
|
+
results.push({
|
|
217
|
+
type: 'encode-uri',
|
|
218
|
+
file: filePath,
|
|
219
|
+
line: i + 1,
|
|
220
|
+
column: match.index + 1,
|
|
221
|
+
matchedText: match[0],
|
|
222
|
+
context: line.trim(),
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return results;
|
|
228
|
+
}
|
|
229
|
+
export function detectTextContent(content, filePath) {
|
|
230
|
+
const results = [];
|
|
231
|
+
const lines = content.split('\n');
|
|
232
|
+
for (let i = 0; i < lines.length; i++) {
|
|
233
|
+
const line = lines[i];
|
|
234
|
+
for (const pattern of TEXT_CONTENT_PATTERNS) {
|
|
235
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
236
|
+
let match;
|
|
237
|
+
while ((match = regex.exec(line)) !== null) {
|
|
238
|
+
results.push({
|
|
239
|
+
type: 'text-content',
|
|
240
|
+
file: filePath,
|
|
241
|
+
line: i + 1,
|
|
242
|
+
column: match.index + 1,
|
|
243
|
+
matchedText: match[0],
|
|
244
|
+
context: line.trim(),
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return results;
|
|
250
|
+
}
|
|
251
|
+
export function detectDangerousInnerHTMLViolations(content, filePath) {
|
|
252
|
+
const results = [];
|
|
253
|
+
const lines = content.split('\n');
|
|
254
|
+
for (let i = 0; i < lines.length; i++) {
|
|
255
|
+
const line = lines[i];
|
|
256
|
+
for (const pattern of DANGEROUS_INNER_HTML_PATTERNS) {
|
|
257
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
258
|
+
let match;
|
|
259
|
+
while ((match = regex.exec(line)) !== null) {
|
|
260
|
+
results.push({
|
|
261
|
+
type: 'dangerous-inner-html',
|
|
262
|
+
file: filePath,
|
|
263
|
+
line: i + 1,
|
|
264
|
+
column: match.index + 1,
|
|
265
|
+
matchedText: match[0],
|
|
266
|
+
issue: 'dangerouslySetInnerHTML usage - ensure content is sanitized',
|
|
267
|
+
suggestedFix: 'Sanitize content with DOMPurify before using dangerouslySetInnerHTML',
|
|
268
|
+
severity: 'high',
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return results;
|
|
274
|
+
}
|
|
275
|
+
export function detectDocumentWriteViolations(content, filePath) {
|
|
276
|
+
const results = [];
|
|
277
|
+
const lines = content.split('\n');
|
|
278
|
+
for (let i = 0; i < lines.length; i++) {
|
|
279
|
+
const line = lines[i];
|
|
280
|
+
for (const pattern of DOCUMENT_WRITE_PATTERNS) {
|
|
281
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
282
|
+
let match;
|
|
283
|
+
while ((match = regex.exec(line)) !== null) {
|
|
284
|
+
results.push({
|
|
285
|
+
type: 'document-write',
|
|
286
|
+
file: filePath,
|
|
287
|
+
line: i + 1,
|
|
288
|
+
column: match.index + 1,
|
|
289
|
+
matchedText: match[0],
|
|
290
|
+
issue: 'document.write usage - potential XSS vulnerability',
|
|
291
|
+
suggestedFix: 'Use DOM manipulation methods instead of document.write',
|
|
292
|
+
severity: 'high',
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return results;
|
|
298
|
+
}
|
|
299
|
+
export function detectEvalViolations(content, filePath) {
|
|
300
|
+
const results = [];
|
|
301
|
+
const lines = content.split('\n');
|
|
302
|
+
for (let i = 0; i < lines.length; i++) {
|
|
303
|
+
const line = lines[i];
|
|
304
|
+
for (const pattern of EVAL_USAGE_PATTERNS) {
|
|
305
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
306
|
+
let match;
|
|
307
|
+
while ((match = regex.exec(line)) !== null) {
|
|
308
|
+
results.push({
|
|
309
|
+
type: 'eval-usage',
|
|
310
|
+
file: filePath,
|
|
311
|
+
line: i + 1,
|
|
312
|
+
column: match.index + 1,
|
|
313
|
+
matchedText: match[0],
|
|
314
|
+
issue: 'eval or Function constructor usage - potential code injection',
|
|
315
|
+
suggestedFix: 'Avoid eval and use safer alternatives like JSON.parse',
|
|
316
|
+
severity: 'high',
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return results;
|
|
322
|
+
}
|
|
323
|
+
export function detectInnerHTMLViolations(content, filePath) {
|
|
324
|
+
const results = [];
|
|
325
|
+
const lines = content.split('\n');
|
|
326
|
+
for (let i = 0; i < lines.length; i++) {
|
|
327
|
+
const line = lines[i];
|
|
328
|
+
for (const pattern of INNER_HTML_ASSIGNMENT_PATTERNS) {
|
|
329
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
330
|
+
let match;
|
|
331
|
+
while ((match = regex.exec(line)) !== null) {
|
|
332
|
+
results.push({
|
|
333
|
+
type: 'inner-html-assignment',
|
|
334
|
+
file: filePath,
|
|
335
|
+
line: i + 1,
|
|
336
|
+
column: match.index + 1,
|
|
337
|
+
matchedText: match[0],
|
|
338
|
+
issue: 'innerHTML assignment - potential XSS if content is not sanitized',
|
|
339
|
+
suggestedFix: 'Use textContent for text or sanitize HTML with DOMPurify',
|
|
340
|
+
severity: 'medium',
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return results;
|
|
346
|
+
}
|
|
347
|
+
export function analyzeXSSPrevention(content, filePath) {
|
|
348
|
+
if (shouldExcludeFile(filePath)) {
|
|
349
|
+
return {
|
|
350
|
+
patterns: [],
|
|
351
|
+
violations: [],
|
|
352
|
+
hasXSSPrevention: false,
|
|
353
|
+
hasViolations: false,
|
|
354
|
+
confidence: 1.0,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
const patterns = [
|
|
358
|
+
...detectHTMLEscape(content, filePath),
|
|
359
|
+
...detectDOMPurifySanitize(content, filePath),
|
|
360
|
+
...detectSanitizeHTML(content, filePath),
|
|
361
|
+
...detectCSPNonce(content, filePath),
|
|
362
|
+
...detectEncodeURI(content, filePath),
|
|
363
|
+
...detectTextContent(content, filePath),
|
|
364
|
+
];
|
|
365
|
+
const violations = [
|
|
366
|
+
...detectDangerousInnerHTMLViolations(content, filePath),
|
|
367
|
+
...detectDocumentWriteViolations(content, filePath),
|
|
368
|
+
...detectEvalViolations(content, filePath),
|
|
369
|
+
...detectInnerHTMLViolations(content, filePath),
|
|
370
|
+
];
|
|
371
|
+
const hasXSSPrevention = patterns.length > 0;
|
|
372
|
+
const hasViolations = violations.length > 0;
|
|
373
|
+
const confidence = hasViolations ? 0.7 : hasXSSPrevention ? 0.95 : 0.8;
|
|
374
|
+
return {
|
|
375
|
+
patterns,
|
|
376
|
+
violations,
|
|
377
|
+
hasXSSPrevention,
|
|
378
|
+
hasViolations,
|
|
379
|
+
confidence,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
// ============================================================================
|
|
383
|
+
// Detector Class
|
|
384
|
+
// ============================================================================
|
|
385
|
+
export class XSSPreventionDetector extends RegexDetector {
|
|
386
|
+
id = 'security/xss-prevention';
|
|
387
|
+
name = 'XSS Prevention Detector';
|
|
388
|
+
description = 'Detects XSS prevention patterns and identifies potential vulnerabilities';
|
|
389
|
+
category = 'security';
|
|
390
|
+
subcategory = 'xss-prevention';
|
|
391
|
+
supportedLanguages = ['typescript', 'javascript', 'python'];
|
|
392
|
+
async detect(context) {
|
|
393
|
+
if (!this.supportsLanguage(context.language)) {
|
|
394
|
+
return this.createEmptyResult();
|
|
395
|
+
}
|
|
396
|
+
const analysis = analyzeXSSPrevention(context.content, context.file);
|
|
397
|
+
if (analysis.patterns.length === 0 && analysis.violations.length === 0) {
|
|
398
|
+
return this.createEmptyResult();
|
|
399
|
+
}
|
|
400
|
+
return this.createResult([], [], analysis.confidence, {
|
|
401
|
+
custom: {
|
|
402
|
+
patterns: analysis.patterns,
|
|
403
|
+
violations: analysis.violations,
|
|
404
|
+
hasXSSPrevention: analysis.hasXSSPrevention,
|
|
405
|
+
hasViolations: analysis.hasViolations,
|
|
406
|
+
},
|
|
407
|
+
});
|
|
408
|
+
}
|
|
409
|
+
generateQuickFix(_violation) {
|
|
410
|
+
return null;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
export function createXSSPreventionDetector() {
|
|
414
|
+
return new XSSPreventionDetector();
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=xss-prevention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xss-prevention.js","sourceRoot":"","sources":["../../src/security/xss-prevention.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel Exports Detector - Index file pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects index.ts/index.js usage patterns and export patterns.
|
|
5
|
+
* Identifies barrel files that re-export from other modules and
|
|
6
|
+
* analyzes consistency of barrel file usage across the project.
|
|
7
|
+
*
|
|
8
|
+
* @requirements 7.4 - THE Structural_Detector SHALL detect barrel/index file usage patterns
|
|
9
|
+
*/
|
|
10
|
+
import type { Violation, QuickFix, Language } from 'driftdetect-core';
|
|
11
|
+
import { StructuralDetector, type DetectionContext, type DetectionResult } from '../base/index.js';
|
|
12
|
+
/**
|
|
13
|
+
* Types of barrel file patterns
|
|
14
|
+
*/
|
|
15
|
+
export type BarrelPattern = 'consistent' | 'inconsistent' | 'none' | 'unknown';
|
|
16
|
+
/**
|
|
17
|
+
* Types of export patterns found in barrel files
|
|
18
|
+
*/
|
|
19
|
+
export type ExportType = 'named-export' | 'namespace-export' | 'default-reexport' | 'named-reexport' | 'direct-export' | 'default-export';
|
|
20
|
+
/**
|
|
21
|
+
* Common barrel file names
|
|
22
|
+
*/
|
|
23
|
+
export declare const BARREL_FILE_NAMES: readonly ["index.ts", "index.tsx", "index.js", "index.jsx", "index.mjs", "index.cjs"];
|
|
24
|
+
/**
|
|
25
|
+
* Directories that typically should have barrel files
|
|
26
|
+
*/
|
|
27
|
+
export declare const BARREL_EXPECTED_DIRECTORIES: readonly ["components", "hooks", "utils", "helpers", "services", "lib", "types", "models", "features", "modules", "pages", "api", "store", "contexts", "providers"];
|
|
28
|
+
/**
|
|
29
|
+
* Information about a barrel file
|
|
30
|
+
*/
|
|
31
|
+
export interface BarrelFileInfo {
|
|
32
|
+
/** File path */
|
|
33
|
+
path: string;
|
|
34
|
+
/** Directory containing the barrel file */
|
|
35
|
+
directory: string;
|
|
36
|
+
/** Number of exports in the barrel file */
|
|
37
|
+
exportCount: number;
|
|
38
|
+
/** Types of exports found */
|
|
39
|
+
exportTypes: ExportType[];
|
|
40
|
+
/** Files being re-exported */
|
|
41
|
+
reexportedFiles: string[];
|
|
42
|
+
/** Whether this is a valid barrel file (has re-exports) */
|
|
43
|
+
isValidBarrel: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Information about a directory's barrel status
|
|
47
|
+
*/
|
|
48
|
+
export interface DirectoryBarrelInfo {
|
|
49
|
+
/** Directory path */
|
|
50
|
+
directory: string;
|
|
51
|
+
/** Whether the directory has a barrel file */
|
|
52
|
+
hasBarrel: boolean;
|
|
53
|
+
/** The barrel file path (if exists) */
|
|
54
|
+
barrelFile: string | null;
|
|
55
|
+
/** Number of sibling files in the directory */
|
|
56
|
+
siblingFileCount: number;
|
|
57
|
+
/** Whether this directory should have a barrel file */
|
|
58
|
+
shouldHaveBarrel: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Analysis of barrel file patterns in a project
|
|
62
|
+
*/
|
|
63
|
+
export interface BarrelAnalysis {
|
|
64
|
+
/** Detected barrel pattern */
|
|
65
|
+
pattern: BarrelPattern;
|
|
66
|
+
/** Confidence in the detection (0-1) */
|
|
67
|
+
confidence: number;
|
|
68
|
+
/** All barrel files found */
|
|
69
|
+
barrelFiles: BarrelFileInfo[];
|
|
70
|
+
/** Directories with barrel files */
|
|
71
|
+
directoriesWithBarrels: DirectoryBarrelInfo[];
|
|
72
|
+
/** Directories missing barrel files (that should have them) */
|
|
73
|
+
directoriesMissingBarrels: DirectoryBarrelInfo[];
|
|
74
|
+
/** Total directories analyzed */
|
|
75
|
+
totalDirectories: number;
|
|
76
|
+
/** Percentage of directories with barrel files */
|
|
77
|
+
barrelCoverage: number;
|
|
78
|
+
/** Dominant export style */
|
|
79
|
+
dominantExportStyle: ExportType | null;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Export pattern found in a file
|
|
83
|
+
*/
|
|
84
|
+
export interface ExportPattern {
|
|
85
|
+
/** Type of export */
|
|
86
|
+
type: ExportType;
|
|
87
|
+
/** The exported name(s) */
|
|
88
|
+
names: string[];
|
|
89
|
+
/** Source module (for re-exports) */
|
|
90
|
+
source: string | null;
|
|
91
|
+
/** Line number where the export is found */
|
|
92
|
+
line: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if a file is a barrel/index file
|
|
96
|
+
*/
|
|
97
|
+
export declare function isBarrelFile(filePath: string): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Get the directory of a file
|
|
100
|
+
*/
|
|
101
|
+
export declare function getFileDirectory(filePath: string): string;
|
|
102
|
+
/**
|
|
103
|
+
* Get the file name from a path
|
|
104
|
+
*/
|
|
105
|
+
export declare function getFileName(filePath: string): string;
|
|
106
|
+
/**
|
|
107
|
+
* Check if a directory name suggests it should have a barrel file
|
|
108
|
+
*/
|
|
109
|
+
export declare function shouldDirectoryHaveBarrel(directoryPath: string): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Parse export patterns from file content
|
|
112
|
+
*/
|
|
113
|
+
export declare function parseExportPatterns(content: string): ExportPattern[];
|
|
114
|
+
/**
|
|
115
|
+
* Analyze a barrel file's content
|
|
116
|
+
*/
|
|
117
|
+
export declare function analyzeBarrelFile(filePath: string, content: string): BarrelFileInfo;
|
|
118
|
+
/**
|
|
119
|
+
* Extract unique directories from file paths
|
|
120
|
+
*/
|
|
121
|
+
export declare function extractDirectories(files: string[]): Map<string, string[]>;
|
|
122
|
+
/**
|
|
123
|
+
* Analyze barrel file patterns in a project
|
|
124
|
+
*/
|
|
125
|
+
export declare function analyzeBarrelPatterns(files: string[], fileContents?: Map<string, string>): BarrelAnalysis;
|
|
126
|
+
/**
|
|
127
|
+
* Check if a directory should have a barrel file based on project patterns
|
|
128
|
+
*/
|
|
129
|
+
export declare function checkDirectoryNeedsBarrel(directory: string, files: string[], analysis: BarrelAnalysis): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Detector for barrel/index file patterns
|
|
132
|
+
*
|
|
133
|
+
* Identifies barrel files (index.ts/index.js) that re-export from other modules
|
|
134
|
+
* and analyzes consistency of barrel file usage across the project.
|
|
135
|
+
*
|
|
136
|
+
* @requirements 7.4 - THE Structural_Detector SHALL detect barrel/index file usage patterns
|
|
137
|
+
*/
|
|
138
|
+
export declare class BarrelExportsDetector extends StructuralDetector {
|
|
139
|
+
readonly id = "structural/barrel-exports";
|
|
140
|
+
readonly category: "structural";
|
|
141
|
+
readonly subcategory = "barrel-exports";
|
|
142
|
+
readonly name = "Barrel Exports Detector";
|
|
143
|
+
readonly description = "Detects barrel/index file usage patterns and export consistency";
|
|
144
|
+
readonly supportedLanguages: Language[];
|
|
145
|
+
/**
|
|
146
|
+
* Detect barrel file patterns in the project
|
|
147
|
+
*/
|
|
148
|
+
detect(context: DetectionContext): Promise<DetectionResult>;
|
|
149
|
+
/**
|
|
150
|
+
* Generate a quick fix for barrel export violations
|
|
151
|
+
*/
|
|
152
|
+
generateQuickFix(violation: Violation): QuickFix | null;
|
|
153
|
+
/**
|
|
154
|
+
* Create a pattern match for barrel file usage
|
|
155
|
+
*/
|
|
156
|
+
private createBarrelPattern;
|
|
157
|
+
/**
|
|
158
|
+
* Create a pattern match for export style
|
|
159
|
+
*/
|
|
160
|
+
private createExportStylePattern;
|
|
161
|
+
/**
|
|
162
|
+
* Create a violation for an empty barrel file
|
|
163
|
+
*/
|
|
164
|
+
private createEmptyBarrelViolation;
|
|
165
|
+
/**
|
|
166
|
+
* Check for inconsistent export style in a barrel file
|
|
167
|
+
*/
|
|
168
|
+
private checkExportStyleConsistency;
|
|
169
|
+
/**
|
|
170
|
+
* Check if the current file's directory is missing a barrel file
|
|
171
|
+
*/
|
|
172
|
+
private checkMissingBarrel;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Create a new BarrelExportsDetector instance
|
|
176
|
+
*/
|
|
177
|
+
export declare function createBarrelExportsDetector(): BarrelExportsDetector;
|
|
178
|
+
//# sourceMappingURL=barrel-exports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"barrel-exports.d.ts","sourceRoot":"","sources":["../../src/structural/barrel-exports.ts"],"names":[],"mappings":"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"}
|