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,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Handling Detector - Token pattern detection
|
|
3
|
+
*
|
|
4
|
+
* Detects token handling patterns including JWT storage, refresh tokens,
|
|
5
|
+
* token validation, and secure token practices.
|
|
6
|
+
*
|
|
7
|
+
* Flags violations: Insecure token storage, missing refresh logic, exposed tokens.
|
|
8
|
+
*
|
|
9
|
+
* @requirements 11.2 - Token handling patterns
|
|
10
|
+
*/
|
|
11
|
+
import { RegexDetector } from '../base/index.js';
|
|
12
|
+
export const TOKEN_STORAGE_PATTERNS = [
|
|
13
|
+
/localStorage\.setItem\s*\(\s*['"`](?:token|jwt|access_token|auth)/gi,
|
|
14
|
+
/sessionStorage\.setItem\s*\(\s*['"`](?:token|jwt|access_token|auth)/gi,
|
|
15
|
+
/document\.cookie\s*=.*(?:token|jwt|access)/gi,
|
|
16
|
+
/setCookie\s*\([^)]*(?:token|jwt|access)/gi,
|
|
17
|
+
];
|
|
18
|
+
export const SECURE_COOKIE_PATTERNS = [
|
|
19
|
+
/httpOnly\s*:\s*true/gi,
|
|
20
|
+
/secure\s*:\s*true/gi,
|
|
21
|
+
/sameSite\s*:\s*['"`](?:strict|lax)['"`]/gi,
|
|
22
|
+
];
|
|
23
|
+
export const REFRESH_TOKEN_PATTERNS = [
|
|
24
|
+
/refresh[_-]?token/gi,
|
|
25
|
+
/refreshToken/gi,
|
|
26
|
+
/\/api\/(?:auth\/)?refresh/gi,
|
|
27
|
+
/tokenRefresh/gi,
|
|
28
|
+
/rotateToken/gi,
|
|
29
|
+
];
|
|
30
|
+
export const TOKEN_VALIDATION_PATTERNS = [
|
|
31
|
+
/jwt\.verify\s*\(/gi,
|
|
32
|
+
/verifyToken\s*\(/gi,
|
|
33
|
+
/validateToken\s*\(/gi,
|
|
34
|
+
/isTokenValid/gi,
|
|
35
|
+
/checkToken/gi,
|
|
36
|
+
/decodeToken\s*\(/gi,
|
|
37
|
+
];
|
|
38
|
+
export const TOKEN_EXTRACTION_PATTERNS = [
|
|
39
|
+
/(?:req|request)\.headers\s*\[\s*['"`]authorization['"`]\s*\]/gi,
|
|
40
|
+
/Bearer\s+/gi,
|
|
41
|
+
/getToken\s*\(/gi,
|
|
42
|
+
/extractToken/gi,
|
|
43
|
+
/parseToken/gi,
|
|
44
|
+
];
|
|
45
|
+
export const INSECURE_STORAGE_PATTERNS = [
|
|
46
|
+
/localStorage\.setItem\s*\(\s*['"`](?:token|jwt|access_token)['"`]/gi,
|
|
47
|
+
];
|
|
48
|
+
export const TOKEN_IN_URL_PATTERNS = [
|
|
49
|
+
/\?.*token=/gi,
|
|
50
|
+
/&token=/gi,
|
|
51
|
+
/url\s*[+=].*token/gi,
|
|
52
|
+
];
|
|
53
|
+
export const TOKEN_LOGGED_PATTERNS = [
|
|
54
|
+
/console\.log\s*\([^)]*token/gi,
|
|
55
|
+
/logger\.\w+\s*\([^)]*token/gi,
|
|
56
|
+
/print\s*\([^)]*token/gi,
|
|
57
|
+
];
|
|
58
|
+
export const EXCLUDED_FILE_PATTERNS = [/\.test\.[jt]sx?$/, /\.spec\.[jt]sx?$/, /node_modules\//, /\.d\.ts$/];
|
|
59
|
+
export function shouldExcludeFile(filePath) {
|
|
60
|
+
return EXCLUDED_FILE_PATTERNS.some(p => p.test(filePath));
|
|
61
|
+
}
|
|
62
|
+
function isInsideComment(content, index) {
|
|
63
|
+
const before = content.slice(0, index);
|
|
64
|
+
const lastNewline = before.lastIndexOf('\n');
|
|
65
|
+
const line = before.slice(lastNewline + 1);
|
|
66
|
+
if (line.includes('//') && index - lastNewline - 1 > line.indexOf('//'))
|
|
67
|
+
return true;
|
|
68
|
+
return before.lastIndexOf('/*') > before.lastIndexOf('*/');
|
|
69
|
+
}
|
|
70
|
+
function getPosition(content, index) {
|
|
71
|
+
const before = content.slice(0, index);
|
|
72
|
+
return { line: before.split('\n').length, column: index - before.lastIndexOf('\n') };
|
|
73
|
+
}
|
|
74
|
+
function detectPatterns(content, file, patterns, type) {
|
|
75
|
+
const results = [];
|
|
76
|
+
const lines = content.split('\n');
|
|
77
|
+
for (const pattern of patterns) {
|
|
78
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
79
|
+
let match;
|
|
80
|
+
while ((match = regex.exec(content)) !== null) {
|
|
81
|
+
if (isInsideComment(content, match.index))
|
|
82
|
+
continue;
|
|
83
|
+
const { line, column } = getPosition(content, match.index);
|
|
84
|
+
results.push({ type, file, line, column, matchedText: match[0], context: lines[line - 1] || '' });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
function detectViolations(content, file, patterns, type, issue, fix) {
|
|
90
|
+
const violations = [];
|
|
91
|
+
const lines = content.split('\n');
|
|
92
|
+
for (const pattern of patterns) {
|
|
93
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
94
|
+
let match;
|
|
95
|
+
while ((match = regex.exec(content)) !== null) {
|
|
96
|
+
if (isInsideComment(content, match.index))
|
|
97
|
+
continue;
|
|
98
|
+
const { line, column } = getPosition(content, match.index);
|
|
99
|
+
violations.push({
|
|
100
|
+
type, file, line, column,
|
|
101
|
+
endLine: line, endColumn: column + match[0].length,
|
|
102
|
+
value: match[0], issue, suggestedFix: fix,
|
|
103
|
+
lineContent: lines[line - 1] || '',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return violations;
|
|
108
|
+
}
|
|
109
|
+
export function analyzeTokenHandling(content, file) {
|
|
110
|
+
if (shouldExcludeFile(file)) {
|
|
111
|
+
return { patterns: [], violations: [], usesSecureStorage: false, hasRefreshLogic: false };
|
|
112
|
+
}
|
|
113
|
+
const patterns = [
|
|
114
|
+
...detectPatterns(content, file, TOKEN_STORAGE_PATTERNS, 'jwt-storage'),
|
|
115
|
+
...detectPatterns(content, file, REFRESH_TOKEN_PATTERNS, 'refresh-token'),
|
|
116
|
+
...detectPatterns(content, file, TOKEN_VALIDATION_PATTERNS, 'token-validation'),
|
|
117
|
+
...detectPatterns(content, file, TOKEN_EXTRACTION_PATTERNS, 'token-extraction'),
|
|
118
|
+
...detectPatterns(content, file, SECURE_COOKIE_PATTERNS, 'secure-cookie'),
|
|
119
|
+
];
|
|
120
|
+
const violations = [
|
|
121
|
+
...detectViolations(content, file, INSECURE_STORAGE_PATTERNS, 'insecure-storage', 'Token stored in localStorage is vulnerable to XSS', 'Use httpOnly cookies instead'),
|
|
122
|
+
...detectViolations(content, file, TOKEN_IN_URL_PATTERNS, 'token-in-url', 'Token in URL can be leaked via referrer or logs', 'Pass tokens in headers instead'),
|
|
123
|
+
...detectViolations(content, file, TOKEN_LOGGED_PATTERNS, 'token-logged', 'Token being logged may expose sensitive data', 'Remove token from logs'),
|
|
124
|
+
];
|
|
125
|
+
const usesSecureStorage = patterns.some(p => p.type === 'secure-cookie');
|
|
126
|
+
const hasRefreshLogic = patterns.some(p => p.type === 'refresh-token');
|
|
127
|
+
return { patterns, violations, usesSecureStorage, hasRefreshLogic };
|
|
128
|
+
}
|
|
129
|
+
export class TokenHandlingDetector extends RegexDetector {
|
|
130
|
+
id = 'auth/token-handling';
|
|
131
|
+
name = 'Token Handling Detector';
|
|
132
|
+
description = 'Detects token handling patterns and security issues';
|
|
133
|
+
category = 'auth';
|
|
134
|
+
subcategory = 'tokens';
|
|
135
|
+
supportedLanguages = ['typescript', 'javascript', 'python'];
|
|
136
|
+
async detect(context) {
|
|
137
|
+
const { content, file } = context;
|
|
138
|
+
if (shouldExcludeFile(file))
|
|
139
|
+
return this.createEmptyResult();
|
|
140
|
+
const analysis = analyzeTokenHandling(content, file);
|
|
141
|
+
const confidence = analysis.usesSecureStorage ? 0.9 : 0.75;
|
|
142
|
+
return this.createResult([], [], confidence);
|
|
143
|
+
}
|
|
144
|
+
generateQuickFix() {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
export function createTokenHandlingDetector() {
|
|
149
|
+
return new TokenHandlingDetector();
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=token-handling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-handling.js","sourceRoot":"","sources":["../../src/auth/token-handling.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST Detector - AST-based detection base class
|
|
3
|
+
*
|
|
4
|
+
* Provides Tree-sitter query helpers and utilities for AST-based pattern detection.
|
|
5
|
+
* Extends BaseDetector with specialized methods for traversing and querying ASTs.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 6.4 - THE Detector_System SHALL support detection methods: ast, regex, semantic, structural, and custom
|
|
8
|
+
*/
|
|
9
|
+
import type { AST, ASTNode } from 'driftdetect-core';
|
|
10
|
+
import { BaseDetector } from './base-detector.js';
|
|
11
|
+
/**
|
|
12
|
+
* Pattern definition for AST matching
|
|
13
|
+
*
|
|
14
|
+
* Defines criteria for matching AST nodes during detection.
|
|
15
|
+
*/
|
|
16
|
+
export interface ASTPattern {
|
|
17
|
+
/** Node type to match (e.g., 'FunctionDeclaration', 'ClassDeclaration') */
|
|
18
|
+
type?: string;
|
|
19
|
+
/** Text content to match (exact string or regex) */
|
|
20
|
+
text?: string | RegExp;
|
|
21
|
+
/** Whether text matching should be exact */
|
|
22
|
+
exactText?: boolean;
|
|
23
|
+
/** Child patterns to match */
|
|
24
|
+
children?: ASTPattern[];
|
|
25
|
+
/** Minimum number of children required */
|
|
26
|
+
minChildren?: number;
|
|
27
|
+
/** Maximum number of children allowed */
|
|
28
|
+
maxChildren?: number;
|
|
29
|
+
/** Custom predicate for additional matching logic */
|
|
30
|
+
predicate?: (node: ASTNode) => boolean;
|
|
31
|
+
/** Whether to match any descendant (not just direct children) */
|
|
32
|
+
matchDescendants?: boolean;
|
|
33
|
+
/** Capture name for extracting matched nodes */
|
|
34
|
+
capture?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Result of an AST pattern match
|
|
38
|
+
*/
|
|
39
|
+
export interface ASTMatchResult {
|
|
40
|
+
/** The matched node */
|
|
41
|
+
node: ASTNode;
|
|
42
|
+
/** Confidence score (0-1) */
|
|
43
|
+
confidence: number;
|
|
44
|
+
/** Captured nodes by name */
|
|
45
|
+
captures: Map<string, ASTNode>;
|
|
46
|
+
/** Start position in source */
|
|
47
|
+
startPosition: {
|
|
48
|
+
row: number;
|
|
49
|
+
column: number;
|
|
50
|
+
};
|
|
51
|
+
/** End position in source */
|
|
52
|
+
endPosition: {
|
|
53
|
+
row: number;
|
|
54
|
+
column: number;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Options for AST traversal
|
|
59
|
+
*/
|
|
60
|
+
export interface TraversalOptions {
|
|
61
|
+
/** Maximum depth to traverse (undefined = unlimited) */
|
|
62
|
+
maxDepth?: number;
|
|
63
|
+
/** Node types to skip during traversal */
|
|
64
|
+
skipTypes?: string[];
|
|
65
|
+
/** Whether to include the root node in traversal */
|
|
66
|
+
includeRoot?: boolean;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Visitor function for AST traversal
|
|
70
|
+
*
|
|
71
|
+
* @param node - Current node being visited
|
|
72
|
+
* @param parent - Parent node (null for root)
|
|
73
|
+
* @param depth - Current depth in the tree
|
|
74
|
+
* @returns false to stop traversal of subtree, undefined to continue
|
|
75
|
+
*/
|
|
76
|
+
export type ASTVisitor = (node: ASTNode, parent: ASTNode | null, depth: number) => boolean | void;
|
|
77
|
+
/**
|
|
78
|
+
* Abstract base class for AST-based detectors
|
|
79
|
+
*
|
|
80
|
+
* Provides Tree-sitter query helpers and utilities for pattern detection
|
|
81
|
+
* that operates on parsed AST structures.
|
|
82
|
+
*
|
|
83
|
+
* @requirements 6.4 - THE Detector_System SHALL support detection methods: ast
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* class FunctionNamingDetector extends ASTDetector {
|
|
88
|
+
* readonly id = 'structural/function-naming';
|
|
89
|
+
* readonly category = 'structural';
|
|
90
|
+
* readonly subcategory = 'naming-conventions';
|
|
91
|
+
* readonly name = 'Function Naming Detector';
|
|
92
|
+
* readonly description = 'Detects function naming patterns';
|
|
93
|
+
* readonly supportedLanguages = ['typescript', 'javascript'];
|
|
94
|
+
*
|
|
95
|
+
* async detect(context: DetectionContext): Promise<DetectionResult> {
|
|
96
|
+
* if (!context.ast) {
|
|
97
|
+
* return this.createEmptyResult();
|
|
98
|
+
* }
|
|
99
|
+
*
|
|
100
|
+
* const functions = this.findNodes(context.ast, 'function_declaration');
|
|
101
|
+
* // Analyze function naming patterns...
|
|
102
|
+
* }
|
|
103
|
+
*
|
|
104
|
+
* generateQuickFix(violation: Violation): QuickFix | null {
|
|
105
|
+
* return null;
|
|
106
|
+
* }
|
|
107
|
+
* }
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export declare abstract class ASTDetector extends BaseDetector {
|
|
111
|
+
/**
|
|
112
|
+
* Detection method is always 'ast' for AST-based detectors
|
|
113
|
+
*
|
|
114
|
+
* @requirements 6.4 - Detector declares detection method as 'ast'
|
|
115
|
+
*/
|
|
116
|
+
readonly detectionMethod: "ast";
|
|
117
|
+
/**
|
|
118
|
+
* Find all nodes of a specific type in the AST
|
|
119
|
+
*
|
|
120
|
+
* Traverses the entire AST and returns all nodes matching the specified type.
|
|
121
|
+
*
|
|
122
|
+
* @param ast - The AST to search
|
|
123
|
+
* @param nodeType - The type of node to find (e.g., 'function_declaration', 'class_declaration')
|
|
124
|
+
* @returns Array of matching nodes
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* ```typescript
|
|
128
|
+
* const functions = this.findNodes(ast, 'function_declaration');
|
|
129
|
+
* const classes = this.findNodes(ast, 'class_declaration');
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
protected findNodes(ast: AST, nodeType: string): ASTNode[];
|
|
133
|
+
/**
|
|
134
|
+
* Find all nodes matching multiple types
|
|
135
|
+
*
|
|
136
|
+
* @param ast - The AST to search
|
|
137
|
+
* @param nodeTypes - Array of node types to find
|
|
138
|
+
* @returns Array of matching nodes
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```typescript
|
|
142
|
+
* const declarations = this.findNodesByTypes(ast, ['function_declaration', 'arrow_function']);
|
|
143
|
+
* ```
|
|
144
|
+
*/
|
|
145
|
+
protected findNodesByTypes(ast: AST, nodeTypes: string[]): ASTNode[];
|
|
146
|
+
/**
|
|
147
|
+
* Find the first node of a specific type
|
|
148
|
+
*
|
|
149
|
+
* @param ast - The AST to search
|
|
150
|
+
* @param nodeType - The type of node to find
|
|
151
|
+
* @returns The first matching node, or null if not found
|
|
152
|
+
*/
|
|
153
|
+
protected findFirstNode(ast: AST, nodeType: string): ASTNode | null;
|
|
154
|
+
/**
|
|
155
|
+
* Find nodes matching a predicate function
|
|
156
|
+
*
|
|
157
|
+
* @param ast - The AST to search
|
|
158
|
+
* @param predicate - Function that returns true for matching nodes
|
|
159
|
+
* @returns Array of matching nodes
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* const asyncFunctions = this.findNodesWhere(ast, (node) =>
|
|
164
|
+
* node.type === 'function_declaration' && node.text.includes('async')
|
|
165
|
+
* );
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
protected findNodesWhere(ast: AST, predicate: (node: ASTNode) => boolean): ASTNode[];
|
|
169
|
+
/**
|
|
170
|
+
* Find the nearest ancestor of a specific type
|
|
171
|
+
*
|
|
172
|
+
* Traverses up the tree from the given node to find the first ancestor
|
|
173
|
+
* matching the specified type.
|
|
174
|
+
*
|
|
175
|
+
* @param node - The starting node
|
|
176
|
+
* @param nodeType - The type of ancestor to find
|
|
177
|
+
* @param ast - The AST containing the node (needed for parent lookup)
|
|
178
|
+
* @returns The ancestor node, or null if not found
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```typescript
|
|
182
|
+
* const parentClass = this.findAncestor(methodNode, 'class_declaration', ast);
|
|
183
|
+
* ```
|
|
184
|
+
*/
|
|
185
|
+
protected findAncestor(node: ASTNode, nodeType: string, ast: AST): ASTNode | null;
|
|
186
|
+
/**
|
|
187
|
+
* Find all ancestors of a node
|
|
188
|
+
*
|
|
189
|
+
* @param node - The starting node
|
|
190
|
+
* @param ast - The AST containing the node
|
|
191
|
+
* @returns Array of ancestor nodes from immediate parent to root
|
|
192
|
+
*/
|
|
193
|
+
protected findAllAncestors(node: ASTNode, ast: AST): ASTNode[];
|
|
194
|
+
/**
|
|
195
|
+
* Find all descendants of a node
|
|
196
|
+
*
|
|
197
|
+
* @param node - The starting node
|
|
198
|
+
* @returns Array of all descendant nodes
|
|
199
|
+
*/
|
|
200
|
+
protected findDescendants(node: ASTNode): ASTNode[];
|
|
201
|
+
/**
|
|
202
|
+
* Find descendants of a specific type
|
|
203
|
+
*
|
|
204
|
+
* @param node - The starting node
|
|
205
|
+
* @param nodeType - The type of descendants to find
|
|
206
|
+
* @returns Array of matching descendant nodes
|
|
207
|
+
*/
|
|
208
|
+
protected findDescendantsByType(node: ASTNode, nodeType: string): ASTNode[];
|
|
209
|
+
/**
|
|
210
|
+
* Get the text content of a node
|
|
211
|
+
*
|
|
212
|
+
* Returns the source text corresponding to the node's position.
|
|
213
|
+
* If content is provided, extracts from content; otherwise uses node.text.
|
|
214
|
+
*
|
|
215
|
+
* @param node - The node to get text for
|
|
216
|
+
* @param content - Optional source content to extract from
|
|
217
|
+
* @returns The text content of the node
|
|
218
|
+
*
|
|
219
|
+
* @example
|
|
220
|
+
* ```typescript
|
|
221
|
+
* const functionName = this.getNodeText(identifierNode, context.content);
|
|
222
|
+
* ```
|
|
223
|
+
*/
|
|
224
|
+
protected getNodeText(node: ASTNode, content?: string): string;
|
|
225
|
+
/**
|
|
226
|
+
* Get the trimmed text content of a node
|
|
227
|
+
*
|
|
228
|
+
* @param node - The node to get text for
|
|
229
|
+
* @param content - Optional source content to extract from
|
|
230
|
+
* @returns The trimmed text content
|
|
231
|
+
*/
|
|
232
|
+
protected getNodeTextTrimmed(node: ASTNode, content?: string): string;
|
|
233
|
+
/**
|
|
234
|
+
* Match an AST against a pattern
|
|
235
|
+
*
|
|
236
|
+
* Searches the AST for nodes matching the specified pattern and returns
|
|
237
|
+
* all matches with their confidence scores.
|
|
238
|
+
*
|
|
239
|
+
* @param ast - The AST to search
|
|
240
|
+
* @param pattern - The pattern to match
|
|
241
|
+
* @returns Array of match results
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* ```typescript
|
|
245
|
+
* const matches = this.matchPattern(ast, {
|
|
246
|
+
* type: 'function_declaration',
|
|
247
|
+
* children: [{ type: 'identifier', capture: 'name' }]
|
|
248
|
+
* });
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
protected matchPattern(ast: AST, pattern: ASTPattern): ASTMatchResult[];
|
|
252
|
+
/**
|
|
253
|
+
* Match a single node against a pattern
|
|
254
|
+
*
|
|
255
|
+
* @param node - The node to match
|
|
256
|
+
* @param pattern - The pattern to match against
|
|
257
|
+
* @param captures - Map to store captured nodes
|
|
258
|
+
* @returns Confidence score (0-1), 0 if no match
|
|
259
|
+
*/
|
|
260
|
+
private matchNode;
|
|
261
|
+
/**
|
|
262
|
+
* Match text against a pattern (string or regex)
|
|
263
|
+
*/
|
|
264
|
+
private matchText;
|
|
265
|
+
/**
|
|
266
|
+
* Match child patterns against node children
|
|
267
|
+
*/
|
|
268
|
+
private matchChildPatterns;
|
|
269
|
+
/**
|
|
270
|
+
* Traverse the AST depth-first
|
|
271
|
+
*
|
|
272
|
+
* Visits each node in the AST, calling the visitor function.
|
|
273
|
+
* The visitor can return false to stop traversal of a subtree.
|
|
274
|
+
*
|
|
275
|
+
* @param ast - The AST to traverse
|
|
276
|
+
* @param visitor - Function called for each node
|
|
277
|
+
* @param options - Traversal options
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```typescript
|
|
281
|
+
* this.traverse(ast, (node, parent, depth) => {
|
|
282
|
+
* console.log(`${node.type} at depth ${depth}`);
|
|
283
|
+
* if (depth > 5) return false; // Stop going deeper
|
|
284
|
+
* });
|
|
285
|
+
* ```
|
|
286
|
+
*/
|
|
287
|
+
protected traverse(ast: AST, visitor: ASTVisitor, options?: TraversalOptions): void;
|
|
288
|
+
/**
|
|
289
|
+
* Traverse a specific node and its descendants
|
|
290
|
+
*
|
|
291
|
+
* @param node - The node to start traversal from
|
|
292
|
+
* @param visitor - Function called for each node
|
|
293
|
+
* @param options - Traversal options
|
|
294
|
+
*/
|
|
295
|
+
protected traverseNode(node: ASTNode, visitor: ASTVisitor, options?: TraversalOptions): void;
|
|
296
|
+
/**
|
|
297
|
+
* Get the parent chain from root to a specific node
|
|
298
|
+
*
|
|
299
|
+
* @param ast - The AST to search
|
|
300
|
+
* @param targetNode - The node to find parents for
|
|
301
|
+
* @returns Array of parent nodes from root to immediate parent
|
|
302
|
+
*/
|
|
303
|
+
protected getParentChain(ast: AST, targetNode: ASTNode): ASTNode[];
|
|
304
|
+
/**
|
|
305
|
+
* Get the immediate parent of a node
|
|
306
|
+
*
|
|
307
|
+
* @param ast - The AST containing the node
|
|
308
|
+
* @param node - The node to find the parent of
|
|
309
|
+
* @returns The parent node, or null if node is root
|
|
310
|
+
*/
|
|
311
|
+
protected getParent(ast: AST, node: ASTNode): ASTNode | null;
|
|
312
|
+
/**
|
|
313
|
+
* Get the depth of a node in the AST
|
|
314
|
+
*
|
|
315
|
+
* @param ast - The AST containing the node
|
|
316
|
+
* @param targetNode - The node to get depth for
|
|
317
|
+
* @returns The depth (0 for root), or -1 if not found
|
|
318
|
+
*/
|
|
319
|
+
protected getNodeDepth(ast: AST, targetNode: ASTNode): number;
|
|
320
|
+
/**
|
|
321
|
+
* Check if a node is a leaf node (has no children)
|
|
322
|
+
*
|
|
323
|
+
* @param node - The node to check
|
|
324
|
+
* @returns true if the node has no children
|
|
325
|
+
*/
|
|
326
|
+
protected isLeafNode(node: ASTNode): boolean;
|
|
327
|
+
/**
|
|
328
|
+
* Get direct children of a specific type
|
|
329
|
+
*
|
|
330
|
+
* @param node - The parent node
|
|
331
|
+
* @param nodeType - The type of children to find
|
|
332
|
+
* @returns Array of matching child nodes
|
|
333
|
+
*/
|
|
334
|
+
protected getChildrenByType(node: ASTNode, nodeType: string): ASTNode[];
|
|
335
|
+
/**
|
|
336
|
+
* Get the first direct child of a specific type
|
|
337
|
+
*
|
|
338
|
+
* @param node - The parent node
|
|
339
|
+
* @param nodeType - The type of child to find
|
|
340
|
+
* @returns The first matching child, or null if not found
|
|
341
|
+
*/
|
|
342
|
+
protected getFirstChildByType(node: ASTNode, nodeType: string): ASTNode | null;
|
|
343
|
+
/**
|
|
344
|
+
* Check if a node has a child of a specific type
|
|
345
|
+
*
|
|
346
|
+
* @param node - The parent node
|
|
347
|
+
* @param nodeType - The type to check for
|
|
348
|
+
* @returns true if a child of the specified type exists
|
|
349
|
+
*/
|
|
350
|
+
protected hasChildOfType(node: ASTNode, nodeType: string): boolean;
|
|
351
|
+
/**
|
|
352
|
+
* Check if a node has a descendant of a specific type
|
|
353
|
+
*
|
|
354
|
+
* @param node - The starting node
|
|
355
|
+
* @param nodeType - The type to check for
|
|
356
|
+
* @returns true if a descendant of the specified type exists
|
|
357
|
+
*/
|
|
358
|
+
protected hasDescendantOfType(node: ASTNode, nodeType: string): boolean;
|
|
359
|
+
/**
|
|
360
|
+
* Get siblings of a node (other children of the same parent)
|
|
361
|
+
*
|
|
362
|
+
* @param ast - The AST containing the node
|
|
363
|
+
* @param node - The node to find siblings for
|
|
364
|
+
* @returns Array of sibling nodes (excluding the node itself)
|
|
365
|
+
*/
|
|
366
|
+
protected getSiblings(ast: AST, node: ASTNode): ASTNode[];
|
|
367
|
+
/**
|
|
368
|
+
* Get the next sibling of a node
|
|
369
|
+
*
|
|
370
|
+
* @param ast - The AST containing the node
|
|
371
|
+
* @param node - The node to find the next sibling for
|
|
372
|
+
* @returns The next sibling, or null if none exists
|
|
373
|
+
*/
|
|
374
|
+
protected getNextSibling(ast: AST, node: ASTNode): ASTNode | null;
|
|
375
|
+
/**
|
|
376
|
+
* Get the previous sibling of a node
|
|
377
|
+
*
|
|
378
|
+
* @param ast - The AST containing the node
|
|
379
|
+
* @param node - The node to find the previous sibling for
|
|
380
|
+
* @returns The previous sibling, or null if none exists
|
|
381
|
+
*/
|
|
382
|
+
protected getPreviousSibling(ast: AST, node: ASTNode): ASTNode | null;
|
|
383
|
+
/**
|
|
384
|
+
* Count nodes of a specific type in the AST
|
|
385
|
+
*
|
|
386
|
+
* @param ast - The AST to search
|
|
387
|
+
* @param nodeType - The type of nodes to count
|
|
388
|
+
* @returns The count of matching nodes
|
|
389
|
+
*/
|
|
390
|
+
protected countNodes(ast: AST, nodeType: string): number;
|
|
391
|
+
/**
|
|
392
|
+
* Check if the AST contains a node of a specific type
|
|
393
|
+
*
|
|
394
|
+
* @param ast - The AST to search
|
|
395
|
+
* @param nodeType - The type to check for
|
|
396
|
+
* @returns true if a node of the specified type exists
|
|
397
|
+
*/
|
|
398
|
+
protected hasNodeOfType(ast: AST, nodeType: string): boolean;
|
|
399
|
+
/**
|
|
400
|
+
* Get the line number of a node (1-indexed)
|
|
401
|
+
*
|
|
402
|
+
* @param node - The node to get the line number for
|
|
403
|
+
* @returns The line number (1-indexed)
|
|
404
|
+
*/
|
|
405
|
+
protected getLineNumber(node: ASTNode): number;
|
|
406
|
+
/**
|
|
407
|
+
* Get the column number of a node (1-indexed)
|
|
408
|
+
*
|
|
409
|
+
* @param node - The node to get the column number for
|
|
410
|
+
* @returns The column number (1-indexed)
|
|
411
|
+
*/
|
|
412
|
+
protected getColumnNumber(node: ASTNode): number;
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Type guard to check if a detector is an AST detector
|
|
416
|
+
*
|
|
417
|
+
* @param detector - The detector to check
|
|
418
|
+
* @returns true if the detector is an ASTDetector
|
|
419
|
+
*/
|
|
420
|
+
export declare function isASTDetector(detector: BaseDetector): detector is ASTDetector;
|
|
421
|
+
//# sourceMappingURL=ast-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-detector.d.ts","sourceRoot":"","sources":["../../src/base/ast-detector.ts"],"names":[],"mappings":"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"}
|