@empline/preflight 1.1.11 → 1.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/checks/consolidated/auth-storage-state.d.ts +3 -0
- package/dist/checks/consolidated/auth-storage-state.d.ts.map +1 -0
- package/dist/checks/consolidated/auth-storage-state.js +146 -0
- package/dist/checks/consolidated/auth-storage-state.js.map +1 -0
- package/dist/checks/consolidated/business.d.ts +50 -0
- package/dist/checks/consolidated/business.d.ts.map +1 -0
- package/dist/checks/consolidated/business.js +252 -0
- package/dist/checks/consolidated/business.js.map +1 -0
- package/dist/checks/consolidated/caching-strategy.d.ts +104 -0
- package/dist/checks/consolidated/caching-strategy.d.ts.map +1 -0
- package/dist/checks/consolidated/caching-strategy.js +725 -0
- package/dist/checks/consolidated/caching-strategy.js.map +1 -0
- package/dist/checks/consolidated/code-quality.d.ts +83 -0
- package/dist/checks/consolidated/code-quality.d.ts.map +1 -0
- package/dist/checks/consolidated/code-quality.js +445 -0
- package/dist/checks/consolidated/code-quality.js.map +1 -0
- package/dist/checks/consolidated/console-statements.d.ts +32 -0
- package/dist/checks/consolidated/console-statements.d.ts.map +1 -0
- package/dist/checks/consolidated/console-statements.js +304 -0
- package/dist/checks/consolidated/console-statements.js.map +1 -0
- package/dist/checks/consolidated/css-advanced-validation.d.ts +24 -0
- package/dist/checks/consolidated/css-advanced-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/css-advanced-validation.js +415 -0
- package/dist/checks/consolidated/css-advanced-validation.js.map +1 -0
- package/dist/checks/consolidated/css-organization.d.ts +14 -0
- package/dist/checks/consolidated/css-organization.d.ts.map +1 -0
- package/dist/checks/consolidated/css-organization.js +432 -0
- package/dist/checks/consolidated/css-organization.js.map +1 -0
- package/dist/checks/consolidated/css-runtime-validation.d.ts +22 -0
- package/dist/checks/consolidated/css-runtime-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/css-runtime-validation.js +330 -0
- package/dist/checks/consolidated/css-runtime-validation.js.map +1 -0
- package/dist/checks/consolidated/css-variable-validation.d.ts +17 -0
- package/dist/checks/consolidated/css-variable-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/css-variable-validation.js +412 -0
- package/dist/checks/consolidated/css-variable-validation.js.map +1 -0
- package/dist/checks/consolidated/dark-mode-consistency.d.ts +23 -0
- package/dist/checks/consolidated/dark-mode-consistency.d.ts.map +1 -0
- package/dist/checks/consolidated/dark-mode-consistency.js +291 -0
- package/dist/checks/consolidated/dark-mode-consistency.js.map +1 -0
- package/dist/checks/consolidated/database.d.ts +95 -0
- package/dist/checks/consolidated/database.d.ts.map +1 -0
- package/dist/checks/consolidated/database.js +427 -0
- package/dist/checks/consolidated/database.js.map +1 -0
- package/dist/checks/consolidated/e2e-checks.d.ts +52 -0
- package/dist/checks/consolidated/e2e-checks.d.ts.map +1 -0
- package/dist/checks/consolidated/e2e-checks.js +157 -0
- package/dist/checks/consolidated/e2e-checks.js.map +1 -0
- package/dist/checks/consolidated/e2e-regression-coverage.d.ts +14 -0
- package/dist/checks/consolidated/e2e-regression-coverage.d.ts.map +1 -0
- package/dist/checks/consolidated/e2e-regression-coverage.js +151 -0
- package/dist/checks/consolidated/e2e-regression-coverage.js.map +1 -0
- package/dist/checks/consolidated/e2e-validation.d.ts +137 -0
- package/dist/checks/consolidated/e2e-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/e2e-validation.js +1001 -0
- package/dist/checks/consolidated/e2e-validation.js.map +1 -0
- package/dist/checks/consolidated/enterprise-baseline.d.ts +9 -0
- package/dist/checks/consolidated/enterprise-baseline.d.ts.map +1 -0
- package/dist/checks/consolidated/enterprise-baseline.js +277 -0
- package/dist/checks/consolidated/enterprise-baseline.js.map +1 -0
- package/dist/checks/consolidated/generate-pageload-config.d.ts +6 -0
- package/dist/checks/consolidated/generate-pageload-config.d.ts.map +1 -0
- package/dist/checks/consolidated/generate-pageload-config.js +161 -0
- package/dist/checks/consolidated/generate-pageload-config.js.map +1 -0
- package/dist/checks/consolidated/hardened-checks.d.ts +276 -0
- package/dist/checks/consolidated/hardened-checks.d.ts.map +1 -0
- package/dist/checks/consolidated/hardened-checks.js +3056 -0
- package/dist/checks/consolidated/hardened-checks.js.map +1 -0
- package/dist/checks/consolidated/homepage-ux.d.ts +12 -0
- package/dist/checks/consolidated/homepage-ux.d.ts.map +1 -0
- package/dist/checks/consolidated/homepage-ux.js +242 -0
- package/dist/checks/consolidated/homepage-ux.js.map +1 -0
- package/dist/checks/consolidated/images.d.ts +76 -0
- package/dist/checks/consolidated/images.d.ts.map +1 -0
- package/dist/checks/consolidated/images.js +311 -0
- package/dist/checks/consolidated/images.js.map +1 -0
- package/dist/checks/consolidated/import-cycles.d.ts +63 -0
- package/dist/checks/consolidated/import-cycles.d.ts.map +1 -0
- package/dist/checks/consolidated/import-cycles.js +291 -0
- package/dist/checks/consolidated/import-cycles.js.map +1 -0
- package/dist/checks/consolidated/imports.d.ts +112 -0
- package/dist/checks/consolidated/imports.d.ts.map +1 -0
- package/dist/checks/consolidated/imports.js +977 -0
- package/dist/checks/consolidated/imports.js.map +1 -0
- package/dist/checks/consolidated/inline-style-conflicts.d.ts +21 -0
- package/dist/checks/consolidated/inline-style-conflicts.d.ts.map +1 -0
- package/dist/checks/consolidated/inline-style-conflicts.js +300 -0
- package/dist/checks/consolidated/inline-style-conflicts.js.map +1 -0
- package/dist/checks/consolidated/lib-organization.d.ts +12 -0
- package/dist/checks/consolidated/lib-organization.d.ts.map +1 -0
- package/dist/checks/consolidated/lib-organization.js +419 -0
- package/dist/checks/consolidated/lib-organization.js.map +1 -0
- package/dist/checks/consolidated/n-plus-one.d.ts +63 -0
- package/dist/checks/consolidated/n-plus-one.d.ts.map +1 -0
- package/dist/checks/consolidated/n-plus-one.js +331 -0
- package/dist/checks/consolidated/n-plus-one.js.map +1 -0
- package/dist/checks/consolidated/nextjs.d.ts +51 -0
- package/dist/checks/consolidated/nextjs.d.ts.map +1 -0
- package/dist/checks/consolidated/nextjs.js +205 -0
- package/dist/checks/consolidated/nextjs.js.map +1 -0
- package/dist/checks/consolidated/organization.d.ts +54 -0
- package/dist/checks/consolidated/organization.d.ts.map +1 -0
- package/dist/checks/consolidated/organization.js +158 -0
- package/dist/checks/consolidated/organization.js.map +1 -0
- package/dist/checks/consolidated/pageload.d.ts +12 -0
- package/dist/checks/consolidated/pageload.d.ts.map +1 -0
- package/dist/checks/consolidated/pageload.js +138 -0
- package/dist/checks/consolidated/pageload.js.map +1 -0
- package/dist/checks/consolidated/performance.d.ts +112 -0
- package/dist/checks/consolidated/performance.d.ts.map +1 -0
- package/dist/checks/consolidated/performance.js +1546 -0
- package/dist/checks/consolidated/performance.js.map +1 -0
- package/dist/checks/consolidated/quality.d.ts +52 -0
- package/dist/checks/consolidated/quality.d.ts.map +1 -0
- package/dist/checks/consolidated/quality.js +253 -0
- package/dist/checks/consolidated/quality.js.map +1 -0
- package/dist/checks/consolidated/react.d.ts +48 -0
- package/dist/checks/consolidated/react.d.ts.map +1 -0
- package/dist/checks/consolidated/react.js +203 -0
- package/dist/checks/consolidated/react.js.map +1 -0
- package/dist/checks/consolidated/regression-hygiene.d.ts +17 -0
- package/dist/checks/consolidated/regression-hygiene.d.ts.map +1 -0
- package/dist/checks/consolidated/regression-hygiene.js +242 -0
- package/dist/checks/consolidated/regression-hygiene.js.map +1 -0
- package/dist/checks/consolidated/regression.d.ts +20 -0
- package/dist/checks/consolidated/regression.d.ts.map +1 -0
- package/dist/checks/consolidated/regression.js +121 -0
- package/dist/checks/consolidated/regression.js.map +1 -0
- package/dist/checks/consolidated/runtime.d.ts +53 -0
- package/dist/checks/consolidated/runtime.d.ts.map +1 -0
- package/dist/checks/consolidated/runtime.js +160 -0
- package/dist/checks/consolidated/runtime.js.map +1 -0
- package/dist/checks/consolidated/script-performance.d.ts +17 -0
- package/dist/checks/consolidated/script-performance.d.ts.map +1 -0
- package/dist/checks/consolidated/script-performance.js +137 -0
- package/dist/checks/consolidated/script-performance.js.map +1 -0
- package/dist/checks/consolidated/security.d.ts +78 -0
- package/dist/checks/consolidated/security.d.ts.map +1 -0
- package/dist/checks/consolidated/security.js +404 -0
- package/dist/checks/consolidated/security.js.map +1 -0
- package/dist/checks/consolidated/seo.d.ts +31 -0
- package/dist/checks/consolidated/seo.d.ts.map +1 -0
- package/dist/checks/consolidated/seo.js +1438 -0
- package/dist/checks/consolidated/seo.js.map +1 -0
- package/dist/checks/consolidated/sx-prop-deprecation.d.ts +22 -0
- package/dist/checks/consolidated/sx-prop-deprecation.d.ts.map +1 -0
- package/dist/checks/consolidated/sx-prop-deprecation.js +280 -0
- package/dist/checks/consolidated/sx-prop-deprecation.js.map +1 -0
- package/dist/checks/consolidated/tailwind-class-validation.d.ts +25 -0
- package/dist/checks/consolidated/tailwind-class-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/tailwind-class-validation.js +533 -0
- package/dist/checks/consolidated/tailwind-class-validation.js.map +1 -0
- package/dist/checks/consolidated/testing.d.ts +54 -0
- package/dist/checks/consolidated/testing.d.ts.map +1 -0
- package/dist/checks/consolidated/testing.js +163 -0
- package/dist/checks/consolidated/testing.js.map +1 -0
- package/dist/checks/consolidated/typescript.d.ts +3 -0
- package/dist/checks/consolidated/typescript.d.ts.map +1 -0
- package/dist/checks/consolidated/typescript.js +31 -0
- package/dist/checks/consolidated/typescript.js.map +1 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.d.ts +104 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.js +689 -0
- package/dist/checks/consolidated/ui-accessibility-advanced.js.map +1 -0
- package/dist/checks/consolidated/ui-accessibility.d.ts +121 -0
- package/dist/checks/consolidated/ui-accessibility.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-accessibility.js +776 -0
- package/dist/checks/consolidated/ui-accessibility.js.map +1 -0
- package/dist/checks/consolidated/ui-advanced-spacing.d.ts +142 -0
- package/dist/checks/consolidated/ui-advanced-spacing.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-advanced-spacing.js +1220 -0
- package/dist/checks/consolidated/ui-advanced-spacing.js.map +1 -0
- package/dist/checks/consolidated/ui-animation-duration.d.ts +108 -0
- package/dist/checks/consolidated/ui-animation-duration.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-animation-duration.js +531 -0
- package/dist/checks/consolidated/ui-animation-duration.js.map +1 -0
- package/dist/checks/consolidated/ui-border-radius.d.ts +90 -0
- package/dist/checks/consolidated/ui-border-radius.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-border-radius.js +519 -0
- package/dist/checks/consolidated/ui-border-radius.js.map +1 -0
- package/dist/checks/consolidated/ui-buttons.d.ts +32 -0
- package/dist/checks/consolidated/ui-buttons.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-buttons.js +481 -0
- package/dist/checks/consolidated/ui-buttons.js.map +1 -0
- package/dist/checks/consolidated/ui-cards.d.ts +29 -0
- package/dist/checks/consolidated/ui-cards.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-cards.js +504 -0
- package/dist/checks/consolidated/ui-cards.js.map +1 -0
- package/dist/checks/consolidated/ui-checks.d.ts +48 -0
- package/dist/checks/consolidated/ui-checks.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-checks.js +264 -0
- package/dist/checks/consolidated/ui-checks.js.map +1 -0
- package/dist/checks/consolidated/ui-cleanup.d.ts +81 -0
- package/dist/checks/consolidated/ui-cleanup.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-cleanup.js +650 -0
- package/dist/checks/consolidated/ui-cleanup.js.map +1 -0
- package/dist/checks/consolidated/ui-components.d.ts +255 -0
- package/dist/checks/consolidated/ui-components.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-components.js +2008 -0
- package/dist/checks/consolidated/ui-components.js.map +1 -0
- package/dist/checks/consolidated/ui-consistency-advanced.d.ts +130 -0
- package/dist/checks/consolidated/ui-consistency-advanced.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-consistency-advanced.js +982 -0
- package/dist/checks/consolidated/ui-consistency-advanced.js.map +1 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts +30 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.js +1018 -0
- package/dist/checks/consolidated/ui-consistency-comprehensive.js.map +1 -0
- package/dist/checks/consolidated/ui-consistency-extended.d.ts +26 -0
- package/dist/checks/consolidated/ui-consistency-extended.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-consistency-extended.js +606 -0
- package/dist/checks/consolidated/ui-consistency-extended.js.map +1 -0
- package/dist/checks/consolidated/ui-data-display.d.ts +103 -0
- package/dist/checks/consolidated/ui-data-display.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-data-display.js +740 -0
- package/dist/checks/consolidated/ui-data-display.js.map +1 -0
- package/dist/checks/consolidated/ui-deprecated.d.ts +22 -0
- package/dist/checks/consolidated/ui-deprecated.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-deprecated.js +336 -0
- package/dist/checks/consolidated/ui-deprecated.js.map +1 -0
- package/dist/checks/consolidated/ui-empty-null-states.d.ts +90 -0
- package/dist/checks/consolidated/ui-empty-null-states.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-empty-null-states.js +511 -0
- package/dist/checks/consolidated/ui-empty-null-states.js.map +1 -0
- package/dist/checks/consolidated/ui-error-states.d.ts +99 -0
- package/dist/checks/consolidated/ui-error-states.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-error-states.js +694 -0
- package/dist/checks/consolidated/ui-error-states.js.map +1 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.d.ts +90 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.js +596 -0
- package/dist/checks/consolidated/ui-feedback-confirmations.js.map +1 -0
- package/dist/checks/consolidated/ui-forms.d.ts +32 -0
- package/dist/checks/consolidated/ui-forms.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-forms.js +568 -0
- package/dist/checks/consolidated/ui-forms.js.map +1 -0
- package/dist/checks/consolidated/ui-gradient-shadow.d.ts +90 -0
- package/dist/checks/consolidated/ui-gradient-shadow.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-gradient-shadow.js +568 -0
- package/dist/checks/consolidated/ui-gradient-shadow.js.map +1 -0
- package/dist/checks/consolidated/ui-grid-responsive.d.ts +27 -0
- package/dist/checks/consolidated/ui-grid-responsive.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-grid-responsive.js +441 -0
- package/dist/checks/consolidated/ui-grid-responsive.js.map +1 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.d.ts +104 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.js +514 -0
- package/dist/checks/consolidated/ui-icon-size-tokens.js.map +1 -0
- package/dist/checks/consolidated/ui-iconography.d.ts +90 -0
- package/dist/checks/consolidated/ui-iconography.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-iconography.js +565 -0
- package/dist/checks/consolidated/ui-iconography.js.map +1 -0
- package/dist/checks/consolidated/ui-interactive-states.d.ts +240 -0
- package/dist/checks/consolidated/ui-interactive-states.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-interactive-states.js +2474 -0
- package/dist/checks/consolidated/ui-interactive-states.js.map +1 -0
- package/dist/checks/consolidated/ui-layout.d.ts +256 -0
- package/dist/checks/consolidated/ui-layout.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-layout.js +1371 -0
- package/dist/checks/consolidated/ui-layout.js.map +1 -0
- package/dist/checks/consolidated/ui-loading-skeletons.d.ts +11 -0
- package/dist/checks/consolidated/ui-loading-skeletons.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-loading-skeletons.js +145 -0
- package/dist/checks/consolidated/ui-loading-skeletons.js.map +1 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts +9 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.js +125 -0
- package/dist/checks/consolidated/ui-loading-state-skeletons.js.map +1 -0
- package/dist/checks/consolidated/ui-media.d.ts +74 -0
- package/dist/checks/consolidated/ui-media.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-media.js +408 -0
- package/dist/checks/consolidated/ui-media.js.map +1 -0
- package/dist/checks/consolidated/ui-micro-interactions.d.ts +107 -0
- package/dist/checks/consolidated/ui-micro-interactions.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-micro-interactions.js +825 -0
- package/dist/checks/consolidated/ui-micro-interactions.js.map +1 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.d.ts +114 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.js +566 -0
- package/dist/checks/consolidated/ui-microcopy-consistency.js.map +1 -0
- package/dist/checks/consolidated/ui-mobile-ux.d.ts +251 -0
- package/dist/checks/consolidated/ui-mobile-ux.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-mobile-ux.js +2212 -0
- package/dist/checks/consolidated/ui-mobile-ux.js.map +1 -0
- package/dist/checks/consolidated/ui-motion-accessibility.d.ts +93 -0
- package/dist/checks/consolidated/ui-motion-accessibility.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-motion-accessibility.js +450 -0
- package/dist/checks/consolidated/ui-motion-accessibility.js.map +1 -0
- package/dist/checks/consolidated/ui-navigation.d.ts +85 -0
- package/dist/checks/consolidated/ui-navigation.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-navigation.js +673 -0
- package/dist/checks/consolidated/ui-navigation.js.map +1 -0
- package/dist/checks/consolidated/ui-patterns.d.ts +174 -0
- package/dist/checks/consolidated/ui-patterns.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-patterns.js +1532 -0
- package/dist/checks/consolidated/ui-patterns.js.map +1 -0
- package/dist/checks/consolidated/ui-responsive.d.ts +89 -0
- package/dist/checks/consolidated/ui-responsive.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-responsive.js +588 -0
- package/dist/checks/consolidated/ui-responsive.js.map +1 -0
- package/dist/checks/consolidated/ui-spacing-standards.d.ts +43 -0
- package/dist/checks/consolidated/ui-spacing-standards.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-spacing-standards.js +874 -0
- package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -0
- package/dist/checks/consolidated/ui-spacing.d.ts +751 -0
- package/dist/checks/consolidated/ui-spacing.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-spacing.js +4996 -0
- package/dist/checks/consolidated/ui-spacing.js.map +1 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts +70 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.js +429 -0
- package/dist/checks/consolidated/ui-standards-auto-fixer.js.map +1 -0
- package/dist/checks/consolidated/ui-standards-enforcement.d.ts +100 -0
- package/dist/checks/consolidated/ui-standards-enforcement.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-standards-enforcement.js +935 -0
- package/dist/checks/consolidated/ui-standards-enforcement.js.map +1 -0
- package/dist/checks/consolidated/ui-state-consistency.d.ts +90 -0
- package/dist/checks/consolidated/ui-state-consistency.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-state-consistency.js +659 -0
- package/dist/checks/consolidated/ui-state-consistency.js.map +1 -0
- package/dist/checks/consolidated/ui-style-validation.d.ts +74 -0
- package/dist/checks/consolidated/ui-style-validation.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-style-validation.js +403 -0
- package/dist/checks/consolidated/ui-style-validation.js.map +1 -0
- package/dist/checks/consolidated/ui-tokens.d.ts +110 -0
- package/dist/checks/consolidated/ui-tokens.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-tokens.js +990 -0
- package/dist/checks/consolidated/ui-tokens.js.map +1 -0
- package/dist/checks/consolidated/ui-typography.d.ts +77 -0
- package/dist/checks/consolidated/ui-typography.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-typography.js +416 -0
- package/dist/checks/consolidated/ui-typography.js.map +1 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.d.ts +90 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.d.ts.map +1 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.js +562 -0
- package/dist/checks/consolidated/ui-visual-hierarchy.js.map +1 -0
- package/dist/checks/consolidated/woocommerce.d.ts +50 -0
- package/dist/checks/consolidated/woocommerce.d.ts.map +1 -0
- package/dist/checks/consolidated/woocommerce.js +198 -0
- package/dist/checks/consolidated/woocommerce.js.map +1 -0
- package/dist/checks/core/api-route-protection.d.ts +2 -0
- package/dist/checks/core/api-route-protection.d.ts.map +1 -0
- package/dist/checks/core/api-route-protection.js +101 -0
- package/dist/checks/core/api-route-protection.js.map +1 -0
- package/dist/checks/core/critical.d.ts +8 -0
- package/dist/checks/core/critical.d.ts.map +1 -0
- package/dist/checks/core/critical.js +200 -0
- package/dist/checks/core/critical.js.map +1 -0
- package/dist/checks/core/database.d.ts +8 -0
- package/dist/checks/core/database.d.ts.map +1 -0
- package/dist/checks/core/database.js +699 -0
- package/dist/checks/core/database.js.map +1 -0
- package/dist/checks/core/development.d.ts +8 -0
- package/dist/checks/core/development.d.ts.map +1 -0
- package/dist/checks/core/development.js +417 -0
- package/dist/checks/core/development.js.map +1 -0
- package/dist/checks/core/hydration-mismatch-check.d.ts +38 -0
- package/dist/checks/core/hydration-mismatch-check.d.ts.map +1 -0
- package/dist/checks/core/hydration-mismatch-check.js +411 -0
- package/dist/checks/core/hydration-mismatch-check.js.map +1 -0
- package/dist/checks/core/performance.d.ts +8 -0
- package/dist/checks/core/performance.d.ts.map +1 -0
- package/dist/checks/core/performance.js +474 -0
- package/dist/checks/core/performance.js.map +1 -0
- package/dist/checks/core/security.d.ts +8 -0
- package/dist/checks/core/security.d.ts.map +1 -0
- package/dist/checks/core/security.js +275 -0
- package/dist/checks/core/security.js.map +1 -0
- package/dist/checks/core/standardized-error-handling.d.ts +43 -0
- package/dist/checks/core/standardized-error-handling.d.ts.map +1 -0
- package/dist/checks/core/standardized-error-handling.js +384 -0
- package/dist/checks/core/standardized-error-handling.js.map +1 -0
- package/dist/checks/core/supercatch.d.ts +8 -0
- package/dist/checks/core/supercatch.d.ts.map +1 -0
- package/dist/checks/core/supercatch.js +750 -0
- package/dist/checks/core/supercatch.js.map +1 -0
- package/dist/checks/core/suppression-check.d.ts +2 -0
- package/dist/checks/core/suppression-check.d.ts.map +1 -0
- package/dist/checks/core/suppression-check.js +129 -0
- package/dist/checks/core/suppression-check.js.map +1 -0
- package/dist/checks/core/ui-quality.d.ts +8 -0
- package/dist/checks/core/ui-quality.d.ts.map +1 -0
- package/dist/checks/core/ui-quality.js +1736 -0
- package/dist/checks/core/ui-quality.js.map +1 -0
- package/dist/checks/core/unused-assets-check.d.ts +2 -0
- package/dist/checks/core/unused-assets-check.d.ts.map +1 -0
- package/dist/checks/core/unused-assets-check.js +112 -0
- package/dist/checks/core/unused-assets-check.js.map +1 -0
- package/dist/checks/core/use-status-ssr-safety.d.ts +34 -0
- package/dist/checks/core/use-status-ssr-safety.d.ts.map +1 -0
- package/dist/checks/core/use-status-ssr-safety.js +283 -0
- package/dist/checks/core/use-status-ssr-safety.js.map +1 -0
- package/dist/checks/email/email-flow-validation.d.ts +23 -0
- package/dist/checks/email/email-flow-validation.d.ts.map +1 -0
- package/dist/checks/email/email-flow-validation.js +468 -0
- package/dist/checks/email/email-flow-validation.js.map +1 -0
- package/dist/checks/email/email-template-db-verification.d.ts +20 -0
- package/dist/checks/email/email-template-db-verification.d.ts.map +1 -0
- package/dist/checks/email/email-template-db-verification.js +46 -0
- package/dist/checks/email/email-template-db-verification.js.map +1 -0
- package/dist/checks/email/email-template-validation.d.ts +24 -0
- package/dist/checks/email/email-template-validation.d.ts.map +1 -0
- package/dist/checks/email/email-template-validation.js +688 -0
- package/dist/checks/email/email-template-validation.js.map +1 -0
- package/dist/checks/jsx/comment-placement.d.ts +45 -0
- package/dist/checks/jsx/comment-placement.d.ts.map +1 -0
- package/dist/checks/jsx/comment-placement.js +316 -0
- package/dist/checks/jsx/comment-placement.js.map +1 -0
- package/dist/checks/specialized/admin-layout-check.d.ts +19 -0
- package/dist/checks/specialized/admin-layout-check.d.ts.map +1 -0
- package/dist/checks/specialized/admin-layout-check.js +166 -0
- package/dist/checks/specialized/admin-layout-check.js.map +1 -0
- package/dist/checks/specialized/client-server-separation.d.ts +14 -0
- package/dist/checks/specialized/client-server-separation.d.ts.map +1 -0
- package/dist/checks/specialized/client-server-separation.js +197 -0
- package/dist/checks/specialized/client-server-separation.js.map +1 -0
- package/dist/checks/specialized/cost-optimization.d.ts +18 -0
- package/dist/checks/specialized/cost-optimization.d.ts.map +1 -0
- package/dist/checks/specialized/cost-optimization.js +78 -0
- package/dist/checks/specialized/cost-optimization.js.map +1 -0
- package/dist/checks/specialized/database-migration-sync.d.ts +21 -0
- package/dist/checks/specialized/database-migration-sync.d.ts.map +1 -0
- package/dist/checks/specialized/database-migration-sync.js +150 -0
- package/dist/checks/specialized/database-migration-sync.js.map +1 -0
- package/dist/checks/specialized/database-model-validation.d.ts +15 -0
- package/dist/checks/specialized/database-model-validation.d.ts.map +1 -0
- package/dist/checks/specialized/database-model-validation.js +35 -0
- package/dist/checks/specialized/database-model-validation.js.map +1 -0
- package/dist/checks/specialized/database-schema-migrations-diff.d.ts +27 -0
- package/dist/checks/specialized/database-schema-migrations-diff.d.ts.map +1 -0
- package/dist/checks/specialized/database-schema-migrations-diff.js +177 -0
- package/dist/checks/specialized/database-schema-migrations-diff.js.map +1 -0
- package/dist/checks/specialized/database-schema-sync.d.ts +23 -0
- package/dist/checks/specialized/database-schema-sync.d.ts.map +1 -0
- package/dist/checks/specialized/database-schema-sync.js +77 -0
- package/dist/checks/specialized/database-schema-sync.js.map +1 -0
- package/dist/checks/specialized/decimal-serialization.d.ts +24 -0
- package/dist/checks/specialized/decimal-serialization.d.ts.map +1 -0
- package/dist/checks/specialized/decimal-serialization.js +400 -0
- package/dist/checks/specialized/decimal-serialization.js.map +1 -0
- package/dist/checks/specialized/detect-router-issues.d.ts +14 -0
- package/dist/checks/specialized/detect-router-issues.d.ts.map +1 -0
- package/dist/checks/specialized/detect-router-issues.js +96 -0
- package/dist/checks/specialized/detect-router-issues.js.map +1 -0
- package/dist/checks/specialized/enum-validation.d.ts +15 -0
- package/dist/checks/specialized/enum-validation.d.ts.map +1 -0
- package/dist/checks/specialized/enum-validation.js +35 -0
- package/dist/checks/specialized/enum-validation.js.map +1 -0
- package/dist/checks/specialized/hash-collision.d.ts +18 -0
- package/dist/checks/specialized/hash-collision.d.ts.map +1 -0
- package/dist/checks/specialized/hash-collision.js +78 -0
- package/dist/checks/specialized/hash-collision.js.map +1 -0
- package/dist/checks/specialized/id-generation-enforcement.d.ts +16 -0
- package/dist/checks/specialized/id-generation-enforcement.d.ts.map +1 -0
- package/dist/checks/specialized/id-generation-enforcement.js +307 -0
- package/dist/checks/specialized/id-generation-enforcement.js.map +1 -0
- package/dist/checks/specialized/image-data-integrity.d.ts +15 -0
- package/dist/checks/specialized/image-data-integrity.d.ts.map +1 -0
- package/dist/checks/specialized/image-data-integrity.js +79 -0
- package/dist/checks/specialized/image-data-integrity.js.map +1 -0
- package/dist/checks/specialized/image-health.d.ts +14 -0
- package/dist/checks/specialized/image-health.d.ts.map +1 -0
- package/dist/checks/specialized/image-health.js +122 -0
- package/dist/checks/specialized/image-health.js.map +1 -0
- package/dist/checks/specialized/image-metadata-validation.d.ts +14 -0
- package/dist/checks/specialized/image-metadata-validation.d.ts.map +1 -0
- package/dist/checks/specialized/image-metadata-validation.js +95 -0
- package/dist/checks/specialized/image-metadata-validation.js.map +1 -0
- package/dist/checks/specialized/image-optimization.d.ts +16 -0
- package/dist/checks/specialized/image-optimization.d.ts.map +1 -0
- package/dist/checks/specialized/image-optimization.js +86 -0
- package/dist/checks/specialized/image-optimization.js.map +1 -0
- package/dist/checks/specialized/invalid-module-imports.d.ts +24 -0
- package/dist/checks/specialized/invalid-module-imports.d.ts.map +1 -0
- package/dist/checks/specialized/invalid-module-imports.js +209 -0
- package/dist/checks/specialized/invalid-module-imports.js.map +1 -0
- package/dist/checks/specialized/lint-validation.d.ts +26 -0
- package/dist/checks/specialized/lint-validation.d.ts.map +1 -0
- package/dist/checks/specialized/lint-validation.js +193 -0
- package/dist/checks/specialized/lint-validation.js.map +1 -0
- package/dist/checks/specialized/listing-workflow.d.ts +19 -0
- package/dist/checks/specialized/listing-workflow.d.ts.map +1 -0
- package/dist/checks/specialized/listing-workflow.js +89 -0
- package/dist/checks/specialized/listing-workflow.js.map +1 -0
- package/dist/checks/specialized/mui-imports-validation.d.ts +18 -0
- package/dist/checks/specialized/mui-imports-validation.d.ts.map +1 -0
- package/dist/checks/specialized/mui-imports-validation.js +134 -0
- package/dist/checks/specialized/mui-imports-validation.js.map +1 -0
- package/dist/checks/specialized/nextauth-v5-compliance.d.ts +16 -0
- package/dist/checks/specialized/nextauth-v5-compliance.d.ts.map +1 -0
- package/dist/checks/specialized/nextauth-v5-compliance.js +164 -0
- package/dist/checks/specialized/nextauth-v5-compliance.js.map +1 -0
- package/dist/checks/specialized/nextjs-params-check.d.ts +14 -0
- package/dist/checks/specialized/nextjs-params-check.d.ts.map +1 -0
- package/dist/checks/specialized/nextjs-params-check.js +140 -0
- package/dist/checks/specialized/nextjs-params-check.js.map +1 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts +16 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts.map +1 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js +36 -0
- package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js.map +1 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts +22 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts.map +1 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.js +97 -0
- package/dist/checks/specialized/no-wata-cardgraded-validation.js.map +1 -0
- package/dist/checks/specialized/parameter-consistency-check.d.ts +20 -0
- package/dist/checks/specialized/parameter-consistency-check.d.ts.map +1 -0
- package/dist/checks/specialized/parameter-consistency-check.js +115 -0
- package/dist/checks/specialized/parameter-consistency-check.js.map +1 -0
- package/dist/checks/specialized/prisma-field-names-validation.d.ts +15 -0
- package/dist/checks/specialized/prisma-field-names-validation.d.ts.map +1 -0
- package/dist/checks/specialized/prisma-field-names-validation.js +35 -0
- package/dist/checks/specialized/prisma-field-names-validation.js.map +1 -0
- package/dist/checks/specialized/prisma-null-syntax.d.ts +34 -0
- package/dist/checks/specialized/prisma-null-syntax.d.ts.map +1 -0
- package/dist/checks/specialized/prisma-null-syntax.js +330 -0
- package/dist/checks/specialized/prisma-null-syntax.js.map +1 -0
- package/dist/checks/specialized/prisma-query-validation.d.ts +15 -0
- package/dist/checks/specialized/prisma-query-validation.d.ts.map +1 -0
- package/dist/checks/specialized/prisma-query-validation.js +35 -0
- package/dist/checks/specialized/prisma-query-validation.js.map +1 -0
- package/dist/checks/specialized/product-type-validation.d.ts +17 -0
- package/dist/checks/specialized/product-type-validation.d.ts.map +1 -0
- package/dist/checks/specialized/product-type-validation.js +129 -0
- package/dist/checks/specialized/product-type-validation.js.map +1 -0
- package/dist/checks/specialized/responsive-image-validation.d.ts +14 -0
- package/dist/checks/specialized/responsive-image-validation.d.ts.map +1 -0
- package/dist/checks/specialized/responsive-image-validation.js +101 -0
- package/dist/checks/specialized/responsive-image-validation.js.map +1 -0
- package/dist/checks/specialized/root-cleanliness.d.ts +21 -0
- package/dist/checks/specialized/root-cleanliness.d.ts.map +1 -0
- package/dist/checks/specialized/root-cleanliness.js +251 -0
- package/dist/checks/specialized/root-cleanliness.js.map +1 -0
- package/dist/checks/specialized/rotation-detection-validation.d.ts +16 -0
- package/dist/checks/specialized/rotation-detection-validation.d.ts.map +1 -0
- package/dist/checks/specialized/rotation-detection-validation.js +113 -0
- package/dist/checks/specialized/rotation-detection-validation.js.map +1 -0
- package/dist/checks/specialized/script-organization.d.ts +17 -0
- package/dist/checks/specialized/script-organization.d.ts.map +1 -0
- package/dist/checks/specialized/script-organization.js +487 -0
- package/dist/checks/specialized/script-organization.js.map +1 -0
- package/dist/checks/specialized/shared-components-migration.d.ts +137 -0
- package/dist/checks/specialized/shared-components-migration.d.ts.map +1 -0
- package/dist/checks/specialized/shared-components-migration.js +1288 -0
- package/dist/checks/specialized/shared-components-migration.js.map +1 -0
- package/dist/checks/specialized/store-specialties-normalization.d.ts +10 -0
- package/dist/checks/specialized/store-specialties-normalization.d.ts.map +1 -0
- package/dist/checks/specialized/store-specialties-normalization.js +126 -0
- package/dist/checks/specialized/store-specialties-normalization.js.map +1 -0
- package/dist/checks/specialized/two-stage-trim-validation.d.ts +16 -0
- package/dist/checks/specialized/two-stage-trim-validation.d.ts.map +1 -0
- package/dist/checks/specialized/two-stage-trim-validation.js +115 -0
- package/dist/checks/specialized/two-stage-trim-validation.js.map +1 -0
- package/dist/checks/specialized/underscore-variable-audit.d.ts +26 -0
- package/dist/checks/specialized/underscore-variable-audit.d.ts.map +1 -0
- package/dist/checks/specialized/underscore-variable-audit.js +219 -0
- package/dist/checks/specialized/underscore-variable-audit.js.map +1 -0
- package/dist/checks/specialized/unified-badge-consistency.d.ts +16 -0
- package/dist/checks/specialized/unified-badge-consistency.d.ts.map +1 -0
- package/dist/checks/specialized/unified-badge-consistency.js +284 -0
- package/dist/checks/specialized/unified-badge-consistency.js.map +1 -0
- package/dist/checks/specialized/validate-integration-enums.d.ts +15 -0
- package/dist/checks/specialized/validate-integration-enums.d.ts.map +1 -0
- package/dist/checks/specialized/validate-integration-enums.js +131 -0
- package/dist/checks/specialized/validate-integration-enums.js.map +1 -0
- package/dist/checks/testing/action-regression.d.ts +23 -0
- package/dist/checks/testing/action-regression.d.ts.map +1 -0
- package/dist/checks/testing/action-regression.js +192 -0
- package/dist/checks/testing/action-regression.js.map +1 -0
- package/dist/checks/testing/critical-api-coverage.d.ts +21 -0
- package/dist/checks/testing/critical-api-coverage.d.ts.map +1 -0
- package/dist/checks/testing/critical-api-coverage.js +158 -0
- package/dist/checks/testing/critical-api-coverage.js.map +1 -0
- package/dist/checks/testing/data-entry-regression-required.d.ts +24 -0
- package/dist/checks/testing/data-entry-regression-required.d.ts.map +1 -0
- package/dist/checks/testing/data-entry-regression-required.js +378 -0
- package/dist/checks/testing/data-entry-regression-required.js.map +1 -0
- package/dist/checks/testing/e2e-best-practices.d.ts +24 -0
- package/dist/checks/testing/e2e-best-practices.d.ts.map +1 -0
- package/dist/checks/testing/e2e-best-practices.js +791 -0
- package/dist/checks/testing/e2e-best-practices.js.map +1 -0
- package/dist/checks/testing/e2e-flake-patterns.d.ts +26 -0
- package/dist/checks/testing/e2e-flake-patterns.d.ts.map +1 -0
- package/dist/checks/testing/e2e-flake-patterns.js +305 -0
- package/dist/checks/testing/e2e-flake-patterns.js.map +1 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts +25 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts.map +1 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.js +613 -0
- package/dist/checks/testing/e2e-redundant-visibility-checks.js.map +1 -0
- package/dist/checks/testing/e2e-slow-tests.d.ts +9 -0
- package/dist/checks/testing/e2e-slow-tests.d.ts.map +1 -0
- package/dist/checks/testing/e2e-slow-tests.js +142 -0
- package/dist/checks/testing/e2e-slow-tests.js.map +1 -0
- package/dist/checks/testing/e2e-timeouts.d.ts +9 -0
- package/dist/checks/testing/e2e-timeouts.d.ts.map +1 -0
- package/dist/checks/testing/e2e-timeouts.js +82 -0
- package/dist/checks/testing/e2e-timeouts.js.map +1 -0
- package/dist/checks/testing/integration-e2e-depth.d.ts +20 -0
- package/dist/checks/testing/integration-e2e-depth.d.ts.map +1 -0
- package/dist/checks/testing/integration-e2e-depth.js +575 -0
- package/dist/checks/testing/integration-e2e-depth.js.map +1 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts +31 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts.map +1 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.js +1582 -0
- package/dist/checks/testing/playwright-feature-coverage-gaps.js.map +1 -0
- package/dist/checks/testing/playwright-mock-inventory.d.ts +24 -0
- package/dist/checks/testing/playwright-mock-inventory.d.ts.map +1 -0
- package/dist/checks/testing/playwright-mock-inventory.js +380 -0
- package/dist/checks/testing/playwright-mock-inventory.js.map +1 -0
- package/dist/checks/testing/test-coverage-threshold.d.ts +25 -0
- package/dist/checks/testing/test-coverage-threshold.d.ts.map +1 -0
- package/dist/checks/testing/test-coverage-threshold.js +166 -0
- package/dist/checks/testing/test-coverage-threshold.js.map +1 -0
- package/dist/checks/testing/test-flakiness-score.d.ts +27 -0
- package/dist/checks/testing/test-flakiness-score.d.ts.map +1 -0
- package/dist/checks/testing/test-flakiness-score.js +358 -0
- package/dist/checks/testing/test-flakiness-score.js.map +1 -0
- package/dist/checks/testing/test-patterns.d.ts +16 -0
- package/dist/checks/testing/test-patterns.d.ts.map +1 -0
- package/dist/checks/testing/test-patterns.js +156 -0
- package/dist/checks/testing/test-patterns.js.map +1 -0
- package/dist/checks/workflows/a-plus-rating-validation.d.ts +42 -0
- package/dist/checks/workflows/a-plus-rating-validation.d.ts.map +1 -0
- package/dist/checks/workflows/a-plus-rating-validation.js +527 -0
- package/dist/checks/workflows/a-plus-rating-validation.js.map +1 -0
- package/dist/checks/workflows/affected.d.ts +14 -0
- package/dist/checks/workflows/affected.d.ts.map +1 -0
- package/dist/checks/workflows/affected.js +126 -0
- package/dist/checks/workflows/affected.js.map +1 -0
- package/dist/checks/workflows/ai.d.ts +6 -0
- package/dist/checks/workflows/ai.d.ts.map +1 -0
- package/dist/checks/workflows/ai.js +42 -0
- package/dist/checks/workflows/ai.js.map +1 -0
- package/dist/checks/workflows/all.d.ts +31 -0
- package/dist/checks/workflows/all.d.ts.map +1 -0
- package/dist/checks/workflows/all.js +2688 -0
- package/dist/checks/workflows/all.js.map +1 -0
- package/dist/checks/workflows/commit.d.ts +19 -0
- package/dist/checks/workflows/commit.d.ts.map +1 -0
- package/dist/checks/workflows/commit.js +207 -0
- package/dist/checks/workflows/commit.js.map +1 -0
- package/dist/checks/workflows/critical.d.ts +9 -0
- package/dist/checks/workflows/critical.d.ts.map +1 -0
- package/dist/checks/workflows/critical.js +213 -0
- package/dist/checks/workflows/critical.js.map +1 -0
- package/dist/checks/workflows/database-id-validation.d.ts +9 -0
- package/dist/checks/workflows/database-id-validation.d.ts.map +1 -0
- package/dist/checks/workflows/database-id-validation.js +13 -0
- package/dist/checks/workflows/database-id-validation.js.map +1 -0
- package/dist/checks/workflows/deploy.d.ts +20 -0
- package/dist/checks/workflows/deploy.d.ts.map +1 -0
- package/dist/checks/workflows/deploy.js +107 -0
- package/dist/checks/workflows/deploy.js.map +1 -0
- package/dist/checks/workflows/deployment-readiness.d.ts +12 -0
- package/dist/checks/workflows/deployment-readiness.d.ts.map +1 -0
- package/dist/checks/workflows/deployment-readiness.js +403 -0
- package/dist/checks/workflows/deployment-readiness.js.map +1 -0
- package/dist/checks/workflows/dev.d.ts +19 -0
- package/dist/checks/workflows/dev.d.ts.map +1 -0
- package/dist/checks/workflows/dev.js +88 -0
- package/dist/checks/workflows/dev.js.map +1 -0
- package/dist/checks/workflows/development.d.ts +9 -0
- package/dist/checks/workflows/development.d.ts.map +1 -0
- package/dist/checks/workflows/development.js +65 -0
- package/dist/checks/workflows/development.js.map +1 -0
- package/dist/checks/workflows/enterprise.d.ts +10 -0
- package/dist/checks/workflows/enterprise.d.ts.map +1 -0
- package/dist/checks/workflows/enterprise.js +359 -0
- package/dist/checks/workflows/enterprise.js.map +1 -0
- package/dist/checks/workflows/images.d.ts +6 -0
- package/dist/checks/workflows/images.d.ts.map +1 -0
- package/dist/checks/workflows/images.js +58 -0
- package/dist/checks/workflows/images.js.map +1 -0
- package/dist/checks/workflows/naming.d.ts +19 -0
- package/dist/checks/workflows/naming.d.ts.map +1 -0
- package/dist/checks/workflows/naming.js +42 -0
- package/dist/checks/workflows/naming.js.map +1 -0
- package/dist/checks/workflows/performance.d.ts +8 -0
- package/dist/checks/workflows/performance.d.ts.map +1 -0
- package/dist/checks/workflows/performance.js +77 -0
- package/dist/checks/workflows/performance.js.map +1 -0
- package/dist/checks/workflows/pre-deploy.d.ts +6 -0
- package/dist/checks/workflows/pre-deploy.d.ts.map +1 -0
- package/dist/checks/workflows/pre-deploy.js +41 -0
- package/dist/checks/workflows/pre-deploy.js.map +1 -0
- package/dist/checks/workflows/security.d.ts +8 -0
- package/dist/checks/workflows/security.d.ts.map +1 -0
- package/dist/checks/workflows/security.js +71 -0
- package/dist/checks/workflows/security.js.map +1 -0
- package/dist/checks/workflows/supercatch.d.ts +8 -0
- package/dist/checks/workflows/supercatch.d.ts.map +1 -0
- package/dist/checks/workflows/supercatch.js +127 -0
- package/dist/checks/workflows/supercatch.js.map +1 -0
- package/dist/checks/workflows/ui-quality.d.ts +9 -0
- package/dist/checks/workflows/ui-quality.d.ts.map +1 -0
- package/dist/checks/workflows/ui-quality.js +264 -0
- package/dist/checks/workflows/ui-quality.js.map +1 -0
- package/dist/checks/workflows/ui-uniformity.d.ts +18 -0
- package/dist/checks/workflows/ui-uniformity.d.ts.map +1 -0
- package/dist/checks/workflows/ui-uniformity.js +265 -0
- package/dist/checks/workflows/ui-uniformity.js.map +1 -0
- package/dist/checks/workflows/vercel.d.ts +16 -0
- package/dist/checks/workflows/vercel.d.ts.map +1 -0
- package/dist/checks/workflows/vercel.js +173 -0
- package/dist/checks/workflows/vercel.js.map +1 -0
- package/dist/utils/validation-helpers.d.ts +43 -0
- package/dist/utils/validation-helpers.d.ts.map +1 -0
- package/dist/utils/validation-helpers.js +370 -0
- package/dist/utils/validation-helpers.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,982 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Advanced UI Consistency Preflight
|
|
5
|
+
*
|
|
6
|
+
* Comprehensive consistency checks:
|
|
7
|
+
* 1. Tooltip Consistency - Delay, placement, styling
|
|
8
|
+
* 2. Modal/Drawer Sizing - maxWidth, consistent sizing
|
|
9
|
+
* 3. Pagination Consistency - Different patterns across tables
|
|
10
|
+
* 4. Avatar Sizing - Inconsistent sizes
|
|
11
|
+
* 5. Badge Positioning - Proper overlap positioning
|
|
12
|
+
* 5b. UI Control Gap Spacing - Uniform gaps in SegmentedControl, Tabs, Chips, Button groups
|
|
13
|
+
* 6. Divider Usage - Missing dividers between sections
|
|
14
|
+
* 7. Transition Consistency - Hardcoded vs design tokens
|
|
15
|
+
* 8. Overflow Handling - Text overflow without ellipsis
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* pnpm preflight:ui-consistency # All checks
|
|
19
|
+
* pnpm preflight:ui-consistency tooltips # Tooltip only
|
|
20
|
+
* pnpm preflight:ui-consistency modals # Modal sizing only
|
|
21
|
+
* pnpm preflight:ui-consistency pagination # Pagination only
|
|
22
|
+
* pnpm preflight:ui-consistency avatars # Avatar sizing only
|
|
23
|
+
* pnpm preflight:ui-consistency badges # Badge positioning only
|
|
24
|
+
* pnpm preflight:ui-consistency gaps # UI control gap spacing only
|
|
25
|
+
* pnpm preflight:ui-consistency dividers # Divider usage only
|
|
26
|
+
* pnpm preflight:ui-consistency transitions # Transition consistency only
|
|
27
|
+
* pnpm preflight:ui-consistency overflow # Overflow handling only
|
|
28
|
+
*/
|
|
29
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
30
|
+
if (k2 === undefined) k2 = k;
|
|
31
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
32
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
33
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
34
|
+
}
|
|
35
|
+
Object.defineProperty(o, k2, desc);
|
|
36
|
+
}) : (function(o, m, k, k2) {
|
|
37
|
+
if (k2 === undefined) k2 = k;
|
|
38
|
+
o[k2] = m[k];
|
|
39
|
+
}));
|
|
40
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
41
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
42
|
+
}) : function(o, v) {
|
|
43
|
+
o["default"] = v;
|
|
44
|
+
});
|
|
45
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
46
|
+
var ownKeys = function(o) {
|
|
47
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
48
|
+
var ar = [];
|
|
49
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
50
|
+
return ar;
|
|
51
|
+
};
|
|
52
|
+
return ownKeys(o);
|
|
53
|
+
};
|
|
54
|
+
return function (mod) {
|
|
55
|
+
if (mod && mod.__esModule) return mod;
|
|
56
|
+
var result = {};
|
|
57
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
58
|
+
__setModuleDefault(result, mod);
|
|
59
|
+
return result;
|
|
60
|
+
};
|
|
61
|
+
})();
|
|
62
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
63
|
+
exports.UIConsistencyAdvancedModule = void 0;
|
|
64
|
+
const fs = __importStar(require("fs"));
|
|
65
|
+
const file_cache_1 = require("../../shared/file-cache");
|
|
66
|
+
const path = __importStar(require("path"));
|
|
67
|
+
const console_chars_1 = require("../../utils/console-chars");
|
|
68
|
+
const universal_progress_reporter_1 = require("../system/universal-progress-reporter");
|
|
69
|
+
const concurrency_config_1 = require("../../shared/concurrency-config");
|
|
70
|
+
const EXCLUDED_PATTERNS = [
|
|
71
|
+
"**/node_modules/**",
|
|
72
|
+
"**/.next/**",
|
|
73
|
+
"**/dist/**",
|
|
74
|
+
"**/build/**",
|
|
75
|
+
"**/*.test.tsx",
|
|
76
|
+
"**/*.spec.tsx",
|
|
77
|
+
"**/*.stories.tsx",
|
|
78
|
+
];
|
|
79
|
+
// Get concurrency from shared config (respects PREFLIGHT_CONCURRENCY env var)
|
|
80
|
+
const concurrencyConfig = (0, concurrency_config_1.getConcurrencyConfig)();
|
|
81
|
+
class UIConsistencyAdvancedModule {
|
|
82
|
+
verbose;
|
|
83
|
+
parallel = false;
|
|
84
|
+
constructor(options = {}) {
|
|
85
|
+
this.verbose = options.verbose || false;
|
|
86
|
+
this.parallel = options.parallel || concurrencyConfig.parallel;
|
|
87
|
+
}
|
|
88
|
+
async getFiles() {
|
|
89
|
+
return await file_cache_1.fileCache.getAllTsxJsx();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 1. Tooltip Consistency
|
|
93
|
+
* - Tooltips without delay
|
|
94
|
+
* - Inconsistent placement
|
|
95
|
+
* - Missing arrow
|
|
96
|
+
*/
|
|
97
|
+
async checkTooltipConsistency() {
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
const issues = [];
|
|
100
|
+
const files = await this.getFiles();
|
|
101
|
+
const placements = new Map();
|
|
102
|
+
for (const file of files) {
|
|
103
|
+
const content = fs.readFileSync(file, "utf8");
|
|
104
|
+
const lines = content.split("\n");
|
|
105
|
+
lines.forEach((line, index) => {
|
|
106
|
+
if (/<Tooltip/.test(line)) {
|
|
107
|
+
const tooltipBlock = lines.slice(index, Math.min(index + 10, lines.length)).join("\n");
|
|
108
|
+
// Track placement usage
|
|
109
|
+
const placementMatch = tooltipBlock.match(/placement=["']([^"']+)["']/);
|
|
110
|
+
if (placementMatch) {
|
|
111
|
+
const placement = placementMatch[1];
|
|
112
|
+
placements.set(placement, (placements.get(placement) || 0) + 1);
|
|
113
|
+
}
|
|
114
|
+
// Check for enterDelay (should have some delay for UX)
|
|
115
|
+
const hasEnterDelay = /enterDelay=/.test(tooltipBlock);
|
|
116
|
+
const hasDelayProp = /delay=/.test(tooltipBlock);
|
|
117
|
+
if (!hasEnterDelay && !hasDelayProp) {
|
|
118
|
+
issues.push({
|
|
119
|
+
file,
|
|
120
|
+
line: index + 1,
|
|
121
|
+
type: "tooltip-no-delay",
|
|
122
|
+
severity: "info",
|
|
123
|
+
message: "Tooltip without enterDelay (may appear too quickly)",
|
|
124
|
+
suggestion: "Add enterDelay={300} for better UX",
|
|
125
|
+
snippet: line.trim().substring(0, 80),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Check for arrow prop
|
|
129
|
+
const hasArrow = /arrow/.test(tooltipBlock);
|
|
130
|
+
if (!hasArrow) {
|
|
131
|
+
issues.push({
|
|
132
|
+
file,
|
|
133
|
+
line: index + 1,
|
|
134
|
+
type: "tooltip-no-arrow",
|
|
135
|
+
severity: "info",
|
|
136
|
+
message: "Tooltip without arrow (harder to associate with trigger)",
|
|
137
|
+
suggestion: "Add arrow prop for visual connection",
|
|
138
|
+
snippet: line.trim().substring(0, 80),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Report inconsistent placement usage
|
|
145
|
+
if (placements.size > 3) {
|
|
146
|
+
const sortedPlacements = [...placements.entries()].sort((a, b) => b[1] - a[1]);
|
|
147
|
+
issues.push({
|
|
148
|
+
file: "codebase-wide",
|
|
149
|
+
line: 0,
|
|
150
|
+
type: "tooltip-placement-inconsistency",
|
|
151
|
+
severity: "info",
|
|
152
|
+
message: `Tooltips use ${placements.size} different placements: ${sortedPlacements.map(([p, c]) => `${p}(${c})`).join(", ")}`,
|
|
153
|
+
suggestion: "Standardize on top/bottom for most tooltips",
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
name: "Tooltip Consistency",
|
|
158
|
+
passed: true,
|
|
159
|
+
blocking: true,
|
|
160
|
+
issues,
|
|
161
|
+
duration: Date.now() - startTime,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* 2. Modal/Drawer Sizing
|
|
166
|
+
* - Dialogs without maxWidth
|
|
167
|
+
* - Inconsistent drawer widths
|
|
168
|
+
*/
|
|
169
|
+
async checkModalSizing() {
|
|
170
|
+
const startTime = Date.now();
|
|
171
|
+
const issues = [];
|
|
172
|
+
const files = await this.getFiles();
|
|
173
|
+
const dialogMaxWidths = new Map();
|
|
174
|
+
const drawerWidths = new Map();
|
|
175
|
+
for (const file of files) {
|
|
176
|
+
const content = fs.readFileSync(file, "utf8");
|
|
177
|
+
const lines = content.split("\n");
|
|
178
|
+
lines.forEach((line, index) => {
|
|
179
|
+
// Check Dialog maxWidth
|
|
180
|
+
if (/<Dialog\b/.test(line)) {
|
|
181
|
+
const dialogBlock = lines.slice(index, Math.min(index + 10, lines.length)).join("\n");
|
|
182
|
+
const maxWidthMatch = dialogBlock.match(/maxWidth=["']([^"']+)["']/);
|
|
183
|
+
if (maxWidthMatch) {
|
|
184
|
+
dialogMaxWidths.set(maxWidthMatch[1], (dialogMaxWidths.get(maxWidthMatch[1]) || 0) + 1);
|
|
185
|
+
}
|
|
186
|
+
else if (!dialogBlock.includes("fullScreen")) {
|
|
187
|
+
issues.push({
|
|
188
|
+
file,
|
|
189
|
+
line: index + 1,
|
|
190
|
+
type: "dialog-no-maxwidth",
|
|
191
|
+
severity: "info",
|
|
192
|
+
message: "Dialog without maxWidth prop",
|
|
193
|
+
suggestion: 'Add maxWidth="sm" or "md" for consistent sizing',
|
|
194
|
+
snippet: line.trim().substring(0, 80),
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Check Drawer width
|
|
199
|
+
if (/<Drawer\b/.test(line)) {
|
|
200
|
+
const drawerBlock = lines.slice(index, Math.min(index + 20, lines.length)).join("\n");
|
|
201
|
+
const widthMatch = drawerBlock.match(/width[=:]\s*["']?(\d+(?:px|rem|%)?|var\([^)]+\))["']?/);
|
|
202
|
+
if (widthMatch) {
|
|
203
|
+
drawerWidths.set(widthMatch[1], (drawerWidths.get(widthMatch[1]) || 0) + 1);
|
|
204
|
+
}
|
|
205
|
+
// Check for hardcoded pixel widths
|
|
206
|
+
if (/width:\s*["']?\d+px/.test(drawerBlock)) {
|
|
207
|
+
issues.push({
|
|
208
|
+
file,
|
|
209
|
+
line: index + 1,
|
|
210
|
+
type: "drawer-hardcoded-width",
|
|
211
|
+
severity: "info",
|
|
212
|
+
message: "Drawer with hardcoded pixel width",
|
|
213
|
+
suggestion: "Use design token var(--sidebar-width) or responsive width",
|
|
214
|
+
snippet: line.trim().substring(0, 80),
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
name: "Modal/Drawer Sizing",
|
|
222
|
+
passed: true,
|
|
223
|
+
blocking: true,
|
|
224
|
+
issues,
|
|
225
|
+
duration: Date.now() - startTime,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* 3. Pagination Consistency
|
|
230
|
+
* - Different pagination patterns
|
|
231
|
+
* - Missing page size options
|
|
232
|
+
*/
|
|
233
|
+
async checkPaginationConsistency() {
|
|
234
|
+
const startTime = Date.now();
|
|
235
|
+
const issues = [];
|
|
236
|
+
const files = await this.getFiles();
|
|
237
|
+
let paginationPatterns = 0;
|
|
238
|
+
let tablePaginationCount = 0;
|
|
239
|
+
let customPaginationCount = 0;
|
|
240
|
+
for (const file of files) {
|
|
241
|
+
const content = fs.readFileSync(file, "utf8");
|
|
242
|
+
const lines = content.split("\n");
|
|
243
|
+
// Count different pagination approaches
|
|
244
|
+
if (/<TablePagination/.test(content))
|
|
245
|
+
tablePaginationCount++;
|
|
246
|
+
if (/<Pagination\b/.test(content))
|
|
247
|
+
customPaginationCount++;
|
|
248
|
+
lines.forEach((line, index) => {
|
|
249
|
+
// Check for pagination without page size selector
|
|
250
|
+
if (/<(?:TablePagination|Pagination)\b/.test(line)) {
|
|
251
|
+
const paginationBlock = lines.slice(index, Math.min(index + 15, lines.length)).join("\n");
|
|
252
|
+
const hasRowsPerPage = /rowsPerPage|pageSize|perPage/.test(paginationBlock);
|
|
253
|
+
if (!hasRowsPerPage) {
|
|
254
|
+
issues.push({
|
|
255
|
+
file,
|
|
256
|
+
line: index + 1,
|
|
257
|
+
type: "pagination-no-page-size",
|
|
258
|
+
severity: "info",
|
|
259
|
+
message: "Pagination without page size selector",
|
|
260
|
+
suggestion: "Add rowsPerPageOptions for user control",
|
|
261
|
+
snippet: line.trim().substring(0, 80),
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Check for manual pagination (page buttons without component)
|
|
266
|
+
if (/page\s*[<>=]+\s*\d|setPage\(/.test(line) && !content.includes("Pagination")) {
|
|
267
|
+
paginationPatterns++;
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Report mixed pagination approaches
|
|
272
|
+
if (tablePaginationCount > 0 && customPaginationCount > 0) {
|
|
273
|
+
issues.push({
|
|
274
|
+
file: "codebase-wide",
|
|
275
|
+
line: 0,
|
|
276
|
+
type: "mixed-pagination-components",
|
|
277
|
+
severity: "info",
|
|
278
|
+
message: `Mixed pagination: TablePagination(${tablePaginationCount}) and Pagination(${customPaginationCount})`,
|
|
279
|
+
suggestion: "Standardize on one pagination component",
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
name: "Pagination Consistency",
|
|
284
|
+
passed: true,
|
|
285
|
+
blocking: true,
|
|
286
|
+
issues,
|
|
287
|
+
duration: Date.now() - startTime,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* 4. Avatar Sizing
|
|
292
|
+
* - Inconsistent avatar sizes
|
|
293
|
+
* - Missing fallback
|
|
294
|
+
*/
|
|
295
|
+
async checkAvatarSizing() {
|
|
296
|
+
const startTime = Date.now();
|
|
297
|
+
const issues = [];
|
|
298
|
+
const files = await this.getFiles();
|
|
299
|
+
const avatarSizes = new Map();
|
|
300
|
+
for (const file of files) {
|
|
301
|
+
const content = fs.readFileSync(file, "utf8");
|
|
302
|
+
const lines = content.split("\n");
|
|
303
|
+
lines.forEach((line, index) => {
|
|
304
|
+
if (/<Avatar\b/.test(line)) {
|
|
305
|
+
const avatarBlock = lines.slice(index, Math.min(index + 10, lines.length)).join("\n");
|
|
306
|
+
// Track sizes
|
|
307
|
+
const sizeMatch = avatarBlock.match(/(?:width|height|size)[=:]\s*["']?(\d+(?:px)?|var\([^)]+\))["']?/);
|
|
308
|
+
if (sizeMatch) {
|
|
309
|
+
avatarSizes.set(sizeMatch[1], (avatarSizes.get(sizeMatch[1]) || 0) + 1);
|
|
310
|
+
}
|
|
311
|
+
// Check for fallback (alt or children)
|
|
312
|
+
const hasAlt = /alt=/.test(avatarBlock);
|
|
313
|
+
const hasChildren = /<Avatar[^>]*>[^<]+<\/Avatar>/.test(avatarBlock);
|
|
314
|
+
const hasSrc = /src=/.test(avatarBlock);
|
|
315
|
+
if (hasSrc && !hasAlt && !hasChildren) {
|
|
316
|
+
issues.push({
|
|
317
|
+
file,
|
|
318
|
+
line: index + 1,
|
|
319
|
+
type: "avatar-no-fallback",
|
|
320
|
+
severity: "warning",
|
|
321
|
+
message: "Avatar with src but no alt or fallback content",
|
|
322
|
+
suggestion: 'Add alt="User name" or fallback initials as children',
|
|
323
|
+
snippet: line.trim().substring(0, 80),
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
// Check for hardcoded pixel sizes
|
|
327
|
+
if (/(?:width|height):\s*["']?\d+px/.test(avatarBlock)) {
|
|
328
|
+
issues.push({
|
|
329
|
+
file,
|
|
330
|
+
line: index + 1,
|
|
331
|
+
type: "avatar-hardcoded-size",
|
|
332
|
+
severity: "info",
|
|
333
|
+
message: "Avatar with hardcoded pixel size",
|
|
334
|
+
suggestion: "Use consistent sizes: 32px (sm), 40px (md), 48px (lg)",
|
|
335
|
+
snippet: line.trim().substring(0, 80),
|
|
336
|
+
});
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// Report inconsistent sizes
|
|
342
|
+
if (avatarSizes.size > 4) {
|
|
343
|
+
const sortedSizes = [...avatarSizes.entries()].sort((a, b) => b[1] - a[1]);
|
|
344
|
+
issues.push({
|
|
345
|
+
file: "codebase-wide",
|
|
346
|
+
line: 0,
|
|
347
|
+
type: "avatar-size-inconsistency",
|
|
348
|
+
severity: "info",
|
|
349
|
+
message: `Avatars use ${avatarSizes.size} different sizes: ${sortedSizes
|
|
350
|
+
.slice(0, 5)
|
|
351
|
+
.map(([s, c]) => `${s}(${c})`)
|
|
352
|
+
.join(", ")}`,
|
|
353
|
+
suggestion: "Standardize on 32px, 40px, 48px, 64px sizes",
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
name: "Avatar Sizing",
|
|
358
|
+
passed: issues.filter((i) => i.severity === "error").length === 0,
|
|
359
|
+
blocking: true,
|
|
360
|
+
issues,
|
|
361
|
+
duration: Date.now() - startTime,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* 5. Badge Positioning
|
|
366
|
+
* - Badges without proper overlap
|
|
367
|
+
* - Missing anchor origin
|
|
368
|
+
*/
|
|
369
|
+
async checkBadgePositioning() {
|
|
370
|
+
const startTime = Date.now();
|
|
371
|
+
const issues = [];
|
|
372
|
+
const files = await this.getFiles();
|
|
373
|
+
for (const file of files) {
|
|
374
|
+
const content = fs.readFileSync(file, "utf8");
|
|
375
|
+
const lines = content.split("\n");
|
|
376
|
+
lines.forEach((line, index) => {
|
|
377
|
+
if (/<Badge\b/.test(line)) {
|
|
378
|
+
const badgeBlock = lines.slice(index, Math.min(index + 10, lines.length)).join("\n");
|
|
379
|
+
// Check for anchorOrigin
|
|
380
|
+
const hasAnchorOrigin = /anchorOrigin/.test(badgeBlock);
|
|
381
|
+
const hasOverlap = /overlap/.test(badgeBlock);
|
|
382
|
+
// Badge on Avatar should have circular overlap
|
|
383
|
+
const isOnAvatar = /<Badge[^>]*>[^]*<Avatar/.test(badgeBlock) ||
|
|
384
|
+
/<Avatar[^>]*>[^]*<Badge/.test(badgeBlock);
|
|
385
|
+
if (isOnAvatar && !hasOverlap) {
|
|
386
|
+
issues.push({
|
|
387
|
+
file,
|
|
388
|
+
line: index + 1,
|
|
389
|
+
type: "badge-avatar-no-overlap",
|
|
390
|
+
severity: "info",
|
|
391
|
+
message: 'Badge on Avatar without overlap="circular"',
|
|
392
|
+
suggestion: 'Add overlap="circular" for proper positioning on avatars',
|
|
393
|
+
snippet: line.trim().substring(0, 80),
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
// Check for invisible badges (badgeContent={0} without showZero)
|
|
397
|
+
if (/badgeContent=\{0\}/.test(badgeBlock) && !/showZero/.test(badgeBlock)) {
|
|
398
|
+
issues.push({
|
|
399
|
+
file,
|
|
400
|
+
line: index + 1,
|
|
401
|
+
type: "badge-zero-hidden",
|
|
402
|
+
severity: "info",
|
|
403
|
+
message: "Badge with content 0 will be hidden (add showZero if intentional)",
|
|
404
|
+
suggestion: "Add showZero prop if zero should be displayed",
|
|
405
|
+
snippet: line.trim().substring(0, 80),
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
return {
|
|
412
|
+
name: "Badge Positioning",
|
|
413
|
+
passed: true,
|
|
414
|
+
blocking: true,
|
|
415
|
+
issues,
|
|
416
|
+
duration: Date.now() - startTime,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* 5b. UI Control Gap Spacing
|
|
421
|
+
* Ensures consistent gap spacing across all UI control components:
|
|
422
|
+
* - SegmentedControl: gap-1 between items
|
|
423
|
+
* - Tabs: flex with proper spacing
|
|
424
|
+
* - ToggleButtonGroup: gap or border-based separation
|
|
425
|
+
* - Chip groups: gap-2 between chips
|
|
426
|
+
* - Custom radiogroup/tab patterns
|
|
427
|
+
*/
|
|
428
|
+
async checkUIControlGapSpacing() {
|
|
429
|
+
const startTime = Date.now();
|
|
430
|
+
const issues = [];
|
|
431
|
+
// Define UI control components and their expected gap patterns
|
|
432
|
+
const uiControlChecks = [
|
|
433
|
+
{
|
|
434
|
+
path: "components/ui/SegmentedControl.tsx",
|
|
435
|
+
name: "SegmentedControl",
|
|
436
|
+
expectedGap: "gap-1",
|
|
437
|
+
checkPattern: /cva\s*\(\s*["'`][^"'`]*\bgap-\d/,
|
|
438
|
+
suggestion: "Add gap-1 to CVA base styles for uniform item spacing",
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
path: "components/ui/Tabs.tsx",
|
|
442
|
+
name: "Tabs",
|
|
443
|
+
// Tabs use flex without gap (items touch the border-bottom indicator)
|
|
444
|
+
// This is intentional - tabs rely on individual padding
|
|
445
|
+
skipCheck: true,
|
|
446
|
+
},
|
|
447
|
+
{
|
|
448
|
+
path: "components/ui/ToggleButton.tsx",
|
|
449
|
+
name: "ToggleButtonGroup",
|
|
450
|
+
// ToggleButtonGroup uses border separation, not gap (intentional design)
|
|
451
|
+
skipCheck: true,
|
|
452
|
+
},
|
|
453
|
+
{
|
|
454
|
+
path: "components/ui/Chip.tsx",
|
|
455
|
+
name: "Chip",
|
|
456
|
+
// Individual chip has internal gap-1.5, groups should use gap-2
|
|
457
|
+
expectedGap: "gap-1.5",
|
|
458
|
+
checkPattern: /["'`][^"'`]*\bgap-1\.5/,
|
|
459
|
+
suggestion: "Chip should have gap-1.5 for icon/label spacing",
|
|
460
|
+
},
|
|
461
|
+
];
|
|
462
|
+
// Check each UI control component
|
|
463
|
+
for (const check of uiControlChecks) {
|
|
464
|
+
if (check.skipCheck)
|
|
465
|
+
continue;
|
|
466
|
+
if (fs.existsSync(check.path)) {
|
|
467
|
+
const content = fs.readFileSync(check.path, "utf8");
|
|
468
|
+
const lines = content.split("\n");
|
|
469
|
+
if (check.checkPattern && !check.checkPattern.test(content)) {
|
|
470
|
+
// Find the cva definition line
|
|
471
|
+
let cvaLine = 1;
|
|
472
|
+
lines.forEach((line, index) => {
|
|
473
|
+
if (/cva\s*\(/.test(line)) {
|
|
474
|
+
cvaLine = index + 1;
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
issues.push({
|
|
478
|
+
file: check.path,
|
|
479
|
+
line: cvaLine,
|
|
480
|
+
type: `${check.name.toLowerCase()}-no-gap`,
|
|
481
|
+
severity: "error",
|
|
482
|
+
message: `${check.name} missing expected gap spacing (${check.expectedGap})`,
|
|
483
|
+
suggestion: check.suggestion,
|
|
484
|
+
snippet: `Expected: ${check.expectedGap}`,
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// Check for Chip groups without proper gap
|
|
490
|
+
const files = await this.getFiles();
|
|
491
|
+
for (const file of files) {
|
|
492
|
+
// Skip UI component definitions (already checked above)
|
|
493
|
+
// Normalize path separators for cross-platform compatibility
|
|
494
|
+
const normalizedPath = file.replace(/\\/g, "/");
|
|
495
|
+
if (normalizedPath.includes("components/ui/"))
|
|
496
|
+
continue;
|
|
497
|
+
const content = fs.readFileSync(file, "utf8");
|
|
498
|
+
const lines = content.split("\n");
|
|
499
|
+
lines.forEach((line, index) => {
|
|
500
|
+
// Check for Chip groups (multiple Chips in a flex container)
|
|
501
|
+
// Match "flex" as display:flex, not flex-1, flex-grow, etc.
|
|
502
|
+
// Skip Stack components (they have built-in spacing prop)
|
|
503
|
+
const isFlexContainer = /className=["'][^"']*\bflex\b(?!-)[^"']*["']/.test(line) && !/<Stack\b/.test(line);
|
|
504
|
+
if (isFlexContainer) {
|
|
505
|
+
const contextBlock = lines.slice(index, Math.min(index + 15, lines.length)).join("\n");
|
|
506
|
+
// Skip if this is inside a Stack component (check previous lines)
|
|
507
|
+
const prevLines = lines.slice(Math.max(0, index - 3), index).join("\n");
|
|
508
|
+
const isInsideStack = /<Stack\b/.test(prevLines) && !/<\/Stack>/.test(prevLines);
|
|
509
|
+
if (!isInsideStack) {
|
|
510
|
+
// Count Chip components
|
|
511
|
+
const chipCount = (contextBlock.match(/<Chip\b/g) || []).length;
|
|
512
|
+
if (chipCount >= 2) {
|
|
513
|
+
const hasGap = /\bgap-\d/.test(line) || /\bgap-\d/.test(contextBlock.split("\n")[0]);
|
|
514
|
+
const hasSpacing = /spacing=/.test(line) || /space-x-/.test(line);
|
|
515
|
+
if (!hasGap && !hasSpacing) {
|
|
516
|
+
issues.push({
|
|
517
|
+
file,
|
|
518
|
+
line: index + 1,
|
|
519
|
+
type: "chip-group-no-gap",
|
|
520
|
+
severity: "warning",
|
|
521
|
+
message: `Chip group (${chipCount} chips) without gap spacing`,
|
|
522
|
+
suggestion: "Add gap-2 class for consistent chip spacing",
|
|
523
|
+
snippet: line.trim().substring(0, 80),
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
// Check for custom radiogroup patterns (excluding grids and star ratings)
|
|
530
|
+
if (/role=["']radiogroup["']/.test(line)) {
|
|
531
|
+
const contextBlock = lines
|
|
532
|
+
.slice(Math.max(0, index - 5), Math.min(index + 15, lines.length))
|
|
533
|
+
.join("\n");
|
|
534
|
+
// Skip grid layouts and star ratings
|
|
535
|
+
const isGrid = /\bgrid\b/.test(contextBlock);
|
|
536
|
+
const isStarRating = /Rating|star|Star/.test(file) || /starValue|isFilled/.test(contextBlock);
|
|
537
|
+
if (!isGrid && !isStarRating) {
|
|
538
|
+
const hasGap = /\bgap-\d/.test(line) ||
|
|
539
|
+
/\bgap-\d/.test(contextBlock.split("\n").slice(0, 3).join("\n"));
|
|
540
|
+
if (!hasGap) {
|
|
541
|
+
issues.push({
|
|
542
|
+
file,
|
|
543
|
+
line: index + 1,
|
|
544
|
+
type: "custom-radiogroup-no-gap",
|
|
545
|
+
severity: "warning",
|
|
546
|
+
message: "Custom radiogroup without gap spacing",
|
|
547
|
+
suggestion: "Add gap-1 or gap-2 class, or use <SegmentedControl /> component",
|
|
548
|
+
snippet: line.trim().substring(0, 80),
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
// Check for flex containers with aria-checked buttons (tab-like patterns)
|
|
554
|
+
if (/className=["'][^"']*\bflex\b[^"']*["']/.test(line) && !line.includes("flex-wrap")) {
|
|
555
|
+
const contextBlock = lines.slice(index, Math.min(index + 20, lines.length)).join("\n");
|
|
556
|
+
const hasAriaChecked = /aria-checked/.test(contextBlock);
|
|
557
|
+
const buttonCount = (contextBlock.match(/<button\b/gi) || []).length;
|
|
558
|
+
const isStarRating = /Rating|star|Star/.test(file) || /starValue|isFilled/.test(contextBlock);
|
|
559
|
+
if (hasAriaChecked && buttonCount >= 2 && !isStarRating) {
|
|
560
|
+
const hasGap = /\bgap-\d/.test(line);
|
|
561
|
+
if (!hasGap) {
|
|
562
|
+
issues.push({
|
|
563
|
+
file,
|
|
564
|
+
line: index + 1,
|
|
565
|
+
type: "custom-tabs-no-gap",
|
|
566
|
+
severity: "warning",
|
|
567
|
+
message: "Custom tab/toggle pattern without gap spacing",
|
|
568
|
+
suggestion: "Add gap-1 class for uniform spacing, or use <SegmentedControl /> or <Tabs />",
|
|
569
|
+
snippet: line.trim().substring(0, 80),
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
// Check for Button groups (multiple Buttons in inline-flex without gap)
|
|
575
|
+
if (/className=["'][^"']*\binline-flex\b[^"']*["']/.test(line)) {
|
|
576
|
+
const contextBlock = lines.slice(index, Math.min(index + 10, lines.length)).join("\n");
|
|
577
|
+
const buttonCount = (contextBlock.match(/<Button\b/g) || []).length;
|
|
578
|
+
if (buttonCount >= 2) {
|
|
579
|
+
const hasGap = /\bgap-\d/.test(line);
|
|
580
|
+
const hasSpace = /\bspace-x-\d/.test(line);
|
|
581
|
+
if (!hasGap && !hasSpace) {
|
|
582
|
+
issues.push({
|
|
583
|
+
file,
|
|
584
|
+
line: index + 1,
|
|
585
|
+
type: "button-group-no-gap",
|
|
586
|
+
severity: "info",
|
|
587
|
+
message: `Button group (${buttonCount} buttons) without gap spacing`,
|
|
588
|
+
suggestion: "Add gap-2 class for consistent button spacing",
|
|
589
|
+
snippet: line.trim().substring(0, 80),
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
const hasErrors = issues.some((i) => i.severity === "error");
|
|
597
|
+
return {
|
|
598
|
+
name: "UI Control Gap Spacing",
|
|
599
|
+
passed: !hasErrors,
|
|
600
|
+
blocking: true,
|
|
601
|
+
issues,
|
|
602
|
+
duration: Date.now() - startTime,
|
|
603
|
+
};
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* 6. Divider Usage
|
|
607
|
+
* - Missing dividers between sections
|
|
608
|
+
* - Inconsistent divider styling
|
|
609
|
+
*/
|
|
610
|
+
async checkDividerUsage() {
|
|
611
|
+
const startTime = Date.now();
|
|
612
|
+
const issues = [];
|
|
613
|
+
const files = await this.getFiles();
|
|
614
|
+
for (const file of files) {
|
|
615
|
+
const content = fs.readFileSync(file, "utf8");
|
|
616
|
+
const lines = content.split("\n");
|
|
617
|
+
lines.forEach((line, index) => {
|
|
618
|
+
// Check for hr elements (should use Divider component)
|
|
619
|
+
if (/<hr\b/.test(line)) {
|
|
620
|
+
issues.push({
|
|
621
|
+
file,
|
|
622
|
+
line: index + 1,
|
|
623
|
+
type: "raw-hr-element",
|
|
624
|
+
severity: "info",
|
|
625
|
+
message: "Raw <hr> element instead of Divider component",
|
|
626
|
+
suggestion: "Use <Divider /> for consistent styling",
|
|
627
|
+
snippet: line.trim().substring(0, 80),
|
|
628
|
+
});
|
|
629
|
+
}
|
|
630
|
+
// Check for border-based dividers
|
|
631
|
+
if (/border-(?:t|b)-\[1px\]|borderTop:\s*["']1px/.test(line)) {
|
|
632
|
+
const contextBlock = lines.slice(index, Math.min(index + 5, lines.length)).join("\n");
|
|
633
|
+
const isActualDivider = /divider|separator/i.test(contextBlock);
|
|
634
|
+
if (isActualDivider) {
|
|
635
|
+
issues.push({
|
|
636
|
+
file,
|
|
637
|
+
line: index + 1,
|
|
638
|
+
type: "border-as-divider",
|
|
639
|
+
severity: "info",
|
|
640
|
+
message: "Border used as divider instead of Divider component",
|
|
641
|
+
suggestion: "Use <Divider /> for semantic and consistent dividers",
|
|
642
|
+
snippet: line.trim().substring(0, 80),
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
// Check Divider without proper margin
|
|
647
|
+
if (/<Divider\b/.test(line)) {
|
|
648
|
+
const dividerBlock = lines.slice(index, Math.min(index + 5, lines.length)).join("\n");
|
|
649
|
+
const hasMargin = /className=["'][^"']*my-|style=\{[^}]*margin/.test(dividerBlock);
|
|
650
|
+
const hasSx = /sx=\{[^}]*my?:/.test(dividerBlock);
|
|
651
|
+
if (!hasMargin && !hasSx) {
|
|
652
|
+
issues.push({
|
|
653
|
+
file,
|
|
654
|
+
line: index + 1,
|
|
655
|
+
type: "divider-no-margin",
|
|
656
|
+
severity: "info",
|
|
657
|
+
message: "Divider without vertical margin",
|
|
658
|
+
suggestion: 'Add className="my-4" for proper spacing',
|
|
659
|
+
snippet: line.trim().substring(0, 80),
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
});
|
|
664
|
+
}
|
|
665
|
+
return {
|
|
666
|
+
name: "Divider Usage",
|
|
667
|
+
passed: true,
|
|
668
|
+
blocking: true,
|
|
669
|
+
issues,
|
|
670
|
+
duration: Date.now() - startTime,
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* 7. Transition Consistency
|
|
675
|
+
* - Hardcoded transitions vs design tokens
|
|
676
|
+
* - Missing transitions on interactive elements
|
|
677
|
+
*/
|
|
678
|
+
async checkTransitionConsistency() {
|
|
679
|
+
const startTime = Date.now();
|
|
680
|
+
const issues = [];
|
|
681
|
+
const files = await this.getFiles();
|
|
682
|
+
for (const file of files) {
|
|
683
|
+
const content = fs.readFileSync(file, "utf8");
|
|
684
|
+
const lines = content.split("\n");
|
|
685
|
+
// Check if file uses CVA - if so, check for transition in base styles
|
|
686
|
+
const usesCva = /\bcva\(/.test(content);
|
|
687
|
+
const hasCvaTransition = usesCva && /transition-(?:all|colors|transform|opacity)/.test(content);
|
|
688
|
+
// Check if file has inline style transitions
|
|
689
|
+
const hasInlineTransition = /transition:\s*["']?(?:all|var\(--transition)/.test(content);
|
|
690
|
+
lines.forEach((line, index) => {
|
|
691
|
+
// Check for hardcoded transition values (skip custom easing which is intentional)
|
|
692
|
+
if (/transition:\s*["'](?:all|opacity|transform|color|background)[^"']*\d+(?:ms|s)/.test(line)) {
|
|
693
|
+
const usesToken = /var\(--transition/.test(line);
|
|
694
|
+
const hasCustomEasing = /cubic-bezier|ease-in-out|ease-out|ease-in/.test(line);
|
|
695
|
+
if (!usesToken && !hasCustomEasing) {
|
|
696
|
+
issues.push({
|
|
697
|
+
file,
|
|
698
|
+
line: index + 1,
|
|
699
|
+
type: "hardcoded-transition",
|
|
700
|
+
severity: "info",
|
|
701
|
+
message: "Hardcoded transition duration",
|
|
702
|
+
suggestion: "Use var(--transition-fast), var(--transition-normal), or var(--transition-slow)",
|
|
703
|
+
snippet: line.trim().substring(0, 80),
|
|
704
|
+
});
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
// Check for hover states without transition
|
|
708
|
+
if (/hover:(?:bg-|text-|border-|opacity-)/.test(line)) {
|
|
709
|
+
const hasTransition = /transition/.test(line);
|
|
710
|
+
// Skip if file uses CVA with transition, or has inline style transitions
|
|
711
|
+
if (!hasTransition && !hasCvaTransition && !hasInlineTransition) {
|
|
712
|
+
// Also check surrounding context (20 lines) for transition
|
|
713
|
+
const contextBlock = lines
|
|
714
|
+
.slice(Math.max(0, index - 15), Math.min(index + 10, lines.length))
|
|
715
|
+
.join("\n");
|
|
716
|
+
const hasContextTransition = /transition-(?:all|colors|transform|opacity)|transition:\s*["']?(?:all|var|background|opacity)/.test(contextBlock);
|
|
717
|
+
// Skip if hover is on a component that has built-in transitions (Button, Card, IconButton)
|
|
718
|
+
// Check both the line and surrounding context for the component
|
|
719
|
+
const isOnTransitionComponent = /<(?:Button|Card|IconButton|MenuItem|ListItem|Tab|Chip)\b/.test(line) ||
|
|
720
|
+
/<(?:Button|Card|IconButton|MenuItem|ListItem|Tab|Chip)\b/.test(contextBlock);
|
|
721
|
+
if (!hasContextTransition && !isOnTransitionComponent) {
|
|
722
|
+
issues.push({
|
|
723
|
+
file,
|
|
724
|
+
line: index + 1,
|
|
725
|
+
type: "hover-no-transition",
|
|
726
|
+
severity: "info",
|
|
727
|
+
message: "Hover state without transition (will be abrupt)",
|
|
728
|
+
suggestion: "Add transition-colors or transition-all class",
|
|
729
|
+
snippet: line.trim().substring(0, 80),
|
|
730
|
+
});
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
// Check for transform without transition
|
|
735
|
+
if (/hover:(?:scale-|rotate-|translate-)/.test(line)) {
|
|
736
|
+
const hasTransition = /transition/.test(line);
|
|
737
|
+
if (!hasTransition && !hasCvaTransition && !hasInlineTransition) {
|
|
738
|
+
const contextBlock = lines
|
|
739
|
+
.slice(Math.max(0, index - 10), Math.min(index + 10, lines.length))
|
|
740
|
+
.join("\n");
|
|
741
|
+
const hasContextTransition = /transition-(?:all|colors|transform|opacity)|transition:\s*["']?(?:all|var)/.test(contextBlock);
|
|
742
|
+
// Skip if transform is on a component that has built-in transitions
|
|
743
|
+
const isOnTransitionComponent = /<(?:Button|Card|IconButton)\b/.test(line);
|
|
744
|
+
if (!hasContextTransition && !isOnTransitionComponent) {
|
|
745
|
+
issues.push({
|
|
746
|
+
file,
|
|
747
|
+
line: index + 1,
|
|
748
|
+
type: "transform-no-transition",
|
|
749
|
+
severity: "info",
|
|
750
|
+
message: "Transform on hover without transition",
|
|
751
|
+
suggestion: "Add transition-transform class",
|
|
752
|
+
snippet: line.trim().substring(0, 80),
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
});
|
|
758
|
+
}
|
|
759
|
+
return {
|
|
760
|
+
name: "Transition Consistency",
|
|
761
|
+
passed: true,
|
|
762
|
+
blocking: true,
|
|
763
|
+
issues,
|
|
764
|
+
duration: Date.now() - startTime,
|
|
765
|
+
};
|
|
766
|
+
}
|
|
767
|
+
/**
|
|
768
|
+
* 8. Overflow Handling
|
|
769
|
+
* - Text overflow without ellipsis
|
|
770
|
+
* - Long content without truncation
|
|
771
|
+
*/
|
|
772
|
+
async checkOverflowHandling() {
|
|
773
|
+
const startTime = Date.now();
|
|
774
|
+
const issues = [];
|
|
775
|
+
const files = await this.getFiles();
|
|
776
|
+
for (const file of files) {
|
|
777
|
+
const content = fs.readFileSync(file, "utf8");
|
|
778
|
+
const lines = content.split("\n");
|
|
779
|
+
lines.forEach((line, index) => {
|
|
780
|
+
// Check for overflow-hidden without text handling
|
|
781
|
+
if (/overflow-hidden/.test(line) &&
|
|
782
|
+
!line.includes("overflow-x") &&
|
|
783
|
+
!line.includes("overflow-y")) {
|
|
784
|
+
const contextBlock = lines.slice(index, Math.min(index + 10, lines.length)).join("\n");
|
|
785
|
+
const hasTextTruncate = /truncate|text-ellipsis|line-clamp/.test(contextBlock);
|
|
786
|
+
const hasTypography = /<Typography/.test(contextBlock);
|
|
787
|
+
if (hasTypography && !hasTextTruncate) {
|
|
788
|
+
issues.push({
|
|
789
|
+
file,
|
|
790
|
+
line: index + 1,
|
|
791
|
+
type: "overflow-hidden-no-truncate",
|
|
792
|
+
severity: "info",
|
|
793
|
+
message: "overflow-hidden on text container without truncation",
|
|
794
|
+
suggestion: "Add truncate class or line-clamp-N for text overflow",
|
|
795
|
+
snippet: line.trim().substring(0, 80),
|
|
796
|
+
});
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
// Check for Typography with noWrap but no width constraint
|
|
800
|
+
if (/<Typography[^>]*noWrap/.test(line)) {
|
|
801
|
+
const contextBlock = lines.slice(index, Math.min(index + 5, lines.length)).join("\n");
|
|
802
|
+
const hasWidthConstraint = /max-w-|maxWidth|w-\[|width:/.test(contextBlock);
|
|
803
|
+
if (!hasWidthConstraint) {
|
|
804
|
+
issues.push({
|
|
805
|
+
file,
|
|
806
|
+
line: index + 1,
|
|
807
|
+
type: "nowrap-no-width",
|
|
808
|
+
severity: "info",
|
|
809
|
+
message: "Typography noWrap without width constraint",
|
|
810
|
+
suggestion: "Add max-w-[200px] or similar to enable truncation",
|
|
811
|
+
snippet: line.trim().substring(0, 80),
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
// Check for long text fields without truncation
|
|
816
|
+
if (/<(?:TableCell|td)[^>]*>/.test(line)) {
|
|
817
|
+
const cellBlock = lines.slice(index, Math.min(index + 5, lines.length)).join("\n");
|
|
818
|
+
const hasDescription = /description|comment|note|message/i.test(cellBlock);
|
|
819
|
+
const hasTruncation = /truncate|line-clamp|noWrap|ellipsis/.test(cellBlock);
|
|
820
|
+
if (hasDescription && !hasTruncation) {
|
|
821
|
+
issues.push({
|
|
822
|
+
file,
|
|
823
|
+
line: index + 1,
|
|
824
|
+
type: "table-cell-no-truncate",
|
|
825
|
+
severity: "info",
|
|
826
|
+
message: "Table cell with long text field may need truncation",
|
|
827
|
+
suggestion: "Add truncate class or max-w-[300px] with overflow handling",
|
|
828
|
+
snippet: line.trim().substring(0, 80),
|
|
829
|
+
});
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
});
|
|
833
|
+
}
|
|
834
|
+
return {
|
|
835
|
+
name: "Overflow Handling",
|
|
836
|
+
passed: true,
|
|
837
|
+
blocking: true,
|
|
838
|
+
issues,
|
|
839
|
+
duration: Date.now() - startTime,
|
|
840
|
+
};
|
|
841
|
+
}
|
|
842
|
+
/**
|
|
843
|
+
* Run all checks
|
|
844
|
+
*/
|
|
845
|
+
async runAll() {
|
|
846
|
+
const startTime = Date.now();
|
|
847
|
+
console.log(`\n${console_chars_1.emoji.target} ADVANCED UI CONSISTENCY PREFLIGHT`);
|
|
848
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
849
|
+
const checks = [];
|
|
850
|
+
checks.push(await this.checkTooltipConsistency());
|
|
851
|
+
checks.push(await this.checkModalSizing());
|
|
852
|
+
checks.push(await this.checkPaginationConsistency());
|
|
853
|
+
checks.push(await this.checkAvatarSizing());
|
|
854
|
+
checks.push(await this.checkBadgePositioning());
|
|
855
|
+
checks.push(await this.checkUIControlGapSpacing());
|
|
856
|
+
checks.push(await this.checkDividerUsage());
|
|
857
|
+
checks.push(await this.checkTransitionConsistency());
|
|
858
|
+
checks.push(await this.checkOverflowHandling());
|
|
859
|
+
const totalDuration = Date.now() - startTime;
|
|
860
|
+
const allIssues = checks.flatMap((c) => c.issues);
|
|
861
|
+
const errors = allIssues.filter((i) => i.severity === "error").length;
|
|
862
|
+
const warnings = allIssues.filter((i) => i.severity === "warning").length;
|
|
863
|
+
const infos = allIssues.filter((i) => i.severity === "info").length;
|
|
864
|
+
const blockingFailed = checks.some((c) => c.blocking && !c.passed);
|
|
865
|
+
const summary = {
|
|
866
|
+
total: checks.length,
|
|
867
|
+
passed: checks.filter((c) => c.passed).length,
|
|
868
|
+
failed: checks.filter((c) => !c.passed).length,
|
|
869
|
+
errors,
|
|
870
|
+
warnings,
|
|
871
|
+
};
|
|
872
|
+
// Print results
|
|
873
|
+
checks.forEach((check) => {
|
|
874
|
+
const icon = check.passed ? `${console_chars_1.emoji.success}` : `${console_chars_1.emoji.error}`;
|
|
875
|
+
const suffix = check.blocking ? " [BLOCKING]" : "";
|
|
876
|
+
console.log(`${icon} ${check.name} (${check.issues.length} issues, ${(check.duration / 1000).toFixed(1)}s)${suffix}`);
|
|
877
|
+
});
|
|
878
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
879
|
+
console.log(`Errors: ${errors} | Warnings: ${warnings} | Info: ${infos} | Time: ${(totalDuration / 1000).toFixed(1)}s`);
|
|
880
|
+
if (blockingFailed) {
|
|
881
|
+
console.log(`\n${console_chars_1.emoji.error} UI CONSISTENCY FAILED - ${errors} error(s)`);
|
|
882
|
+
}
|
|
883
|
+
else if (warnings > 0) {
|
|
884
|
+
console.log(`\n${console_chars_1.emoji.warning} UI CONSISTENCY PASSED - ${warnings} warning(s)`);
|
|
885
|
+
}
|
|
886
|
+
else {
|
|
887
|
+
console.log(`\n${console_chars_1.emoji.success} UI CONSISTENCY PASSED`);
|
|
888
|
+
}
|
|
889
|
+
return {
|
|
890
|
+
module: "ui-consistency-advanced",
|
|
891
|
+
passed: !blockingFailed,
|
|
892
|
+
totalDuration,
|
|
893
|
+
checks,
|
|
894
|
+
summary,
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
}
|
|
898
|
+
exports.UIConsistencyAdvancedModule = UIConsistencyAdvancedModule;
|
|
899
|
+
async function main() {
|
|
900
|
+
const reporter = (0, universal_progress_reporter_1.createUniversalProgressReporter)(path.basename(__filename, ".ts"));
|
|
901
|
+
const args = process.argv.slice(2);
|
|
902
|
+
const mode = args[0] || "all";
|
|
903
|
+
const verbose = args.includes("--verbose") || args.includes("-v");
|
|
904
|
+
const parallel = args.includes("--parallel") || args.includes("-p");
|
|
905
|
+
const module = new UIConsistencyAdvancedModule({ verbose, parallel });
|
|
906
|
+
const runSingle = async (name, fn) => {
|
|
907
|
+
console.log(`\n${console_chars_1.emoji.target} UI CONSISTENCY: ${name.toUpperCase()}`);
|
|
908
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
909
|
+
const check = await fn();
|
|
910
|
+
const summary = {
|
|
911
|
+
total: 1,
|
|
912
|
+
passed: check.passed ? 1 : 0,
|
|
913
|
+
failed: check.passed ? 0 : 1,
|
|
914
|
+
errors: check.issues.filter((i) => i.severity === "error").length,
|
|
915
|
+
warnings: check.issues.filter((i) => i.severity === "warning").length,
|
|
916
|
+
};
|
|
917
|
+
const icon = check.passed ? `${console_chars_1.emoji.success}` : `${console_chars_1.emoji.error}`;
|
|
918
|
+
console.log(`${icon} ${check.name} (${check.issues.length} issues, ${(check.duration / 1000).toFixed(1)}s)`);
|
|
919
|
+
if (check.issues.length > 0) {
|
|
920
|
+
check.issues.slice(0, 30).forEach((issue) => {
|
|
921
|
+
const color = issue.severity === "error"
|
|
922
|
+
? "\x1b[31m"
|
|
923
|
+
: issue.severity === "warning"
|
|
924
|
+
? "\x1b[33m"
|
|
925
|
+
: "\x1b[36m";
|
|
926
|
+
const reset = "\x1b[0m";
|
|
927
|
+
console.log(` ${color}[${issue.severity.toUpperCase()}]${reset} ${issue.file}:${issue.line}`);
|
|
928
|
+
console.log(` ${issue.message}`);
|
|
929
|
+
if (issue.suggestion)
|
|
930
|
+
console.log(` ${console_chars_1.chars.arrow} ${issue.suggestion}`);
|
|
931
|
+
});
|
|
932
|
+
if (check.issues.length > 30)
|
|
933
|
+
console.log(` ... and ${check.issues.length - 30} more issues`);
|
|
934
|
+
}
|
|
935
|
+
console.log((0, console_chars_1.createDivider)(80, "heavy"));
|
|
936
|
+
return {
|
|
937
|
+
module: `ui-consistency:${name}`,
|
|
938
|
+
passed: check.passed,
|
|
939
|
+
totalDuration: check.duration,
|
|
940
|
+
checks: [check],
|
|
941
|
+
summary,
|
|
942
|
+
};
|
|
943
|
+
};
|
|
944
|
+
let result;
|
|
945
|
+
switch (mode) {
|
|
946
|
+
case "tooltips":
|
|
947
|
+
result = await runSingle("tooltips", () => module.checkTooltipConsistency());
|
|
948
|
+
break;
|
|
949
|
+
case "modals":
|
|
950
|
+
result = await runSingle("modals", () => module.checkModalSizing());
|
|
951
|
+
break;
|
|
952
|
+
case "pagination":
|
|
953
|
+
result = await runSingle("pagination", () => module.checkPaginationConsistency());
|
|
954
|
+
break;
|
|
955
|
+
case "avatars":
|
|
956
|
+
result = await runSingle("avatars", () => module.checkAvatarSizing());
|
|
957
|
+
break;
|
|
958
|
+
case "badges":
|
|
959
|
+
result = await runSingle("badges", () => module.checkBadgePositioning());
|
|
960
|
+
break;
|
|
961
|
+
case "gaps":
|
|
962
|
+
result = await runSingle("gaps", () => module.checkUIControlGapSpacing());
|
|
963
|
+
break;
|
|
964
|
+
case "dividers":
|
|
965
|
+
result = await runSingle("dividers", () => module.checkDividerUsage());
|
|
966
|
+
break;
|
|
967
|
+
case "transitions":
|
|
968
|
+
result = await runSingle("transitions", () => module.checkTransitionConsistency());
|
|
969
|
+
break;
|
|
970
|
+
case "overflow":
|
|
971
|
+
result = await runSingle("overflow", () => module.checkOverflowHandling());
|
|
972
|
+
break;
|
|
973
|
+
default:
|
|
974
|
+
result = await module.runAll();
|
|
975
|
+
break;
|
|
976
|
+
}
|
|
977
|
+
process.exit(result.passed ? 0 : 1);
|
|
978
|
+
}
|
|
979
|
+
if (require.main === module) {
|
|
980
|
+
main();
|
|
981
|
+
}
|
|
982
|
+
//# sourceMappingURL=ui-consistency-advanced.js.map
|