@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.
Files changed (709) hide show
  1. package/dist/checks/consolidated/auth-storage-state.d.ts +3 -0
  2. package/dist/checks/consolidated/auth-storage-state.d.ts.map +1 -0
  3. package/dist/checks/consolidated/auth-storage-state.js +146 -0
  4. package/dist/checks/consolidated/auth-storage-state.js.map +1 -0
  5. package/dist/checks/consolidated/business.d.ts +50 -0
  6. package/dist/checks/consolidated/business.d.ts.map +1 -0
  7. package/dist/checks/consolidated/business.js +252 -0
  8. package/dist/checks/consolidated/business.js.map +1 -0
  9. package/dist/checks/consolidated/caching-strategy.d.ts +104 -0
  10. package/dist/checks/consolidated/caching-strategy.d.ts.map +1 -0
  11. package/dist/checks/consolidated/caching-strategy.js +725 -0
  12. package/dist/checks/consolidated/caching-strategy.js.map +1 -0
  13. package/dist/checks/consolidated/code-quality.d.ts +83 -0
  14. package/dist/checks/consolidated/code-quality.d.ts.map +1 -0
  15. package/dist/checks/consolidated/code-quality.js +445 -0
  16. package/dist/checks/consolidated/code-quality.js.map +1 -0
  17. package/dist/checks/consolidated/console-statements.d.ts +32 -0
  18. package/dist/checks/consolidated/console-statements.d.ts.map +1 -0
  19. package/dist/checks/consolidated/console-statements.js +304 -0
  20. package/dist/checks/consolidated/console-statements.js.map +1 -0
  21. package/dist/checks/consolidated/css-advanced-validation.d.ts +24 -0
  22. package/dist/checks/consolidated/css-advanced-validation.d.ts.map +1 -0
  23. package/dist/checks/consolidated/css-advanced-validation.js +415 -0
  24. package/dist/checks/consolidated/css-advanced-validation.js.map +1 -0
  25. package/dist/checks/consolidated/css-organization.d.ts +14 -0
  26. package/dist/checks/consolidated/css-organization.d.ts.map +1 -0
  27. package/dist/checks/consolidated/css-organization.js +432 -0
  28. package/dist/checks/consolidated/css-organization.js.map +1 -0
  29. package/dist/checks/consolidated/css-runtime-validation.d.ts +22 -0
  30. package/dist/checks/consolidated/css-runtime-validation.d.ts.map +1 -0
  31. package/dist/checks/consolidated/css-runtime-validation.js +330 -0
  32. package/dist/checks/consolidated/css-runtime-validation.js.map +1 -0
  33. package/dist/checks/consolidated/css-variable-validation.d.ts +17 -0
  34. package/dist/checks/consolidated/css-variable-validation.d.ts.map +1 -0
  35. package/dist/checks/consolidated/css-variable-validation.js +412 -0
  36. package/dist/checks/consolidated/css-variable-validation.js.map +1 -0
  37. package/dist/checks/consolidated/dark-mode-consistency.d.ts +23 -0
  38. package/dist/checks/consolidated/dark-mode-consistency.d.ts.map +1 -0
  39. package/dist/checks/consolidated/dark-mode-consistency.js +291 -0
  40. package/dist/checks/consolidated/dark-mode-consistency.js.map +1 -0
  41. package/dist/checks/consolidated/database.d.ts +95 -0
  42. package/dist/checks/consolidated/database.d.ts.map +1 -0
  43. package/dist/checks/consolidated/database.js +427 -0
  44. package/dist/checks/consolidated/database.js.map +1 -0
  45. package/dist/checks/consolidated/e2e-checks.d.ts +52 -0
  46. package/dist/checks/consolidated/e2e-checks.d.ts.map +1 -0
  47. package/dist/checks/consolidated/e2e-checks.js +157 -0
  48. package/dist/checks/consolidated/e2e-checks.js.map +1 -0
  49. package/dist/checks/consolidated/e2e-regression-coverage.d.ts +14 -0
  50. package/dist/checks/consolidated/e2e-regression-coverage.d.ts.map +1 -0
  51. package/dist/checks/consolidated/e2e-regression-coverage.js +151 -0
  52. package/dist/checks/consolidated/e2e-regression-coverage.js.map +1 -0
  53. package/dist/checks/consolidated/e2e-validation.d.ts +137 -0
  54. package/dist/checks/consolidated/e2e-validation.d.ts.map +1 -0
  55. package/dist/checks/consolidated/e2e-validation.js +1001 -0
  56. package/dist/checks/consolidated/e2e-validation.js.map +1 -0
  57. package/dist/checks/consolidated/enterprise-baseline.d.ts +9 -0
  58. package/dist/checks/consolidated/enterprise-baseline.d.ts.map +1 -0
  59. package/dist/checks/consolidated/enterprise-baseline.js +277 -0
  60. package/dist/checks/consolidated/enterprise-baseline.js.map +1 -0
  61. package/dist/checks/consolidated/generate-pageload-config.d.ts +6 -0
  62. package/dist/checks/consolidated/generate-pageload-config.d.ts.map +1 -0
  63. package/dist/checks/consolidated/generate-pageload-config.js +161 -0
  64. package/dist/checks/consolidated/generate-pageload-config.js.map +1 -0
  65. package/dist/checks/consolidated/hardened-checks.d.ts +276 -0
  66. package/dist/checks/consolidated/hardened-checks.d.ts.map +1 -0
  67. package/dist/checks/consolidated/hardened-checks.js +3056 -0
  68. package/dist/checks/consolidated/hardened-checks.js.map +1 -0
  69. package/dist/checks/consolidated/homepage-ux.d.ts +12 -0
  70. package/dist/checks/consolidated/homepage-ux.d.ts.map +1 -0
  71. package/dist/checks/consolidated/homepage-ux.js +242 -0
  72. package/dist/checks/consolidated/homepage-ux.js.map +1 -0
  73. package/dist/checks/consolidated/images.d.ts +76 -0
  74. package/dist/checks/consolidated/images.d.ts.map +1 -0
  75. package/dist/checks/consolidated/images.js +311 -0
  76. package/dist/checks/consolidated/images.js.map +1 -0
  77. package/dist/checks/consolidated/import-cycles.d.ts +63 -0
  78. package/dist/checks/consolidated/import-cycles.d.ts.map +1 -0
  79. package/dist/checks/consolidated/import-cycles.js +291 -0
  80. package/dist/checks/consolidated/import-cycles.js.map +1 -0
  81. package/dist/checks/consolidated/imports.d.ts +112 -0
  82. package/dist/checks/consolidated/imports.d.ts.map +1 -0
  83. package/dist/checks/consolidated/imports.js +977 -0
  84. package/dist/checks/consolidated/imports.js.map +1 -0
  85. package/dist/checks/consolidated/inline-style-conflicts.d.ts +21 -0
  86. package/dist/checks/consolidated/inline-style-conflicts.d.ts.map +1 -0
  87. package/dist/checks/consolidated/inline-style-conflicts.js +300 -0
  88. package/dist/checks/consolidated/inline-style-conflicts.js.map +1 -0
  89. package/dist/checks/consolidated/lib-organization.d.ts +12 -0
  90. package/dist/checks/consolidated/lib-organization.d.ts.map +1 -0
  91. package/dist/checks/consolidated/lib-organization.js +419 -0
  92. package/dist/checks/consolidated/lib-organization.js.map +1 -0
  93. package/dist/checks/consolidated/n-plus-one.d.ts +63 -0
  94. package/dist/checks/consolidated/n-plus-one.d.ts.map +1 -0
  95. package/dist/checks/consolidated/n-plus-one.js +331 -0
  96. package/dist/checks/consolidated/n-plus-one.js.map +1 -0
  97. package/dist/checks/consolidated/nextjs.d.ts +51 -0
  98. package/dist/checks/consolidated/nextjs.d.ts.map +1 -0
  99. package/dist/checks/consolidated/nextjs.js +205 -0
  100. package/dist/checks/consolidated/nextjs.js.map +1 -0
  101. package/dist/checks/consolidated/organization.d.ts +54 -0
  102. package/dist/checks/consolidated/organization.d.ts.map +1 -0
  103. package/dist/checks/consolidated/organization.js +158 -0
  104. package/dist/checks/consolidated/organization.js.map +1 -0
  105. package/dist/checks/consolidated/pageload.d.ts +12 -0
  106. package/dist/checks/consolidated/pageload.d.ts.map +1 -0
  107. package/dist/checks/consolidated/pageload.js +138 -0
  108. package/dist/checks/consolidated/pageload.js.map +1 -0
  109. package/dist/checks/consolidated/performance.d.ts +112 -0
  110. package/dist/checks/consolidated/performance.d.ts.map +1 -0
  111. package/dist/checks/consolidated/performance.js +1546 -0
  112. package/dist/checks/consolidated/performance.js.map +1 -0
  113. package/dist/checks/consolidated/quality.d.ts +52 -0
  114. package/dist/checks/consolidated/quality.d.ts.map +1 -0
  115. package/dist/checks/consolidated/quality.js +253 -0
  116. package/dist/checks/consolidated/quality.js.map +1 -0
  117. package/dist/checks/consolidated/react.d.ts +48 -0
  118. package/dist/checks/consolidated/react.d.ts.map +1 -0
  119. package/dist/checks/consolidated/react.js +203 -0
  120. package/dist/checks/consolidated/react.js.map +1 -0
  121. package/dist/checks/consolidated/regression-hygiene.d.ts +17 -0
  122. package/dist/checks/consolidated/regression-hygiene.d.ts.map +1 -0
  123. package/dist/checks/consolidated/regression-hygiene.js +242 -0
  124. package/dist/checks/consolidated/regression-hygiene.js.map +1 -0
  125. package/dist/checks/consolidated/regression.d.ts +20 -0
  126. package/dist/checks/consolidated/regression.d.ts.map +1 -0
  127. package/dist/checks/consolidated/regression.js +121 -0
  128. package/dist/checks/consolidated/regression.js.map +1 -0
  129. package/dist/checks/consolidated/runtime.d.ts +53 -0
  130. package/dist/checks/consolidated/runtime.d.ts.map +1 -0
  131. package/dist/checks/consolidated/runtime.js +160 -0
  132. package/dist/checks/consolidated/runtime.js.map +1 -0
  133. package/dist/checks/consolidated/script-performance.d.ts +17 -0
  134. package/dist/checks/consolidated/script-performance.d.ts.map +1 -0
  135. package/dist/checks/consolidated/script-performance.js +137 -0
  136. package/dist/checks/consolidated/script-performance.js.map +1 -0
  137. package/dist/checks/consolidated/security.d.ts +78 -0
  138. package/dist/checks/consolidated/security.d.ts.map +1 -0
  139. package/dist/checks/consolidated/security.js +404 -0
  140. package/dist/checks/consolidated/security.js.map +1 -0
  141. package/dist/checks/consolidated/seo.d.ts +31 -0
  142. package/dist/checks/consolidated/seo.d.ts.map +1 -0
  143. package/dist/checks/consolidated/seo.js +1438 -0
  144. package/dist/checks/consolidated/seo.js.map +1 -0
  145. package/dist/checks/consolidated/sx-prop-deprecation.d.ts +22 -0
  146. package/dist/checks/consolidated/sx-prop-deprecation.d.ts.map +1 -0
  147. package/dist/checks/consolidated/sx-prop-deprecation.js +280 -0
  148. package/dist/checks/consolidated/sx-prop-deprecation.js.map +1 -0
  149. package/dist/checks/consolidated/tailwind-class-validation.d.ts +25 -0
  150. package/dist/checks/consolidated/tailwind-class-validation.d.ts.map +1 -0
  151. package/dist/checks/consolidated/tailwind-class-validation.js +533 -0
  152. package/dist/checks/consolidated/tailwind-class-validation.js.map +1 -0
  153. package/dist/checks/consolidated/testing.d.ts +54 -0
  154. package/dist/checks/consolidated/testing.d.ts.map +1 -0
  155. package/dist/checks/consolidated/testing.js +163 -0
  156. package/dist/checks/consolidated/testing.js.map +1 -0
  157. package/dist/checks/consolidated/typescript.d.ts +3 -0
  158. package/dist/checks/consolidated/typescript.d.ts.map +1 -0
  159. package/dist/checks/consolidated/typescript.js +31 -0
  160. package/dist/checks/consolidated/typescript.js.map +1 -0
  161. package/dist/checks/consolidated/ui-accessibility-advanced.d.ts +104 -0
  162. package/dist/checks/consolidated/ui-accessibility-advanced.d.ts.map +1 -0
  163. package/dist/checks/consolidated/ui-accessibility-advanced.js +689 -0
  164. package/dist/checks/consolidated/ui-accessibility-advanced.js.map +1 -0
  165. package/dist/checks/consolidated/ui-accessibility.d.ts +121 -0
  166. package/dist/checks/consolidated/ui-accessibility.d.ts.map +1 -0
  167. package/dist/checks/consolidated/ui-accessibility.js +776 -0
  168. package/dist/checks/consolidated/ui-accessibility.js.map +1 -0
  169. package/dist/checks/consolidated/ui-advanced-spacing.d.ts +142 -0
  170. package/dist/checks/consolidated/ui-advanced-spacing.d.ts.map +1 -0
  171. package/dist/checks/consolidated/ui-advanced-spacing.js +1220 -0
  172. package/dist/checks/consolidated/ui-advanced-spacing.js.map +1 -0
  173. package/dist/checks/consolidated/ui-animation-duration.d.ts +108 -0
  174. package/dist/checks/consolidated/ui-animation-duration.d.ts.map +1 -0
  175. package/dist/checks/consolidated/ui-animation-duration.js +531 -0
  176. package/dist/checks/consolidated/ui-animation-duration.js.map +1 -0
  177. package/dist/checks/consolidated/ui-border-radius.d.ts +90 -0
  178. package/dist/checks/consolidated/ui-border-radius.d.ts.map +1 -0
  179. package/dist/checks/consolidated/ui-border-radius.js +519 -0
  180. package/dist/checks/consolidated/ui-border-radius.js.map +1 -0
  181. package/dist/checks/consolidated/ui-buttons.d.ts +32 -0
  182. package/dist/checks/consolidated/ui-buttons.d.ts.map +1 -0
  183. package/dist/checks/consolidated/ui-buttons.js +481 -0
  184. package/dist/checks/consolidated/ui-buttons.js.map +1 -0
  185. package/dist/checks/consolidated/ui-cards.d.ts +29 -0
  186. package/dist/checks/consolidated/ui-cards.d.ts.map +1 -0
  187. package/dist/checks/consolidated/ui-cards.js +504 -0
  188. package/dist/checks/consolidated/ui-cards.js.map +1 -0
  189. package/dist/checks/consolidated/ui-checks.d.ts +48 -0
  190. package/dist/checks/consolidated/ui-checks.d.ts.map +1 -0
  191. package/dist/checks/consolidated/ui-checks.js +264 -0
  192. package/dist/checks/consolidated/ui-checks.js.map +1 -0
  193. package/dist/checks/consolidated/ui-cleanup.d.ts +81 -0
  194. package/dist/checks/consolidated/ui-cleanup.d.ts.map +1 -0
  195. package/dist/checks/consolidated/ui-cleanup.js +650 -0
  196. package/dist/checks/consolidated/ui-cleanup.js.map +1 -0
  197. package/dist/checks/consolidated/ui-components.d.ts +255 -0
  198. package/dist/checks/consolidated/ui-components.d.ts.map +1 -0
  199. package/dist/checks/consolidated/ui-components.js +2008 -0
  200. package/dist/checks/consolidated/ui-components.js.map +1 -0
  201. package/dist/checks/consolidated/ui-consistency-advanced.d.ts +130 -0
  202. package/dist/checks/consolidated/ui-consistency-advanced.d.ts.map +1 -0
  203. package/dist/checks/consolidated/ui-consistency-advanced.js +982 -0
  204. package/dist/checks/consolidated/ui-consistency-advanced.js.map +1 -0
  205. package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts +30 -0
  206. package/dist/checks/consolidated/ui-consistency-comprehensive.d.ts.map +1 -0
  207. package/dist/checks/consolidated/ui-consistency-comprehensive.js +1018 -0
  208. package/dist/checks/consolidated/ui-consistency-comprehensive.js.map +1 -0
  209. package/dist/checks/consolidated/ui-consistency-extended.d.ts +26 -0
  210. package/dist/checks/consolidated/ui-consistency-extended.d.ts.map +1 -0
  211. package/dist/checks/consolidated/ui-consistency-extended.js +606 -0
  212. package/dist/checks/consolidated/ui-consistency-extended.js.map +1 -0
  213. package/dist/checks/consolidated/ui-data-display.d.ts +103 -0
  214. package/dist/checks/consolidated/ui-data-display.d.ts.map +1 -0
  215. package/dist/checks/consolidated/ui-data-display.js +740 -0
  216. package/dist/checks/consolidated/ui-data-display.js.map +1 -0
  217. package/dist/checks/consolidated/ui-deprecated.d.ts +22 -0
  218. package/dist/checks/consolidated/ui-deprecated.d.ts.map +1 -0
  219. package/dist/checks/consolidated/ui-deprecated.js +336 -0
  220. package/dist/checks/consolidated/ui-deprecated.js.map +1 -0
  221. package/dist/checks/consolidated/ui-empty-null-states.d.ts +90 -0
  222. package/dist/checks/consolidated/ui-empty-null-states.d.ts.map +1 -0
  223. package/dist/checks/consolidated/ui-empty-null-states.js +511 -0
  224. package/dist/checks/consolidated/ui-empty-null-states.js.map +1 -0
  225. package/dist/checks/consolidated/ui-error-states.d.ts +99 -0
  226. package/dist/checks/consolidated/ui-error-states.d.ts.map +1 -0
  227. package/dist/checks/consolidated/ui-error-states.js +694 -0
  228. package/dist/checks/consolidated/ui-error-states.js.map +1 -0
  229. package/dist/checks/consolidated/ui-feedback-confirmations.d.ts +90 -0
  230. package/dist/checks/consolidated/ui-feedback-confirmations.d.ts.map +1 -0
  231. package/dist/checks/consolidated/ui-feedback-confirmations.js +596 -0
  232. package/dist/checks/consolidated/ui-feedback-confirmations.js.map +1 -0
  233. package/dist/checks/consolidated/ui-forms.d.ts +32 -0
  234. package/dist/checks/consolidated/ui-forms.d.ts.map +1 -0
  235. package/dist/checks/consolidated/ui-forms.js +568 -0
  236. package/dist/checks/consolidated/ui-forms.js.map +1 -0
  237. package/dist/checks/consolidated/ui-gradient-shadow.d.ts +90 -0
  238. package/dist/checks/consolidated/ui-gradient-shadow.d.ts.map +1 -0
  239. package/dist/checks/consolidated/ui-gradient-shadow.js +568 -0
  240. package/dist/checks/consolidated/ui-gradient-shadow.js.map +1 -0
  241. package/dist/checks/consolidated/ui-grid-responsive.d.ts +27 -0
  242. package/dist/checks/consolidated/ui-grid-responsive.d.ts.map +1 -0
  243. package/dist/checks/consolidated/ui-grid-responsive.js +441 -0
  244. package/dist/checks/consolidated/ui-grid-responsive.js.map +1 -0
  245. package/dist/checks/consolidated/ui-icon-size-tokens.d.ts +104 -0
  246. package/dist/checks/consolidated/ui-icon-size-tokens.d.ts.map +1 -0
  247. package/dist/checks/consolidated/ui-icon-size-tokens.js +514 -0
  248. package/dist/checks/consolidated/ui-icon-size-tokens.js.map +1 -0
  249. package/dist/checks/consolidated/ui-iconography.d.ts +90 -0
  250. package/dist/checks/consolidated/ui-iconography.d.ts.map +1 -0
  251. package/dist/checks/consolidated/ui-iconography.js +565 -0
  252. package/dist/checks/consolidated/ui-iconography.js.map +1 -0
  253. package/dist/checks/consolidated/ui-interactive-states.d.ts +240 -0
  254. package/dist/checks/consolidated/ui-interactive-states.d.ts.map +1 -0
  255. package/dist/checks/consolidated/ui-interactive-states.js +2474 -0
  256. package/dist/checks/consolidated/ui-interactive-states.js.map +1 -0
  257. package/dist/checks/consolidated/ui-layout.d.ts +256 -0
  258. package/dist/checks/consolidated/ui-layout.d.ts.map +1 -0
  259. package/dist/checks/consolidated/ui-layout.js +1371 -0
  260. package/dist/checks/consolidated/ui-layout.js.map +1 -0
  261. package/dist/checks/consolidated/ui-loading-skeletons.d.ts +11 -0
  262. package/dist/checks/consolidated/ui-loading-skeletons.d.ts.map +1 -0
  263. package/dist/checks/consolidated/ui-loading-skeletons.js +145 -0
  264. package/dist/checks/consolidated/ui-loading-skeletons.js.map +1 -0
  265. package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts +9 -0
  266. package/dist/checks/consolidated/ui-loading-state-skeletons.d.ts.map +1 -0
  267. package/dist/checks/consolidated/ui-loading-state-skeletons.js +125 -0
  268. package/dist/checks/consolidated/ui-loading-state-skeletons.js.map +1 -0
  269. package/dist/checks/consolidated/ui-media.d.ts +74 -0
  270. package/dist/checks/consolidated/ui-media.d.ts.map +1 -0
  271. package/dist/checks/consolidated/ui-media.js +408 -0
  272. package/dist/checks/consolidated/ui-media.js.map +1 -0
  273. package/dist/checks/consolidated/ui-micro-interactions.d.ts +107 -0
  274. package/dist/checks/consolidated/ui-micro-interactions.d.ts.map +1 -0
  275. package/dist/checks/consolidated/ui-micro-interactions.js +825 -0
  276. package/dist/checks/consolidated/ui-micro-interactions.js.map +1 -0
  277. package/dist/checks/consolidated/ui-microcopy-consistency.d.ts +114 -0
  278. package/dist/checks/consolidated/ui-microcopy-consistency.d.ts.map +1 -0
  279. package/dist/checks/consolidated/ui-microcopy-consistency.js +566 -0
  280. package/dist/checks/consolidated/ui-microcopy-consistency.js.map +1 -0
  281. package/dist/checks/consolidated/ui-mobile-ux.d.ts +251 -0
  282. package/dist/checks/consolidated/ui-mobile-ux.d.ts.map +1 -0
  283. package/dist/checks/consolidated/ui-mobile-ux.js +2212 -0
  284. package/dist/checks/consolidated/ui-mobile-ux.js.map +1 -0
  285. package/dist/checks/consolidated/ui-motion-accessibility.d.ts +93 -0
  286. package/dist/checks/consolidated/ui-motion-accessibility.d.ts.map +1 -0
  287. package/dist/checks/consolidated/ui-motion-accessibility.js +450 -0
  288. package/dist/checks/consolidated/ui-motion-accessibility.js.map +1 -0
  289. package/dist/checks/consolidated/ui-navigation.d.ts +85 -0
  290. package/dist/checks/consolidated/ui-navigation.d.ts.map +1 -0
  291. package/dist/checks/consolidated/ui-navigation.js +673 -0
  292. package/dist/checks/consolidated/ui-navigation.js.map +1 -0
  293. package/dist/checks/consolidated/ui-patterns.d.ts +174 -0
  294. package/dist/checks/consolidated/ui-patterns.d.ts.map +1 -0
  295. package/dist/checks/consolidated/ui-patterns.js +1532 -0
  296. package/dist/checks/consolidated/ui-patterns.js.map +1 -0
  297. package/dist/checks/consolidated/ui-responsive.d.ts +89 -0
  298. package/dist/checks/consolidated/ui-responsive.d.ts.map +1 -0
  299. package/dist/checks/consolidated/ui-responsive.js +588 -0
  300. package/dist/checks/consolidated/ui-responsive.js.map +1 -0
  301. package/dist/checks/consolidated/ui-spacing-standards.d.ts +43 -0
  302. package/dist/checks/consolidated/ui-spacing-standards.d.ts.map +1 -0
  303. package/dist/checks/consolidated/ui-spacing-standards.js +874 -0
  304. package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -0
  305. package/dist/checks/consolidated/ui-spacing.d.ts +751 -0
  306. package/dist/checks/consolidated/ui-spacing.d.ts.map +1 -0
  307. package/dist/checks/consolidated/ui-spacing.js +4996 -0
  308. package/dist/checks/consolidated/ui-spacing.js.map +1 -0
  309. package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts +70 -0
  310. package/dist/checks/consolidated/ui-standards-auto-fixer.d.ts.map +1 -0
  311. package/dist/checks/consolidated/ui-standards-auto-fixer.js +429 -0
  312. package/dist/checks/consolidated/ui-standards-auto-fixer.js.map +1 -0
  313. package/dist/checks/consolidated/ui-standards-enforcement.d.ts +100 -0
  314. package/dist/checks/consolidated/ui-standards-enforcement.d.ts.map +1 -0
  315. package/dist/checks/consolidated/ui-standards-enforcement.js +935 -0
  316. package/dist/checks/consolidated/ui-standards-enforcement.js.map +1 -0
  317. package/dist/checks/consolidated/ui-state-consistency.d.ts +90 -0
  318. package/dist/checks/consolidated/ui-state-consistency.d.ts.map +1 -0
  319. package/dist/checks/consolidated/ui-state-consistency.js +659 -0
  320. package/dist/checks/consolidated/ui-state-consistency.js.map +1 -0
  321. package/dist/checks/consolidated/ui-style-validation.d.ts +74 -0
  322. package/dist/checks/consolidated/ui-style-validation.d.ts.map +1 -0
  323. package/dist/checks/consolidated/ui-style-validation.js +403 -0
  324. package/dist/checks/consolidated/ui-style-validation.js.map +1 -0
  325. package/dist/checks/consolidated/ui-tokens.d.ts +110 -0
  326. package/dist/checks/consolidated/ui-tokens.d.ts.map +1 -0
  327. package/dist/checks/consolidated/ui-tokens.js +990 -0
  328. package/dist/checks/consolidated/ui-tokens.js.map +1 -0
  329. package/dist/checks/consolidated/ui-typography.d.ts +77 -0
  330. package/dist/checks/consolidated/ui-typography.d.ts.map +1 -0
  331. package/dist/checks/consolidated/ui-typography.js +416 -0
  332. package/dist/checks/consolidated/ui-typography.js.map +1 -0
  333. package/dist/checks/consolidated/ui-visual-hierarchy.d.ts +90 -0
  334. package/dist/checks/consolidated/ui-visual-hierarchy.d.ts.map +1 -0
  335. package/dist/checks/consolidated/ui-visual-hierarchy.js +562 -0
  336. package/dist/checks/consolidated/ui-visual-hierarchy.js.map +1 -0
  337. package/dist/checks/consolidated/woocommerce.d.ts +50 -0
  338. package/dist/checks/consolidated/woocommerce.d.ts.map +1 -0
  339. package/dist/checks/consolidated/woocommerce.js +198 -0
  340. package/dist/checks/consolidated/woocommerce.js.map +1 -0
  341. package/dist/checks/core/api-route-protection.d.ts +2 -0
  342. package/dist/checks/core/api-route-protection.d.ts.map +1 -0
  343. package/dist/checks/core/api-route-protection.js +101 -0
  344. package/dist/checks/core/api-route-protection.js.map +1 -0
  345. package/dist/checks/core/critical.d.ts +8 -0
  346. package/dist/checks/core/critical.d.ts.map +1 -0
  347. package/dist/checks/core/critical.js +200 -0
  348. package/dist/checks/core/critical.js.map +1 -0
  349. package/dist/checks/core/database.d.ts +8 -0
  350. package/dist/checks/core/database.d.ts.map +1 -0
  351. package/dist/checks/core/database.js +699 -0
  352. package/dist/checks/core/database.js.map +1 -0
  353. package/dist/checks/core/development.d.ts +8 -0
  354. package/dist/checks/core/development.d.ts.map +1 -0
  355. package/dist/checks/core/development.js +417 -0
  356. package/dist/checks/core/development.js.map +1 -0
  357. package/dist/checks/core/hydration-mismatch-check.d.ts +38 -0
  358. package/dist/checks/core/hydration-mismatch-check.d.ts.map +1 -0
  359. package/dist/checks/core/hydration-mismatch-check.js +411 -0
  360. package/dist/checks/core/hydration-mismatch-check.js.map +1 -0
  361. package/dist/checks/core/performance.d.ts +8 -0
  362. package/dist/checks/core/performance.d.ts.map +1 -0
  363. package/dist/checks/core/performance.js +474 -0
  364. package/dist/checks/core/performance.js.map +1 -0
  365. package/dist/checks/core/security.d.ts +8 -0
  366. package/dist/checks/core/security.d.ts.map +1 -0
  367. package/dist/checks/core/security.js +275 -0
  368. package/dist/checks/core/security.js.map +1 -0
  369. package/dist/checks/core/standardized-error-handling.d.ts +43 -0
  370. package/dist/checks/core/standardized-error-handling.d.ts.map +1 -0
  371. package/dist/checks/core/standardized-error-handling.js +384 -0
  372. package/dist/checks/core/standardized-error-handling.js.map +1 -0
  373. package/dist/checks/core/supercatch.d.ts +8 -0
  374. package/dist/checks/core/supercatch.d.ts.map +1 -0
  375. package/dist/checks/core/supercatch.js +750 -0
  376. package/dist/checks/core/supercatch.js.map +1 -0
  377. package/dist/checks/core/suppression-check.d.ts +2 -0
  378. package/dist/checks/core/suppression-check.d.ts.map +1 -0
  379. package/dist/checks/core/suppression-check.js +129 -0
  380. package/dist/checks/core/suppression-check.js.map +1 -0
  381. package/dist/checks/core/ui-quality.d.ts +8 -0
  382. package/dist/checks/core/ui-quality.d.ts.map +1 -0
  383. package/dist/checks/core/ui-quality.js +1736 -0
  384. package/dist/checks/core/ui-quality.js.map +1 -0
  385. package/dist/checks/core/unused-assets-check.d.ts +2 -0
  386. package/dist/checks/core/unused-assets-check.d.ts.map +1 -0
  387. package/dist/checks/core/unused-assets-check.js +112 -0
  388. package/dist/checks/core/unused-assets-check.js.map +1 -0
  389. package/dist/checks/core/use-status-ssr-safety.d.ts +34 -0
  390. package/dist/checks/core/use-status-ssr-safety.d.ts.map +1 -0
  391. package/dist/checks/core/use-status-ssr-safety.js +283 -0
  392. package/dist/checks/core/use-status-ssr-safety.js.map +1 -0
  393. package/dist/checks/email/email-flow-validation.d.ts +23 -0
  394. package/dist/checks/email/email-flow-validation.d.ts.map +1 -0
  395. package/dist/checks/email/email-flow-validation.js +468 -0
  396. package/dist/checks/email/email-flow-validation.js.map +1 -0
  397. package/dist/checks/email/email-template-db-verification.d.ts +20 -0
  398. package/dist/checks/email/email-template-db-verification.d.ts.map +1 -0
  399. package/dist/checks/email/email-template-db-verification.js +46 -0
  400. package/dist/checks/email/email-template-db-verification.js.map +1 -0
  401. package/dist/checks/email/email-template-validation.d.ts +24 -0
  402. package/dist/checks/email/email-template-validation.d.ts.map +1 -0
  403. package/dist/checks/email/email-template-validation.js +688 -0
  404. package/dist/checks/email/email-template-validation.js.map +1 -0
  405. package/dist/checks/jsx/comment-placement.d.ts +45 -0
  406. package/dist/checks/jsx/comment-placement.d.ts.map +1 -0
  407. package/dist/checks/jsx/comment-placement.js +316 -0
  408. package/dist/checks/jsx/comment-placement.js.map +1 -0
  409. package/dist/checks/specialized/admin-layout-check.d.ts +19 -0
  410. package/dist/checks/specialized/admin-layout-check.d.ts.map +1 -0
  411. package/dist/checks/specialized/admin-layout-check.js +166 -0
  412. package/dist/checks/specialized/admin-layout-check.js.map +1 -0
  413. package/dist/checks/specialized/client-server-separation.d.ts +14 -0
  414. package/dist/checks/specialized/client-server-separation.d.ts.map +1 -0
  415. package/dist/checks/specialized/client-server-separation.js +197 -0
  416. package/dist/checks/specialized/client-server-separation.js.map +1 -0
  417. package/dist/checks/specialized/cost-optimization.d.ts +18 -0
  418. package/dist/checks/specialized/cost-optimization.d.ts.map +1 -0
  419. package/dist/checks/specialized/cost-optimization.js +78 -0
  420. package/dist/checks/specialized/cost-optimization.js.map +1 -0
  421. package/dist/checks/specialized/database-migration-sync.d.ts +21 -0
  422. package/dist/checks/specialized/database-migration-sync.d.ts.map +1 -0
  423. package/dist/checks/specialized/database-migration-sync.js +150 -0
  424. package/dist/checks/specialized/database-migration-sync.js.map +1 -0
  425. package/dist/checks/specialized/database-model-validation.d.ts +15 -0
  426. package/dist/checks/specialized/database-model-validation.d.ts.map +1 -0
  427. package/dist/checks/specialized/database-model-validation.js +35 -0
  428. package/dist/checks/specialized/database-model-validation.js.map +1 -0
  429. package/dist/checks/specialized/database-schema-migrations-diff.d.ts +27 -0
  430. package/dist/checks/specialized/database-schema-migrations-diff.d.ts.map +1 -0
  431. package/dist/checks/specialized/database-schema-migrations-diff.js +177 -0
  432. package/dist/checks/specialized/database-schema-migrations-diff.js.map +1 -0
  433. package/dist/checks/specialized/database-schema-sync.d.ts +23 -0
  434. package/dist/checks/specialized/database-schema-sync.d.ts.map +1 -0
  435. package/dist/checks/specialized/database-schema-sync.js +77 -0
  436. package/dist/checks/specialized/database-schema-sync.js.map +1 -0
  437. package/dist/checks/specialized/decimal-serialization.d.ts +24 -0
  438. package/dist/checks/specialized/decimal-serialization.d.ts.map +1 -0
  439. package/dist/checks/specialized/decimal-serialization.js +400 -0
  440. package/dist/checks/specialized/decimal-serialization.js.map +1 -0
  441. package/dist/checks/specialized/detect-router-issues.d.ts +14 -0
  442. package/dist/checks/specialized/detect-router-issues.d.ts.map +1 -0
  443. package/dist/checks/specialized/detect-router-issues.js +96 -0
  444. package/dist/checks/specialized/detect-router-issues.js.map +1 -0
  445. package/dist/checks/specialized/enum-validation.d.ts +15 -0
  446. package/dist/checks/specialized/enum-validation.d.ts.map +1 -0
  447. package/dist/checks/specialized/enum-validation.js +35 -0
  448. package/dist/checks/specialized/enum-validation.js.map +1 -0
  449. package/dist/checks/specialized/hash-collision.d.ts +18 -0
  450. package/dist/checks/specialized/hash-collision.d.ts.map +1 -0
  451. package/dist/checks/specialized/hash-collision.js +78 -0
  452. package/dist/checks/specialized/hash-collision.js.map +1 -0
  453. package/dist/checks/specialized/id-generation-enforcement.d.ts +16 -0
  454. package/dist/checks/specialized/id-generation-enforcement.d.ts.map +1 -0
  455. package/dist/checks/specialized/id-generation-enforcement.js +307 -0
  456. package/dist/checks/specialized/id-generation-enforcement.js.map +1 -0
  457. package/dist/checks/specialized/image-data-integrity.d.ts +15 -0
  458. package/dist/checks/specialized/image-data-integrity.d.ts.map +1 -0
  459. package/dist/checks/specialized/image-data-integrity.js +79 -0
  460. package/dist/checks/specialized/image-data-integrity.js.map +1 -0
  461. package/dist/checks/specialized/image-health.d.ts +14 -0
  462. package/dist/checks/specialized/image-health.d.ts.map +1 -0
  463. package/dist/checks/specialized/image-health.js +122 -0
  464. package/dist/checks/specialized/image-health.js.map +1 -0
  465. package/dist/checks/specialized/image-metadata-validation.d.ts +14 -0
  466. package/dist/checks/specialized/image-metadata-validation.d.ts.map +1 -0
  467. package/dist/checks/specialized/image-metadata-validation.js +95 -0
  468. package/dist/checks/specialized/image-metadata-validation.js.map +1 -0
  469. package/dist/checks/specialized/image-optimization.d.ts +16 -0
  470. package/dist/checks/specialized/image-optimization.d.ts.map +1 -0
  471. package/dist/checks/specialized/image-optimization.js +86 -0
  472. package/dist/checks/specialized/image-optimization.js.map +1 -0
  473. package/dist/checks/specialized/invalid-module-imports.d.ts +24 -0
  474. package/dist/checks/specialized/invalid-module-imports.d.ts.map +1 -0
  475. package/dist/checks/specialized/invalid-module-imports.js +209 -0
  476. package/dist/checks/specialized/invalid-module-imports.js.map +1 -0
  477. package/dist/checks/specialized/lint-validation.d.ts +26 -0
  478. package/dist/checks/specialized/lint-validation.d.ts.map +1 -0
  479. package/dist/checks/specialized/lint-validation.js +193 -0
  480. package/dist/checks/specialized/lint-validation.js.map +1 -0
  481. package/dist/checks/specialized/listing-workflow.d.ts +19 -0
  482. package/dist/checks/specialized/listing-workflow.d.ts.map +1 -0
  483. package/dist/checks/specialized/listing-workflow.js +89 -0
  484. package/dist/checks/specialized/listing-workflow.js.map +1 -0
  485. package/dist/checks/specialized/mui-imports-validation.d.ts +18 -0
  486. package/dist/checks/specialized/mui-imports-validation.d.ts.map +1 -0
  487. package/dist/checks/specialized/mui-imports-validation.js +134 -0
  488. package/dist/checks/specialized/mui-imports-validation.js.map +1 -0
  489. package/dist/checks/specialized/nextauth-v5-compliance.d.ts +16 -0
  490. package/dist/checks/specialized/nextauth-v5-compliance.d.ts.map +1 -0
  491. package/dist/checks/specialized/nextauth-v5-compliance.js +164 -0
  492. package/dist/checks/specialized/nextauth-v5-compliance.js.map +1 -0
  493. package/dist/checks/specialized/nextjs-params-check.d.ts +14 -0
  494. package/dist/checks/specialized/nextjs-params-check.d.ts.map +1 -0
  495. package/dist/checks/specialized/nextjs-params-check.js +140 -0
  496. package/dist/checks/specialized/nextjs-params-check.js.map +1 -0
  497. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts +16 -0
  498. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.d.ts.map +1 -0
  499. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js +36 -0
  500. package/dist/checks/specialized/no-legacy-catalog-aliases-validation.js.map +1 -0
  501. package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts +22 -0
  502. package/dist/checks/specialized/no-wata-cardgraded-validation.d.ts.map +1 -0
  503. package/dist/checks/specialized/no-wata-cardgraded-validation.js +97 -0
  504. package/dist/checks/specialized/no-wata-cardgraded-validation.js.map +1 -0
  505. package/dist/checks/specialized/parameter-consistency-check.d.ts +20 -0
  506. package/dist/checks/specialized/parameter-consistency-check.d.ts.map +1 -0
  507. package/dist/checks/specialized/parameter-consistency-check.js +115 -0
  508. package/dist/checks/specialized/parameter-consistency-check.js.map +1 -0
  509. package/dist/checks/specialized/prisma-field-names-validation.d.ts +15 -0
  510. package/dist/checks/specialized/prisma-field-names-validation.d.ts.map +1 -0
  511. package/dist/checks/specialized/prisma-field-names-validation.js +35 -0
  512. package/dist/checks/specialized/prisma-field-names-validation.js.map +1 -0
  513. package/dist/checks/specialized/prisma-null-syntax.d.ts +34 -0
  514. package/dist/checks/specialized/prisma-null-syntax.d.ts.map +1 -0
  515. package/dist/checks/specialized/prisma-null-syntax.js +330 -0
  516. package/dist/checks/specialized/prisma-null-syntax.js.map +1 -0
  517. package/dist/checks/specialized/prisma-query-validation.d.ts +15 -0
  518. package/dist/checks/specialized/prisma-query-validation.d.ts.map +1 -0
  519. package/dist/checks/specialized/prisma-query-validation.js +35 -0
  520. package/dist/checks/specialized/prisma-query-validation.js.map +1 -0
  521. package/dist/checks/specialized/product-type-validation.d.ts +17 -0
  522. package/dist/checks/specialized/product-type-validation.d.ts.map +1 -0
  523. package/dist/checks/specialized/product-type-validation.js +129 -0
  524. package/dist/checks/specialized/product-type-validation.js.map +1 -0
  525. package/dist/checks/specialized/responsive-image-validation.d.ts +14 -0
  526. package/dist/checks/specialized/responsive-image-validation.d.ts.map +1 -0
  527. package/dist/checks/specialized/responsive-image-validation.js +101 -0
  528. package/dist/checks/specialized/responsive-image-validation.js.map +1 -0
  529. package/dist/checks/specialized/root-cleanliness.d.ts +21 -0
  530. package/dist/checks/specialized/root-cleanliness.d.ts.map +1 -0
  531. package/dist/checks/specialized/root-cleanliness.js +251 -0
  532. package/dist/checks/specialized/root-cleanliness.js.map +1 -0
  533. package/dist/checks/specialized/rotation-detection-validation.d.ts +16 -0
  534. package/dist/checks/specialized/rotation-detection-validation.d.ts.map +1 -0
  535. package/dist/checks/specialized/rotation-detection-validation.js +113 -0
  536. package/dist/checks/specialized/rotation-detection-validation.js.map +1 -0
  537. package/dist/checks/specialized/script-organization.d.ts +17 -0
  538. package/dist/checks/specialized/script-organization.d.ts.map +1 -0
  539. package/dist/checks/specialized/script-organization.js +487 -0
  540. package/dist/checks/specialized/script-organization.js.map +1 -0
  541. package/dist/checks/specialized/shared-components-migration.d.ts +137 -0
  542. package/dist/checks/specialized/shared-components-migration.d.ts.map +1 -0
  543. package/dist/checks/specialized/shared-components-migration.js +1288 -0
  544. package/dist/checks/specialized/shared-components-migration.js.map +1 -0
  545. package/dist/checks/specialized/store-specialties-normalization.d.ts +10 -0
  546. package/dist/checks/specialized/store-specialties-normalization.d.ts.map +1 -0
  547. package/dist/checks/specialized/store-specialties-normalization.js +126 -0
  548. package/dist/checks/specialized/store-specialties-normalization.js.map +1 -0
  549. package/dist/checks/specialized/two-stage-trim-validation.d.ts +16 -0
  550. package/dist/checks/specialized/two-stage-trim-validation.d.ts.map +1 -0
  551. package/dist/checks/specialized/two-stage-trim-validation.js +115 -0
  552. package/dist/checks/specialized/two-stage-trim-validation.js.map +1 -0
  553. package/dist/checks/specialized/underscore-variable-audit.d.ts +26 -0
  554. package/dist/checks/specialized/underscore-variable-audit.d.ts.map +1 -0
  555. package/dist/checks/specialized/underscore-variable-audit.js +219 -0
  556. package/dist/checks/specialized/underscore-variable-audit.js.map +1 -0
  557. package/dist/checks/specialized/unified-badge-consistency.d.ts +16 -0
  558. package/dist/checks/specialized/unified-badge-consistency.d.ts.map +1 -0
  559. package/dist/checks/specialized/unified-badge-consistency.js +284 -0
  560. package/dist/checks/specialized/unified-badge-consistency.js.map +1 -0
  561. package/dist/checks/specialized/validate-integration-enums.d.ts +15 -0
  562. package/dist/checks/specialized/validate-integration-enums.d.ts.map +1 -0
  563. package/dist/checks/specialized/validate-integration-enums.js +131 -0
  564. package/dist/checks/specialized/validate-integration-enums.js.map +1 -0
  565. package/dist/checks/testing/action-regression.d.ts +23 -0
  566. package/dist/checks/testing/action-regression.d.ts.map +1 -0
  567. package/dist/checks/testing/action-regression.js +192 -0
  568. package/dist/checks/testing/action-regression.js.map +1 -0
  569. package/dist/checks/testing/critical-api-coverage.d.ts +21 -0
  570. package/dist/checks/testing/critical-api-coverage.d.ts.map +1 -0
  571. package/dist/checks/testing/critical-api-coverage.js +158 -0
  572. package/dist/checks/testing/critical-api-coverage.js.map +1 -0
  573. package/dist/checks/testing/data-entry-regression-required.d.ts +24 -0
  574. package/dist/checks/testing/data-entry-regression-required.d.ts.map +1 -0
  575. package/dist/checks/testing/data-entry-regression-required.js +378 -0
  576. package/dist/checks/testing/data-entry-regression-required.js.map +1 -0
  577. package/dist/checks/testing/e2e-best-practices.d.ts +24 -0
  578. package/dist/checks/testing/e2e-best-practices.d.ts.map +1 -0
  579. package/dist/checks/testing/e2e-best-practices.js +791 -0
  580. package/dist/checks/testing/e2e-best-practices.js.map +1 -0
  581. package/dist/checks/testing/e2e-flake-patterns.d.ts +26 -0
  582. package/dist/checks/testing/e2e-flake-patterns.d.ts.map +1 -0
  583. package/dist/checks/testing/e2e-flake-patterns.js +305 -0
  584. package/dist/checks/testing/e2e-flake-patterns.js.map +1 -0
  585. package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts +25 -0
  586. package/dist/checks/testing/e2e-redundant-visibility-checks.d.ts.map +1 -0
  587. package/dist/checks/testing/e2e-redundant-visibility-checks.js +613 -0
  588. package/dist/checks/testing/e2e-redundant-visibility-checks.js.map +1 -0
  589. package/dist/checks/testing/e2e-slow-tests.d.ts +9 -0
  590. package/dist/checks/testing/e2e-slow-tests.d.ts.map +1 -0
  591. package/dist/checks/testing/e2e-slow-tests.js +142 -0
  592. package/dist/checks/testing/e2e-slow-tests.js.map +1 -0
  593. package/dist/checks/testing/e2e-timeouts.d.ts +9 -0
  594. package/dist/checks/testing/e2e-timeouts.d.ts.map +1 -0
  595. package/dist/checks/testing/e2e-timeouts.js +82 -0
  596. package/dist/checks/testing/e2e-timeouts.js.map +1 -0
  597. package/dist/checks/testing/integration-e2e-depth.d.ts +20 -0
  598. package/dist/checks/testing/integration-e2e-depth.d.ts.map +1 -0
  599. package/dist/checks/testing/integration-e2e-depth.js +575 -0
  600. package/dist/checks/testing/integration-e2e-depth.js.map +1 -0
  601. package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts +31 -0
  602. package/dist/checks/testing/playwright-feature-coverage-gaps.d.ts.map +1 -0
  603. package/dist/checks/testing/playwright-feature-coverage-gaps.js +1582 -0
  604. package/dist/checks/testing/playwright-feature-coverage-gaps.js.map +1 -0
  605. package/dist/checks/testing/playwright-mock-inventory.d.ts +24 -0
  606. package/dist/checks/testing/playwright-mock-inventory.d.ts.map +1 -0
  607. package/dist/checks/testing/playwright-mock-inventory.js +380 -0
  608. package/dist/checks/testing/playwright-mock-inventory.js.map +1 -0
  609. package/dist/checks/testing/test-coverage-threshold.d.ts +25 -0
  610. package/dist/checks/testing/test-coverage-threshold.d.ts.map +1 -0
  611. package/dist/checks/testing/test-coverage-threshold.js +166 -0
  612. package/dist/checks/testing/test-coverage-threshold.js.map +1 -0
  613. package/dist/checks/testing/test-flakiness-score.d.ts +27 -0
  614. package/dist/checks/testing/test-flakiness-score.d.ts.map +1 -0
  615. package/dist/checks/testing/test-flakiness-score.js +358 -0
  616. package/dist/checks/testing/test-flakiness-score.js.map +1 -0
  617. package/dist/checks/testing/test-patterns.d.ts +16 -0
  618. package/dist/checks/testing/test-patterns.d.ts.map +1 -0
  619. package/dist/checks/testing/test-patterns.js +156 -0
  620. package/dist/checks/testing/test-patterns.js.map +1 -0
  621. package/dist/checks/workflows/a-plus-rating-validation.d.ts +42 -0
  622. package/dist/checks/workflows/a-plus-rating-validation.d.ts.map +1 -0
  623. package/dist/checks/workflows/a-plus-rating-validation.js +527 -0
  624. package/dist/checks/workflows/a-plus-rating-validation.js.map +1 -0
  625. package/dist/checks/workflows/affected.d.ts +14 -0
  626. package/dist/checks/workflows/affected.d.ts.map +1 -0
  627. package/dist/checks/workflows/affected.js +126 -0
  628. package/dist/checks/workflows/affected.js.map +1 -0
  629. package/dist/checks/workflows/ai.d.ts +6 -0
  630. package/dist/checks/workflows/ai.d.ts.map +1 -0
  631. package/dist/checks/workflows/ai.js +42 -0
  632. package/dist/checks/workflows/ai.js.map +1 -0
  633. package/dist/checks/workflows/all.d.ts +31 -0
  634. package/dist/checks/workflows/all.d.ts.map +1 -0
  635. package/dist/checks/workflows/all.js +2688 -0
  636. package/dist/checks/workflows/all.js.map +1 -0
  637. package/dist/checks/workflows/commit.d.ts +19 -0
  638. package/dist/checks/workflows/commit.d.ts.map +1 -0
  639. package/dist/checks/workflows/commit.js +207 -0
  640. package/dist/checks/workflows/commit.js.map +1 -0
  641. package/dist/checks/workflows/critical.d.ts +9 -0
  642. package/dist/checks/workflows/critical.d.ts.map +1 -0
  643. package/dist/checks/workflows/critical.js +213 -0
  644. package/dist/checks/workflows/critical.js.map +1 -0
  645. package/dist/checks/workflows/database-id-validation.d.ts +9 -0
  646. package/dist/checks/workflows/database-id-validation.d.ts.map +1 -0
  647. package/dist/checks/workflows/database-id-validation.js +13 -0
  648. package/dist/checks/workflows/database-id-validation.js.map +1 -0
  649. package/dist/checks/workflows/deploy.d.ts +20 -0
  650. package/dist/checks/workflows/deploy.d.ts.map +1 -0
  651. package/dist/checks/workflows/deploy.js +107 -0
  652. package/dist/checks/workflows/deploy.js.map +1 -0
  653. package/dist/checks/workflows/deployment-readiness.d.ts +12 -0
  654. package/dist/checks/workflows/deployment-readiness.d.ts.map +1 -0
  655. package/dist/checks/workflows/deployment-readiness.js +403 -0
  656. package/dist/checks/workflows/deployment-readiness.js.map +1 -0
  657. package/dist/checks/workflows/dev.d.ts +19 -0
  658. package/dist/checks/workflows/dev.d.ts.map +1 -0
  659. package/dist/checks/workflows/dev.js +88 -0
  660. package/dist/checks/workflows/dev.js.map +1 -0
  661. package/dist/checks/workflows/development.d.ts +9 -0
  662. package/dist/checks/workflows/development.d.ts.map +1 -0
  663. package/dist/checks/workflows/development.js +65 -0
  664. package/dist/checks/workflows/development.js.map +1 -0
  665. package/dist/checks/workflows/enterprise.d.ts +10 -0
  666. package/dist/checks/workflows/enterprise.d.ts.map +1 -0
  667. package/dist/checks/workflows/enterprise.js +359 -0
  668. package/dist/checks/workflows/enterprise.js.map +1 -0
  669. package/dist/checks/workflows/images.d.ts +6 -0
  670. package/dist/checks/workflows/images.d.ts.map +1 -0
  671. package/dist/checks/workflows/images.js +58 -0
  672. package/dist/checks/workflows/images.js.map +1 -0
  673. package/dist/checks/workflows/naming.d.ts +19 -0
  674. package/dist/checks/workflows/naming.d.ts.map +1 -0
  675. package/dist/checks/workflows/naming.js +42 -0
  676. package/dist/checks/workflows/naming.js.map +1 -0
  677. package/dist/checks/workflows/performance.d.ts +8 -0
  678. package/dist/checks/workflows/performance.d.ts.map +1 -0
  679. package/dist/checks/workflows/performance.js +77 -0
  680. package/dist/checks/workflows/performance.js.map +1 -0
  681. package/dist/checks/workflows/pre-deploy.d.ts +6 -0
  682. package/dist/checks/workflows/pre-deploy.d.ts.map +1 -0
  683. package/dist/checks/workflows/pre-deploy.js +41 -0
  684. package/dist/checks/workflows/pre-deploy.js.map +1 -0
  685. package/dist/checks/workflows/security.d.ts +8 -0
  686. package/dist/checks/workflows/security.d.ts.map +1 -0
  687. package/dist/checks/workflows/security.js +71 -0
  688. package/dist/checks/workflows/security.js.map +1 -0
  689. package/dist/checks/workflows/supercatch.d.ts +8 -0
  690. package/dist/checks/workflows/supercatch.d.ts.map +1 -0
  691. package/dist/checks/workflows/supercatch.js +127 -0
  692. package/dist/checks/workflows/supercatch.js.map +1 -0
  693. package/dist/checks/workflows/ui-quality.d.ts +9 -0
  694. package/dist/checks/workflows/ui-quality.d.ts.map +1 -0
  695. package/dist/checks/workflows/ui-quality.js +264 -0
  696. package/dist/checks/workflows/ui-quality.js.map +1 -0
  697. package/dist/checks/workflows/ui-uniformity.d.ts +18 -0
  698. package/dist/checks/workflows/ui-uniformity.d.ts.map +1 -0
  699. package/dist/checks/workflows/ui-uniformity.js +265 -0
  700. package/dist/checks/workflows/ui-uniformity.js.map +1 -0
  701. package/dist/checks/workflows/vercel.d.ts +16 -0
  702. package/dist/checks/workflows/vercel.d.ts.map +1 -0
  703. package/dist/checks/workflows/vercel.js +173 -0
  704. package/dist/checks/workflows/vercel.js.map +1 -0
  705. package/dist/utils/validation-helpers.d.ts +43 -0
  706. package/dist/utils/validation-helpers.d.ts.map +1 -0
  707. package/dist/utils/validation-helpers.js +370 -0
  708. package/dist/utils/validation-helpers.js.map +1 -0
  709. package/package.json +1 -1
@@ -0,0 +1,1001 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ /**
4
+ * Consolidated E2E Validation Preflight
5
+ *
6
+ * MASTER module for all E2E test validation. Consolidates 18+ separate preflights into one.
7
+ *
8
+ * Sub-checks included (10 total):
9
+ * 1. Best Practices - No hardcoded waits, force clicks, page.pause, .only tests
10
+ * 2. Outcome Validation - Critical actions have outcome verification
11
+ * 3. Flake Patterns - Patterns that cause flaky tests
12
+ * 4. Timeout Limits - Playwright config timeout limits
13
+ * 5. Performance - Slow patterns and excessive timeouts
14
+ * 6. Test Organization - test.describe blocks and imports
15
+ * 7. Assertion Quality - Detects weak assertions (visibility-only tests)
16
+ * 8. Test Isolation - Shared state and beforeAll issues
17
+ * 9. Selector Stability - Brittle selectors (class, nth-child, nested divs)
18
+ * 10. Critical Route Coverage - Ensures critical paths have E2E tests
19
+ *
20
+ * Usage:
21
+ * pnpm preflight:e2e # All checks
22
+ * pnpm preflight:e2e best-practices # Best practices only
23
+ * pnpm preflight:e2e outcomes # Outcome validation only
24
+ * pnpm preflight:e2e flakes # Flake patterns only
25
+ * pnpm preflight:e2e timeouts # Timeout limits only
26
+ * pnpm preflight:e2e performance # Performance patterns only
27
+ * pnpm preflight:e2e organization # Test organization only
28
+ * pnpm preflight:e2e assertions # Assertion quality only
29
+ * pnpm preflight:e2e isolation # Test isolation only
30
+ * pnpm preflight:e2e selectors # Selector stability only
31
+ * pnpm preflight:e2e coverage # Critical route coverage only
32
+ * pnpm preflight:e2e --warn # All checks as warnings
33
+ * pnpm preflight:e2e --verbose # Show all issues
34
+ *
35
+ * Replaces:
36
+ * - e2e/e2e-outcome-validation.ts
37
+ * - e2e/e2e-interaction-regression.ts
38
+ * - e2e/e2e-interaction-coverage-scan.ts
39
+ * - e2e/e2e-action-outcome-validator.ts
40
+ * - e2e/e2e-button-functionality-audit.ts
41
+ * - e2e/e2e-performance-regression.ts
42
+ * - e2e/e2e-performance-baseline.ts
43
+ * - e2e/e2e-performance-patterns.ts
44
+ * - e2e/e2e-resource-monitoring.ts
45
+ * - testing/e2e-best-practices.ts
46
+ * - testing/e2e-flake-patterns.ts
47
+ * - testing/e2e-timeouts.ts
48
+ * - testing/e2e-slow-tests.ts
49
+ * - testing/e2e-redundant-visibility-checks.ts
50
+ * - consolidated/e2e-regression-coverage.ts
51
+ * - consolidated/regression-hygiene.ts (E2E parts)
52
+ */
53
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
54
+ if (k2 === undefined) k2 = k;
55
+ var desc = Object.getOwnPropertyDescriptor(m, k);
56
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
57
+ desc = { enumerable: true, get: function() { return m[k]; } };
58
+ }
59
+ Object.defineProperty(o, k2, desc);
60
+ }) : (function(o, m, k, k2) {
61
+ if (k2 === undefined) k2 = k;
62
+ o[k2] = m[k];
63
+ }));
64
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
65
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
66
+ }) : function(o, v) {
67
+ o["default"] = v;
68
+ });
69
+ var __importStar = (this && this.__importStar) || (function () {
70
+ var ownKeys = function(o) {
71
+ ownKeys = Object.getOwnPropertyNames || function (o) {
72
+ var ar = [];
73
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
74
+ return ar;
75
+ };
76
+ return ownKeys(o);
77
+ };
78
+ return function (mod) {
79
+ if (mod && mod.__esModule) return mod;
80
+ var result = {};
81
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
82
+ __setModuleDefault(result, mod);
83
+ return result;
84
+ };
85
+ })();
86
+ Object.defineProperty(exports, "__esModule", { value: true });
87
+ exports.E2EValidationModule = void 0;
88
+ const fs = __importStar(require("fs"));
89
+ const path = __importStar(require("path"));
90
+ const console_chars_1 = require("../../utils/console-chars");
91
+ const file_cache_1 = require("../../shared/file-cache");
92
+ const glob_patterns_1 = require("../../shared/glob-patterns");
93
+ const concurrency_config_1 = require("../../shared/concurrency-config");
94
+ // CACHED FILE LISTS - Scan once, use everywhere
95
+ let _cachedE2ESpecFiles = null;
96
+ async function getE2ESpecFiles() {
97
+ if (!_cachedE2ESpecFiles) {
98
+ _cachedE2ESpecFiles = await file_cache_1.fileCache.getE2ESpecFiles();
99
+ }
100
+ return _cachedE2ESpecFiles;
101
+ }
102
+ // CONFIGURATION
103
+ const EXCLUDED = [...glob_patterns_1.STANDARD_EXCLUDES];
104
+ const E2E_TEST_GLOB = "tests/e2e/**/*.spec.ts";
105
+ // Best practices rules
106
+ // NOTE: These are all warnings (non-blocking) because the original e2e-best-practices.ts
107
+ // was NOT included in preflight:all. Making them blocking would be a regression.
108
+ // To make blocking in future: change severity to 'error' and fix all violations first.
109
+ const BEST_PRACTICE_RULES = {
110
+ "no-hardcoded-waits": {
111
+ pattern: /waitForTimeout\s*\(\s*(\d+)\s*\)/g,
112
+ threshold: 500,
113
+ severity: "warning", // Non-blocking - original preflight wasn't in all.ts
114
+ message: (timeout) => `Hardcoded wait of ${timeout}ms found`,
115
+ suggestion: "Use waitForSelector, waitForLoadState, or expect().toBeVisible()",
116
+ },
117
+ "no-force-click": {
118
+ pattern: /force:\s*true/g,
119
+ contextPattern: /click/,
120
+ severity: "warning", // Non-blocking - sometimes needed for mobile tests
121
+ message: "Using force: true bypasses actionability checks",
122
+ suggestion: "Fix element visibility/interactability instead of using force: true",
123
+ },
124
+ "no-page-pause": {
125
+ pattern: /page\.pause\(\)/g,
126
+ severity: "error",
127
+ message: "page.pause() should not be committed to tests",
128
+ suggestion: "Remove page.pause() - it's only for debugging",
129
+ },
130
+ "no-only-tests": {
131
+ pattern: /test\.only\(|\.only\(/g,
132
+ severity: "error",
133
+ message: "test.only() should not be committed",
134
+ suggestion: "Remove .only() to run all tests in CI",
135
+ },
136
+ "no-skip-without-reason": {
137
+ pattern: /test\.skip\(/g,
138
+ checkPrevLineForTodo: true, // Special handling - check for TODO/FIXME on previous line
139
+ severity: "warning",
140
+ message: "test.skip() should have a reason comment",
141
+ suggestion: 'Add a TODO comment on the line before, or use test.skip("reason", ...)',
142
+ },
143
+ };
144
+ // Critical actions that MUST have outcome verification
145
+ const CRITICAL_ACTIONS = [
146
+ {
147
+ pattern: /\.click\s*\([^)]*(?:delete|remove|trash)/i,
148
+ name: "Delete",
149
+ severity: "critical",
150
+ },
151
+ {
152
+ pattern: /\.click\s*\([^)]*(?:checkout|place.*order|pay|purchase)/i,
153
+ name: "Checkout",
154
+ severity: "critical",
155
+ },
156
+ { pattern: /\.click\s*\([^)]*(?:refund)/i, name: "Refund", severity: "critical" },
157
+ {
158
+ pattern: /\.click\s*\([^)]*(?:submit|save|confirm)/i,
159
+ name: "Submit",
160
+ severity: "high",
161
+ },
162
+ {
163
+ pattern: /\.click\s*\([^)]*(?:approve|reject)/i,
164
+ name: "Approve/Reject",
165
+ severity: "high",
166
+ },
167
+ { pattern: /\.click\s*\([^)]*(?:ship|fulfill)/i, name: "Ship", severity: "high" },
168
+ { pattern: /\.click\s*\([^)]*(?:cancel)/i, name: "Cancel", severity: "high" },
169
+ {
170
+ pattern: /\.click\s*\([^)]*(?:add.*cart|buy)/i,
171
+ name: "Add to Cart",
172
+ severity: "high",
173
+ },
174
+ ];
175
+ // Strong outcome patterns
176
+ const STRONG_OUTCOMES = [
177
+ /toHaveURL\s*\(/,
178
+ /toHaveText\s*\(/,
179
+ /toContainText\s*\(/,
180
+ /toHaveValue\s*\(/,
181
+ /toHaveCount\s*\(/,
182
+ /not\.toBeVisible\s*\(/,
183
+ /toBeHidden\s*\(/,
184
+ /waitForResponse\s*\(/,
185
+ /waitForRequest\s*\(/,
186
+ /waitForURL\s*\(/,
187
+ /expect\.poll\s*\(/,
188
+ ];
189
+ // Flake patterns
190
+ const FLAKE_PATTERNS = [
191
+ {
192
+ pattern: /:text\s*\(/g,
193
+ name: "text-selector",
194
+ message: "Text selectors are brittle",
195
+ suggestion: "Use getByRole, getByTestId, or getByLabel",
196
+ },
197
+ {
198
+ pattern: /\.catch\s*\(\s*\(\s*\)\s*=>\s*\{\s*\}\s*\)/g,
199
+ name: "empty-catch",
200
+ message: "Empty catch swallows errors",
201
+ suggestion: "Log or rethrow the error",
202
+ },
203
+ {
204
+ pattern: /page\.content\(\)/g,
205
+ name: "page-content",
206
+ message: "page.content() is brittle for assertions",
207
+ suggestion: "Use specific element assertions",
208
+ },
209
+ ];
210
+ // Timeout limits
211
+ const TIMEOUT_LIMITS = {
212
+ testTimeoutMs: 90_000,
213
+ actionTimeoutMs: 15_000,
214
+ expectTimeoutMs: 30_000,
215
+ navigationTimeoutMs: 60_000,
216
+ };
217
+ // Performance patterns
218
+ const SLOW_PATTERNS = [
219
+ {
220
+ pattern: /timeout:\s*(1[2-9]\d{4,}|[2-9]\d{5,}|\d{6,})/g,
221
+ severity: "error",
222
+ message: "Very excessive timeout (120s+)",
223
+ },
224
+ {
225
+ pattern: /timeout:\s*([6-9]\d{4}|1[01]\d{4})/g,
226
+ severity: "warning",
227
+ message: "Long timeout (60s+)",
228
+ },
229
+ {
230
+ pattern: /waitForTimeout\(\s*([2-9]\d{3,}|\d{5,})\s*\)/g,
231
+ severity: "error",
232
+ message: "Very long waitForTimeout (2s+)",
233
+ },
234
+ {
235
+ pattern: /page\.waitForSelector\(/g,
236
+ severity: "warning",
237
+ message: "waitForSelector is deprecated",
238
+ },
239
+ ];
240
+ // ENHANCEMENT: Missing Test Coverage Detection
241
+ // Routes that MUST have E2E coverage (critical user paths)
242
+ const CRITICAL_ROUTES_REQUIRING_TESTS = [
243
+ { route: "/checkout", minTests: 1, severity: "critical" },
244
+ { route: "/login", minTests: 1, severity: "critical" },
245
+ { route: "/register", minTests: 1, severity: "critical" },
246
+ { route: "/store", minTests: 1, severity: "high" },
247
+ { route: "/marketplace", minTests: 1, severity: "high" },
248
+ { route: "/cart", minTests: 1, severity: "high" },
249
+ { route: "/account", minTests: 1, severity: "medium" },
250
+ ];
251
+ // Assertion patterns that indicate test completeness
252
+ const ASSERTION_QUALITY_PATTERNS = {
253
+ // Strong assertions - actually verify functionality
254
+ strong: [
255
+ /toHaveURL\s*\(/,
256
+ /toHaveText\s*\(/,
257
+ /toContainText\s*\(/,
258
+ /toHaveValue\s*\(/,
259
+ /toHaveCount\s*\(/,
260
+ /toBeChecked\s*\(/,
261
+ /not\.toBeVisible\s*\(/,
262
+ /toBeHidden\s*\(/,
263
+ /waitForResponse\s*\(/,
264
+ /waitForURL\s*\(/,
265
+ /expect\.poll\s*\(/,
266
+ ],
267
+ // Weak assertions - may pass even when broken
268
+ weak: [
269
+ /toBeVisible\s*\(\s*\)\s*;?\s*$/, // Just visibility check with no content
270
+ /toBeTruthy\s*\(\s*\)/, // Too generic
271
+ /toBeDefined\s*\(\s*\)/, // Too generic
272
+ ],
273
+ };
274
+ // Test isolation patterns - detecting shared state issues
275
+ const ISOLATION_ANTI_PATTERNS = [
276
+ {
277
+ pattern: /let\s+\w+\s*=\s*[^;]+;[\s\S]*test\(/g,
278
+ name: "module-level-variable",
279
+ message: "Module-level variable may cause test pollution",
280
+ },
281
+ {
282
+ pattern: /beforeAll\s*\([^)]*\)\s*=>\s*\{[\s\S]*page\./g,
283
+ name: "beforeAll-page-access",
284
+ message: "Accessing page in beforeAll can cause isolation issues",
285
+ },
286
+ ];
287
+ // E2E VALIDATION MODULE
288
+ // Get concurrency from shared config (respects PREFLIGHT_CONCURRENCY env var)
289
+ const concurrencyConfig = (0, concurrency_config_1.getConcurrencyConfig)();
290
+ class E2EValidationModule {
291
+ warnOnly;
292
+ constructor(options = {}) {
293
+ this.warnOnly = options.warnOnly ?? false;
294
+ }
295
+ /**
296
+ * Check 1: Best Practices
297
+ */
298
+ async checkBestPractices() {
299
+ const startTime = Date.now();
300
+ const issues = [];
301
+ const files = await getE2ESpecFiles();
302
+ for (const file of files) {
303
+ const content = fs.readFileSync(file, "utf8");
304
+ const lines = content.split("\n");
305
+ // Check each rule
306
+ for (const [ruleName, rule] of Object.entries(BEST_PRACTICE_RULES)) {
307
+ if ("threshold" in rule) {
308
+ // Pattern with threshold (e.g., waitForTimeout)
309
+ let match;
310
+ while ((match = rule.pattern.exec(content)) !== null) {
311
+ const value = parseInt(match[1] ?? "0", 10);
312
+ if (value > rule.threshold) {
313
+ const lineNum = content.substring(0, match.index).split("\n").length;
314
+ issues.push({
315
+ file,
316
+ line: lineNum,
317
+ type: ruleName,
318
+ severity: this.warnOnly ? "warning" : rule.severity,
319
+ message: rule.message(value),
320
+ suggestion: rule.suggestion,
321
+ rule: ruleName,
322
+ });
323
+ }
324
+ }
325
+ }
326
+ else if ("contextPattern" in rule) {
327
+ // Pattern with context check
328
+ lines.forEach((line, index) => {
329
+ if (rule.pattern.test(line) && rule.contextPattern.test(line)) {
330
+ issues.push({
331
+ file,
332
+ line: index + 1,
333
+ type: ruleName,
334
+ severity: this.warnOnly ? "warning" : rule.severity,
335
+ message: rule.message,
336
+ suggestion: rule.suggestion,
337
+ rule: ruleName,
338
+ });
339
+ }
340
+ });
341
+ }
342
+ else if ("checkPrevLineForTodo" in rule && rule.checkPrevLineForTodo) {
343
+ // test.skip() pattern - check for TODO/FIXME on previous line or inline reason
344
+ lines.forEach((line, index) => {
345
+ if (rule.pattern.test(line) && !line.trim().startsWith("//")) {
346
+ const prevLine = index > 0 ? (lines[index - 1] ?? "") : "";
347
+ // Allow if previous line has TODO or FIXME
348
+ if (prevLine.includes("TODO") || prevLine.includes("FIXME")) {
349
+ return;
350
+ }
351
+ // Allow if line has inline comment
352
+ if (line.includes("//") || line.includes("/*")) {
353
+ return;
354
+ }
355
+ // Allow if previous line has any comment
356
+ if (prevLine.trim().startsWith("//")) {
357
+ return;
358
+ }
359
+ // Check for inline reason string in various formats:
360
+ // test.skip("reason", async () => {
361
+ // test.skip(condition, "reason")
362
+ // test.skip(!visible, "Reason text")
363
+ // test.skip(await emptyState.isVisible().catch(() => false), "No posts")
364
+ const lookahead = [
365
+ lines[index] ?? "",
366
+ lines[index + 1] ?? "",
367
+ lines[index + 2] ?? "",
368
+ lines[index + 3] ?? "",
369
+ ].join("\n");
370
+ // Check for test.skip with a reason string - look for pattern with comma followed by string
371
+ // Handle complex expressions by looking for ", " or ",\n" followed by a quote
372
+ const hasInlineReason = /test\.skip\([\s\S]*?,\s*['"`][^'"`]+['"`]/.test(lookahead) ||
373
+ /test\.skip\(\s*['"`][^'"`]+['"`]\s*,/.test(lookahead);
374
+ if (hasInlineReason) {
375
+ return;
376
+ }
377
+ issues.push({
378
+ file,
379
+ line: index + 1,
380
+ type: ruleName,
381
+ severity: this.warnOnly ? "warning" : rule.severity,
382
+ message: rule.message,
383
+ suggestion: rule.suggestion,
384
+ rule: ruleName,
385
+ });
386
+ }
387
+ });
388
+ }
389
+ else {
390
+ // Simple pattern match
391
+ lines.forEach((line, index) => {
392
+ if (rule.pattern.test(line) && !line.trim().startsWith("//")) {
393
+ issues.push({
394
+ file,
395
+ line: index + 1,
396
+ type: ruleName,
397
+ severity: this.warnOnly ? "warning" : rule.severity,
398
+ message: rule.message,
399
+ suggestion: rule.suggestion,
400
+ rule: ruleName,
401
+ });
402
+ }
403
+ });
404
+ }
405
+ }
406
+ }
407
+ const hasErrors = issues.some((i) => i.severity === "error");
408
+ return {
409
+ name: "E2E Best Practices",
410
+ passed: !hasErrors,
411
+ blocking: !this.warnOnly,
412
+ issues,
413
+ duration: Date.now() - startTime,
414
+ };
415
+ }
416
+ /**
417
+ * Check 2: Outcome Validation
418
+ */
419
+ async checkOutcomeValidation() {
420
+ const startTime = Date.now();
421
+ const issues = [];
422
+ const files = await getE2ESpecFiles();
423
+ for (const file of files) {
424
+ const content = fs.readFileSync(file, "utf8");
425
+ const lines = content.split("\n");
426
+ for (let i = 0; i < lines.length; i++) {
427
+ const line = lines[i] ?? "";
428
+ for (const action of CRITICAL_ACTIONS) {
429
+ if (action.pattern.test(line)) {
430
+ // Check if there's an outcome assertion within 10 lines
431
+ const contextEnd = Math.min(i + 10, lines.length);
432
+ const context = lines.slice(i, contextEnd).join("\n");
433
+ const hasOutcome = STRONG_OUTCOMES.some((p) => p.test(context));
434
+ if (!hasOutcome) {
435
+ issues.push({
436
+ file,
437
+ line: i + 1,
438
+ type: "missing-outcome",
439
+ severity: action.severity === "critical" ? "error" : "warning",
440
+ message: `${action.name} action without outcome verification`,
441
+ suggestion: "Add toHaveURL, toHaveText, waitForResponse, or similar assertion",
442
+ });
443
+ }
444
+ }
445
+ }
446
+ }
447
+ }
448
+ const hasErrors = issues.some((i) => i.severity === "error");
449
+ return {
450
+ name: "E2E Outcome Validation",
451
+ passed: !hasErrors || this.warnOnly,
452
+ blocking: !this.warnOnly,
453
+ issues,
454
+ duration: Date.now() - startTime,
455
+ };
456
+ }
457
+ /**
458
+ * Check 3: Flake Patterns
459
+ */
460
+ async checkFlakePatterns() {
461
+ const startTime = Date.now();
462
+ const issues = [];
463
+ const files = await getE2ESpecFiles();
464
+ for (const file of files) {
465
+ const content = fs.readFileSync(file, "utf8");
466
+ const lines = content.split("\n");
467
+ for (const flake of FLAKE_PATTERNS) {
468
+ let match;
469
+ while ((match = flake.pattern.exec(content)) !== null) {
470
+ const lineNum = content.substring(0, match.index).split("\n").length;
471
+ // Check for suppression comment
472
+ // lineNum is 1-indexed, but slice is 0-indexed, so use lineNum - 1
473
+ // Look 4 lines before to catch multi-line locators where comment is before const
474
+ const lineIndex = lineNum - 1;
475
+ const contextStart = Math.max(0, lineIndex - 4);
476
+ const contextEnd = Math.min(lineIndex + 1, lines.length);
477
+ const context = lines.slice(contextStart, contextEnd).join("\n");
478
+ if (!context.includes("e2e-allow-flake-pattern")) {
479
+ issues.push({
480
+ file,
481
+ line: lineNum,
482
+ type: flake.name,
483
+ severity: "warning",
484
+ message: flake.message,
485
+ suggestion: flake.suggestion,
486
+ });
487
+ }
488
+ }
489
+ }
490
+ }
491
+ return {
492
+ name: "E2E Flake Patterns",
493
+ passed: true, // Non-blocking
494
+ blocking: false,
495
+ issues,
496
+ duration: Date.now() - startTime,
497
+ };
498
+ }
499
+ /**
500
+ * Check 4: Timeout Limits
501
+ */
502
+ async checkTimeoutLimits() {
503
+ const startTime = Date.now();
504
+ const issues = [];
505
+ try {
506
+ // Dynamic import of playwright config
507
+ const configPath = path.join(process.cwd(), "playwright.config.ts");
508
+ if (!fs.existsSync(configPath)) {
509
+ return {
510
+ name: "E2E Timeout Limits",
511
+ passed: true,
512
+ blocking: false,
513
+ issues: [
514
+ {
515
+ file: "playwright.config.ts",
516
+ line: 0,
517
+ type: "missing-config",
518
+ severity: "info",
519
+ message: "No playwright.config.ts found",
520
+ },
521
+ ],
522
+ duration: Date.now() - startTime,
523
+ };
524
+ }
525
+ // Read and parse config (simplified check)
526
+ const configContent = fs.readFileSync(configPath, "utf8");
527
+ // Check for excessive timeouts in config
528
+ const timeoutMatch = configContent.match(/timeout:\s*(\d+)/);
529
+ if (timeoutMatch) {
530
+ const timeout = parseInt(timeoutMatch[1] ?? "0", 10);
531
+ if (timeout > TIMEOUT_LIMITS.testTimeoutMs) {
532
+ issues.push({
533
+ file: "playwright.config.ts",
534
+ line: 1,
535
+ type: "excessive-timeout",
536
+ severity: "error",
537
+ message: `Test timeout ${timeout}ms exceeds limit of ${TIMEOUT_LIMITS.testTimeoutMs}ms`,
538
+ suggestion: "Reduce timeout or break tests into smaller units",
539
+ });
540
+ }
541
+ }
542
+ }
543
+ catch {
544
+ // Config parsing failed, skip this check
545
+ }
546
+ const hasErrors = issues.some((i) => i.severity === "error");
547
+ return {
548
+ name: "E2E Timeout Limits",
549
+ passed: !hasErrors,
550
+ blocking: true,
551
+ issues,
552
+ duration: Date.now() - startTime,
553
+ };
554
+ }
555
+ /**
556
+ * Check 5: Performance Patterns
557
+ */
558
+ async checkPerformancePatterns() {
559
+ const startTime = Date.now();
560
+ const issues = [];
561
+ const files = await getE2ESpecFiles();
562
+ for (const file of files) {
563
+ const content = fs.readFileSync(file, "utf8");
564
+ for (const slow of SLOW_PATTERNS) {
565
+ let match;
566
+ while ((match = slow.pattern.exec(content)) !== null) {
567
+ const lineNum = content.substring(0, match.index).split("\n").length;
568
+ issues.push({
569
+ file,
570
+ line: lineNum,
571
+ type: "slow-pattern",
572
+ severity: slow.severity,
573
+ message: slow.message,
574
+ });
575
+ }
576
+ }
577
+ }
578
+ const hasErrors = issues.some((i) => i.severity === "error");
579
+ return {
580
+ name: "E2E Performance Patterns",
581
+ passed: !hasErrors || this.warnOnly,
582
+ blocking: false, // Performance is non-blocking
583
+ issues,
584
+ duration: Date.now() - startTime,
585
+ };
586
+ }
587
+ /**
588
+ * Check 6: Test Organization
589
+ */
590
+ async checkTestOrganization() {
591
+ const startTime = Date.now();
592
+ const issues = [];
593
+ const files = await getE2ESpecFiles();
594
+ for (const file of files) {
595
+ const content = fs.readFileSync(file, "utf8");
596
+ // Check for test.describe usage (also accept .skip, .serial, .parallel variants)
597
+ const hasDescribe = /test\.describe(\.(skip|serial|parallel|only|fixme))?\s*\(/.test(content);
598
+ if (!hasDescribe && content.includes("test(")) {
599
+ issues.push({
600
+ file,
601
+ line: 1,
602
+ type: "missing-describe",
603
+ severity: "warning",
604
+ message: "Tests should be organized with test.describe()",
605
+ suggestion: "Wrap related tests in test.describe() blocks",
606
+ });
607
+ }
608
+ // Check for proper imports
609
+ if (!content.includes("from '@playwright/test'") &&
610
+ !content.includes('from "@playwright/test"')) {
611
+ issues.push({
612
+ file,
613
+ line: 1,
614
+ type: "missing-import",
615
+ severity: "warning",
616
+ message: "Missing Playwright test import",
617
+ suggestion: "Add: import { test, expect } from '@playwright/test'",
618
+ });
619
+ }
620
+ }
621
+ return {
622
+ name: "E2E Test Organization",
623
+ passed: true, // Non-blocking
624
+ blocking: false,
625
+ issues,
626
+ duration: Date.now() - startTime,
627
+ };
628
+ }
629
+ /**
630
+ * Check 7: Assertion Quality
631
+ * Detects tests that only use weak assertions (toBeVisible only) without verifying actual content/state
632
+ */
633
+ async checkAssertionQuality() {
634
+ const startTime = Date.now();
635
+ const issues = [];
636
+ const files = await getE2ESpecFiles();
637
+ for (const file of files) {
638
+ const content = fs.readFileSync(file, "utf8");
639
+ // Split into test blocks
640
+ const testBlocks = content.split(/\btest\s*\(/);
641
+ testBlocks.forEach((block, blockIndex) => {
642
+ if (blockIndex === 0)
643
+ return; // Skip before first test
644
+ // Extract test name
645
+ const nameMatch = block.match(/^["'`]([^"'`]+)["'`]/);
646
+ const testName = nameMatch ? nameMatch[1] : `test #${blockIndex}`;
647
+ // Get test body (up to closing of test)
648
+ const testBody = block.substring(0, Math.min(block.length, 2000));
649
+ // Count assertion types
650
+ const strongAssertions = ASSERTION_QUALITY_PATTERNS.strong.filter((p) => p.test(testBody)).length;
651
+ const weakAssertions = ASSERTION_QUALITY_PATTERNS.weak.filter((p) => p.test(testBody)).length;
652
+ const totalExpects = (testBody.match(/expect\s*\(/g) ?? []).length;
653
+ // Flag tests with only weak assertions
654
+ if (totalExpects > 0 && strongAssertions === 0 && weakAssertions > 0) {
655
+ // Skip display/render tests
656
+ const isDisplayTest = /\b(display|render|show|visible|appear|load)\b/i.test(testName);
657
+ if (!isDisplayTest) {
658
+ issues.push({
659
+ file,
660
+ line: 1,
661
+ type: "weak-assertions-only",
662
+ severity: "warning",
663
+ message: `Test "${testName}" uses only weak assertions (visibility checks)`,
664
+ suggestion: "Add content verification: toHaveText, toContainText, toHaveValue, or toHaveURL",
665
+ });
666
+ }
667
+ }
668
+ });
669
+ }
670
+ return {
671
+ name: "E2E Assertion Quality",
672
+ passed: true, // Non-blocking
673
+ blocking: false,
674
+ issues,
675
+ duration: Date.now() - startTime,
676
+ };
677
+ }
678
+ /**
679
+ * Check 8: Test Isolation
680
+ * Detects patterns that can cause flaky tests due to shared state
681
+ */
682
+ async checkTestIsolation() {
683
+ const startTime = Date.now();
684
+ const issues = [];
685
+ const files = await getE2ESpecFiles();
686
+ for (const file of files) {
687
+ const content = fs.readFileSync(file, "utf8");
688
+ const lines = content.split("\n");
689
+ // Track if we're inside a function/block
690
+ let braceDepth = 0;
691
+ let inDescribeOrTest = false;
692
+ // Check for module-level mutable state
693
+ for (let i = 0; i < lines.length; i++) {
694
+ const line = lines[i] ?? "";
695
+ // Track brace depth to detect module-level vs function-level variables
696
+ const openBraces = (line.match(/\{/g) ?? []).length;
697
+ const closeBraces = (line.match(/\}/g) ?? []).length;
698
+ // Check if entering a describe/test block
699
+ if (/test\.describe\s*\(|test\s*\(/.test(line)) {
700
+ inDescribeOrTest = true;
701
+ }
702
+ braceDepth += openBraces - closeBraces;
703
+ // Only flag module-level let (braceDepth 0 and not yet in test blocks)
704
+ if (braceDepth === 0 && !inDescribeOrTest && i < 50) {
705
+ // Detect: let someVar = ... at module level (not inside function)
706
+ if (/^let\s+\w+\s*=/.test(line.trim()) &&
707
+ !line.includes("readonly") &&
708
+ !line.includes("// isolation-ok")) {
709
+ // Check if this is before any test block
710
+ const remainingContent = lines.slice(i).join("\n");
711
+ if (remainingContent.includes("test(") || remainingContent.includes("test.describe(")) {
712
+ issues.push({
713
+ file,
714
+ line: i + 1,
715
+ type: "mutable-module-state",
716
+ severity: "warning",
717
+ message: "Mutable module-level variable may cause test pollution",
718
+ suggestion: "Use test.beforeEach() to reset state, or use const/readonly, or add // isolation-ok",
719
+ });
720
+ }
721
+ }
722
+ }
723
+ // Detect beforeAll with page access (can cause isolation issues)
724
+ if (/beforeAll\s*\(\s*async/.test(line)) {
725
+ const blockEnd = Math.min(i + 20, lines.length);
726
+ const beforeAllBlock = lines.slice(i, blockEnd).join("\n");
727
+ if (/page\./.test(beforeAllBlock) && !beforeAllBlock.includes("// isolation-ok")) {
728
+ issues.push({
729
+ file,
730
+ line: i + 1,
731
+ type: "beforeAll-page-access",
732
+ severity: "warning",
733
+ message: "Accessing page in beforeAll can cause parallel execution issues",
734
+ suggestion: "Use beforeEach for page setup, or add // isolation-ok comment if intentional",
735
+ });
736
+ }
737
+ }
738
+ }
739
+ }
740
+ return {
741
+ name: "E2E Test Isolation",
742
+ passed: true, // Non-blocking
743
+ blocking: false,
744
+ issues,
745
+ duration: Date.now() - startTime,
746
+ };
747
+ }
748
+ /**
749
+ * Check 9: Selector Stability
750
+ * Detects brittle selectors that can cause flaky tests
751
+ */
752
+ async checkSelectorStability() {
753
+ const startTime = Date.now();
754
+ const issues = [];
755
+ const files = await getE2ESpecFiles();
756
+ const brittlePatterns = [
757
+ {
758
+ pattern: /locator\s*\(\s*['"`]\.[\w-]+['"`]\s*\)/g,
759
+ name: "class-selector",
760
+ message: "Class selectors are brittle",
761
+ },
762
+ {
763
+ pattern: /locator\s*\(\s*['"`]div\s*>\s*div/g,
764
+ name: "nested-div",
765
+ message: "Nested div selectors are very brittle",
766
+ },
767
+ {
768
+ pattern: /locator\s*\(\s*['"`]#(?!root|app|__next)[\w-]+['"`]\s*\)/g,
769
+ name: "id-selector",
770
+ message: "ID selectors can be brittle (prefer data-testid)",
771
+ },
772
+ {
773
+ pattern: /:nth-child\s*\(/g,
774
+ name: "nth-child",
775
+ message: "nth-child selectors break when order changes",
776
+ },
777
+ {
778
+ pattern: /\[class\*?=/g,
779
+ name: "class-attribute",
780
+ message: "Class attribute selectors are brittle",
781
+ },
782
+ ];
783
+ for (const file of files) {
784
+ const content = fs.readFileSync(file, "utf8");
785
+ const lines = content.split("\n");
786
+ for (const { pattern, name, message } of brittlePatterns) {
787
+ let match;
788
+ const regex = new RegExp(pattern.source, pattern.flags);
789
+ while ((match = regex.exec(content)) !== null) {
790
+ const lineNum = content.substring(0, match.index).split("\n").length;
791
+ // Allow suppression with comment on same line or up to 3 lines before
792
+ const lineIndex = lineNum - 1;
793
+ const contextStart = Math.max(0, lineIndex - 3);
794
+ const contextEnd = Math.min(lineIndex + 1, lines.length);
795
+ const context = lines.slice(contextStart, contextEnd).join("\n");
796
+ if (context.includes("selector-ok") || context.includes("e2e-allow")) {
797
+ continue;
798
+ }
799
+ issues.push({
800
+ file,
801
+ line: lineNum,
802
+ type: name,
803
+ severity: "info",
804
+ message,
805
+ suggestion: "Use getByRole, getByLabel, getByTestId, or getByText instead",
806
+ });
807
+ }
808
+ }
809
+ }
810
+ return {
811
+ name: "E2E Selector Stability",
812
+ passed: true, // Non-blocking (info only)
813
+ blocking: false,
814
+ issues,
815
+ duration: Date.now() - startTime,
816
+ };
817
+ }
818
+ /**
819
+ * Check 10: Critical Route Coverage
820
+ * Ensures critical user paths have E2E test coverage
821
+ */
822
+ async checkCriticalRouteCoverage() {
823
+ const startTime = Date.now();
824
+ const issues = [];
825
+ const files = await getE2ESpecFiles();
826
+ // Build a map of routes tested
827
+ const testedRoutes = new Map();
828
+ for (const file of files) {
829
+ const content = fs.readFileSync(file, "utf8");
830
+ // Find goto() calls - supports both page.goto() and goto(page, url) patterns
831
+ // Pattern 1: page.goto("/route") or page.goto('/route') or page.goto(`/route`)
832
+ // Pattern 2: goto(page, "/route") - custom helper pattern
833
+ const gotoPatterns = [
834
+ /page\.goto\s*\(\s*['"`]([^'"`]+)['"`]/g,
835
+ /goto\s*\(\s*page\s*,\s*['"`]([^'"`]+)['"`]/g,
836
+ /goto\s*\(\s*['"`]([^'"`]+)['"`]/g,
837
+ ];
838
+ for (const pattern of gotoPatterns) {
839
+ const gotoMatches = Array.from(content.matchAll(pattern));
840
+ for (const match of gotoMatches) {
841
+ const route = match[1] ?? "";
842
+ for (const criticalRoute of CRITICAL_ROUTES_REQUIRING_TESTS) {
843
+ if (route.startsWith(criticalRoute.route) || route.includes(criticalRoute.route)) {
844
+ testedRoutes.set(criticalRoute.route, (testedRoutes.get(criticalRoute.route) ?? 0) + 1);
845
+ }
846
+ }
847
+ }
848
+ }
849
+ }
850
+ // Check which critical routes lack coverage
851
+ for (const { route, minTests, severity } of CRITICAL_ROUTES_REQUIRING_TESTS) {
852
+ const testCount = testedRoutes.get(route) ?? 0;
853
+ if (testCount < minTests) {
854
+ issues.push({
855
+ file: "tests/e2e/",
856
+ line: 0,
857
+ type: "missing-route-coverage",
858
+ severity: severity === "critical" ? "error" : "warning",
859
+ message: `Critical route "${route}" has ${testCount}/${minTests} required E2E tests`,
860
+ suggestion: `Add E2E tests that navigate to and verify ${route} functionality`,
861
+ });
862
+ }
863
+ }
864
+ const hasErrors = issues.some((i) => i.severity === "error");
865
+ return {
866
+ name: "E2E Critical Route Coverage",
867
+ passed: !hasErrors || this.warnOnly,
868
+ blocking: !this.warnOnly,
869
+ issues,
870
+ duration: Date.now() - startTime,
871
+ };
872
+ }
873
+ /**
874
+ * Run all checks
875
+ */
876
+ async runAll() {
877
+ const checks = [];
878
+ checks.push(await this.checkBestPractices());
879
+ checks.push(await this.checkOutcomeValidation());
880
+ checks.push(await this.checkFlakePatterns());
881
+ checks.push(await this.checkTimeoutLimits());
882
+ checks.push(await this.checkPerformancePatterns());
883
+ checks.push(await this.checkTestOrganization());
884
+ checks.push(await this.checkAssertionQuality());
885
+ checks.push(await this.checkTestIsolation());
886
+ checks.push(await this.checkSelectorStability());
887
+ checks.push(await this.checkCriticalRouteCoverage());
888
+ const passed = checks.every((c) => c.passed || !c.blocking);
889
+ const totalDuration = checks.reduce((sum, c) => sum + c.duration, 0);
890
+ const allIssues = checks.flatMap((c) => c.issues);
891
+ const errors = allIssues.filter((i) => i.severity === "error").length;
892
+ const warnings = allIssues.filter((i) => i.severity === "warning").length;
893
+ return {
894
+ module: "E2E Validation",
895
+ passed,
896
+ totalDuration,
897
+ checks,
898
+ summary: {
899
+ total: checks.length,
900
+ passed: checks.filter((c) => c.passed).length,
901
+ failed: checks.filter((c) => !c.passed).length,
902
+ errors,
903
+ warnings,
904
+ },
905
+ };
906
+ }
907
+ }
908
+ exports.E2EValidationModule = E2EValidationModule;
909
+ // CLI
910
+ async function main() {
911
+ const args = process.argv.slice(2);
912
+ const subCommand = args.find((a) => !a.startsWith("--"));
913
+ const warnOnly = args.includes("--warn");
914
+ const verbose = args.includes("--verbose");
915
+ console.log(`\n${console_chars_1.emoji.search} E2E Validation Preflight (Consolidated)\n`);
916
+ console.log((0, console_chars_1.createDivider)(70, "heavy"));
917
+ const module = new E2EValidationModule({ verbose, warnOnly });
918
+ let result;
919
+ switch (subCommand) {
920
+ case "best-practices":
921
+ result = await module.checkBestPractices();
922
+ break;
923
+ case "outcomes":
924
+ result = await module.checkOutcomeValidation();
925
+ break;
926
+ case "flakes":
927
+ result = await module.checkFlakePatterns();
928
+ break;
929
+ case "timeouts":
930
+ result = await module.checkTimeoutLimits();
931
+ break;
932
+ case "performance":
933
+ result = await module.checkPerformancePatterns();
934
+ break;
935
+ case "organization":
936
+ result = await module.checkTestOrganization();
937
+ break;
938
+ case "assertions":
939
+ case "assertion-quality":
940
+ result = await module.checkAssertionQuality();
941
+ break;
942
+ case "isolation":
943
+ result = await module.checkTestIsolation();
944
+ break;
945
+ case "selectors":
946
+ case "selector-stability":
947
+ result = await module.checkSelectorStability();
948
+ break;
949
+ case "coverage":
950
+ case "route-coverage":
951
+ result = await module.checkCriticalRouteCoverage();
952
+ break;
953
+ default:
954
+ result = await module.runAll();
955
+ }
956
+ // Report results
957
+ if ("checks" in result) {
958
+ // Full module result
959
+ const moduleResult = result;
960
+ for (const check of moduleResult.checks) {
961
+ const status = check.passed ? console_chars_1.emoji.success : check.blocking ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
962
+ console.log(`\n${status} ${check.name} (${check.duration}ms)`);
963
+ if (check.issues.length > 0 && (verbose || !check.passed)) {
964
+ const displayIssues = verbose ? check.issues : check.issues.slice(0, 5);
965
+ for (const issue of displayIssues) {
966
+ const icon = issue.severity === "error" ? console_chars_1.emoji.error : console_chars_1.emoji.warning;
967
+ console.log(` ${icon} ${path.basename(issue.file)}:${issue.line} - ${issue.message}`);
968
+ }
969
+ if (!verbose && check.issues.length > 5) {
970
+ console.log(` ... and ${check.issues.length - 5} more issues`);
971
+ }
972
+ }
973
+ }
974
+ console.log(`\n${(0, console_chars_1.createDivider)(70, "heavy")}`);
975
+ console.log(`${console_chars_1.emoji.chart} Summary: ${moduleResult.summary.passed}/${moduleResult.summary.total} checks passed`);
976
+ console.log(` Errors: ${moduleResult.summary.errors}, Warnings: ${moduleResult.summary.warnings}`);
977
+ console.log(` Duration: ${moduleResult.totalDuration}ms`);
978
+ if (!moduleResult.passed) {
979
+ console.log(`\n${console_chars_1.emoji.error} E2E validation failed\n`);
980
+ process.exit(1);
981
+ }
982
+ else {
983
+ console.log(`\n${console_chars_1.emoji.success} E2E validation passed\n`);
984
+ }
985
+ }
986
+ else {
987
+ // Single check result
988
+ const checkResult = result;
989
+ const status = checkResult.passed ? console_chars_1.emoji.success : console_chars_1.emoji.error;
990
+ console.log(`\n${status} ${checkResult.name} (${checkResult.duration}ms)`);
991
+ console.log(` Issues: ${checkResult.issues.length}`);
992
+ if (!checkResult.passed) {
993
+ process.exit(1);
994
+ }
995
+ }
996
+ }
997
+ main().catch((err) => {
998
+ console.error(`${console_chars_1.emoji.error} E2E validation crashed:`, err);
999
+ process.exit(1);
1000
+ });
1001
+ //# sourceMappingURL=e2e-validation.js.map