@empline/preflight 1.0.20
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/README.md +540 -0
- package/dist/bin/approve.d.ts +24 -0
- package/dist/bin/approve.d.ts.map +1 -0
- package/dist/bin/approve.js +249 -0
- package/dist/bin/approve.js.map +1 -0
- package/dist/bin/audit.d.ts +64 -0
- package/dist/bin/audit.d.ts.map +1 -0
- package/dist/bin/audit.js +464 -0
- package/dist/bin/audit.js.map +1 -0
- package/dist/bin/install-hooks.d.ts +20 -0
- package/dist/bin/install-hooks.d.ts.map +1 -0
- package/dist/bin/install-hooks.js +204 -0
- package/dist/bin/install-hooks.js.map +1 -0
- package/dist/bin/preflight.d.ts +21 -0
- package/dist/bin/preflight.d.ts.map +1 -0
- package/dist/bin/preflight.js +218 -0
- package/dist/bin/preflight.js.map +1 -0
- package/dist/bin/preinstall.d.ts +15 -0
- package/dist/bin/preinstall.d.ts.map +1 -0
- package/dist/bin/preinstall.js +229 -0
- package/dist/bin/preinstall.js.map +1 -0
- package/dist/bin/review-drift.d.ts +17 -0
- package/dist/bin/review-drift.d.ts.map +1 -0
- package/dist/bin/review-drift.js +292 -0
- package/dist/bin/review-drift.js.map +1 -0
- package/dist/bin/review.d.ts +22 -0
- package/dist/bin/review.d.ts.map +1 -0
- package/dist/bin/review.js +179 -0
- package/dist/bin/review.js.map +1 -0
- package/dist/bin/submit-drift.d.ts +36 -0
- package/dist/bin/submit-drift.d.ts.map +1 -0
- package/dist/bin/submit-drift.js +534 -0
- package/dist/bin/submit-drift.js.map +1 -0
- package/dist/bin/submit.d.ts +23 -0
- package/dist/bin/submit.d.ts.map +1 -0
- package/dist/bin/submit.js +263 -0
- package/dist/bin/submit.js.map +1 -0
- package/dist/bin/watch.d.ts +27 -0
- package/dist/bin/watch.d.ts.map +1 -0
- package/dist/bin/watch.js +327 -0
- package/dist/bin/watch.js.map +1 -0
- package/dist/checks/ai/card-size-detection-validation.d.ts +22 -0
- package/dist/checks/ai/card-size-detection-validation.d.ts.map +1 -0
- package/dist/checks/ai/card-size-detection-validation.js +452 -0
- package/dist/checks/ai/card-size-detection-validation.js.map +1 -0
- package/dist/checks/ai/code-quality-ai.d.ts +17 -0
- package/dist/checks/ai/code-quality-ai.d.ts.map +1 -0
- package/dist/checks/ai/code-quality-ai.js +399 -0
- package/dist/checks/ai/code-quality-ai.js.map +1 -0
- package/dist/checks/ai/recognition-pipeline-validation.d.ts +27 -0
- package/dist/checks/ai/recognition-pipeline-validation.d.ts.map +1 -0
- package/dist/checks/ai/recognition-pipeline-validation.js +808 -0
- package/dist/checks/ai/recognition-pipeline-validation.js.map +1 -0
- package/dist/checks/ai/series-subset-hierarchy.d.ts +21 -0
- package/dist/checks/ai/series-subset-hierarchy.d.ts.map +1 -0
- package/dist/checks/ai/series-subset-hierarchy.js +373 -0
- package/dist/checks/ai/series-subset-hierarchy.js.map +1 -0
- package/dist/checks/api/api-completeness-check.d.ts +26 -0
- package/dist/checks/api/api-completeness-check.d.ts.map +1 -0
- package/dist/checks/api/api-completeness-check.js +311 -0
- package/dist/checks/api/api-completeness-check.js.map +1 -0
- package/dist/checks/api/api-contract-validation.d.ts +24 -0
- package/dist/checks/api/api-contract-validation.d.ts.map +1 -0
- package/dist/checks/api/api-contract-validation.js +219 -0
- package/dist/checks/api/api-contract-validation.js.map +1 -0
- package/dist/checks/api/pagination-validation.d.ts +21 -0
- package/dist/checks/api/pagination-validation.d.ts.map +1 -0
- package/dist/checks/api/pagination-validation.js +270 -0
- package/dist/checks/api/pagination-validation.js.map +1 -0
- package/dist/checks/api/response-consistency.d.ts +21 -0
- package/dist/checks/api/response-consistency.d.ts.map +1 -0
- package/dist/checks/api/response-consistency.js +238 -0
- package/dist/checks/api/response-consistency.js.map +1 -0
- package/dist/checks/api/response-schema-validation.d.ts +25 -0
- package/dist/checks/api/response-schema-validation.d.ts.map +1 -0
- package/dist/checks/api/response-schema-validation.js +288 -0
- package/dist/checks/api/response-schema-validation.js.map +1 -0
- package/dist/checks/api/response-time-budget.d.ts +17 -0
- package/dist/checks/api/response-time-budget.d.ts.map +1 -0
- package/dist/checks/api/response-time-budget.js +294 -0
- package/dist/checks/api/response-time-budget.js.map +1 -0
- package/dist/checks/api/variant-switching-integrity.d.ts +22 -0
- package/dist/checks/api/variant-switching-integrity.d.ts.map +1 -0
- package/dist/checks/api/variant-switching-integrity.js +306 -0
- package/dist/checks/api/variant-switching-integrity.js.map +1 -0
- package/dist/checks/architecture/admin-page-consistency.d.ts +27 -0
- package/dist/checks/architecture/admin-page-consistency.d.ts.map +1 -0
- package/dist/checks/architecture/admin-page-consistency.js +294 -0
- package/dist/checks/architecture/admin-page-consistency.js.map +1 -0
- package/dist/checks/architecture/backend-ui-coverage.d.ts +25 -0
- package/dist/checks/architecture/backend-ui-coverage.d.ts.map +1 -0
- package/dist/checks/architecture/backend-ui-coverage.js +562 -0
- package/dist/checks/architecture/backend-ui-coverage.js.map +1 -0
- package/dist/checks/architecture/component-architecture.d.ts +26 -0
- package/dist/checks/architecture/component-architecture.d.ts.map +1 -0
- package/dist/checks/architecture/component-architecture.js +513 -0
- package/dist/checks/architecture/component-architecture.js.map +1 -0
- package/dist/checks/architecture/component-consolidation-opportunities.d.ts +28 -0
- package/dist/checks/architecture/component-consolidation-opportunities.d.ts.map +1 -0
- package/dist/checks/architecture/component-consolidation-opportunities.js +338 -0
- package/dist/checks/architecture/component-consolidation-opportunities.js.map +1 -0
- package/dist/checks/architecture/orphaned-pages-detection.d.ts +34 -0
- package/dist/checks/architecture/orphaned-pages-detection.d.ts.map +1 -0
- package/dist/checks/architecture/orphaned-pages-detection.js +464 -0
- package/dist/checks/architecture/orphaned-pages-detection.js.map +1 -0
- package/dist/checks/architecture/primitive-component-enforcement.d.ts +25 -0
- package/dist/checks/architecture/primitive-component-enforcement.d.ts.map +1 -0
- package/dist/checks/architecture/primitive-component-enforcement.js +305 -0
- package/dist/checks/architecture/primitive-component-enforcement.js.map +1 -0
- package/dist/checks/architecture/shared-component-enforcement.d.ts +34 -0
- package/dist/checks/architecture/shared-component-enforcement.d.ts.map +1 -0
- package/dist/checks/architecture/shared-component-enforcement.js +725 -0
- package/dist/checks/architecture/shared-component-enforcement.js.map +1 -0
- package/dist/checks/async-cleanup-validation.d.ts +20 -0
- package/dist/checks/async-cleanup-validation.d.ts.map +1 -0
- package/dist/checks/async-cleanup-validation.js +179 -0
- package/dist/checks/async-cleanup-validation.js.map +1 -0
- package/dist/checks/auth/auth-page-consistency.d.ts +25 -0
- package/dist/checks/auth/auth-page-consistency.d.ts.map +1 -0
- package/dist/checks/auth/auth-page-consistency.js +581 -0
- package/dist/checks/auth/auth-page-consistency.js.map +1 -0
- package/dist/checks/auth/authenticated-redirect.d.ts +55 -0
- package/dist/checks/auth/authenticated-redirect.d.ts.map +1 -0
- package/dist/checks/auth/authenticated-redirect.js +389 -0
- package/dist/checks/auth/authenticated-redirect.js.map +1 -0
- package/dist/checks/auth/role-validation.d.ts +31 -0
- package/dist/checks/auth/role-validation.d.ts.map +1 -0
- package/dist/checks/auth/role-validation.js +252 -0
- package/dist/checks/auth/role-validation.js.map +1 -0
- package/dist/checks/auth/session-integrity-validation.d.ts +58 -0
- package/dist/checks/auth/session-integrity-validation.d.ts.map +1 -0
- package/dist/checks/auth/session-integrity-validation.js +402 -0
- package/dist/checks/auth/session-integrity-validation.js.map +1 -0
- package/dist/checks/auth/session-security.d.ts +67 -0
- package/dist/checks/auth/session-security.d.ts.map +1 -0
- package/dist/checks/auth/session-security.js +399 -0
- package/dist/checks/auth/session-security.js.map +1 -0
- package/dist/checks/auth/session-update-safety.d.ts +96 -0
- package/dist/checks/auth/session-update-safety.d.ts.map +1 -0
- package/dist/checks/auth/session-update-safety.js +697 -0
- package/dist/checks/auth/session-update-safety.js.map +1 -0
- package/dist/checks/auth/store-access-delegation.d.ts +33 -0
- package/dist/checks/auth/store-access-delegation.d.ts.map +1 -0
- package/dist/checks/auth/store-access-delegation.js +344 -0
- package/dist/checks/auth/store-access-delegation.js.map +1 -0
- package/dist/checks/business/business-invariants.d.ts +20 -0
- package/dist/checks/business/business-invariants.d.ts.map +1 -0
- package/dist/checks/business/business-invariants.js +174 -0
- package/dist/checks/business/business-invariants.js.map +1 -0
- package/dist/checks/business/currency-precision.d.ts +21 -0
- package/dist/checks/business/currency-precision.d.ts.map +1 -0
- package/dist/checks/business/currency-precision.js +433 -0
- package/dist/checks/business/currency-precision.js.map +1 -0
- package/dist/checks/business/idempotency-key-validation.d.ts +27 -0
- package/dist/checks/business/idempotency-key-validation.d.ts.map +1 -0
- package/dist/checks/business/idempotency-key-validation.js +275 -0
- package/dist/checks/business/idempotency-key-validation.js.map +1 -0
- package/dist/checks/business/image-metadata-injection.d.ts +19 -0
- package/dist/checks/business/image-metadata-injection.d.ts.map +1 -0
- package/dist/checks/business/image-metadata-injection.js +367 -0
- package/dist/checks/business/image-metadata-injection.js.map +1 -0
- package/dist/checks/business/image-upload-optimization.d.ts +20 -0
- package/dist/checks/business/image-upload-optimization.d.ts.map +1 -0
- package/dist/checks/business/image-upload-optimization.js +271 -0
- package/dist/checks/business/image-upload-optimization.js.map +1 -0
- package/dist/checks/business/inventory-atomicity-validation.d.ts +19 -0
- package/dist/checks/business/inventory-atomicity-validation.d.ts.map +1 -0
- package/dist/checks/business/inventory-atomicity-validation.js +257 -0
- package/dist/checks/business/inventory-atomicity-validation.js.map +1 -0
- package/dist/checks/business/order-state-machine-validation.d.ts +19 -0
- package/dist/checks/business/order-state-machine-validation.d.ts.map +1 -0
- package/dist/checks/business/order-state-machine-validation.js +289 -0
- package/dist/checks/business/order-state-machine-validation.js.map +1 -0
- package/dist/checks/business/price-calculation-validation.d.ts +20 -0
- package/dist/checks/business/price-calculation-validation.d.ts.map +1 -0
- package/dist/checks/business/price-calculation-validation.js +247 -0
- package/dist/checks/business/price-calculation-validation.js.map +1 -0
- package/dist/checks/business/price-display-validation.d.ts +22 -0
- package/dist/checks/business/price-display-validation.d.ts.map +1 -0
- package/dist/checks/business/price-display-validation.js +152 -0
- package/dist/checks/business/price-display-validation.js.map +1 -0
- package/dist/checks/business/resilient-recognition-validation.d.ts +26 -0
- package/dist/checks/business/resilient-recognition-validation.d.ts.map +1 -0
- package/dist/checks/business/resilient-recognition-validation.js +230 -0
- package/dist/checks/business/resilient-recognition-validation.js.map +1 -0
- package/dist/checks/business/store-approval-listing-filter.d.ts +19 -0
- package/dist/checks/business/store-approval-listing-filter.d.ts.map +1 -0
- package/dist/checks/business/store-approval-listing-filter.js +176 -0
- package/dist/checks/business/store-approval-listing-filter.js.map +1 -0
- package/dist/checks/business/timezone-handling.d.ts +28 -0
- package/dist/checks/business/timezone-handling.d.ts.map +1 -0
- package/dist/checks/business/timezone-handling.js +294 -0
- package/dist/checks/business/timezone-handling.js.map +1 -0
- package/dist/checks/code-hygiene/any-type-detection.d.ts +30 -0
- package/dist/checks/code-hygiene/any-type-detection.d.ts.map +1 -0
- package/dist/checks/code-hygiene/any-type-detection.js +210 -0
- package/dist/checks/code-hygiene/any-type-detection.js.map +1 -0
- package/dist/checks/code-hygiene/api-error-handling.d.ts +29 -0
- package/dist/checks/code-hygiene/api-error-handling.d.ts.map +1 -0
- package/dist/checks/code-hygiene/api-error-handling.js +285 -0
- package/dist/checks/code-hygiene/api-error-handling.js.map +1 -0
- package/dist/checks/code-hygiene/broken-template-literals.d.ts +24 -0
- package/dist/checks/code-hygiene/broken-template-literals.d.ts.map +1 -0
- package/dist/checks/code-hygiene/broken-template-literals.js +209 -0
- package/dist/checks/code-hygiene/broken-template-literals.js.map +1 -0
- package/dist/checks/code-hygiene/comment-hygiene.d.ts +26 -0
- package/dist/checks/code-hygiene/comment-hygiene.d.ts.map +1 -0
- package/dist/checks/code-hygiene/comment-hygiene.js +421 -0
- package/dist/checks/code-hygiene/comment-hygiene.js.map +1 -0
- package/dist/checks/code-hygiene/console-chars-sync.d.ts +26 -0
- package/dist/checks/code-hygiene/console-chars-sync.d.ts.map +1 -0
- package/dist/checks/code-hygiene/console-chars-sync.js +417 -0
- package/dist/checks/code-hygiene/console-chars-sync.js.map +1 -0
- package/dist/checks/code-hygiene/console-log-detection.d.ts +27 -0
- package/dist/checks/code-hygiene/console-log-detection.d.ts.map +1 -0
- package/dist/checks/code-hygiene/console-log-detection.js +204 -0
- package/dist/checks/code-hygiene/console-log-detection.js.map +1 -0
- package/dist/checks/code-hygiene/dead-code-detection.d.ts +28 -0
- package/dist/checks/code-hygiene/dead-code-detection.d.ts.map +1 -0
- package/dist/checks/code-hygiene/dead-code-detection.js +217 -0
- package/dist/checks/code-hygiene/dead-code-detection.js.map +1 -0
- package/dist/checks/code-hygiene/decorative-separators.d.ts +32 -0
- package/dist/checks/code-hygiene/decorative-separators.d.ts.map +1 -0
- package/dist/checks/code-hygiene/decorative-separators.js +251 -0
- package/dist/checks/code-hygiene/decorative-separators.js.map +1 -0
- package/dist/checks/code-hygiene/empty-catch-detection.d.ts +25 -0
- package/dist/checks/code-hygiene/empty-catch-detection.d.ts.map +1 -0
- package/dist/checks/code-hygiene/empty-catch-detection.js +184 -0
- package/dist/checks/code-hygiene/empty-catch-detection.js.map +1 -0
- package/dist/checks/code-hygiene/fix-hardcoded-emoji.d.ts +18 -0
- package/dist/checks/code-hygiene/fix-hardcoded-emoji.d.ts.map +1 -0
- package/dist/checks/code-hygiene/fix-hardcoded-emoji.js +332 -0
- package/dist/checks/code-hygiene/fix-hardcoded-emoji.js.map +1 -0
- package/dist/checks/code-hygiene/log-level-misuse.d.ts +25 -0
- package/dist/checks/code-hygiene/log-level-misuse.d.ts.map +1 -0
- package/dist/checks/code-hygiene/log-level-misuse.js +383 -0
- package/dist/checks/code-hygiene/log-level-misuse.js.map +1 -0
- package/dist/checks/code-hygiene/missing-logger-import.d.ts +16 -0
- package/dist/checks/code-hygiene/missing-logger-import.d.ts.map +1 -0
- package/dist/checks/code-hygiene/missing-logger-import.js +154 -0
- package/dist/checks/code-hygiene/missing-logger-import.js.map +1 -0
- package/dist/checks/code-hygiene/root-file-hygiene.d.ts +31 -0
- package/dist/checks/code-hygiene/root-file-hygiene.d.ts.map +1 -0
- package/dist/checks/code-hygiene/root-file-hygiene.js +285 -0
- package/dist/checks/code-hygiene/root-file-hygiene.js.map +1 -0
- package/dist/checks/code-hygiene/todo-tracking.d.ts +25 -0
- package/dist/checks/code-hygiene/todo-tracking.d.ts.map +1 -0
- package/dist/checks/code-hygiene/todo-tracking.js +205 -0
- package/dist/checks/code-hygiene/todo-tracking.js.map +1 -0
- package/dist/checks/code-hygiene/unicode-console-compatibility.d.ts +21 -0
- package/dist/checks/code-hygiene/unicode-console-compatibility.d.ts.map +1 -0
- package/dist/checks/code-hygiene/unicode-console-compatibility.js +229 -0
- package/dist/checks/code-hygiene/unicode-console-compatibility.js.map +1 -0
- package/dist/checks/code-quality/duplicate-logic-detection.d.ts +39 -0
- package/dist/checks/code-quality/duplicate-logic-detection.d.ts.map +1 -0
- package/dist/checks/code-quality/duplicate-logic-detection.js +270 -0
- package/dist/checks/code-quality/duplicate-logic-detection.js.map +1 -0
- package/dist/checks/code-quality/feature-flag-hygiene.d.ts +26 -0
- package/dist/checks/code-quality/feature-flag-hygiene.d.ts.map +1 -0
- package/dist/checks/code-quality/feature-flag-hygiene.js +353 -0
- package/dist/checks/code-quality/feature-flag-hygiene.js.map +1 -0
- package/dist/checks/code-quality/grading-config-usage.d.ts +29 -0
- package/dist/checks/code-quality/grading-config-usage.d.ts.map +1 -0
- package/dist/checks/code-quality/grading-config-usage.js +210 -0
- package/dist/checks/code-quality/grading-config-usage.js.map +1 -0
- package/dist/checks/code-quality/legacy-data-pattern-detection.d.ts +36 -0
- package/dist/checks/code-quality/legacy-data-pattern-detection.d.ts.map +1 -0
- package/dist/checks/code-quality/legacy-data-pattern-detection.js +450 -0
- package/dist/checks/code-quality/legacy-data-pattern-detection.js.map +1 -0
- package/dist/checks/code-quality/magic-number-detection.d.ts +30 -0
- package/dist/checks/code-quality/magic-number-detection.d.ts.map +1 -0
- package/dist/checks/code-quality/magic-number-detection.js +405 -0
- package/dist/checks/code-quality/magic-number-detection.js.map +1 -0
- package/dist/checks/code-quality/mock-function-detection.d.ts +32 -0
- package/dist/checks/code-quality/mock-function-detection.d.ts.map +1 -0
- package/dist/checks/code-quality/mock-function-detection.js +244 -0
- package/dist/checks/code-quality/mock-function-detection.js.map +1 -0
- package/dist/checks/code-quality/no-console-production.d.ts +26 -0
- package/dist/checks/code-quality/no-console-production.d.ts.map +1 -0
- package/dist/checks/code-quality/no-console-production.js +272 -0
- package/dist/checks/code-quality/no-console-production.js.map +1 -0
- package/dist/checks/code-quality/shared-utility-gaps.d.ts +27 -0
- package/dist/checks/code-quality/shared-utility-gaps.d.ts.map +1 -0
- package/dist/checks/code-quality/shared-utility-gaps.js +413 -0
- package/dist/checks/code-quality/shared-utility-gaps.js.map +1 -0
- package/dist/checks/code-quality/stub-script-detection.d.ts +32 -0
- package/dist/checks/code-quality/stub-script-detection.d.ts.map +1 -0
- package/dist/checks/code-quality/stub-script-detection.js +211 -0
- package/dist/checks/code-quality/stub-script-detection.js.map +1 -0
- package/dist/checks/code-quality/typescript-type-safety.d.ts +31 -0
- package/dist/checks/code-quality/typescript-type-safety.d.ts.map +1 -0
- package/dist/checks/code-quality/typescript-type-safety.js +228 -0
- package/dist/checks/code-quality/typescript-type-safety.js.map +1 -0
- package/dist/checks/component-imports.d.ts +15 -0
- package/dist/checks/component-imports.d.ts.map +1 -0
- package/dist/checks/component-imports.js +227 -0
- package/dist/checks/component-imports.js.map +1 -0
- package/dist/checks/config/env-completeness.d.ts +20 -0
- package/dist/checks/config/env-completeness.d.ts.map +1 -0
- package/dist/checks/config/env-completeness.js +193 -0
- package/dist/checks/config/env-completeness.js.map +1 -0
- package/dist/checks/coverage-gap-analysis.d.ts +21 -0
- package/dist/checks/coverage-gap-analysis.d.ts.map +1 -0
- package/dist/checks/coverage-gap-analysis.js +779 -0
- package/dist/checks/coverage-gap-analysis.js.map +1 -0
- package/dist/checks/css/dead-css-detection.d.ts +14 -0
- package/dist/checks/css/dead-css-detection.d.ts.map +1 -0
- package/dist/checks/css/dead-css-detection.js +222 -0
- package/dist/checks/css/dead-css-detection.js.map +1 -0
- package/dist/checks/css/sticky-header-validation.d.ts +19 -0
- package/dist/checks/css/sticky-header-validation.d.ts.map +1 -0
- package/dist/checks/css/sticky-header-validation.js +256 -0
- package/dist/checks/css/sticky-header-validation.js.map +1 -0
- package/dist/checks/data-integrity/cart-data-integrity.d.ts +19 -0
- package/dist/checks/data-integrity/cart-data-integrity.d.ts.map +1 -0
- package/dist/checks/data-integrity/cart-data-integrity.js +235 -0
- package/dist/checks/data-integrity/cart-data-integrity.js.map +1 -0
- package/dist/checks/data-integrity/enum-special-chars-validation.d.ts +26 -0
- package/dist/checks/data-integrity/enum-special-chars-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/enum-special-chars-validation.js +94 -0
- package/dist/checks/data-integrity/enum-special-chars-validation.js.map +1 -0
- package/dist/checks/data-integrity/notification-template-alignment.d.ts +21 -0
- package/dist/checks/data-integrity/notification-template-alignment.d.ts.map +1 -0
- package/dist/checks/data-integrity/notification-template-alignment.js +372 -0
- package/dist/checks/data-integrity/notification-template-alignment.js.map +1 -0
- package/dist/checks/data-integrity/product-data-flow-validation.d.ts +21 -0
- package/dist/checks/data-integrity/product-data-flow-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/product-data-flow-validation.js +569 -0
- package/dist/checks/data-integrity/product-data-flow-validation.js.map +1 -0
- package/dist/checks/data-integrity/store-data-integrity.d.ts +18 -0
- package/dist/checks/data-integrity/store-data-integrity.d.ts.map +1 -0
- package/dist/checks/data-integrity/store-data-integrity.js +398 -0
- package/dist/checks/data-integrity/store-data-integrity.js.map +1 -0
- package/dist/checks/data-integrity/unwired-functionality.d.ts +22 -0
- package/dist/checks/data-integrity/unwired-functionality.d.ts.map +1 -0
- package/dist/checks/data-integrity/unwired-functionality.js +550 -0
- package/dist/checks/data-integrity/unwired-functionality.js.map +1 -0
- package/dist/checks/database/block-db-push.d.ts +29 -0
- package/dist/checks/database/block-db-push.d.ts.map +1 -0
- package/dist/checks/database/block-db-push.js +138 -0
- package/dist/checks/database/block-db-push.js.map +1 -0
- package/dist/checks/database/grade-integrity.d.ts +13 -0
- package/dist/checks/database/grade-integrity.d.ts.map +1 -0
- package/dist/checks/database/grade-integrity.js +131 -0
- package/dist/checks/database/grade-integrity.js.map +1 -0
- package/dist/checks/database/migration-integrity.d.ts +26 -0
- package/dist/checks/database/migration-integrity.d.ts.map +1 -0
- package/dist/checks/database/migration-integrity.js +239 -0
- package/dist/checks/database/migration-integrity.js.map +1 -0
- package/dist/checks/database/migration-reversibility.d.ts +25 -0
- package/dist/checks/database/migration-reversibility.d.ts.map +1 -0
- package/dist/checks/database/migration-reversibility.js +277 -0
- package/dist/checks/database/migration-reversibility.js.map +1 -0
- package/dist/checks/database/migration-safety.d.ts +27 -0
- package/dist/checks/database/migration-safety.d.ts.map +1 -0
- package/dist/checks/database/migration-safety.js +243 -0
- package/dist/checks/database/migration-safety.js.map +1 -0
- package/dist/checks/database/prisma-client-db-sync.d.ts +24 -0
- package/dist/checks/database/prisma-client-db-sync.d.ts.map +1 -0
- package/dist/checks/database/prisma-client-db-sync.js +226 -0
- package/dist/checks/database/prisma-client-db-sync.js.map +1 -0
- package/dist/checks/database/prisma-drift-prevention.d.ts +29 -0
- package/dist/checks/database/prisma-drift-prevention.d.ts.map +1 -0
- package/dist/checks/database/prisma-drift-prevention.js +614 -0
- package/dist/checks/database/prisma-drift-prevention.js.map +1 -0
- package/dist/checks/database/prisma-overfetch-detection.d.ts +26 -0
- package/dist/checks/database/prisma-overfetch-detection.d.ts.map +1 -0
- package/dist/checks/database/prisma-overfetch-detection.js +666 -0
- package/dist/checks/database/prisma-overfetch-detection.js.map +1 -0
- package/dist/checks/database/prisma-precommit-guard.d.ts +25 -0
- package/dist/checks/database/prisma-precommit-guard.d.ts.map +1 -0
- package/dist/checks/database/prisma-precommit-guard.js +188 -0
- package/dist/checks/database/prisma-precommit-guard.js.map +1 -0
- package/dist/checks/database/prisma-schema-syntax.d.ts +17 -0
- package/dist/checks/database/prisma-schema-syntax.d.ts.map +1 -0
- package/dist/checks/database/prisma-schema-syntax.js +50 -0
- package/dist/checks/database/prisma-schema-syntax.js.map +1 -0
- package/dist/checks/database/prod-db-guardrail.d.ts +20 -0
- package/dist/checks/database/prod-db-guardrail.d.ts.map +1 -0
- package/dist/checks/database/prod-db-guardrail.js +184 -0
- package/dist/checks/database/prod-db-guardrail.js.map +1 -0
- package/dist/checks/database/schema-best-practices.d.ts +24 -0
- package/dist/checks/database/schema-best-practices.d.ts.map +1 -0
- package/dist/checks/database/schema-best-practices.js +393 -0
- package/dist/checks/database/schema-best-practices.js.map +1 -0
- package/dist/checks/database/schema-migration-column-sync.d.ts +33 -0
- package/dist/checks/database/schema-migration-column-sync.d.ts.map +1 -0
- package/dist/checks/database/schema-migration-column-sync.js +561 -0
- package/dist/checks/database/schema-migration-column-sync.js.map +1 -0
- package/dist/checks/database/seed-coverage-validation.d.ts +29 -0
- package/dist/checks/database/seed-coverage-validation.d.ts.map +1 -0
- package/dist/checks/database/seed-coverage-validation.js +595 -0
- package/dist/checks/database/seed-coverage-validation.js.map +1 -0
- package/dist/checks/database/soft-delete-consistency.d.ts +24 -0
- package/dist/checks/database/soft-delete-consistency.d.ts.map +1 -0
- package/dist/checks/database/soft-delete-consistency.js +273 -0
- package/dist/checks/database/soft-delete-consistency.js.map +1 -0
- package/dist/checks/database/tcg-seed-validation.d.ts +29 -0
- package/dist/checks/database/tcg-seed-validation.d.ts.map +1 -0
- package/dist/checks/database/tcg-seed-validation.js +281 -0
- package/dist/checks/database/tcg-seed-validation.js.map +1 -0
- package/dist/checks/database/transaction-integrity.d.ts +25 -0
- package/dist/checks/database/transaction-integrity.d.ts.map +1 -0
- package/dist/checks/database/transaction-integrity.js +275 -0
- package/dist/checks/database/transaction-integrity.js.map +1 -0
- package/dist/checks/database/unused-schema-detection.d.ts +28 -0
- package/dist/checks/database/unused-schema-detection.d.ts.map +1 -0
- package/dist/checks/database/unused-schema-detection.js +624 -0
- package/dist/checks/database/unused-schema-detection.js.map +1 -0
- package/dist/checks/dependencies/deprecated-packages.d.ts +17 -0
- package/dist/checks/dependencies/deprecated-packages.d.ts.map +1 -0
- package/dist/checks/dependencies/deprecated-packages.js +220 -0
- package/dist/checks/dependencies/deprecated-packages.js.map +1 -0
- package/dist/checks/dependencies/weekly-stable-updates.d.ts +27 -0
- package/dist/checks/dependencies/weekly-stable-updates.d.ts.map +1 -0
- package/dist/checks/dependencies/weekly-stable-updates.js +490 -0
- package/dist/checks/dependencies/weekly-stable-updates.js.map +1 -0
- package/dist/checks/deployment/esm-import-extensions.d.ts +23 -0
- package/dist/checks/deployment/esm-import-extensions.d.ts.map +1 -0
- package/dist/checks/deployment/esm-import-extensions.js +183 -0
- package/dist/checks/deployment/esm-import-extensions.js.map +1 -0
- package/dist/checks/deployment/pre-production-checklist-quick.d.ts +15 -0
- package/dist/checks/deployment/pre-production-checklist-quick.d.ts.map +1 -0
- package/dist/checks/deployment/pre-production-checklist-quick.js +140 -0
- package/dist/checks/deployment/pre-production-checklist-quick.js.map +1 -0
- package/dist/checks/deployment/pre-production-checklist.d.ts +18 -0
- package/dist/checks/deployment/pre-production-checklist.d.ts.map +1 -0
- package/dist/checks/deployment/pre-production-checklist.js +219 -0
- package/dist/checks/deployment/pre-production-checklist.js.map +1 -0
- package/dist/checks/deployment/production-config.d.ts +36 -0
- package/dist/checks/deployment/production-config.d.ts.map +1 -0
- package/dist/checks/deployment/production-config.js +424 -0
- package/dist/checks/deployment/production-config.js.map +1 -0
- package/dist/checks/deployment/production-env-validation.d.ts +18 -0
- package/dist/checks/deployment/production-env-validation.d.ts.map +1 -0
- package/dist/checks/deployment/production-env-validation.js +162 -0
- package/dist/checks/deployment/production-env-validation.js.map +1 -0
- package/dist/checks/deployment/rollback-compatibility.d.ts +27 -0
- package/dist/checks/deployment/rollback-compatibility.d.ts.map +1 -0
- package/dist/checks/deployment/rollback-compatibility.js +327 -0
- package/dist/checks/deployment/rollback-compatibility.js.map +1 -0
- package/dist/checks/deprecated-api-usage.d.ts +86 -0
- package/dist/checks/deprecated-api-usage.d.ts.map +1 -0
- package/dist/checks/deprecated-api-usage.js +382 -0
- package/dist/checks/deprecated-api-usage.js.map +1 -0
- package/dist/checks/drift-prevention/api-contract-consistency.d.ts +18 -0
- package/dist/checks/drift-prevention/api-contract-consistency.d.ts.map +1 -0
- package/dist/checks/drift-prevention/api-contract-consistency.js +279 -0
- package/dist/checks/drift-prevention/api-contract-consistency.js.map +1 -0
- package/dist/checks/drift-prevention/breaking-change-detection.d.ts +28 -0
- package/dist/checks/drift-prevention/breaking-change-detection.d.ts.map +1 -0
- package/dist/checks/drift-prevention/breaking-change-detection.js +364 -0
- package/dist/checks/drift-prevention/breaking-change-detection.js.map +1 -0
- package/dist/checks/drift-prevention/component-prop-consistency.d.ts +18 -0
- package/dist/checks/drift-prevention/component-prop-consistency.d.ts.map +1 -0
- package/dist/checks/drift-prevention/component-prop-consistency.js +289 -0
- package/dist/checks/drift-prevention/component-prop-consistency.js.map +1 -0
- package/dist/checks/drift-prevention/database-query-patterns.d.ts +19 -0
- package/dist/checks/drift-prevention/database-query-patterns.d.ts.map +1 -0
- package/dist/checks/drift-prevention/database-query-patterns.js +340 -0
- package/dist/checks/drift-prevention/database-query-patterns.js.map +1 -0
- package/dist/checks/drift-prevention/design-system-consistency.d.ts +18 -0
- package/dist/checks/drift-prevention/design-system-consistency.d.ts.map +1 -0
- package/dist/checks/drift-prevention/design-system-consistency.js +419 -0
- package/dist/checks/drift-prevention/design-system-consistency.js.map +1 -0
- package/dist/checks/drift-prevention/empty-state-consistency.d.ts +17 -0
- package/dist/checks/drift-prevention/empty-state-consistency.d.ts.map +1 -0
- package/dist/checks/drift-prevention/empty-state-consistency.js +257 -0
- package/dist/checks/drift-prevention/empty-state-consistency.js.map +1 -0
- package/dist/checks/drift-prevention/performance-regression-detection.d.ts +18 -0
- package/dist/checks/drift-prevention/performance-regression-detection.d.ts.map +1 -0
- package/dist/checks/drift-prevention/performance-regression-detection.js +444 -0
- package/dist/checks/drift-prevention/performance-regression-detection.js.map +1 -0
- package/dist/checks/drift-prevention/size-convention-consistency.d.ts +40 -0
- package/dist/checks/drift-prevention/size-convention-consistency.d.ts.map +1 -0
- package/dist/checks/drift-prevention/size-convention-consistency.js +219 -0
- package/dist/checks/drift-prevention/size-convention-consistency.js.map +1 -0
- package/dist/checks/drift-prevention/state-management-patterns.d.ts +18 -0
- package/dist/checks/drift-prevention/state-management-patterns.d.ts.map +1 -0
- package/dist/checks/drift-prevention/state-management-patterns.js +240 -0
- package/dist/checks/drift-prevention/state-management-patterns.js.map +1 -0
- package/dist/checks/e2e/e2e-action-outcome-validator.d.ts +21 -0
- package/dist/checks/e2e/e2e-action-outcome-validator.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-action-outcome-validator.js +292 -0
- package/dist/checks/e2e/e2e-action-outcome-validator.js.map +1 -0
- package/dist/checks/e2e/e2e-interaction-coverage-scan.d.ts +21 -0
- package/dist/checks/e2e/e2e-interaction-coverage-scan.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-interaction-coverage-scan.js +1688 -0
- package/dist/checks/e2e/e2e-interaction-coverage-scan.js.map +1 -0
- package/dist/checks/e2e/e2e-interaction-regression.d.ts +19 -0
- package/dist/checks/e2e/e2e-interaction-regression.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-interaction-regression.js +1039 -0
- package/dist/checks/e2e/e2e-interaction-regression.js.map +1 -0
- package/dist/checks/e2e/e2e-outcome-validation.d.ts +33 -0
- package/dist/checks/e2e/e2e-outcome-validation.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-outcome-validation.js +610 -0
- package/dist/checks/e2e/e2e-outcome-validation.js.map +1 -0
- package/dist/checks/e2e/e2e-performance-baseline.d.ts +14 -0
- package/dist/checks/e2e/e2e-performance-baseline.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-performance-baseline.js +289 -0
- package/dist/checks/e2e/e2e-performance-baseline.js.map +1 -0
- package/dist/checks/e2e/e2e-performance-patterns.d.ts +19 -0
- package/dist/checks/e2e/e2e-performance-patterns.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-performance-patterns.js +464 -0
- package/dist/checks/e2e/e2e-performance-patterns.js.map +1 -0
- package/dist/checks/e2e/e2e-performance-regression.d.ts +18 -0
- package/dist/checks/e2e/e2e-performance-regression.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-performance-regression.js +230 -0
- package/dist/checks/e2e/e2e-performance-regression.js.map +1 -0
- package/dist/checks/e2e/e2e-resource-monitoring.d.ts +17 -0
- package/dist/checks/e2e/e2e-resource-monitoring.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-resource-monitoring.js +368 -0
- package/dist/checks/e2e/e2e-resource-monitoring.js.map +1 -0
- package/dist/checks/e2e/e2e-test-redundancy-scan.d.ts +27 -0
- package/dist/checks/e2e/e2e-test-redundancy-scan.d.ts.map +1 -0
- package/dist/checks/e2e/e2e-test-redundancy-scan.js +477 -0
- package/dist/checks/e2e/e2e-test-redundancy-scan.js.map +1 -0
- package/dist/checks/e2e/playwright-config-validator.d.ts +25 -0
- package/dist/checks/e2e/playwright-config-validator.d.ts.map +1 -0
- package/dist/checks/e2e/playwright-config-validator.js +558 -0
- package/dist/checks/e2e/playwright-config-validator.js.map +1 -0
- package/dist/checks/environment/env-duplicates.d.ts +16 -0
- package/dist/checks/environment/env-duplicates.d.ts.map +1 -0
- package/dist/checks/environment/env-duplicates.js +166 -0
- package/dist/checks/environment/env-duplicates.js.map +1 -0
- package/dist/checks/event-listener-cleanup.d.ts +18 -0
- package/dist/checks/event-listener-cleanup.d.ts.map +1 -0
- package/dist/checks/event-listener-cleanup.js +187 -0
- package/dist/checks/event-listener-cleanup.js.map +1 -0
- package/dist/checks/file-naming-conventions.d.ts +21 -0
- package/dist/checks/file-naming-conventions.d.ts.map +1 -0
- package/dist/checks/file-naming-conventions.js +1258 -0
- package/dist/checks/file-naming-conventions.js.map +1 -0
- package/dist/checks/framework/framework-compatibility.d.ts +35 -0
- package/dist/checks/framework/framework-compatibility.d.ts.map +1 -0
- package/dist/checks/framework/framework-compatibility.js +159 -0
- package/dist/checks/framework/framework-compatibility.js.map +1 -0
- package/dist/checks/framework/turbopack-enforcement.d.ts +22 -0
- package/dist/checks/framework/turbopack-enforcement.d.ts.map +1 -0
- package/dist/checks/framework/turbopack-enforcement.js +171 -0
- package/dist/checks/framework/turbopack-enforcement.js.map +1 -0
- package/dist/checks/governance/check-ui-uniformity.d.ts +18 -0
- package/dist/checks/governance/check-ui-uniformity.d.ts.map +1 -0
- package/dist/checks/governance/check-ui-uniformity.js +127 -0
- package/dist/checks/governance/check-ui-uniformity.js.map +1 -0
- package/dist/checks/governance/codeowners-coverage.d.ts +26 -0
- package/dist/checks/governance/codeowners-coverage.d.ts.map +1 -0
- package/dist/checks/governance/codeowners-coverage.js +290 -0
- package/dist/checks/governance/codeowners-coverage.js.map +1 -0
- package/dist/checks/governance/naming-conventions.d.ts +7 -0
- package/dist/checks/governance/naming-conventions.d.ts.map +1 -0
- package/dist/checks/governance/naming-conventions.js +115 -0
- package/dist/checks/governance/naming-conventions.js.map +1 -0
- package/dist/checks/governance/seller-store-naming-consistency.d.ts +32 -0
- package/dist/checks/governance/seller-store-naming-consistency.d.ts.map +1 -0
- package/dist/checks/governance/seller-store-naming-consistency.js +241 -0
- package/dist/checks/governance/seller-store-naming-consistency.js.map +1 -0
- package/dist/checks/governance/store-seller-route-names.d.ts +17 -0
- package/dist/checks/governance/store-seller-route-names.d.ts.map +1 -0
- package/dist/checks/governance/store-seller-route-names.js +170 -0
- package/dist/checks/governance/store-seller-route-names.js.map +1 -0
- package/dist/checks/grading-config-usage.d.ts +23 -0
- package/dist/checks/grading-config-usage.d.ts.map +1 -0
- package/dist/checks/grading-config-usage.js +197 -0
- package/dist/checks/grading-config-usage.js.map +1 -0
- package/dist/checks/help-center-features-validation.d.ts +21 -0
- package/dist/checks/help-center-features-validation.d.ts.map +1 -0
- package/dist/checks/help-center-features-validation.js +529 -0
- package/dist/checks/help-center-features-validation.js.map +1 -0
- package/dist/checks/help-center-validation.d.ts +21 -0
- package/dist/checks/help-center-validation.d.ts.map +1 -0
- package/dist/checks/help-center-validation.js +325 -0
- package/dist/checks/help-center-validation.js.map +1 -0
- package/dist/checks/image/card-edge-protection.d.ts +33 -0
- package/dist/checks/image/card-edge-protection.d.ts.map +1 -0
- package/dist/checks/image/card-edge-protection.js +230 -0
- package/dist/checks/image/card-edge-protection.js.map +1 -0
- package/dist/checks/image/card-orientation-validation.d.ts +34 -0
- package/dist/checks/image/card-orientation-validation.d.ts.map +1 -0
- package/dist/checks/image/card-orientation-validation.js +519 -0
- package/dist/checks/image/card-orientation-validation.js.map +1 -0
- package/dist/checks/integrations/integrations-consolidated.d.ts +76 -0
- package/dist/checks/integrations/integrations-consolidated.d.ts.map +1 -0
- package/dist/checks/integrations/integrations-consolidated.js +493 -0
- package/dist/checks/integrations/integrations-consolidated.js.map +1 -0
- package/dist/checks/integrations/platform-feed-integrity.d.ts +75 -0
- package/dist/checks/integrations/platform-feed-integrity.d.ts.map +1 -0
- package/dist/checks/integrations/platform-feed-integrity.js +487 -0
- package/dist/checks/integrations/platform-feed-integrity.js.map +1 -0
- package/dist/checks/master-preflight.d.ts +56 -0
- package/dist/checks/master-preflight.d.ts.map +1 -0
- package/dist/checks/master-preflight.js +254 -0
- package/dist/checks/master-preflight.js.map +1 -0
- package/dist/checks/nextjs/dynamic-route-exports.d.ts +28 -0
- package/dist/checks/nextjs/dynamic-route-exports.d.ts.map +1 -0
- package/dist/checks/nextjs/dynamic-route-exports.js +201 -0
- package/dist/checks/nextjs/dynamic-route-exports.js.map +1 -0
- package/dist/checks/nextjs/essential-files-validation.d.ts +23 -0
- package/dist/checks/nextjs/essential-files-validation.d.ts.map +1 -0
- package/dist/checks/nextjs/essential-files-validation.js +355 -0
- package/dist/checks/nextjs/essential-files-validation.js.map +1 -0
- package/dist/checks/nextjs/ignore-build-errors.d.ts +15 -0
- package/dist/checks/nextjs/ignore-build-errors.d.ts.map +1 -0
- package/dist/checks/nextjs/ignore-build-errors.js +120 -0
- package/dist/checks/nextjs/ignore-build-errors.js.map +1 -0
- package/dist/checks/nextjs/metadata-api-placement.d.ts +29 -0
- package/dist/checks/nextjs/metadata-api-placement.d.ts.map +1 -0
- package/dist/checks/nextjs/metadata-api-placement.js +274 -0
- package/dist/checks/nextjs/metadata-api-placement.js.map +1 -0
- package/dist/checks/nextjs/nextjs-image-validation.d.ts +52 -0
- package/dist/checks/nextjs/nextjs-image-validation.d.ts.map +1 -0
- package/dist/checks/nextjs/nextjs-image-validation.js +253 -0
- package/dist/checks/nextjs/nextjs-image-validation.js.map +1 -0
- package/dist/checks/nextjs/nextjs16-compatibility.d.ts +39 -0
- package/dist/checks/nextjs/nextjs16-compatibility.d.ts.map +1 -0
- package/dist/checks/nextjs/nextjs16-compatibility.js +1208 -0
- package/dist/checks/nextjs/nextjs16-compatibility.js.map +1 -0
- package/dist/checks/nextjs/static-generation-check.d.ts +25 -0
- package/dist/checks/nextjs/static-generation-check.d.ts.map +1 -0
- package/dist/checks/nextjs/static-generation-check.js +178 -0
- package/dist/checks/nextjs/static-generation-check.js.map +1 -0
- package/dist/checks/observability/centralized-logging-validation.d.ts +22 -0
- package/dist/checks/observability/centralized-logging-validation.d.ts.map +1 -0
- package/dist/checks/observability/centralized-logging-validation.js +285 -0
- package/dist/checks/observability/centralized-logging-validation.js.map +1 -0
- package/dist/checks/order-number-consistency.d.ts +23 -0
- package/dist/checks/order-number-consistency.d.ts.map +1 -0
- package/dist/checks/order-number-consistency.js +288 -0
- package/dist/checks/order-number-consistency.js.map +1 -0
- package/dist/checks/organization/agent-steering-validation.d.ts +16 -0
- package/dist/checks/organization/agent-steering-validation.d.ts.map +1 -0
- package/dist/checks/organization/agent-steering-validation.js +186 -0
- package/dist/checks/organization/agent-steering-validation.js.map +1 -0
- package/dist/checks/organization/api-route-consolidation.d.ts +23 -0
- package/dist/checks/organization/api-route-consolidation.d.ts.map +1 -0
- package/dist/checks/organization/api-route-consolidation.js +364 -0
- package/dist/checks/organization/api-route-consolidation.js.map +1 -0
- package/dist/checks/organization/api-route-naming-validation.d.ts +23 -0
- package/dist/checks/organization/api-route-naming-validation.d.ts.map +1 -0
- package/dist/checks/organization/api-route-naming-validation.js +491 -0
- package/dist/checks/organization/api-route-naming-validation.js.map +1 -0
- package/dist/checks/organization/file-organization-validation.d.ts +18 -0
- package/dist/checks/organization/file-organization-validation.d.ts.map +1 -0
- package/dist/checks/organization/file-organization-validation.js +562 -0
- package/dist/checks/organization/file-organization-validation.js.map +1 -0
- package/dist/checks/organization/npm-script-bloat-prevention.d.ts +40 -0
- package/dist/checks/organization/npm-script-bloat-prevention.d.ts.map +1 -0
- package/dist/checks/organization/npm-script-bloat-prevention.js +412 -0
- package/dist/checks/organization/npm-script-bloat-prevention.js.map +1 -0
- package/dist/checks/organization/preflight-env-check.d.ts +12 -0
- package/dist/checks/organization/preflight-env-check.d.ts.map +1 -0
- package/dist/checks/organization/preflight-env-check.js +157 -0
- package/dist/checks/organization/preflight-env-check.js.map +1 -0
- package/dist/checks/organization/preflight-progress-consistency.d.ts +25 -0
- package/dist/checks/organization/preflight-progress-consistency.d.ts.map +1 -0
- package/dist/checks/organization/preflight-progress-consistency.js +227 -0
- package/dist/checks/organization/preflight-progress-consistency.js.map +1 -0
- package/dist/checks/organization/preflight-system-validation.d.ts +19 -0
- package/dist/checks/organization/preflight-system-validation.d.ts.map +1 -0
- package/dist/checks/organization/preflight-system-validation.js +487 -0
- package/dist/checks/organization/preflight-system-validation.js.map +1 -0
- package/dist/checks/organization/preflight-typescript-validation.d.ts +14 -0
- package/dist/checks/organization/preflight-typescript-validation.d.ts.map +1 -0
- package/dist/checks/organization/preflight-typescript-validation.js +43 -0
- package/dist/checks/organization/preflight-typescript-validation.js.map +1 -0
- package/dist/checks/organization/route-structure-validation.d.ts +18 -0
- package/dist/checks/organization/route-structure-validation.d.ts.map +1 -0
- package/dist/checks/organization/route-structure-validation.js +235 -0
- package/dist/checks/organization/route-structure-validation.js.map +1 -0
- package/dist/checks/organization/steering-bloat-prevention.d.ts +88 -0
- package/dist/checks/organization/steering-bloat-prevention.d.ts.map +1 -0
- package/dist/checks/organization/steering-bloat-prevention.js +1197 -0
- package/dist/checks/organization/steering-bloat-prevention.js.map +1 -0
- package/dist/checks/performance/bundle-optimization-drift.d.ts +18 -0
- package/dist/checks/performance/bundle-optimization-drift.d.ts.map +1 -0
- package/dist/checks/performance/bundle-optimization-drift.js +260 -0
- package/dist/checks/performance/bundle-optimization-drift.js.map +1 -0
- package/dist/checks/performance/bundle-size-regression.d.ts +14 -0
- package/dist/checks/performance/bundle-size-regression.d.ts.map +1 -0
- package/dist/checks/performance/bundle-size-regression.js +236 -0
- package/dist/checks/performance/bundle-size-regression.js.map +1 -0
- package/dist/checks/performance/core-web-vitals.d.ts +39 -0
- package/dist/checks/performance/core-web-vitals.d.ts.map +1 -0
- package/dist/checks/performance/core-web-vitals.js +445 -0
- package/dist/checks/performance/core-web-vitals.js.map +1 -0
- package/dist/checks/performance/mobile-performance-budget.d.ts +29 -0
- package/dist/checks/performance/mobile-performance-budget.d.ts.map +1 -0
- package/dist/checks/performance/mobile-performance-budget.js +415 -0
- package/dist/checks/performance/mobile-performance-budget.js.map +1 -0
- package/dist/checks/performance/runtime-regression.d.ts +17 -0
- package/dist/checks/performance/runtime-regression.d.ts.map +1 -0
- package/dist/checks/performance/runtime-regression.js +425 -0
- package/dist/checks/performance/runtime-regression.js.map +1 -0
- package/dist/checks/performance/unused-preload-detection.d.ts +17 -0
- package/dist/checks/performance/unused-preload-detection.d.ts.map +1 -0
- package/dist/checks/performance/unused-preload-detection.js +185 -0
- package/dist/checks/performance/unused-preload-detection.js.map +1 -0
- package/dist/checks/prisma/prisma7-compatibility.d.ts +29 -0
- package/dist/checks/prisma/prisma7-compatibility.d.ts.map +1 -0
- package/dist/checks/prisma/prisma7-compatibility.js +440 -0
- package/dist/checks/prisma/prisma7-compatibility.js.map +1 -0
- package/dist/checks/quality/component-size.d.ts +13 -0
- package/dist/checks/quality/component-size.d.ts.map +1 -0
- package/dist/checks/quality/component-size.js +104 -0
- package/dist/checks/quality/component-size.js.map +1 -0
- package/dist/checks/quality/critical-type-imports.d.ts +23 -0
- package/dist/checks/quality/critical-type-imports.d.ts.map +1 -0
- package/dist/checks/quality/critical-type-imports.js +632 -0
- package/dist/checks/quality/critical-type-imports.js.map +1 -0
- package/dist/checks/quality/development.d.ts +13 -0
- package/dist/checks/quality/development.d.ts.map +1 -0
- package/dist/checks/quality/development.js +98 -0
- package/dist/checks/quality/development.js.map +1 -0
- package/dist/checks/quality/docs-code-sync.d.ts +27 -0
- package/dist/checks/quality/docs-code-sync.d.ts.map +1 -0
- package/dist/checks/quality/docs-code-sync.js +368 -0
- package/dist/checks/quality/docs-code-sync.js.map +1 -0
- package/dist/checks/quality/duplicate-jsx-attributes.d.ts +23 -0
- package/dist/checks/quality/duplicate-jsx-attributes.d.ts.map +1 -0
- package/dist/checks/quality/duplicate-jsx-attributes.js +201 -0
- package/dist/checks/quality/duplicate-jsx-attributes.js.map +1 -0
- package/dist/checks/quality/file-size.d.ts +13 -0
- package/dist/checks/quality/file-size.d.ts.map +1 -0
- package/dist/checks/quality/file-size.js +97 -0
- package/dist/checks/quality/file-size.js.map +1 -0
- package/dist/checks/quality/file-validation.d.ts +13 -0
- package/dist/checks/quality/file-validation.d.ts.map +1 -0
- package/dist/checks/quality/file-validation.js +103 -0
- package/dist/checks/quality/file-validation.js.map +1 -0
- package/dist/checks/quality/i18n-hardcoded-strings.d.ts +28 -0
- package/dist/checks/quality/i18n-hardcoded-strings.d.ts.map +1 -0
- package/dist/checks/quality/i18n-hardcoded-strings.js +336 -0
- package/dist/checks/quality/i18n-hardcoded-strings.js.map +1 -0
- package/dist/checks/quality/lint-preflight.d.ts +70 -0
- package/dist/checks/quality/lint-preflight.d.ts.map +1 -0
- package/dist/checks/quality/lint-preflight.js +477 -0
- package/dist/checks/quality/lint-preflight.js.map +1 -0
- package/dist/checks/quality/react-namespace-import.d.ts +27 -0
- package/dist/checks/quality/react-namespace-import.d.ts.map +1 -0
- package/dist/checks/quality/react-namespace-import.js +212 -0
- package/dist/checks/quality/react-namespace-import.js.map +1 -0
- package/dist/checks/quality/strict-lint.d.ts +13 -0
- package/dist/checks/quality/strict-lint.d.ts.map +1 -0
- package/dist/checks/quality/strict-lint.js +41 -0
- package/dist/checks/quality/strict-lint.js.map +1 -0
- package/dist/checks/quality/syntax.d.ts +13 -0
- package/dist/checks/quality/syntax.d.ts.map +1 -0
- package/dist/checks/quality/syntax.js +94 -0
- package/dist/checks/quality/syntax.js.map +1 -0
- package/dist/checks/quality/unused-imports.d.ts +14 -0
- package/dist/checks/quality/unused-imports.d.ts.map +1 -0
- package/dist/checks/quality/unused-imports.js +172 -0
- package/dist/checks/quality/unused-imports.js.map +1 -0
- package/dist/checks/react/component-best-practices.d.ts +23 -0
- package/dist/checks/react/component-best-practices.d.ts.map +1 -0
- package/dist/checks/react/component-best-practices.js +273 -0
- package/dist/checks/react/component-best-practices.js.map +1 -0
- package/dist/checks/react/error-boundary-coverage.d.ts +26 -0
- package/dist/checks/react/error-boundary-coverage.d.ts.map +1 -0
- package/dist/checks/react/error-boundary-coverage.js +304 -0
- package/dist/checks/react/error-boundary-coverage.js.map +1 -0
- package/dist/checks/react/memory-leak-detection.d.ts +22 -0
- package/dist/checks/react/memory-leak-detection.d.ts.map +1 -0
- package/dist/checks/react/memory-leak-detection.js +268 -0
- package/dist/checks/react/memory-leak-detection.js.map +1 -0
- package/dist/checks/react/memory-leak-patterns.d.ts +27 -0
- package/dist/checks/react/memory-leak-patterns.d.ts.map +1 -0
- package/dist/checks/react/memory-leak-patterns.js +324 -0
- package/dist/checks/react/memory-leak-patterns.js.map +1 -0
- package/dist/checks/react/react19-compatibility.d.ts +14 -0
- package/dist/checks/react/react19-compatibility.d.ts.map +1 -0
- package/dist/checks/react/react19-compatibility.js +433 -0
- package/dist/checks/react/react19-compatibility.js.map +1 -0
- package/dist/checks/react/useeffect-loop-detector.d.ts +25 -0
- package/dist/checks/react/useeffect-loop-detector.d.ts.map +1 -0
- package/dist/checks/react/useeffect-loop-detector.js +216 -0
- package/dist/checks/react/useeffect-loop-detector.js.map +1 -0
- package/dist/checks/runtime/client-process-env-usage.d.ts +28 -0
- package/dist/checks/runtime/client-process-env-usage.d.ts.map +1 -0
- package/dist/checks/runtime/client-process-env-usage.js +190 -0
- package/dist/checks/runtime/client-process-env-usage.js.map +1 -0
- package/dist/checks/runtime/client-runtime-errors.d.ts +34 -0
- package/dist/checks/runtime/client-runtime-errors.d.ts.map +1 -0
- package/dist/checks/runtime/client-runtime-errors.js +308 -0
- package/dist/checks/runtime/client-runtime-errors.js.map +1 -0
- package/dist/checks/runtime/dev-error-monitoring-system.d.ts +22 -0
- package/dist/checks/runtime/dev-error-monitoring-system.d.ts.map +1 -0
- package/dist/checks/runtime/dev-error-monitoring-system.js +209 -0
- package/dist/checks/runtime/dev-error-monitoring-system.js.map +1 -0
- package/dist/checks/runtime/gtm-installation.d.ts +21 -0
- package/dist/checks/runtime/gtm-installation.d.ts.map +1 -0
- package/dist/checks/runtime/gtm-installation.js +341 -0
- package/dist/checks/runtime/gtm-installation.js.map +1 -0
- package/dist/checks/runtime/json-parse-safety.d.ts +22 -0
- package/dist/checks/runtime/json-parse-safety.d.ts.map +1 -0
- package/dist/checks/runtime/json-parse-safety.js +179 -0
- package/dist/checks/runtime/json-parse-safety.js.map +1 -0
- package/dist/checks/runtime/missing-public-env-import.d.ts +26 -0
- package/dist/checks/runtime/missing-public-env-import.d.ts.map +1 -0
- package/dist/checks/runtime/missing-public-env-import.js +175 -0
- package/dist/checks/runtime/missing-public-env-import.js.map +1 -0
- package/dist/checks/runtime/node-deprecations.d.ts +22 -0
- package/dist/checks/runtime/node-deprecations.d.ts.map +1 -0
- package/dist/checks/runtime/node-deprecations.js +157 -0
- package/dist/checks/runtime/node-deprecations.js.map +1 -0
- package/dist/checks/runtime/node25-compatibility.d.ts +28 -0
- package/dist/checks/runtime/node25-compatibility.d.ts.map +1 -0
- package/dist/checks/runtime/node25-compatibility.js +200 -0
- package/dist/checks/runtime/node25-compatibility.js.map +1 -0
- package/dist/checks/runtime/process-stdio-usage.d.ts +26 -0
- package/dist/checks/runtime/process-stdio-usage.d.ts.map +1 -0
- package/dist/checks/runtime/process-stdio-usage.js +179 -0
- package/dist/checks/runtime/process-stdio-usage.js.map +1 -0
- package/dist/checks/runtime/server-client-decimal.d.ts +25 -0
- package/dist/checks/runtime/server-client-decimal.d.ts.map +1 -0
- package/dist/checks/runtime/server-client-decimal.js +243 -0
- package/dist/checks/runtime/server-client-decimal.js.map +1 -0
- package/dist/checks/security/csrf-protection.d.ts +20 -0
- package/dist/checks/security/csrf-protection.d.ts.map +1 -0
- package/dist/checks/security/csrf-protection.js +249 -0
- package/dist/checks/security/csrf-protection.js.map +1 -0
- package/dist/checks/security/dependency-audit.d.ts +25 -0
- package/dist/checks/security/dependency-audit.d.ts.map +1 -0
- package/dist/checks/security/dependency-audit.js +219 -0
- package/dist/checks/security/dependency-audit.js.map +1 -0
- package/dist/checks/security/env-value-leakage.d.ts +21 -0
- package/dist/checks/security/env-value-leakage.d.ts.map +1 -0
- package/dist/checks/security/env-value-leakage.js +285 -0
- package/dist/checks/security/env-value-leakage.js.map +1 -0
- package/dist/checks/security/no-tracked-env-files.d.ts +18 -0
- package/dist/checks/security/no-tracked-env-files.d.ts.map +1 -0
- package/dist/checks/security/no-tracked-env-files.js +247 -0
- package/dist/checks/security/no-tracked-env-files.js.map +1 -0
- package/dist/checks/security/open-redirect-prevention.d.ts +19 -0
- package/dist/checks/security/open-redirect-prevention.d.ts.map +1 -0
- package/dist/checks/security/open-redirect-prevention.js +238 -0
- package/dist/checks/security/open-redirect-prevention.js.map +1 -0
- package/dist/checks/security/path-traversal-prevention.d.ts +25 -0
- package/dist/checks/security/path-traversal-prevention.d.ts.map +1 -0
- package/dist/checks/security/path-traversal-prevention.js +246 -0
- package/dist/checks/security/path-traversal-prevention.js.map +1 -0
- package/dist/checks/security/permission-security-validation.d.ts +19 -0
- package/dist/checks/security/permission-security-validation.d.ts.map +1 -0
- package/dist/checks/security/permission-security-validation.js +319 -0
- package/dist/checks/security/permission-security-validation.js.map +1 -0
- package/dist/checks/security/prod-command-detection.d.ts +17 -0
- package/dist/checks/security/prod-command-detection.d.ts.map +1 -0
- package/dist/checks/security/prod-command-detection.js +222 -0
- package/dist/checks/security/prod-command-detection.js.map +1 -0
- package/dist/checks/security/rate-limiting-validation.d.ts +19 -0
- package/dist/checks/security/rate-limiting-validation.d.ts.map +1 -0
- package/dist/checks/security/rate-limiting-validation.js +260 -0
- package/dist/checks/security/rate-limiting-validation.js.map +1 -0
- package/dist/checks/security/security-sla-enforcement.d.ts +34 -0
- package/dist/checks/security/security-sla-enforcement.d.ts.map +1 -0
- package/dist/checks/security/security-sla-enforcement.js +349 -0
- package/dist/checks/security/security-sla-enforcement.js.map +1 -0
- package/dist/checks/security/sensitive-data-exposure.d.ts +36 -0
- package/dist/checks/security/sensitive-data-exposure.d.ts.map +1 -0
- package/dist/checks/security/sensitive-data-exposure.js +540 -0
- package/dist/checks/security/sensitive-data-exposure.js.map +1 -0
- package/dist/checks/security/sql-injection-prevention.d.ts +25 -0
- package/dist/checks/security/sql-injection-prevention.d.ts.map +1 -0
- package/dist/checks/security/sql-injection-prevention.js +216 -0
- package/dist/checks/security/sql-injection-prevention.js.map +1 -0
- package/dist/checks/security/turnstile-scope-validation.d.ts +21 -0
- package/dist/checks/security/turnstile-scope-validation.d.ts.map +1 -0
- package/dist/checks/security/turnstile-scope-validation.js +237 -0
- package/dist/checks/security/turnstile-scope-validation.js.map +1 -0
- package/dist/checks/security/unvalidated-route-params.d.ts +28 -0
- package/dist/checks/security/unvalidated-route-params.d.ts.map +1 -0
- package/dist/checks/security/unvalidated-route-params.js +246 -0
- package/dist/checks/security/unvalidated-route-params.js.map +1 -0
- package/dist/checks/security/webhook-security-validation.d.ts +19 -0
- package/dist/checks/security/webhook-security-validation.d.ts.map +1 -0
- package/dist/checks/security/webhook-security-validation.js +258 -0
- package/dist/checks/security/webhook-security-validation.js.map +1 -0
- package/dist/checks/seo/missing-metadata.d.ts +26 -0
- package/dist/checks/seo/missing-metadata.d.ts.map +1 -0
- package/dist/checks/seo/missing-metadata.js +189 -0
- package/dist/checks/seo/missing-metadata.js.map +1 -0
- package/dist/checks/storage-keys-validation.d.ts +25 -0
- package/dist/checks/storage-keys-validation.d.ts.map +1 -0
- package/dist/checks/storage-keys-validation.js +312 -0
- package/dist/checks/storage-keys-validation.js.map +1 -0
- package/dist/checks/store-order-numbers.d.ts +19 -0
- package/dist/checks/store-order-numbers.d.ts.map +1 -0
- package/dist/checks/store-order-numbers.js +238 -0
- package/dist/checks/store-order-numbers.js.map +1 -0
- package/dist/checks/system/analyze-consolidation-candidates.d.ts +17 -0
- package/dist/checks/system/analyze-consolidation-candidates.d.ts.map +1 -0
- package/dist/checks/system/analyze-consolidation-candidates.js +221 -0
- package/dist/checks/system/analyze-consolidation-candidates.js.map +1 -0
- package/dist/checks/system/apply-universal-progress.d.ts +15 -0
- package/dist/checks/system/apply-universal-progress.d.ts.map +1 -0
- package/dist/checks/system/apply-universal-progress.js +292 -0
- package/dist/checks/system/apply-universal-progress.js.map +1 -0
- package/dist/checks/system/broken-preflight-detection.d.ts +30 -0
- package/dist/checks/system/broken-preflight-detection.d.ts.map +1 -0
- package/dist/checks/system/broken-preflight-detection.js +565 -0
- package/dist/checks/system/broken-preflight-detection.js.map +1 -0
- package/dist/checks/system/find-orphaned-preflights.d.ts +19 -0
- package/dist/checks/system/find-orphaned-preflights.d.ts.map +1 -0
- package/dist/checks/system/find-orphaned-preflights.js +157 -0
- package/dist/checks/system/find-orphaned-preflights.js.map +1 -0
- package/dist/checks/system/lint-preflight-consistency.d.ts +25 -0
- package/dist/checks/system/lint-preflight-consistency.d.ts.map +1 -0
- package/dist/checks/system/lint-preflight-consistency.js +374 -0
- package/dist/checks/system/lint-preflight-consistency.js.map +1 -0
- package/dist/checks/system/orphaned-scripts-detection.d.ts +24 -0
- package/dist/checks/system/orphaned-scripts-detection.d.ts.map +1 -0
- package/dist/checks/system/orphaned-scripts-detection.js +335 -0
- package/dist/checks/system/orphaned-scripts-detection.js.map +1 -0
- package/dist/checks/system/preflight-command-validation.d.ts +32 -0
- package/dist/checks/system/preflight-command-validation.d.ts.map +1 -0
- package/dist/checks/system/preflight-command-validation.js +631 -0
- package/dist/checks/system/preflight-command-validation.js.map +1 -0
- package/dist/checks/system/preflight-concurrency-support.d.ts +18 -0
- package/dist/checks/system/preflight-concurrency-support.d.ts.map +1 -0
- package/dist/checks/system/preflight-concurrency-support.js +207 -0
- package/dist/checks/system/preflight-concurrency-support.js.map +1 -0
- package/dist/checks/system/preflight-consolidation-safety.d.ts +16 -0
- package/dist/checks/system/preflight-consolidation-safety.d.ts.map +1 -0
- package/dist/checks/system/preflight-consolidation-safety.js +250 -0
- package/dist/checks/system/preflight-consolidation-safety.js.map +1 -0
- package/dist/checks/system/preflight-coverage-map.d.ts +26 -0
- package/dist/checks/system/preflight-coverage-map.d.ts.map +1 -0
- package/dist/checks/system/preflight-coverage-map.js +295 -0
- package/dist/checks/system/preflight-coverage-map.js.map +1 -0
- package/dist/checks/system/preflight-drift-detector.d.ts +28 -0
- package/dist/checks/system/preflight-drift-detector.d.ts.map +1 -0
- package/dist/checks/system/preflight-drift-detector.js +380 -0
- package/dist/checks/system/preflight-drift-detector.js.map +1 -0
- package/dist/checks/system/preflight-env-var-documentation.d.ts +25 -0
- package/dist/checks/system/preflight-env-var-documentation.d.ts.map +1 -0
- package/dist/checks/system/preflight-env-var-documentation.js +333 -0
- package/dist/checks/system/preflight-env-var-documentation.js.map +1 -0
- package/dist/checks/system/preflight-exit-code-validator.d.ts +30 -0
- package/dist/checks/system/preflight-exit-code-validator.d.ts.map +1 -0
- package/dist/checks/system/preflight-exit-code-validator.js +298 -0
- package/dist/checks/system/preflight-exit-code-validator.js.map +1 -0
- package/dist/checks/system/preflight-false-positive-tracker.d.ts +25 -0
- package/dist/checks/system/preflight-false-positive-tracker.d.ts.map +1 -0
- package/dist/checks/system/preflight-false-positive-tracker.js +262 -0
- package/dist/checks/system/preflight-false-positive-tracker.js.map +1 -0
- package/dist/checks/system/preflight-metadata-validator.d.ts +28 -0
- package/dist/checks/system/preflight-metadata-validator.d.ts.map +1 -0
- package/dist/checks/system/preflight-metadata-validator.js +220 -0
- package/dist/checks/system/preflight-metadata-validator.js.map +1 -0
- package/dist/checks/system/preflight-organization.d.ts +15 -0
- package/dist/checks/system/preflight-organization.d.ts.map +1 -0
- package/dist/checks/system/preflight-organization.js +212 -0
- package/dist/checks/system/preflight-organization.js.map +1 -0
- package/dist/checks/system/preflight-performance-optimizer.d.ts +17 -0
- package/dist/checks/system/preflight-performance-optimizer.d.ts.map +1 -0
- package/dist/checks/system/preflight-performance-optimizer.js +375 -0
- package/dist/checks/system/preflight-performance-optimizer.js.map +1 -0
- package/dist/checks/system/preflight-redundancy-detection.d.ts +28 -0
- package/dist/checks/system/preflight-redundancy-detection.d.ts.map +1 -0
- package/dist/checks/system/preflight-redundancy-detection.js +1168 -0
- package/dist/checks/system/preflight-redundancy-detection.js.map +1 -0
- package/dist/checks/system/preflight-reporting-standards.d.ts +17 -0
- package/dist/checks/system/preflight-reporting-standards.d.ts.map +1 -0
- package/dist/checks/system/preflight-reporting-standards.js +315 -0
- package/dist/checks/system/preflight-reporting-standards.js.map +1 -0
- package/dist/checks/system/preflight-runtime-health.d.ts +29 -0
- package/dist/checks/system/preflight-runtime-health.d.ts.map +1 -0
- package/dist/checks/system/preflight-runtime-health.js +346 -0
- package/dist/checks/system/preflight-runtime-health.js.map +1 -0
- package/dist/checks/system/preflight-schema-validator.d.ts +23 -0
- package/dist/checks/system/preflight-schema-validator.d.ts.map +1 -0
- package/dist/checks/system/preflight-schema-validator.js +322 -0
- package/dist/checks/system/preflight-schema-validator.js.map +1 -0
- package/dist/checks/system/preflight-test-coverage.d.ts +24 -0
- package/dist/checks/system/preflight-test-coverage.d.ts.map +1 -0
- package/dist/checks/system/preflight-test-coverage.js +242 -0
- package/dist/checks/system/preflight-test-coverage.js.map +1 -0
- package/dist/checks/system/script-path-validation.d.ts +30 -0
- package/dist/checks/system/script-path-validation.d.ts.map +1 -0
- package/dist/checks/system/script-path-validation.js +351 -0
- package/dist/checks/system/script-path-validation.js.map +1 -0
- package/dist/checks/system/stale-preflight-detection.d.ts +15 -0
- package/dist/checks/system/stale-preflight-detection.d.ts.map +1 -0
- package/dist/checks/system/stale-preflight-detection.js +200 -0
- package/dist/checks/system/stale-preflight-detection.js.map +1 -0
- package/dist/checks/system/universal-progress-reporter.d.ts +92 -0
- package/dist/checks/system/universal-progress-reporter.d.ts.map +1 -0
- package/dist/checks/system/universal-progress-reporter.js +272 -0
- package/dist/checks/system/universal-progress-reporter.js.map +1 -0
- package/dist/checks/tailwind/tailwind4-compatibility.d.ts +31 -0
- package/dist/checks/tailwind/tailwind4-compatibility.d.ts.map +1 -0
- package/dist/checks/tailwind/tailwind4-compatibility.js +490 -0
- package/dist/checks/tailwind/tailwind4-compatibility.js.map +1 -0
- package/dist/checks/tanstack/tanstack-query-compatibility.d.ts +31 -0
- package/dist/checks/tanstack/tanstack-query-compatibility.d.ts.map +1 -0
- package/dist/checks/tanstack/tanstack-query-compatibility.js +434 -0
- package/dist/checks/tanstack/tanstack-query-compatibility.js.map +1 -0
- package/dist/checks/ui/accessibility-critical.d.ts +18 -0
- package/dist/checks/ui/accessibility-critical.d.ts.map +1 -0
- package/dist/checks/ui/accessibility-critical.js +357 -0
- package/dist/checks/ui/accessibility-critical.js.map +1 -0
- package/dist/checks/ui/alert-button-gap.d.ts +26 -0
- package/dist/checks/ui/alert-button-gap.d.ts.map +1 -0
- package/dist/checks/ui/alert-button-gap.js +215 -0
- package/dist/checks/ui/alert-button-gap.js.map +1 -0
- package/dist/checks/ui/breadcrumb-consistency.d.ts +18 -0
- package/dist/checks/ui/breadcrumb-consistency.d.ts.map +1 -0
- package/dist/checks/ui/breadcrumb-consistency.js +237 -0
- package/dist/checks/ui/breadcrumb-consistency.js.map +1 -0
- package/dist/checks/ui/button-group-gap.d.ts +22 -0
- package/dist/checks/ui/button-group-gap.d.ts.map +1 -0
- package/dist/checks/ui/button-group-gap.js +194 -0
- package/dist/checks/ui/button-group-gap.js.map +1 -0
- package/dist/checks/ui/button-icon-prop.d.ts +40 -0
- package/dist/checks/ui/button-icon-prop.d.ts.map +1 -0
- package/dist/checks/ui/button-icon-prop.js +248 -0
- package/dist/checks/ui/button-icon-prop.js.map +1 -0
- package/dist/checks/ui/card-section-content-spacing.d.ts +31 -0
- package/dist/checks/ui/card-section-content-spacing.d.ts.map +1 -0
- package/dist/checks/ui/card-section-content-spacing.js +260 -0
- package/dist/checks/ui/card-section-content-spacing.js.map +1 -0
- package/dist/checks/ui/color-check.d.ts +7 -0
- package/dist/checks/ui/color-check.d.ts.map +1 -0
- package/dist/checks/ui/color-check.js +105 -0
- package/dist/checks/ui/color-check.js.map +1 -0
- package/dist/checks/ui/component-library-quality.d.ts +19 -0
- package/dist/checks/ui/component-library-quality.d.ts.map +1 -0
- package/dist/checks/ui/component-library-quality.js +231 -0
- package/dist/checks/ui/component-library-quality.js.map +1 -0
- package/dist/checks/ui/component-prop-validation.d.ts +22 -0
- package/dist/checks/ui/component-prop-validation.d.ts.map +1 -0
- package/dist/checks/ui/component-prop-validation.js +271 -0
- package/dist/checks/ui/component-prop-validation.js.map +1 -0
- package/dist/checks/ui/console-log-check.d.ts +7 -0
- package/dist/checks/ui/console-log-check.d.ts.map +1 -0
- package/dist/checks/ui/console-log-check.js +126 -0
- package/dist/checks/ui/console-log-check.js.map +1 -0
- package/dist/checks/ui/css-grid-gap-check.d.ts +24 -0
- package/dist/checks/ui/css-grid-gap-check.d.ts.map +1 -0
- package/dist/checks/ui/css-grid-gap-check.js +314 -0
- package/dist/checks/ui/css-grid-gap-check.js.map +1 -0
- package/dist/checks/ui/css-token-syntax.d.ts +22 -0
- package/dist/checks/ui/css-token-syntax.d.ts.map +1 -0
- package/dist/checks/ui/css-token-syntax.js +386 -0
- package/dist/checks/ui/css-token-syntax.js.map +1 -0
- package/dist/checks/ui/dark-mode-support.d.ts +95 -0
- package/dist/checks/ui/dark-mode-support.d.ts.map +1 -0
- package/dist/checks/ui/dark-mode-support.js +702 -0
- package/dist/checks/ui/dark-mode-support.js.map +1 -0
- package/dist/checks/ui/dashboard-section-patterns.d.ts +85 -0
- package/dist/checks/ui/dashboard-section-patterns.d.ts.map +1 -0
- package/dist/checks/ui/dashboard-section-patterns.js +1751 -0
- package/dist/checks/ui/dashboard-section-patterns.js.map +1 -0
- package/dist/checks/ui/dashboard-ui.d.ts +28 -0
- package/dist/checks/ui/dashboard-ui.d.ts.map +1 -0
- package/dist/checks/ui/dashboard-ui.js +503 -0
- package/dist/checks/ui/dashboard-ui.js.map +1 -0
- package/dist/checks/ui/dead-action-detector.d.ts +24 -0
- package/dist/checks/ui/dead-action-detector.d.ts.map +1 -0
- package/dist/checks/ui/dead-action-detector.js +457 -0
- package/dist/checks/ui/dead-action-detector.js.map +1 -0
- package/dist/checks/ui/doubled-padding-check.d.ts +21 -0
- package/dist/checks/ui/doubled-padding-check.d.ts.map +1 -0
- package/dist/checks/ui/doubled-padding-check.js +233 -0
- package/dist/checks/ui/doubled-padding-check.js.map +1 -0
- package/dist/checks/ui/dropdown-positioning-check.d.ts +26 -0
- package/dist/checks/ui/dropdown-positioning-check.d.ts.map +1 -0
- package/dist/checks/ui/dropdown-positioning-check.js +283 -0
- package/dist/checks/ui/dropdown-positioning-check.js.map +1 -0
- package/dist/checks/ui/feature-page-hero-consistency.d.ts +29 -0
- package/dist/checks/ui/feature-page-hero-consistency.d.ts.map +1 -0
- package/dist/checks/ui/feature-page-hero-consistency.js +228 -0
- package/dist/checks/ui/feature-page-hero-consistency.js.map +1 -0
- package/dist/checks/ui/filter-loading-states.d.ts +19 -0
- package/dist/checks/ui/filter-loading-states.d.ts.map +1 -0
- package/dist/checks/ui/filter-loading-states.js +193 -0
- package/dist/checks/ui/filter-loading-states.js.map +1 -0
- package/dist/checks/ui/flex-icon-text-gap.d.ts +30 -0
- package/dist/checks/ui/flex-icon-text-gap.d.ts.map +1 -0
- package/dist/checks/ui/flex-icon-text-gap.js +371 -0
- package/dist/checks/ui/flex-icon-text-gap.js.map +1 -0
- package/dist/checks/ui/form-control-layout-check.d.ts +30 -0
- package/dist/checks/ui/form-control-layout-check.d.ts.map +1 -0
- package/dist/checks/ui/form-control-layout-check.js +287 -0
- package/dist/checks/ui/form-control-layout-check.js.map +1 -0
- package/dist/checks/ui/form-field-consistency.d.ts +29 -0
- package/dist/checks/ui/form-field-consistency.d.ts.map +1 -0
- package/dist/checks/ui/form-field-consistency.js +270 -0
- package/dist/checks/ui/form-field-consistency.js.map +1 -0
- package/dist/checks/ui/gap-spacing-consistency.d.ts +35 -0
- package/dist/checks/ui/gap-spacing-consistency.d.ts.map +1 -0
- package/dist/checks/ui/gap-spacing-consistency.js +316 -0
- package/dist/checks/ui/gap-spacing-consistency.js.map +1 -0
- package/dist/checks/ui/header-action-text-color.d.ts +19 -0
- package/dist/checks/ui/header-action-text-color.d.ts.map +1 -0
- package/dist/checks/ui/header-action-text-color.js +122 -0
- package/dist/checks/ui/header-action-text-color.js.map +1 -0
- package/dist/checks/ui/header-vertical-alignment.d.ts +33 -0
- package/dist/checks/ui/header-vertical-alignment.d.ts.map +1 -0
- package/dist/checks/ui/header-vertical-alignment.js +205 -0
- package/dist/checks/ui/header-vertical-alignment.js.map +1 -0
- package/dist/checks/ui/image-component-check.d.ts +7 -0
- package/dist/checks/ui/image-component-check.d.ts.map +1 -0
- package/dist/checks/ui/image-component-check.js +92 -0
- package/dist/checks/ui/image-component-check.js.map +1 -0
- package/dist/checks/ui/inline-flex-gap-check.d.ts +26 -0
- package/dist/checks/ui/inline-flex-gap-check.d.ts.map +1 -0
- package/dist/checks/ui/inline-flex-gap-check.js +196 -0
- package/dist/checks/ui/inline-flex-gap-check.js.map +1 -0
- package/dist/checks/ui/inline-to-tailwind-check.d.ts +47 -0
- package/dist/checks/ui/inline-to-tailwind-check.d.ts.map +1 -0
- package/dist/checks/ui/inline-to-tailwind-check.js +329 -0
- package/dist/checks/ui/inline-to-tailwind-check.js.map +1 -0
- package/dist/checks/ui/input-label-gap.d.ts +34 -0
- package/dist/checks/ui/input-label-gap.d.ts.map +1 -0
- package/dist/checks/ui/input-label-gap.js +347 -0
- package/dist/checks/ui/input-label-gap.js.map +1 -0
- package/dist/checks/ui/input-width-consistency.d.ts +53 -0
- package/dist/checks/ui/input-width-consistency.d.ts.map +1 -0
- package/dist/checks/ui/input-width-consistency.js +342 -0
- package/dist/checks/ui/input-width-consistency.js.map +1 -0
- package/dist/checks/ui/js-responsive-visibility.d.ts +31 -0
- package/dist/checks/ui/js-responsive-visibility.d.ts.map +1 -0
- package/dist/checks/ui/js-responsive-visibility.js +213 -0
- package/dist/checks/ui/js-responsive-visibility.js.map +1 -0
- package/dist/checks/ui/label-description-spacing.d.ts +30 -0
- package/dist/checks/ui/label-description-spacing.d.ts.map +1 -0
- package/dist/checks/ui/label-description-spacing.js +285 -0
- package/dist/checks/ui/label-description-spacing.js.map +1 -0
- package/dist/checks/ui/layout-shift-detection.d.ts +31 -0
- package/dist/checks/ui/layout-shift-detection.d.ts.map +1 -0
- package/dist/checks/ui/layout-shift-detection.js +398 -0
- package/dist/checks/ui/layout-shift-detection.js.map +1 -0
- package/dist/checks/ui/margin-in-gap-container.d.ts +25 -0
- package/dist/checks/ui/margin-in-gap-container.d.ts.map +1 -0
- package/dist/checks/ui/margin-in-gap-container.js +619 -0
- package/dist/checks/ui/margin-in-gap-container.js.map +1 -0
- package/dist/checks/ui/mega-menu-dropdown-position.d.ts +25 -0
- package/dist/checks/ui/mega-menu-dropdown-position.d.ts.map +1 -0
- package/dist/checks/ui/mega-menu-dropdown-position.js +230 -0
- package/dist/checks/ui/mega-menu-dropdown-position.js.map +1 -0
- package/dist/checks/ui/mega-menu-scrollbar-overlap.d.ts +24 -0
- package/dist/checks/ui/mega-menu-scrollbar-overlap.d.ts.map +1 -0
- package/dist/checks/ui/mega-menu-scrollbar-overlap.js +283 -0
- package/dist/checks/ui/mega-menu-scrollbar-overlap.js.map +1 -0
- package/dist/checks/ui/mega-menu-spacing-check.d.ts +21 -0
- package/dist/checks/ui/mega-menu-spacing-check.d.ts.map +1 -0
- package/dist/checks/ui/mega-menu-spacing-check.js +244 -0
- package/dist/checks/ui/mega-menu-spacing-check.js.map +1 -0
- package/dist/checks/ui/notification-feedback-check.d.ts +37 -0
- package/dist/checks/ui/notification-feedback-check.d.ts.map +1 -0
- package/dist/checks/ui/notification-feedback-check.js +552 -0
- package/dist/checks/ui/notification-feedback-check.js.map +1 -0
- package/dist/checks/ui/overflow-clipping-detection.d.ts +17 -0
- package/dist/checks/ui/overflow-clipping-detection.d.ts.map +1 -0
- package/dist/checks/ui/overflow-clipping-detection.js +198 -0
- package/dist/checks/ui/overflow-clipping-detection.js.map +1 -0
- package/dist/checks/ui/page-layout-spacing.d.ts +29 -0
- package/dist/checks/ui/page-layout-spacing.d.ts.map +1 -0
- package/dist/checks/ui/page-layout-spacing.js +604 -0
- package/dist/checks/ui/page-layout-spacing.js.map +1 -0
- package/dist/checks/ui/path-alias-check.d.ts +7 -0
- package/dist/checks/ui/path-alias-check.d.ts.map +1 -0
- package/dist/checks/ui/path-alias-check.js +95 -0
- package/dist/checks/ui/path-alias-check.js.map +1 -0
- package/dist/checks/ui/product-image-animations.d.ts +70 -0
- package/dist/checks/ui/product-image-animations.d.ts.map +1 -0
- package/dist/checks/ui/product-image-animations.js +332 -0
- package/dist/checks/ui/product-image-animations.js.map +1 -0
- package/dist/checks/ui/search-width-consistency.d.ts +53 -0
- package/dist/checks/ui/search-width-consistency.d.ts.map +1 -0
- package/dist/checks/ui/search-width-consistency.js +276 -0
- package/dist/checks/ui/search-width-consistency.js.map +1 -0
- package/dist/checks/ui/section-spacing-check.d.ts +30 -0
- package/dist/checks/ui/section-spacing-check.d.ts.map +1 -0
- package/dist/checks/ui/section-spacing-check.js +248 -0
- package/dist/checks/ui/section-spacing-check.js.map +1 -0
- package/dist/checks/ui/sibling-spacing-check.d.ts +25 -0
- package/dist/checks/ui/sibling-spacing-check.d.ts.map +1 -0
- package/dist/checks/ui/sibling-spacing-check.js +329 -0
- package/dist/checks/ui/sibling-spacing-check.js.map +1 -0
- package/dist/checks/ui/sidebar-layout-gap.d.ts +34 -0
- package/dist/checks/ui/sidebar-layout-gap.d.ts.map +1 -0
- package/dist/checks/ui/sidebar-layout-gap.js +200 -0
- package/dist/checks/ui/sidebar-layout-gap.js.map +1 -0
- package/dist/checks/ui/skeleton-size-consistency.d.ts +50 -0
- package/dist/checks/ui/skeleton-size-consistency.d.ts.map +1 -0
- package/dist/checks/ui/skeleton-size-consistency.js +1239 -0
- package/dist/checks/ui/skeleton-size-consistency.js.map +1 -0
- package/dist/checks/ui/spacing-check.d.ts +7 -0
- package/dist/checks/ui/spacing-check.d.ts.map +1 -0
- package/dist/checks/ui/spacing-check.js +100 -0
- package/dist/checks/ui/spacing-check.js.map +1 -0
- package/dist/checks/ui/styling-standards.d.ts +71 -0
- package/dist/checks/ui/styling-standards.d.ts.map +1 -0
- package/dist/checks/ui/styling-standards.js +567 -0
- package/dist/checks/ui/styling-standards.js.map +1 -0
- package/dist/checks/ui/tailwind-consistency.d.ts +26 -0
- package/dist/checks/ui/tailwind-consistency.d.ts.map +1 -0
- package/dist/checks/ui/tailwind-consistency.js +345 -0
- package/dist/checks/ui/tailwind-consistency.js.map +1 -0
- package/dist/checks/ui/tailwind-contrast-check.d.ts +44 -0
- package/dist/checks/ui/tailwind-contrast-check.d.ts.map +1 -0
- package/dist/checks/ui/tailwind-contrast-check.js +457 -0
- package/dist/checks/ui/tailwind-contrast-check.js.map +1 -0
- package/dist/checks/ui/text-button-group-gap.d.ts +29 -0
- package/dist/checks/ui/text-button-group-gap.d.ts.map +1 -0
- package/dist/checks/ui/text-button-group-gap.js +242 -0
- package/dist/checks/ui/text-button-group-gap.js.map +1 -0
- package/dist/checks/ui/typography-check.d.ts +7 -0
- package/dist/checks/ui/typography-check.d.ts.map +1 -0
- package/dist/checks/ui/typography-check.js +114 -0
- package/dist/checks/ui/typography-check.js.map +1 -0
- package/dist/checks/ui/z-index-check.d.ts +25 -0
- package/dist/checks/ui/z-index-check.d.ts.map +1 -0
- package/dist/checks/ui/z-index-check.js +663 -0
- package/dist/checks/ui/z-index-check.js.map +1 -0
- package/dist/checks/zod/zod4-compatibility.d.ts +31 -0
- package/dist/checks/zod/zod4-compatibility.d.ts.map +1 -0
- package/dist/checks/zod/zod4-compatibility.js +412 -0
- package/dist/checks/zod/zod4-compatibility.js.map +1 -0
- package/dist/core/categories.d.ts +40 -0
- package/dist/core/categories.d.ts.map +1 -0
- package/dist/core/categories.js +153 -0
- package/dist/core/categories.js.map +1 -0
- package/dist/core/config.d.ts +87 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +176 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/types.d.ts +194 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +24 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/runner.d.ts +33 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +457 -0
- package/dist/runner.js.map +1 -0
- package/dist/shared/concurrency-config.d.ts +57 -0
- package/dist/shared/concurrency-config.d.ts.map +1 -0
- package/dist/shared/concurrency-config.js +128 -0
- package/dist/shared/concurrency-config.js.map +1 -0
- package/dist/shared/design-tokens-config.d.ts +140 -0
- package/dist/shared/design-tokens-config.d.ts.map +1 -0
- package/dist/shared/design-tokens-config.js +290 -0
- package/dist/shared/design-tokens-config.js.map +1 -0
- package/dist/shared/design-tokens.d.ts +771 -0
- package/dist/shared/design-tokens.d.ts.map +1 -0
- package/dist/shared/design-tokens.js +873 -0
- package/dist/shared/design-tokens.js.map +1 -0
- package/dist/shared/file-cache.d.ts +379 -0
- package/dist/shared/file-cache.d.ts.map +1 -0
- package/dist/shared/file-cache.js +744 -0
- package/dist/shared/file-cache.js.map +1 -0
- package/dist/shared/glob-patterns.d.ts +200 -0
- package/dist/shared/glob-patterns.d.ts.map +1 -0
- package/dist/shared/glob-patterns.js +291 -0
- package/dist/shared/glob-patterns.js.map +1 -0
- package/dist/shared/layout-constants.d.ts +101 -0
- package/dist/shared/layout-constants.d.ts.map +1 -0
- package/dist/shared/layout-constants.js +172 -0
- package/dist/shared/layout-constants.js.map +1 -0
- package/dist/utils/config-loader.d.ts +34 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +169 -0
- package/dist/utils/config-loader.js.map +1 -0
- package/dist/utils/console-chars.d.ts +388 -0
- package/dist/utils/console-chars.d.ts.map +1 -0
- package/dist/utils/console-chars.js +378 -0
- package/dist/utils/console-chars.js.map +1 -0
- package/dist/utils/file-scanner.d.ts +73 -0
- package/dist/utils/file-scanner.d.ts.map +1 -0
- package/dist/utils/file-scanner.js +203 -0
- package/dist/utils/file-scanner.js.map +1 -0
- package/dist/utils/findings-writer.d.ts +32 -0
- package/dist/utils/findings-writer.d.ts.map +1 -0
- package/dist/utils/findings-writer.js +69 -0
- package/dist/utils/findings-writer.js.map +1 -0
- package/dist/utils/plugin-loader.d.ts +76 -0
- package/dist/utils/plugin-loader.d.ts.map +1 -0
- package/dist/utils/plugin-loader.js +235 -0
- package/dist/utils/plugin-loader.js.map +1 -0
- package/dist/utils/preflight-runner.d.ts +29 -0
- package/dist/utils/preflight-runner.d.ts.map +1 -0
- package/dist/utils/preflight-runner.js +131 -0
- package/dist/utils/preflight-runner.js.map +1 -0
- package/dist/utils/progress-reporter.d.ts +92 -0
- package/dist/utils/progress-reporter.d.ts.map +1 -0
- package/dist/utils/progress-reporter.js +272 -0
- package/dist/utils/progress-reporter.js.map +1 -0
- package/package.json +78 -0
- package/templates/domain-specific/trading-card-system/tcg-seed-validation.ts +197 -0
- package/templates/new-check.ts.template +205 -0
- package/templates/preflight.config.ts.template +103 -0
|
@@ -0,0 +1,1239 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Skeleton Size Consistency Preflight Check (Enhanced)
|
|
5
|
+
*
|
|
6
|
+
* Comprehensive validation that skeleton components match their corresponding
|
|
7
|
+
* real components to prevent Cumulative Layout Shift (CLS) during loading.
|
|
8
|
+
*
|
|
9
|
+
* BLOCKING: No (warning only - helps catch CLS issues before they ship)
|
|
10
|
+
*
|
|
11
|
+
* Run: pnpm preflight:skeleton-size
|
|
12
|
+
*
|
|
13
|
+
* Checks:
|
|
14
|
+
* 1. KNOWN MAPPINGS - Validates skeleton heights against expected component heights
|
|
15
|
+
* 2. STRUCTURAL MAPPINGS - Validates skeleton elements match component structure
|
|
16
|
+
* - Detects missing placeholders for component elements
|
|
17
|
+
* - Detects stale placeholders for removed elements
|
|
18
|
+
* - Compares action button counts between skeleton and component
|
|
19
|
+
* 3. AUTO-DISCOVERY - Finds skeleton/component pairs by naming convention
|
|
20
|
+
* 4. RESPONSIVE ANALYSIS - Compares mobile vs desktop height definitions
|
|
21
|
+
* 5. STRUCTURE MATCHING - Validates loading.tsx structure matches page structure
|
|
22
|
+
* 6. ELEMENT COUNT - Checks skeleton element counts match actual components
|
|
23
|
+
* 7. GRID PATTERNS - Validates grid column counts match between skeleton and page
|
|
24
|
+
* 8. DOCUMENTATION - Ensures skeletons document what they mirror
|
|
25
|
+
* 9. SPACING TOKENS - Validates consistent spacing between skeleton and component
|
|
26
|
+
* 10. DESIGN TOKEN CONSISTENCY - Validates CSS variables match between pairs
|
|
27
|
+
* 11. BORDER/SHADOW CONSISTENCY - Validates visual styling matches
|
|
28
|
+
* 12. ARIA/ACCESSIBILITY - Validates skeleton has proper aria-labels
|
|
29
|
+
* 13. ICON PLACEHOLDER VALIDATION - Validates icon placeholders match actual icons
|
|
30
|
+
*/
|
|
31
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
32
|
+
if (k2 === undefined) k2 = k;
|
|
33
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
34
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
35
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
36
|
+
}
|
|
37
|
+
Object.defineProperty(o, k2, desc);
|
|
38
|
+
}) : (function(o, m, k, k2) {
|
|
39
|
+
if (k2 === undefined) k2 = k;
|
|
40
|
+
o[k2] = m[k];
|
|
41
|
+
}));
|
|
42
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
43
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
44
|
+
}) : function(o, v) {
|
|
45
|
+
o["default"] = v;
|
|
46
|
+
});
|
|
47
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
48
|
+
var ownKeys = function(o) {
|
|
49
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
50
|
+
var ar = [];
|
|
51
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
52
|
+
return ar;
|
|
53
|
+
};
|
|
54
|
+
return ownKeys(o);
|
|
55
|
+
};
|
|
56
|
+
return function (mod) {
|
|
57
|
+
if (mod && mod.__esModule) return mod;
|
|
58
|
+
var result = {};
|
|
59
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
60
|
+
__setModuleDefault(result, mod);
|
|
61
|
+
return result;
|
|
62
|
+
};
|
|
63
|
+
})();
|
|
64
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
65
|
+
exports.tags = exports.description = exports.blocking = exports.category = exports.name = exports.id = void 0;
|
|
66
|
+
exports.checkSkeletonSizeConsistency = checkSkeletonSizeConsistency;
|
|
67
|
+
const fs = __importStar(require("fs"));
|
|
68
|
+
const glob_1 = require("glob");
|
|
69
|
+
const path = __importStar(require("path"));
|
|
70
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
71
|
+
const glob_patterns_1 = require("../../shared/glob-patterns");
|
|
72
|
+
// Check metadata
|
|
73
|
+
exports.id = "ui/skeleton-size-consistency";
|
|
74
|
+
exports.name = "Skeleton Size Consistency";
|
|
75
|
+
exports.category = "ui";
|
|
76
|
+
exports.blocking = false;
|
|
77
|
+
exports.description = "Skeleton Size Consistency Preflight Check (Enhanced)";
|
|
78
|
+
exports.tags = ["ui"];
|
|
79
|
+
// CONSTANTS
|
|
80
|
+
const TAILWIND_SPACING = {
|
|
81
|
+
"0": 0,
|
|
82
|
+
px: 1,
|
|
83
|
+
"0.5": 2,
|
|
84
|
+
"1": 4,
|
|
85
|
+
"1.5": 6,
|
|
86
|
+
"2": 8,
|
|
87
|
+
"2.5": 10,
|
|
88
|
+
"3": 12,
|
|
89
|
+
"3.5": 14,
|
|
90
|
+
"4": 16,
|
|
91
|
+
"5": 20,
|
|
92
|
+
"6": 24,
|
|
93
|
+
"7": 28,
|
|
94
|
+
"8": 32,
|
|
95
|
+
"9": 36,
|
|
96
|
+
"10": 40,
|
|
97
|
+
"11": 44,
|
|
98
|
+
"12": 48,
|
|
99
|
+
"14": 56,
|
|
100
|
+
"16": 64,
|
|
101
|
+
"20": 80,
|
|
102
|
+
"24": 96,
|
|
103
|
+
"28": 112,
|
|
104
|
+
"32": 128,
|
|
105
|
+
"36": 144,
|
|
106
|
+
"40": 160,
|
|
107
|
+
"44": 176,
|
|
108
|
+
"48": 192,
|
|
109
|
+
"52": 208,
|
|
110
|
+
"56": 224,
|
|
111
|
+
"60": 240,
|
|
112
|
+
"64": 256,
|
|
113
|
+
"72": 288,
|
|
114
|
+
"80": 320,
|
|
115
|
+
"96": 384,
|
|
116
|
+
};
|
|
117
|
+
const BREAKPOINTS = ["base", "sm", "md", "lg", "xl", "2xl"];
|
|
118
|
+
// Known skeleton-to-component mappings with expected heights
|
|
119
|
+
const KNOWN_MAPPINGS = [
|
|
120
|
+
{
|
|
121
|
+
skeleton: "components/shared/HeaderSkeleton.tsx",
|
|
122
|
+
component: "components/UnifiedHeader.tsx",
|
|
123
|
+
name: "NavigationHeader",
|
|
124
|
+
expectedHeight: { min: 100, max: 130 },
|
|
125
|
+
},
|
|
126
|
+
];
|
|
127
|
+
const STRUCTURAL_MAPPINGS = [
|
|
128
|
+
{
|
|
129
|
+
skeleton: "components/shared/HeaderSkeleton.tsx",
|
|
130
|
+
component: "components/UnifiedHeader.tsx",
|
|
131
|
+
name: "HeaderSkeleton",
|
|
132
|
+
expectedElements: [
|
|
133
|
+
{
|
|
134
|
+
// SellButton should have a skeleton placeholder on desktop
|
|
135
|
+
skeletonPattern: /SellButton|width={80}.*hidden sm:block.*rounded-lg/s,
|
|
136
|
+
componentPattern: /<SellButton|showSellButton/,
|
|
137
|
+
description: "SellButton placeholder (desktop)",
|
|
138
|
+
breakpoint: "sm",
|
|
139
|
+
severity: "warning",
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
// Theme toggle should have skeleton on desktop
|
|
143
|
+
skeletonPattern: /Theme toggle|hidden sm:block.*circular/s,
|
|
144
|
+
componentPattern: /toggleTheme|<HeaderIconButton.*Moon|Sun/s,
|
|
145
|
+
description: "Theme toggle placeholder (desktop)",
|
|
146
|
+
breakpoint: "sm",
|
|
147
|
+
severity: "warning",
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
// Mobile search should have skeleton on mobile
|
|
151
|
+
skeletonPattern: /Mobile search|block md:hidden.*circular/s,
|
|
152
|
+
componentPattern: /<MobileSearch|showMobileSearchButton/,
|
|
153
|
+
description: "Mobile search placeholder",
|
|
154
|
+
breakpoint: "base",
|
|
155
|
+
severity: "warning",
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
// Core action buttons: notifications, wishlist, cart, user
|
|
159
|
+
skeletonPattern: /NotificationsBell|circular.*width={40}.*height={40}/s,
|
|
160
|
+
componentPattern: /<NotificationsBell/,
|
|
161
|
+
description: "NotificationsBell placeholder",
|
|
162
|
+
breakpoint: "base",
|
|
163
|
+
severity: "warning",
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
skeletonPattern: /WishlistDrawer|circular.*width={40}.*height={40}/s,
|
|
167
|
+
componentPattern: /<WishlistDrawer/,
|
|
168
|
+
description: "WishlistDrawer placeholder",
|
|
169
|
+
breakpoint: "base",
|
|
170
|
+
severity: "warning",
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
skeletonPattern: /CartDrawer|circular.*width={40}.*height={40}/s,
|
|
174
|
+
componentPattern: /<CartDrawer/,
|
|
175
|
+
description: "CartDrawer placeholder",
|
|
176
|
+
breakpoint: "base",
|
|
177
|
+
severity: "warning",
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
skeletonPattern: /UserMenu|circular.*width={40}.*height={40}/s,
|
|
181
|
+
componentPattern: /<UserMenu/,
|
|
182
|
+
description: "UserMenu placeholder",
|
|
183
|
+
breakpoint: "base",
|
|
184
|
+
severity: "warning",
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
// Desktop search bar
|
|
188
|
+
skeletonPattern: /hidden md:block.*Search|SearchBar/s,
|
|
189
|
+
componentPattern: /<SearchBar|<DesktopSearchWrapper/,
|
|
190
|
+
description: "Desktop search bar placeholder",
|
|
191
|
+
breakpoint: "md",
|
|
192
|
+
severity: "warning",
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
// Navigation/MegaMenu
|
|
196
|
+
skeletonPattern: /<nav|MegaMenu/,
|
|
197
|
+
componentPattern: /<MegaMenu|showNavigation/,
|
|
198
|
+
description: "Navigation/MegaMenu placeholder",
|
|
199
|
+
breakpoint: "base",
|
|
200
|
+
severity: "warning",
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
skeleton: "components/shared/HeaderSkeleton.tsx",
|
|
206
|
+
component: "components/shared/UnifiedBreadcrumbs.tsx",
|
|
207
|
+
name: "BreadcrumbSkeleton",
|
|
208
|
+
expectedElements: [
|
|
209
|
+
{
|
|
210
|
+
// ChevronRight separator (not "/" slash)
|
|
211
|
+
skeletonPattern: /ChevronRight|m9 18 6-6-6-6|path.*d="m9 18/,
|
|
212
|
+
componentPattern: /<ChevronRight/,
|
|
213
|
+
description: "ChevronRight separator icon",
|
|
214
|
+
breakpoint: "base",
|
|
215
|
+
severity: "warning",
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
// Home icon placeholder for first breadcrumb item
|
|
219
|
+
skeletonPattern: /Home icon|width={16}.*height={16}.*rounded/s,
|
|
220
|
+
componentPattern: /<Home|showHomeIcon/,
|
|
221
|
+
description: "Home icon placeholder",
|
|
222
|
+
breakpoint: "base",
|
|
223
|
+
severity: "warning",
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
// Background should be bg-secondary (not bg-primary)
|
|
227
|
+
skeletonPattern: /bg-secondary|--bg-secondary/,
|
|
228
|
+
componentPattern: /bg-secondary|--bg-secondary/,
|
|
229
|
+
description: "Background color (bg-secondary)",
|
|
230
|
+
breakpoint: "base",
|
|
231
|
+
severity: "warning",
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
// Proper nav element with aria-label
|
|
235
|
+
skeletonPattern: /<nav.*aria-label/s,
|
|
236
|
+
componentPattern: /<nav.*aria-label/s,
|
|
237
|
+
description: "Accessible nav element",
|
|
238
|
+
breakpoint: "base",
|
|
239
|
+
severity: "warning",
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
];
|
|
244
|
+
// Layout components that include UnifiedHeader by default
|
|
245
|
+
const LAYOUTS_WITH_HEADER = [
|
|
246
|
+
"DashboardPageLayout",
|
|
247
|
+
"StandardPageLayout",
|
|
248
|
+
"ContentLayout",
|
|
249
|
+
"SellerPageLayout",
|
|
250
|
+
"AccountPageLayout",
|
|
251
|
+
"AdminPageLayout",
|
|
252
|
+
"CategoryBrowseLoadingSkeleton",
|
|
253
|
+
"MarketplaceGridLoadingSkeleton",
|
|
254
|
+
];
|
|
255
|
+
// EXTRACTION FUNCTIONS
|
|
256
|
+
function extractHeights(content, containerOnly = true) {
|
|
257
|
+
const heights = [];
|
|
258
|
+
const lines = content.split("\n");
|
|
259
|
+
lines.forEach((line, index) => {
|
|
260
|
+
if (line.trim().startsWith("//") || line.trim().startsWith("*"))
|
|
261
|
+
return;
|
|
262
|
+
// Skip lines that are skeleton element props (height={...} on UnifiedSkeleton)
|
|
263
|
+
if (containerOnly && (line.includes("UnifiedSkeleton") || line.includes("<Skeleton"))) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
// Skip lines with height as a prop (height={32}, height: 32, etc.)
|
|
267
|
+
if (containerOnly && /height[=:]\s*[{"]?\d+[}"]?/.test(line) && !line.includes("minHeight")) {
|
|
268
|
+
// Only skip if it looks like a component prop, not a style object for a container
|
|
269
|
+
if (line.includes("variant=") || line.includes("width=")) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Extract Tailwind height classes with breakpoint prefixes
|
|
274
|
+
// Only match min-h-* for containers (h-* is usually for specific elements)
|
|
275
|
+
for (const bp of BREAKPOINTS) {
|
|
276
|
+
const prefix = bp === "base" ? "" : `${bp}:`;
|
|
277
|
+
// Match min-h-{number} or min-h-[{number}px] patterns
|
|
278
|
+
// Note: \b doesn't work well with [ so we use a simpler pattern
|
|
279
|
+
const regex = new RegExp(bp === "base" ? `(?<![a-z]:)min-h-(\\d+|\\[\\d+px\\])` : `${bp}:min-h-(\\d+|\\[\\d+px\\])`, "g");
|
|
280
|
+
let match;
|
|
281
|
+
while ((match = regex.exec(line)) !== null) {
|
|
282
|
+
const twValue = match[1].replace(/[\[\]px]/g, "");
|
|
283
|
+
const pixels = TAILWIND_SPACING[twValue] ?? parseInt(twValue);
|
|
284
|
+
if (pixels && pixels >= 20) {
|
|
285
|
+
heights.push({
|
|
286
|
+
value: pixels,
|
|
287
|
+
source: bp === "base" ? `min-h-${twValue}` : `${bp}:min-h-${twValue}`,
|
|
288
|
+
line: index + 1,
|
|
289
|
+
breakpoint: bp,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Extract inline minHeight styles (for container divs, not skeleton props)
|
|
295
|
+
// Only if it's in a style object context
|
|
296
|
+
if (line.includes("minHeight") && line.includes("style")) {
|
|
297
|
+
const inlineHeightMatch = line.match(/minHeight:\s*["']?(\d+)(?:px)?["']?/);
|
|
298
|
+
if (inlineHeightMatch) {
|
|
299
|
+
const pixels = parseInt(inlineHeightMatch[1]);
|
|
300
|
+
if (pixels >= 20) {
|
|
301
|
+
heights.push({
|
|
302
|
+
value: pixels,
|
|
303
|
+
source: `minHeight: ${pixels}px`,
|
|
304
|
+
line: index + 1,
|
|
305
|
+
breakpoint: "base",
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
return heights;
|
|
312
|
+
}
|
|
313
|
+
function extractGrids(content) {
|
|
314
|
+
const grids = [];
|
|
315
|
+
const lines = content.split("\n");
|
|
316
|
+
lines.forEach((line, index) => {
|
|
317
|
+
for (const bp of BREAKPOINTS) {
|
|
318
|
+
const prefix = bp === "base" ? "" : `${bp}:`;
|
|
319
|
+
const regex = new RegExp(`${prefix.replace(":", "\\:")}grid-cols-(\\d+)`, "g");
|
|
320
|
+
let match;
|
|
321
|
+
while ((match = regex.exec(line)) !== null) {
|
|
322
|
+
grids.push({
|
|
323
|
+
columns: parseInt(match[1]),
|
|
324
|
+
breakpoint: bp,
|
|
325
|
+
line: index + 1,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
return grids;
|
|
331
|
+
}
|
|
332
|
+
function countSkeletonElements(content) {
|
|
333
|
+
const skeletonMatches = content.match(/<UnifiedSkeleton|<Skeleton/g);
|
|
334
|
+
return skeletonMatches?.length ?? 0;
|
|
335
|
+
}
|
|
336
|
+
function extractMirrorsComment(content) {
|
|
337
|
+
const mirrorsMatch = content.match(/(?:mirrors?|matches?|same as|dimensions of)\s+([A-Z][a-zA-Z]+)/i);
|
|
338
|
+
return mirrorsMatch?.[1];
|
|
339
|
+
}
|
|
340
|
+
function hasDocumentation(content) {
|
|
341
|
+
return /Heights:|Matches|mirrors|dimensions of|same as|Total:.*px/i.test(content);
|
|
342
|
+
}
|
|
343
|
+
function calculateTotalHeightByBreakpoint(heights) {
|
|
344
|
+
const totals = {};
|
|
345
|
+
for (const bp of BREAKPOINTS) {
|
|
346
|
+
const bpHeights = heights.filter((h) => h.breakpoint === bp);
|
|
347
|
+
if (bpHeights.length > 0) {
|
|
348
|
+
totals[bp] = bpHeights.reduce((sum, h) => sum + h.value, 0);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Inherit from smaller breakpoints if not defined
|
|
352
|
+
let lastValue = totals["base"] ?? 0;
|
|
353
|
+
for (const bp of BREAKPOINTS) {
|
|
354
|
+
if (totals[bp] === undefined && lastValue > 0) {
|
|
355
|
+
totals[bp] = lastValue;
|
|
356
|
+
}
|
|
357
|
+
else if (totals[bp] !== undefined) {
|
|
358
|
+
lastValue = totals[bp];
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return totals;
|
|
362
|
+
}
|
|
363
|
+
// ANALYSIS FUNCTIONS
|
|
364
|
+
function analyzeSkeletonFile(filePath) {
|
|
365
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
366
|
+
const heights = extractHeights(content, true); // containerOnly = true
|
|
367
|
+
const grids = extractGrids(content);
|
|
368
|
+
return {
|
|
369
|
+
file: filePath,
|
|
370
|
+
heights,
|
|
371
|
+
grids,
|
|
372
|
+
skeletonCount: countSkeletonElements(content),
|
|
373
|
+
hasDocumentation: hasDocumentation(content),
|
|
374
|
+
mirrorsComponent: extractMirrorsComment(content),
|
|
375
|
+
totalHeightByBreakpoint: calculateTotalHeightByBreakpoint(heights),
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
function analyzeComponentFile(filePath) {
|
|
379
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
380
|
+
const heights = extractHeights(content, true); // containerOnly = true
|
|
381
|
+
const grids = extractGrids(content);
|
|
382
|
+
// Extract common element patterns
|
|
383
|
+
const elementPatterns = [];
|
|
384
|
+
if (content.includes("map("))
|
|
385
|
+
elementPatterns.push("mapped-list");
|
|
386
|
+
if (content.includes("grid"))
|
|
387
|
+
elementPatterns.push("grid-layout");
|
|
388
|
+
if (content.includes("flex"))
|
|
389
|
+
elementPatterns.push("flex-layout");
|
|
390
|
+
return {
|
|
391
|
+
file: filePath,
|
|
392
|
+
heights,
|
|
393
|
+
grids,
|
|
394
|
+
elementPatterns,
|
|
395
|
+
totalHeightByBreakpoint: calculateTotalHeightByBreakpoint(heights),
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
// VALIDATION FUNCTIONS
|
|
399
|
+
async function validateKnownMappings() {
|
|
400
|
+
const issues = [];
|
|
401
|
+
for (const mapping of KNOWN_MAPPINGS) {
|
|
402
|
+
if (!fs.existsSync(mapping.skeleton))
|
|
403
|
+
continue;
|
|
404
|
+
const skeleton = analyzeSkeletonFile(mapping.skeleton);
|
|
405
|
+
const baseHeight = skeleton.totalHeightByBreakpoint["base"] ?? 0;
|
|
406
|
+
if (baseHeight < mapping.expectedHeight.min) {
|
|
407
|
+
issues.push({
|
|
408
|
+
file: mapping.skeleton,
|
|
409
|
+
line: skeleton.heights[0]?.line ?? 1,
|
|
410
|
+
severity: "error",
|
|
411
|
+
category: "HEIGHT_MISMATCH",
|
|
412
|
+
message: `${mapping.name} skeleton is too small (${baseHeight}px)`,
|
|
413
|
+
suggestion: `Increase container heights to ${mapping.expectedHeight.min}-${mapping.expectedHeight.max}px to match ${mapping.name}`,
|
|
414
|
+
details: {
|
|
415
|
+
actual: baseHeight,
|
|
416
|
+
expectedMin: mapping.expectedHeight.min,
|
|
417
|
+
expectedMax: mapping.expectedHeight.max,
|
|
418
|
+
},
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
else if (baseHeight > mapping.expectedHeight.max * 1.5) {
|
|
422
|
+
issues.push({
|
|
423
|
+
file: mapping.skeleton,
|
|
424
|
+
line: skeleton.heights[0]?.line ?? 1,
|
|
425
|
+
severity: "warning",
|
|
426
|
+
category: "HEIGHT_MISMATCH",
|
|
427
|
+
message: `${mapping.name} skeleton may be too large (${baseHeight}px)`,
|
|
428
|
+
suggestion: `Verify heights match ${mapping.name}. Oversized skeletons cause content to jump up.`,
|
|
429
|
+
details: {
|
|
430
|
+
actual: baseHeight,
|
|
431
|
+
expectedMin: mapping.expectedHeight.min,
|
|
432
|
+
expectedMax: mapping.expectedHeight.max,
|
|
433
|
+
},
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return issues;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Validates that skeleton structure matches the actual component structure.
|
|
441
|
+
* This catches drift where the skeleton shows different elements than what actually renders.
|
|
442
|
+
*/
|
|
443
|
+
async function validateStructuralMappings() {
|
|
444
|
+
const issues = [];
|
|
445
|
+
for (const mapping of STRUCTURAL_MAPPINGS) {
|
|
446
|
+
if (!fs.existsSync(mapping.skeleton) || !fs.existsSync(mapping.component)) {
|
|
447
|
+
continue;
|
|
448
|
+
}
|
|
449
|
+
const skeletonContent = fs.readFileSync(mapping.skeleton, "utf8");
|
|
450
|
+
const componentContent = fs.readFileSync(mapping.component, "utf8");
|
|
451
|
+
for (const element of mapping.expectedElements) {
|
|
452
|
+
const componentHasElement = element.componentPattern.test(componentContent);
|
|
453
|
+
const skeletonHasElement = element.skeletonPattern.test(skeletonContent);
|
|
454
|
+
// Component has element but skeleton doesn't - skeleton is missing placeholder
|
|
455
|
+
if (componentHasElement && !skeletonHasElement) {
|
|
456
|
+
issues.push({
|
|
457
|
+
file: mapping.skeleton,
|
|
458
|
+
line: 1,
|
|
459
|
+
severity: element.severity,
|
|
460
|
+
category: "STRUCTURE_DRIFT",
|
|
461
|
+
message: `${mapping.name} missing placeholder for: ${element.description}`,
|
|
462
|
+
suggestion: `Add skeleton placeholder for ${element.description} to match ${path.basename(mapping.component)}`,
|
|
463
|
+
details: {
|
|
464
|
+
element: element.description,
|
|
465
|
+
breakpoint: element.breakpoint ?? "base",
|
|
466
|
+
},
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
// Skeleton has element but component doesn't - skeleton has stale placeholder
|
|
470
|
+
if (skeletonHasElement && !componentHasElement) {
|
|
471
|
+
issues.push({
|
|
472
|
+
file: mapping.skeleton,
|
|
473
|
+
line: 1,
|
|
474
|
+
severity: "info",
|
|
475
|
+
category: "STRUCTURE_DRIFT",
|
|
476
|
+
message: `${mapping.name} has placeholder for removed element: ${element.description}`,
|
|
477
|
+
suggestion: `Remove skeleton placeholder for ${element.description} - no longer in ${path.basename(mapping.component)}`,
|
|
478
|
+
details: {
|
|
479
|
+
element: element.description,
|
|
480
|
+
breakpoint: element.breakpoint ?? "base",
|
|
481
|
+
},
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
// Count skeleton elements vs component interactive elements
|
|
486
|
+
// Only run this check for header-related mappings (not breadcrumbs, etc.)
|
|
487
|
+
const isHeaderMapping = mapping.name.toLowerCase().includes("header") &&
|
|
488
|
+
!mapping.name.toLowerCase().includes("breadcrumb");
|
|
489
|
+
if (isHeaderMapping) {
|
|
490
|
+
const skeletonCircularCount = (skeletonContent.match(/variant="circular"/g) || []).length;
|
|
491
|
+
const componentButtonCount = (componentContent.match(/<HeaderIconButton|<UserMenu|<NotificationsBell|<WishlistDrawer|<CartDrawer|<SellButton/g) || []).length;
|
|
492
|
+
// Allow some variance (skeleton might show fewer on mobile)
|
|
493
|
+
if (Math.abs(skeletonCircularCount - componentButtonCount) > 3) {
|
|
494
|
+
issues.push({
|
|
495
|
+
file: mapping.skeleton,
|
|
496
|
+
line: 1,
|
|
497
|
+
severity: "warning",
|
|
498
|
+
category: "ELEMENT_COUNT_DRIFT",
|
|
499
|
+
message: `${mapping.name} has ${skeletonCircularCount} circular skeletons but component has ~${componentButtonCount} action buttons`,
|
|
500
|
+
suggestion: "Review skeleton to ensure action button placeholders match actual component",
|
|
501
|
+
details: {
|
|
502
|
+
skeletonCount: skeletonCircularCount,
|
|
503
|
+
componentCount: componentButtonCount,
|
|
504
|
+
},
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return issues;
|
|
510
|
+
}
|
|
511
|
+
async function validateAutoDiscoveredPairs() {
|
|
512
|
+
const issues = [];
|
|
513
|
+
// Find skeleton files and try to match them to components
|
|
514
|
+
const skeletonFiles = await (0, glob_1.glob)("components/**/*[Ss]keleton*.tsx", {
|
|
515
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
516
|
+
});
|
|
517
|
+
for (const skeletonFile of skeletonFiles) {
|
|
518
|
+
const skeleton = analyzeSkeletonFile(skeletonFile);
|
|
519
|
+
// Try to find matching component by name
|
|
520
|
+
const baseName = path
|
|
521
|
+
.basename(skeletonFile)
|
|
522
|
+
.replace(/Skeleton/gi, "")
|
|
523
|
+
.replace(/Loading/gi, "")
|
|
524
|
+
.replace(".tsx", "");
|
|
525
|
+
if (!baseName || baseName.length < 3)
|
|
526
|
+
continue;
|
|
527
|
+
// Look for component with similar name
|
|
528
|
+
const possibleComponents = await (0, glob_1.glob)(`components/**/${baseName}*.tsx`, {
|
|
529
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
530
|
+
});
|
|
531
|
+
const componentFile = possibleComponents.find((f) => !f.includes("Skeleton") && !f.includes("Loading"));
|
|
532
|
+
if (componentFile && fs.existsSync(componentFile)) {
|
|
533
|
+
const component = analyzeComponentFile(componentFile);
|
|
534
|
+
// Compare grid columns
|
|
535
|
+
for (const bp of BREAKPOINTS) {
|
|
536
|
+
const skeletonGrid = skeleton.grids.find((g) => g.breakpoint === bp);
|
|
537
|
+
const componentGrid = component.grids.find((g) => g.breakpoint === bp);
|
|
538
|
+
if (skeletonGrid && componentGrid && skeletonGrid.columns !== componentGrid.columns) {
|
|
539
|
+
issues.push({
|
|
540
|
+
file: skeletonFile,
|
|
541
|
+
line: skeletonGrid.line,
|
|
542
|
+
severity: "warning",
|
|
543
|
+
category: "GRID_MISMATCH",
|
|
544
|
+
message: `Grid columns mismatch at ${bp} breakpoint`,
|
|
545
|
+
suggestion: `Skeleton has ${skeletonGrid.columns} columns but component has ${componentGrid.columns}`,
|
|
546
|
+
details: {
|
|
547
|
+
breakpoint: bp,
|
|
548
|
+
skeletonCols: skeletonGrid.columns,
|
|
549
|
+
componentCols: componentGrid.columns,
|
|
550
|
+
},
|
|
551
|
+
});
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
return issues;
|
|
557
|
+
}
|
|
558
|
+
async function validateLoadingFiles() {
|
|
559
|
+
const issues = [];
|
|
560
|
+
const loadingFiles = await (0, glob_1.glob)("app/**/loading.tsx", { ignore: [...glob_patterns_1.STANDARD_EXCLUDES] });
|
|
561
|
+
for (const loadingFile of loadingFiles) {
|
|
562
|
+
const loadingContent = fs.readFileSync(loadingFile, "utf8");
|
|
563
|
+
const dir = path.dirname(loadingFile);
|
|
564
|
+
const pageFile = path.join(dir, "page.tsx");
|
|
565
|
+
// Check HeaderSkeleton usage
|
|
566
|
+
if (loadingContent.includes("HeaderSkeleton")) {
|
|
567
|
+
const hasHeaderProvider = await checkHeaderProvider(dir);
|
|
568
|
+
if (!hasHeaderProvider) {
|
|
569
|
+
issues.push({
|
|
570
|
+
file: loadingFile,
|
|
571
|
+
line: 1,
|
|
572
|
+
severity: "warning",
|
|
573
|
+
category: "STRUCTURE_MISMATCH",
|
|
574
|
+
message: "HeaderSkeleton used but no header found in page hierarchy",
|
|
575
|
+
suggestion: "Remove HeaderSkeleton or add header to layout/page",
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
// Check BreadcrumbSkeleton usage
|
|
580
|
+
if (loadingContent.includes("BreadcrumbSkeleton")) {
|
|
581
|
+
const hasBreadcrumbs = await checkBreadcrumbProvider(dir);
|
|
582
|
+
if (!hasBreadcrumbs) {
|
|
583
|
+
issues.push({
|
|
584
|
+
file: loadingFile,
|
|
585
|
+
line: 1,
|
|
586
|
+
severity: "info",
|
|
587
|
+
category: "STRUCTURE_MISMATCH",
|
|
588
|
+
message: "BreadcrumbSkeleton used but no breadcrumbs found in page hierarchy",
|
|
589
|
+
suggestion: "Verify page renders UnifiedBreadcrumbs or remove BreadcrumbSkeleton",
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
// Compare loading.tsx structure with page.tsx
|
|
594
|
+
if (fs.existsSync(pageFile)) {
|
|
595
|
+
const pageContent = fs.readFileSync(pageFile, "utf8");
|
|
596
|
+
// Check grid consistency
|
|
597
|
+
const loadingGrids = extractGrids(loadingContent);
|
|
598
|
+
const pageGrids = extractGrids(pageContent);
|
|
599
|
+
// Find the client component if page delegates to one
|
|
600
|
+
const clientMatch = pageContent.match(/import\s*{\s*(\w+Client)\s*}/);
|
|
601
|
+
if (clientMatch) {
|
|
602
|
+
const clientName = clientMatch[1];
|
|
603
|
+
const clientFiles = await (0, glob_1.glob)(`${dir}/${clientName}.tsx`, {
|
|
604
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
605
|
+
});
|
|
606
|
+
if (clientFiles.length > 0) {
|
|
607
|
+
const clientContent = fs.readFileSync(clientFiles[0], "utf8");
|
|
608
|
+
const clientGrids = extractGrids(clientContent);
|
|
609
|
+
pageGrids.push(...clientGrids);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
// Compare base grid columns
|
|
613
|
+
const loadingBaseCols = loadingGrids.find((g) => g.breakpoint === "base")?.columns;
|
|
614
|
+
const pageBaseCols = pageGrids.find((g) => g.breakpoint === "base")?.columns;
|
|
615
|
+
if (loadingBaseCols && pageBaseCols && loadingBaseCols !== pageBaseCols) {
|
|
616
|
+
issues.push({
|
|
617
|
+
file: loadingFile,
|
|
618
|
+
line: loadingGrids[0]?.line ?? 1,
|
|
619
|
+
severity: "warning",
|
|
620
|
+
category: "GRID_MISMATCH",
|
|
621
|
+
message: `Loading skeleton grid (${loadingBaseCols} cols) doesn't match page grid (${pageBaseCols} cols)`,
|
|
622
|
+
suggestion: "Align grid-cols-X classes between loading.tsx and page component",
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
// Check for mapped list count mismatches
|
|
626
|
+
const loadingArrayLength = loadingContent.match(/\[([^\]]+)\]\.map/g)?.map((m) => {
|
|
627
|
+
const nums = m.match(/\d+/g);
|
|
628
|
+
return nums ? nums.length : 0;
|
|
629
|
+
}) ?? [];
|
|
630
|
+
// Warn if skeleton shows significantly different item count
|
|
631
|
+
const maxSkeletonItems = Math.max(...loadingArrayLength, 0);
|
|
632
|
+
if (maxSkeletonItems > 0 && maxSkeletonItems < 3) {
|
|
633
|
+
issues.push({
|
|
634
|
+
file: loadingFile,
|
|
635
|
+
line: 1,
|
|
636
|
+
severity: "info",
|
|
637
|
+
category: "ITEM_COUNT",
|
|
638
|
+
message: `Skeleton shows only ${maxSkeletonItems} placeholder items`,
|
|
639
|
+
suggestion: "Consider showing 3-6 skeleton items for better perceived loading",
|
|
640
|
+
});
|
|
641
|
+
}
|
|
642
|
+
// Check for Footer consistency
|
|
643
|
+
const loadingHasFooter = loadingContent.includes("Footer") || loadingContent.includes("footer");
|
|
644
|
+
const pageHasFooter = pageContent.includes("<Footer") || pageContent.includes("Footer />");
|
|
645
|
+
if (pageHasFooter && !loadingHasFooter) {
|
|
646
|
+
issues.push({
|
|
647
|
+
file: loadingFile,
|
|
648
|
+
line: 1,
|
|
649
|
+
severity: "info",
|
|
650
|
+
category: "STRUCTURE_MISMATCH",
|
|
651
|
+
message: "Page has Footer but loading skeleton does not",
|
|
652
|
+
suggestion: "Consider adding Footer to loading.tsx for consistent page height",
|
|
653
|
+
});
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
return issues;
|
|
658
|
+
}
|
|
659
|
+
async function checkHeaderProvider(dir) {
|
|
660
|
+
let currentDir = dir;
|
|
661
|
+
while (currentDir.includes("app")) {
|
|
662
|
+
for (const file of ["layout.tsx", "page.tsx"]) {
|
|
663
|
+
const filePath = path.join(currentDir, file);
|
|
664
|
+
if (fs.existsSync(filePath)) {
|
|
665
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
666
|
+
if (content.includes("UnifiedHeader") ||
|
|
667
|
+
content.includes("AppHeader") ||
|
|
668
|
+
LAYOUTS_WITH_HEADER.some((l) => content.includes(l))) {
|
|
669
|
+
return true;
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
const parentDir = path.dirname(currentDir);
|
|
674
|
+
if (parentDir === currentDir)
|
|
675
|
+
break;
|
|
676
|
+
currentDir = parentDir;
|
|
677
|
+
}
|
|
678
|
+
return false;
|
|
679
|
+
}
|
|
680
|
+
async function checkBreadcrumbProvider(dir) {
|
|
681
|
+
let currentDir = dir;
|
|
682
|
+
// Layout components that include breadcrumbs by default
|
|
683
|
+
const LAYOUTS_WITH_BREADCRUMBS = [
|
|
684
|
+
"DashboardPageLayout",
|
|
685
|
+
"StandardPageLayout",
|
|
686
|
+
"ContentLayout",
|
|
687
|
+
"SellerPageLayout",
|
|
688
|
+
"AccountPageLayout",
|
|
689
|
+
"AdminPageLayout",
|
|
690
|
+
];
|
|
691
|
+
// Helper to check if content uses breadcrumb-providing layouts
|
|
692
|
+
const contentHasBreadcrumbs = (content) => {
|
|
693
|
+
return (content.includes("UnifiedBreadcrumbs") ||
|
|
694
|
+
content.includes("Breadcrumb") ||
|
|
695
|
+
LAYOUTS_WITH_BREADCRUMBS.some((l) => content.includes(l)));
|
|
696
|
+
};
|
|
697
|
+
// Helper to check client component files referenced in a page
|
|
698
|
+
const checkClientComponents = async (pageContent, pageDir) => {
|
|
699
|
+
// Match imports from relative paths like:
|
|
700
|
+
// import { DashboardPageClient } from "./DashboardPageClient"
|
|
701
|
+
// import SomeClient from "./SomeClient"
|
|
702
|
+
const importMatches = [...pageContent.matchAll(/from\s+["']\.\/([^"']+)["']/g)];
|
|
703
|
+
for (const match of importMatches) {
|
|
704
|
+
const importPath = match[1];
|
|
705
|
+
// Check if this looks like a client component (contains Client or Page)
|
|
706
|
+
if (importPath.includes("Client") || importPath.includes("Page")) {
|
|
707
|
+
// Normalize path separators for cross-platform compatibility
|
|
708
|
+
const normalizedDir = pageDir.replace(/\\/g, "/");
|
|
709
|
+
const clientFilePath = `${normalizedDir}/${importPath}.tsx`;
|
|
710
|
+
if (fs.existsSync(clientFilePath)) {
|
|
711
|
+
const clientContent = fs.readFileSync(clientFilePath, "utf8");
|
|
712
|
+
if (contentHasBreadcrumbs(clientContent)) {
|
|
713
|
+
return true;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
return false;
|
|
719
|
+
};
|
|
720
|
+
while (currentDir.includes("app")) {
|
|
721
|
+
for (const file of ["layout.tsx", "page.tsx"]) {
|
|
722
|
+
const filePath = path.join(currentDir, file);
|
|
723
|
+
if (fs.existsSync(filePath)) {
|
|
724
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
725
|
+
if (contentHasBreadcrumbs(content)) {
|
|
726
|
+
return true;
|
|
727
|
+
}
|
|
728
|
+
// Also check client components imported by this page
|
|
729
|
+
if (file === "page.tsx" && (await checkClientComponents(content, currentDir))) {
|
|
730
|
+
return true;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
const parentDir = path.dirname(currentDir);
|
|
735
|
+
if (parentDir === currentDir)
|
|
736
|
+
break;
|
|
737
|
+
currentDir = parentDir;
|
|
738
|
+
}
|
|
739
|
+
// Also check ALL child pages in the original directory tree
|
|
740
|
+
// This catches cases where loading.tsx is at /store but pages are at /store/dashboard, etc.
|
|
741
|
+
try {
|
|
742
|
+
// Normalize dir to use forward slashes for glob
|
|
743
|
+
const normalizedDir = dir.replace(/\\/g, "/");
|
|
744
|
+
const childPages = await (0, glob_1.glob)(`${normalizedDir}/**/page.tsx`, {
|
|
745
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
746
|
+
});
|
|
747
|
+
for (const childPage of childPages) {
|
|
748
|
+
const content = fs.readFileSync(childPage, "utf8");
|
|
749
|
+
if (contentHasBreadcrumbs(content)) {
|
|
750
|
+
return true;
|
|
751
|
+
}
|
|
752
|
+
// Check client components imported by child pages
|
|
753
|
+
const childDir = path.dirname(childPage);
|
|
754
|
+
if (await checkClientComponents(content, childDir)) {
|
|
755
|
+
return true;
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
catch {
|
|
760
|
+
// Ignore glob errors
|
|
761
|
+
}
|
|
762
|
+
return false;
|
|
763
|
+
}
|
|
764
|
+
async function validateSkeletonDocumentation() {
|
|
765
|
+
const issues = [];
|
|
766
|
+
const skeletonFiles = await (0, glob_1.glob)("components/**/*[Ss]keleton*.tsx", {
|
|
767
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
768
|
+
});
|
|
769
|
+
const sharedSkeletons = await (0, glob_1.glob)("components/shared/skeletons/**/*.tsx", {
|
|
770
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
771
|
+
});
|
|
772
|
+
const allSkeletons = [...new Set([...skeletonFiles, ...sharedSkeletons])];
|
|
773
|
+
for (const file of allSkeletons) {
|
|
774
|
+
const skeleton = analyzeSkeletonFile(file);
|
|
775
|
+
// Check documentation
|
|
776
|
+
if (skeleton.heights.length > 0 && !skeleton.hasDocumentation) {
|
|
777
|
+
issues.push({
|
|
778
|
+
file,
|
|
779
|
+
line: 1,
|
|
780
|
+
severity: "info",
|
|
781
|
+
category: "DOCUMENTATION",
|
|
782
|
+
message: "Skeleton lacks height documentation",
|
|
783
|
+
suggestion: "Add JSDoc comment with Heights: section documenting expected dimensions",
|
|
784
|
+
});
|
|
785
|
+
}
|
|
786
|
+
// Check for responsive consistency
|
|
787
|
+
const breakpointsUsed = new Set(skeleton.heights.map((h) => h.breakpoint));
|
|
788
|
+
if (breakpointsUsed.size > 1) {
|
|
789
|
+
const baseHeight = skeleton.totalHeightByBreakpoint["base"];
|
|
790
|
+
const mdHeight = skeleton.totalHeightByBreakpoint["md"];
|
|
791
|
+
if (baseHeight && mdHeight && Math.abs(baseHeight - mdHeight) > 50) {
|
|
792
|
+
// This is expected for responsive designs, just info
|
|
793
|
+
issues.push({
|
|
794
|
+
file,
|
|
795
|
+
line: 1,
|
|
796
|
+
severity: "info",
|
|
797
|
+
category: "RESPONSIVE",
|
|
798
|
+
message: `Large height difference between mobile (${baseHeight}px) and desktop (${mdHeight}px)`,
|
|
799
|
+
suggestion: "Verify this matches the actual component responsive behavior",
|
|
800
|
+
});
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
return issues;
|
|
805
|
+
}
|
|
806
|
+
async function validateSpacingConsistency() {
|
|
807
|
+
const issues = [];
|
|
808
|
+
const loadingFiles = await (0, glob_1.glob)("app/**/loading.tsx", { ignore: [...glob_patterns_1.STANDARD_EXCLUDES] });
|
|
809
|
+
for (const loadingFile of loadingFiles) {
|
|
810
|
+
const content = fs.readFileSync(loadingFile, "utf8");
|
|
811
|
+
const dir = path.dirname(loadingFile);
|
|
812
|
+
const pageFile = path.join(dir, "page.tsx");
|
|
813
|
+
if (!fs.existsSync(pageFile))
|
|
814
|
+
continue;
|
|
815
|
+
const pageContent = fs.readFileSync(pageFile, "utf8");
|
|
816
|
+
// Extract OUTER container spacing (first few lines typically define the main wrapper)
|
|
817
|
+
const loadingLines = content.split("\n").slice(0, 30);
|
|
818
|
+
const pageLines = pageContent.split("\n").slice(0, 50);
|
|
819
|
+
// Look for main container padding patterns
|
|
820
|
+
const loadingOuterPadding = loadingLines
|
|
821
|
+
.join("\n")
|
|
822
|
+
.match(/className="[^"]*\b(px?-\d+)[^"]*"/)?.[1];
|
|
823
|
+
const pageOuterPadding = pageLines.join("\n").match(/className="[^"]*\b(px?-\d+)[^"]*"/)?.[1];
|
|
824
|
+
// Only compare if both have outer padding defined
|
|
825
|
+
if (loadingOuterPadding && pageOuterPadding && loadingOuterPadding !== pageOuterPadding) {
|
|
826
|
+
// Check if they're significantly different
|
|
827
|
+
const loadingVal = TAILWIND_SPACING[loadingOuterPadding.replace(/p[xy]?-/, "")] ?? 0;
|
|
828
|
+
const pageVal = TAILWIND_SPACING[pageOuterPadding.replace(/p[xy]?-/, "")] ?? 0;
|
|
829
|
+
// Only warn if difference is >= 8px (2 spacing units)
|
|
830
|
+
if (Math.abs(loadingVal - pageVal) >= 8) {
|
|
831
|
+
issues.push({
|
|
832
|
+
file: loadingFile,
|
|
833
|
+
line: 1,
|
|
834
|
+
severity: "warning",
|
|
835
|
+
category: "SPACING_MISMATCH",
|
|
836
|
+
message: `Outer container padding mismatch: skeleton uses ${loadingOuterPadding}, page uses ${pageOuterPadding}`,
|
|
837
|
+
suggestion: "Align outer container padding classes to prevent layout shift",
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
// Check max-width consistency
|
|
842
|
+
const loadingMaxW = content.match(/max-w-(\w+)/)?.[1];
|
|
843
|
+
const pageMaxW = pageContent.match(/max-w-(\w+)/)?.[1];
|
|
844
|
+
if (loadingMaxW && pageMaxW && loadingMaxW !== pageMaxW) {
|
|
845
|
+
issues.push({
|
|
846
|
+
file: loadingFile,
|
|
847
|
+
line: 1,
|
|
848
|
+
severity: "warning",
|
|
849
|
+
category: "LAYOUT_MISMATCH",
|
|
850
|
+
message: `Max-width mismatch: skeleton uses max-w-${loadingMaxW}, page uses max-w-${pageMaxW}`,
|
|
851
|
+
suggestion: "Align max-width classes to prevent content width shift",
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
return issues;
|
|
856
|
+
}
|
|
857
|
+
// NEW VALIDATIONS - Design Token & Visual Consistency
|
|
858
|
+
/**
|
|
859
|
+
* Validates that skeleton components use consistent CSS variables/design tokens
|
|
860
|
+
* as their corresponding real components.
|
|
861
|
+
*/
|
|
862
|
+
async function validateDesignTokenConsistency() {
|
|
863
|
+
const issues = [];
|
|
864
|
+
// Find skeleton files that have a clear component pair
|
|
865
|
+
const skeletonFiles = await (0, glob_1.glob)("components/**/*[Ss]keleton*.tsx", {
|
|
866
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
867
|
+
});
|
|
868
|
+
for (const skeletonFile of skeletonFiles) {
|
|
869
|
+
const skeletonContent = fs.readFileSync(skeletonFile, "utf8");
|
|
870
|
+
// Extract CSS variables used in skeleton
|
|
871
|
+
const skeletonVars = extractCssVariables(skeletonContent);
|
|
872
|
+
// Try to find matching component
|
|
873
|
+
const baseName = path
|
|
874
|
+
.basename(skeletonFile)
|
|
875
|
+
.replace(/Skeleton/gi, "")
|
|
876
|
+
.replace(/Loading/gi, "")
|
|
877
|
+
.replace(".tsx", "");
|
|
878
|
+
if (!baseName || baseName.length < 3)
|
|
879
|
+
continue;
|
|
880
|
+
const possibleComponents = await (0, glob_1.glob)(`components/**/${baseName}*.tsx`, {
|
|
881
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
882
|
+
});
|
|
883
|
+
const componentFile = possibleComponents.find((f) => !f.includes("Skeleton") && !f.includes("Loading"));
|
|
884
|
+
if (componentFile && fs.existsSync(componentFile)) {
|
|
885
|
+
const componentContent = fs.readFileSync(componentFile, "utf8");
|
|
886
|
+
const componentVars = extractCssVariables(componentContent);
|
|
887
|
+
// Check for background color mismatches on OUTER containers only
|
|
888
|
+
// Look at the first few lines to find the main container background
|
|
889
|
+
const skeletonFirstLines = skeletonContent.split("\n").slice(0, 30).join("\n");
|
|
890
|
+
const componentFirstLines = componentContent.split("\n").slice(0, 50).join("\n");
|
|
891
|
+
const skeletonOuterBg = skeletonFirstLines.match(/bg-\[var\(--bg-(primary|secondary)\)\]|bg-(primary|secondary)/)?.[0];
|
|
892
|
+
const componentOuterBg = componentFirstLines.match(/bg-\[var\(--bg-(primary|secondary)\)\]|bg-(primary|secondary)/)?.[0];
|
|
893
|
+
if (skeletonOuterBg && componentOuterBg && skeletonOuterBg !== componentOuterBg) {
|
|
894
|
+
// Only warn if outer container backgrounds are clearly different
|
|
895
|
+
const skeletonIsPrimary = skeletonOuterBg.includes("primary");
|
|
896
|
+
const componentIsPrimary = componentOuterBg.includes("primary");
|
|
897
|
+
if (skeletonIsPrimary !== componentIsPrimary) {
|
|
898
|
+
issues.push({
|
|
899
|
+
file: skeletonFile,
|
|
900
|
+
line: 1,
|
|
901
|
+
severity: "warning",
|
|
902
|
+
category: "TOKEN_MISMATCH",
|
|
903
|
+
message: `Outer container background mismatch: skeleton uses ${skeletonOuterBg}, component uses ${componentOuterBg}`,
|
|
904
|
+
suggestion: "Align outer container background CSS variables to prevent color flash on load",
|
|
905
|
+
});
|
|
906
|
+
}
|
|
907
|
+
}
|
|
908
|
+
// Check for border style mismatches - only if skeleton has NO borders at all
|
|
909
|
+
const skeletonBorder = skeletonContent.match(/border-\[var|border-color|borderBottom|border:\s*["']?1px/gi);
|
|
910
|
+
const componentBorder = componentContent.match(/border-\[var|border-color|borderBottom|border:\s*["']?1px/gi);
|
|
911
|
+
// Only flag if component has significant borders (3+) and skeleton has none
|
|
912
|
+
if (componentBorder &&
|
|
913
|
+
componentBorder.length >= 3 &&
|
|
914
|
+
(!skeletonBorder || skeletonBorder.length === 0)) {
|
|
915
|
+
issues.push({
|
|
916
|
+
file: skeletonFile,
|
|
917
|
+
line: 1,
|
|
918
|
+
severity: "info",
|
|
919
|
+
category: "STYLE_MISMATCH",
|
|
920
|
+
message: "Component has borders but skeleton does not",
|
|
921
|
+
suggestion: "Add matching border styles to skeleton for visual consistency",
|
|
922
|
+
});
|
|
923
|
+
}
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
return issues;
|
|
927
|
+
}
|
|
928
|
+
/**
|
|
929
|
+
* Validates that skeleton components have proper accessibility attributes.
|
|
930
|
+
*/
|
|
931
|
+
async function validateSkeletonAccessibility() {
|
|
932
|
+
const issues = [];
|
|
933
|
+
const skeletonFiles = await (0, glob_1.glob)("components/**/*[Ss]keleton*.tsx", {
|
|
934
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
935
|
+
});
|
|
936
|
+
const loadingFiles = await (0, glob_1.glob)("app/**/loading.tsx", { ignore: [...glob_patterns_1.STANDARD_EXCLUDES] });
|
|
937
|
+
const allFiles = [...new Set([...skeletonFiles, ...loadingFiles])];
|
|
938
|
+
for (const file of allFiles) {
|
|
939
|
+
const content = fs.readFileSync(file, "utf8");
|
|
940
|
+
// Check for aria-label on main container
|
|
941
|
+
const hasAriaLabel = /aria-label=/.test(content);
|
|
942
|
+
const hasAriaLabelledBy = /aria-labelledby=/.test(content);
|
|
943
|
+
const hasRole = /role=["']status["']|role=["']progressbar["']/.test(content);
|
|
944
|
+
// Only check exported skeleton components (not internal helpers)
|
|
945
|
+
const isExportedSkeleton = /export\s+(function|const)\s+\w*[Ss]keleton/.test(content);
|
|
946
|
+
if (isExportedSkeleton && !hasAriaLabel && !hasAriaLabelledBy) {
|
|
947
|
+
issues.push({
|
|
948
|
+
file,
|
|
949
|
+
line: 1,
|
|
950
|
+
severity: "info",
|
|
951
|
+
category: "ACCESSIBILITY",
|
|
952
|
+
message: "Skeleton component lacks aria-label for screen readers",
|
|
953
|
+
suggestion: 'Add aria-label="Loading..." to main container for accessibility',
|
|
954
|
+
});
|
|
955
|
+
}
|
|
956
|
+
// Check for proper semantic structure in loading files
|
|
957
|
+
if (file.includes("loading.tsx")) {
|
|
958
|
+
const hasSection = /<section/.test(content);
|
|
959
|
+
const hasMain = /<main/.test(content);
|
|
960
|
+
const hasNav = /<nav/.test(content);
|
|
961
|
+
// If the corresponding page uses semantic elements, skeleton should too
|
|
962
|
+
const dir = path.dirname(file);
|
|
963
|
+
const pageFile = path.join(dir, "page.tsx");
|
|
964
|
+
if (fs.existsSync(pageFile)) {
|
|
965
|
+
const pageContent = fs.readFileSync(pageFile, "utf8");
|
|
966
|
+
const pageHasSection = /<section/.test(pageContent);
|
|
967
|
+
if (pageHasSection && !hasSection) {
|
|
968
|
+
issues.push({
|
|
969
|
+
file,
|
|
970
|
+
line: 1,
|
|
971
|
+
severity: "info",
|
|
972
|
+
category: "SEMANTIC_MISMATCH",
|
|
973
|
+
message: "Page uses <section> but loading skeleton does not",
|
|
974
|
+
suggestion: "Use matching semantic HTML elements for consistent structure",
|
|
975
|
+
});
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
return issues;
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* Validates separator/divider consistency between skeleton and component.
|
|
984
|
+
* Catches issues like "/" vs ChevronRight, "|" vs actual dividers, etc.
|
|
985
|
+
*/
|
|
986
|
+
async function validateSeparatorConsistency() {
|
|
987
|
+
const issues = [];
|
|
988
|
+
// Common separator patterns to check
|
|
989
|
+
const textSeparators = [
|
|
990
|
+
{ pattern: /["']\/["']|>\s*\/\s*</, name: "slash (/)" },
|
|
991
|
+
{ pattern: /["']\|["']|>\s*\|\s*</, name: "pipe (|)" },
|
|
992
|
+
{ pattern: /["']•["']|>\s*•\s*</, name: "bullet (•)" },
|
|
993
|
+
{ pattern: /["']-["']|>\s*-\s*</, name: "dash (-)" },
|
|
994
|
+
];
|
|
995
|
+
const iconSeparators = [
|
|
996
|
+
{ pattern: /<ChevronRight|chevron-right/i, name: "ChevronRight icon" },
|
|
997
|
+
{ pattern: /<ChevronLeft|chevron-left/i, name: "ChevronLeft icon" },
|
|
998
|
+
{ pattern: /<ArrowRight|arrow-right/i, name: "ArrowRight icon" },
|
|
999
|
+
];
|
|
1000
|
+
const skeletonFiles = await (0, glob_1.glob)("components/**/*[Ss]keleton*.tsx", {
|
|
1001
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
1002
|
+
});
|
|
1003
|
+
for (const skeletonFile of skeletonFiles) {
|
|
1004
|
+
const skeletonContent = fs.readFileSync(skeletonFile, "utf8");
|
|
1005
|
+
// Find matching component
|
|
1006
|
+
const baseName = path
|
|
1007
|
+
.basename(skeletonFile)
|
|
1008
|
+
.replace(/Skeleton/gi, "")
|
|
1009
|
+
.replace(/Loading/gi, "")
|
|
1010
|
+
.replace(".tsx", "");
|
|
1011
|
+
if (!baseName || baseName.length < 3)
|
|
1012
|
+
continue;
|
|
1013
|
+
const possibleComponents = await (0, glob_1.glob)(`components/**/${baseName}*.tsx`, {
|
|
1014
|
+
ignore: [...glob_patterns_1.STANDARD_EXCLUDES],
|
|
1015
|
+
});
|
|
1016
|
+
const componentFile = possibleComponents.find((f) => !f.includes("Skeleton") && !f.includes("Loading"));
|
|
1017
|
+
if (!componentFile || !fs.existsSync(componentFile))
|
|
1018
|
+
continue;
|
|
1019
|
+
const componentContent = fs.readFileSync(componentFile, "utf8");
|
|
1020
|
+
// Check if skeleton uses text separator but component uses icon
|
|
1021
|
+
for (const textSep of textSeparators) {
|
|
1022
|
+
if (textSep.pattern.test(skeletonContent)) {
|
|
1023
|
+
for (const iconSep of iconSeparators) {
|
|
1024
|
+
if (iconSep.pattern.test(componentContent)) {
|
|
1025
|
+
issues.push({
|
|
1026
|
+
file: skeletonFile,
|
|
1027
|
+
line: 1,
|
|
1028
|
+
severity: "warning",
|
|
1029
|
+
category: "SEPARATOR_MISMATCH",
|
|
1030
|
+
message: `Skeleton uses ${textSep.name} but component uses ${iconSep.name}`,
|
|
1031
|
+
suggestion: `Replace text separator with matching icon placeholder or inline SVG`,
|
|
1032
|
+
});
|
|
1033
|
+
break;
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
// Check if component uses text separator but skeleton uses icon (less common but possible)
|
|
1039
|
+
for (const iconSep of iconSeparators) {
|
|
1040
|
+
if (iconSep.pattern.test(skeletonContent)) {
|
|
1041
|
+
let componentHasMatchingIcon = false;
|
|
1042
|
+
for (const checkIcon of iconSeparators) {
|
|
1043
|
+
if (checkIcon.pattern.test(componentContent)) {
|
|
1044
|
+
componentHasMatchingIcon = true;
|
|
1045
|
+
break;
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
if (!componentHasMatchingIcon) {
|
|
1049
|
+
// Check if component uses text separator instead
|
|
1050
|
+
for (const textSep of textSeparators) {
|
|
1051
|
+
if (textSep.pattern.test(componentContent)) {
|
|
1052
|
+
issues.push({
|
|
1053
|
+
file: skeletonFile,
|
|
1054
|
+
line: 1,
|
|
1055
|
+
severity: "info",
|
|
1056
|
+
category: "SEPARATOR_MISMATCH",
|
|
1057
|
+
message: `Skeleton uses ${iconSep.name} but component uses ${textSep.name}`,
|
|
1058
|
+
suggestion: "Align separator style with actual component",
|
|
1059
|
+
});
|
|
1060
|
+
break;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
return issues;
|
|
1068
|
+
}
|
|
1069
|
+
/**
|
|
1070
|
+
* Validates that skeleton item counts are reasonable for the component.
|
|
1071
|
+
* Too few items = jarring expansion, too many = jarring contraction.
|
|
1072
|
+
*/
|
|
1073
|
+
async function validateSkeletonItemCounts() {
|
|
1074
|
+
const issues = [];
|
|
1075
|
+
const loadingFiles = await (0, glob_1.glob)("app/**/loading.tsx", { ignore: [...glob_patterns_1.STANDARD_EXCLUDES] });
|
|
1076
|
+
for (const loadingFile of loadingFiles) {
|
|
1077
|
+
const content = fs.readFileSync(loadingFile, "utf8");
|
|
1078
|
+
// Extract skeleton item counts from array patterns like [1,2,3].map or Array.from({length: N})
|
|
1079
|
+
const arrayMapMatches = content.match(/\[([^\]]+)\]\.map/g) || [];
|
|
1080
|
+
const arrayFromMatches = content.match(/Array\.from\(\s*\{\s*length:\s*(\d+)\s*\}/g) || [];
|
|
1081
|
+
const countPropMatches = content.match(/count\s*[=:]\s*(\d+)/g) || [];
|
|
1082
|
+
// Extract counts
|
|
1083
|
+
const counts = [];
|
|
1084
|
+
for (const match of arrayMapMatches) {
|
|
1085
|
+
const nums = match.match(/\d+/g);
|
|
1086
|
+
if (nums)
|
|
1087
|
+
counts.push(nums.length);
|
|
1088
|
+
}
|
|
1089
|
+
for (const match of arrayFromMatches) {
|
|
1090
|
+
const num = match.match(/length:\s*(\d+)/)?.[1];
|
|
1091
|
+
if (num)
|
|
1092
|
+
counts.push(parseInt(num));
|
|
1093
|
+
}
|
|
1094
|
+
for (const match of countPropMatches) {
|
|
1095
|
+
const num = match.match(/(\d+)/)?.[1];
|
|
1096
|
+
if (num)
|
|
1097
|
+
counts.push(parseInt(num));
|
|
1098
|
+
}
|
|
1099
|
+
// Check for very low counts (likely to cause expansion)
|
|
1100
|
+
for (const count of counts) {
|
|
1101
|
+
if (count === 1) {
|
|
1102
|
+
issues.push({
|
|
1103
|
+
file: loadingFile,
|
|
1104
|
+
line: 1,
|
|
1105
|
+
severity: "info",
|
|
1106
|
+
category: "ITEM_COUNT",
|
|
1107
|
+
message: "Skeleton shows only 1 placeholder item",
|
|
1108
|
+
suggestion: "Consider showing 3-6 items to better represent typical content",
|
|
1109
|
+
});
|
|
1110
|
+
}
|
|
1111
|
+
else if (count === 2) {
|
|
1112
|
+
issues.push({
|
|
1113
|
+
file: loadingFile,
|
|
1114
|
+
line: 1,
|
|
1115
|
+
severity: "info",
|
|
1116
|
+
category: "ITEM_COUNT",
|
|
1117
|
+
message: "Skeleton shows only 2 placeholder items",
|
|
1118
|
+
suggestion: "Consider showing 4-8 items for grid layouts",
|
|
1119
|
+
});
|
|
1120
|
+
}
|
|
1121
|
+
else if (count > 20) {
|
|
1122
|
+
issues.push({
|
|
1123
|
+
file: loadingFile,
|
|
1124
|
+
line: 1,
|
|
1125
|
+
severity: "info",
|
|
1126
|
+
category: "ITEM_COUNT",
|
|
1127
|
+
message: `Skeleton shows ${count} placeholder items (may be excessive)`,
|
|
1128
|
+
suggestion: "Consider showing 8-12 items max to avoid overwhelming skeleton",
|
|
1129
|
+
});
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
return issues;
|
|
1134
|
+
}
|
|
1135
|
+
/**
|
|
1136
|
+
* Helper to extract CSS variable references from content
|
|
1137
|
+
*/
|
|
1138
|
+
function extractCssVariables(content) {
|
|
1139
|
+
const vars = [];
|
|
1140
|
+
// Match var(--xxx) patterns
|
|
1141
|
+
const varMatches = content.match(/var\(--[a-z-]+\)/gi) || [];
|
|
1142
|
+
vars.push(...varMatches);
|
|
1143
|
+
// Match Tailwind bg-xxx patterns
|
|
1144
|
+
const bgMatches = content.match(/bg-\[var\(--[a-z-]+\)\]|bg-[a-z]+/gi) || [];
|
|
1145
|
+
vars.push(...bgMatches);
|
|
1146
|
+
return vars;
|
|
1147
|
+
}
|
|
1148
|
+
// MAIN
|
|
1149
|
+
async function checkSkeletonSizeConsistency() {
|
|
1150
|
+
console.log(`\n${console_chars_1.emoji.search} Running Enhanced Skeleton Size Consistency Check...\n`);
|
|
1151
|
+
const allIssues = [];
|
|
1152
|
+
// Run all validations
|
|
1153
|
+
const [knownMappingIssues, structuralIssues, autoDiscoveredIssues, loadingFileIssues, documentationIssues, spacingIssues,] = await Promise.all([
|
|
1154
|
+
validateKnownMappings(),
|
|
1155
|
+
validateStructuralMappings(),
|
|
1156
|
+
validateAutoDiscoveredPairs(),
|
|
1157
|
+
validateLoadingFiles(),
|
|
1158
|
+
validateSkeletonDocumentation(),
|
|
1159
|
+
validateSpacingConsistency(),
|
|
1160
|
+
]);
|
|
1161
|
+
// Run additional validations (these are newer and can run in parallel)
|
|
1162
|
+
const [designTokenIssues, accessibilityIssues, separatorIssues, itemCountIssues] = await Promise.all([
|
|
1163
|
+
validateDesignTokenConsistency(),
|
|
1164
|
+
validateSkeletonAccessibility(),
|
|
1165
|
+
validateSeparatorConsistency(),
|
|
1166
|
+
validateSkeletonItemCounts(),
|
|
1167
|
+
]);
|
|
1168
|
+
allIssues.push(...knownMappingIssues, ...structuralIssues, ...autoDiscoveredIssues, ...loadingFileIssues, ...documentationIssues, ...spacingIssues, ...designTokenIssues, ...accessibilityIssues, ...separatorIssues, ...itemCountIssues);
|
|
1169
|
+
// Print results
|
|
1170
|
+
const RED = "\x1b[31m";
|
|
1171
|
+
const YELLOW = "\x1b[33m";
|
|
1172
|
+
const BLUE = "\x1b[34m";
|
|
1173
|
+
const GREEN = "\x1b[32m";
|
|
1174
|
+
const DIM = "\x1b[2m";
|
|
1175
|
+
const RESET = "\x1b[0m";
|
|
1176
|
+
const errors = allIssues.filter((i) => i.severity === "error");
|
|
1177
|
+
const warnings = allIssues.filter((i) => i.severity === "warning");
|
|
1178
|
+
const infos = allIssues.filter((i) => i.severity === "info");
|
|
1179
|
+
if (allIssues.length === 0) {
|
|
1180
|
+
console.log(`${GREEN}${console_chars_1.emoji.success} No skeleton consistency issues found!${RESET}\n`);
|
|
1181
|
+
}
|
|
1182
|
+
else {
|
|
1183
|
+
// Group by category
|
|
1184
|
+
const byCategory = new Map();
|
|
1185
|
+
for (const issue of allIssues) {
|
|
1186
|
+
const list = byCategory.get(issue.category) ?? [];
|
|
1187
|
+
list.push(issue);
|
|
1188
|
+
byCategory.set(issue.category, list);
|
|
1189
|
+
}
|
|
1190
|
+
console.log(`Found ${errors.length} errors, ${warnings.length} warnings, ${infos.length} info\n`);
|
|
1191
|
+
if (errors.length > 0) {
|
|
1192
|
+
console.log(`${RED}${console_chars_1.emoji.error} ERRORS:${RESET}\n`);
|
|
1193
|
+
for (const issue of errors) {
|
|
1194
|
+
printIssue(issue, RED);
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
if (warnings.length > 0) {
|
|
1198
|
+
console.log(`${YELLOW}${console_chars_1.emoji.warning} WARNINGS:${RESET}\n`);
|
|
1199
|
+
for (const issue of warnings) {
|
|
1200
|
+
printIssue(issue, YELLOW);
|
|
1201
|
+
}
|
|
1202
|
+
}
|
|
1203
|
+
if (infos.length > 0 && process.argv.includes("--verbose")) {
|
|
1204
|
+
console.log(`${BLUE}${console_chars_1.emoji.info} INFO:${RESET}\n`);
|
|
1205
|
+
for (const issue of infos) {
|
|
1206
|
+
printIssue(issue, DIM);
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
else if (infos.length > 0) {
|
|
1210
|
+
console.log(`${DIM}(${infos.length} info items - use --verbose to see)${RESET}\n`);
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
return {
|
|
1214
|
+
passed: errors.length === 0,
|
|
1215
|
+
issues: allIssues,
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
function printIssue(issue, color) {
|
|
1219
|
+
const RESET = "\x1b[0m";
|
|
1220
|
+
const DIM = "\x1b[2m";
|
|
1221
|
+
const relPath = path.relative(process.cwd(), issue.file).replace(/\\/g, "/");
|
|
1222
|
+
console.log(` ${color}[${issue.category}]${RESET} ${relPath}:${issue.line}`);
|
|
1223
|
+
console.log(` ${issue.message}`);
|
|
1224
|
+
console.log(` ${DIM}Fix: ${issue.suggestion}${RESET}`);
|
|
1225
|
+
if (issue.details) {
|
|
1226
|
+
const detailStr = Object.entries(issue.details)
|
|
1227
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
1228
|
+
.join(", ");
|
|
1229
|
+
console.log(` ${DIM}Details: ${detailStr}${RESET}`);
|
|
1230
|
+
}
|
|
1231
|
+
console.log("");
|
|
1232
|
+
}
|
|
1233
|
+
// Run if executed directly
|
|
1234
|
+
if (require.main === module) {
|
|
1235
|
+
checkSkeletonSizeConsistency().then((result) => {
|
|
1236
|
+
process.exit(result.passed ? 0 : 1);
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
//# sourceMappingURL=skeleton-size-consistency.js.map
|