@empline/preflight 1.1.58 → 1.1.60

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 (62) hide show
  1. package/dist/checks/accessibility/accessibility-validation.d.ts.map +1 -1
  2. package/dist/checks/accessibility/accessibility-validation.js +131 -14
  3. package/dist/checks/accessibility/accessibility-validation.js.map +1 -1
  4. package/dist/checks/accessibility/wcag-advanced-validation.d.ts +10 -0
  5. package/dist/checks/accessibility/wcag-advanced-validation.d.ts.map +1 -0
  6. package/dist/checks/accessibility/wcag-advanced-validation.js +622 -0
  7. package/dist/checks/accessibility/wcag-advanced-validation.js.map +1 -0
  8. package/dist/checks/business/auto-approval-system-validation.d.ts +25 -0
  9. package/dist/checks/business/auto-approval-system-validation.d.ts.map +1 -0
  10. package/dist/checks/business/auto-approval-system-validation.js +458 -0
  11. package/dist/checks/business/auto-approval-system-validation.js.map +1 -0
  12. package/dist/checks/business/listing-submission-flow-validation.d.ts +21 -0
  13. package/dist/checks/business/listing-submission-flow-validation.d.ts.map +1 -0
  14. package/dist/checks/business/listing-submission-flow-validation.js +394 -0
  15. package/dist/checks/business/listing-submission-flow-validation.js.map +1 -0
  16. package/dist/checks/business/multi-user-sync-validation.d.ts +21 -0
  17. package/dist/checks/business/multi-user-sync-validation.d.ts.map +1 -0
  18. package/dist/checks/business/multi-user-sync-validation.js +383 -0
  19. package/dist/checks/business/multi-user-sync-validation.js.map +1 -0
  20. package/dist/checks/consolidated/ui-spacing-standards.js +59 -0
  21. package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -1
  22. package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts +38 -0
  23. package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts.map +1 -0
  24. package/dist/checks/data-integrity/catalog-image-protection-validation.js +368 -0
  25. package/dist/checks/data-integrity/catalog-image-protection-validation.js.map +1 -0
  26. package/dist/checks/data-integrity/image-url-validation.d.ts +22 -0
  27. package/dist/checks/data-integrity/image-url-validation.d.ts.map +1 -0
  28. package/dist/checks/data-integrity/image-url-validation.js +310 -0
  29. package/dist/checks/data-integrity/image-url-validation.js.map +1 -0
  30. package/dist/checks/database/query-performance-validation.d.ts +10 -0
  31. package/dist/checks/database/query-performance-validation.d.ts.map +1 -0
  32. package/dist/checks/database/query-performance-validation.js +544 -0
  33. package/dist/checks/database/query-performance-validation.js.map +1 -0
  34. package/dist/checks/performance/async-batch-concurrency.d.ts +10 -0
  35. package/dist/checks/performance/async-batch-concurrency.d.ts.map +1 -0
  36. package/dist/checks/performance/async-batch-concurrency.js +352 -0
  37. package/dist/checks/performance/async-batch-concurrency.js.map +1 -0
  38. package/dist/checks/react/react-patterns-validation.d.ts +10 -0
  39. package/dist/checks/react/react-patterns-validation.d.ts.map +1 -0
  40. package/dist/checks/react/react-patterns-validation.js +559 -0
  41. package/dist/checks/react/react-patterns-validation.js.map +1 -0
  42. package/dist/checks/security/deprecated-node-apis-validation.d.ts +31 -0
  43. package/dist/checks/security/deprecated-node-apis-validation.d.ts.map +1 -0
  44. package/dist/checks/security/deprecated-node-apis-validation.js +324 -0
  45. package/dist/checks/security/deprecated-node-apis-validation.js.map +1 -0
  46. package/dist/checks/security/security-headers-validation.d.ts +10 -0
  47. package/dist/checks/security/security-headers-validation.d.ts.map +1 -0
  48. package/dist/checks/security/security-headers-validation.js +594 -0
  49. package/dist/checks/security/security-headers-validation.js.map +1 -0
  50. package/dist/reporters/github-reporter.d.ts +35 -0
  51. package/dist/reporters/github-reporter.d.ts.map +1 -0
  52. package/dist/reporters/github-reporter.js +397 -0
  53. package/dist/reporters/github-reporter.js.map +1 -0
  54. package/dist/reporters/html-report.d.ts +12 -0
  55. package/dist/reporters/html-report.d.ts.map +1 -0
  56. package/dist/reporters/html-report.js +469 -0
  57. package/dist/reporters/html-report.js.map +1 -0
  58. package/dist/reporters/index.d.ts +8 -0
  59. package/dist/reporters/index.d.ts.map +1 -0
  60. package/dist/reporters/index.js +18 -0
  61. package/dist/reporters/index.js.map +1 -0
  62. package/package.json +1 -1
@@ -0,0 +1,622 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.tags = exports.blocking = exports.category = exports.description = exports.name = exports.id = void 0;
38
+ exports.run = run;
39
+ /**
40
+ * WCAG Advanced Validation Preflight (BLOCKING)
41
+ *
42
+ * Additional WCAG 2.1 AA accessibility checks beyond basic validation:
43
+ *
44
+ * 1. Landmark Structure:
45
+ * - Pages have main landmark
46
+ * - Navigation landmarks present
47
+ * - No duplicate main landmarks
48
+ *
49
+ * 2. Skip Links:
50
+ * - Skip to main content link exists
51
+ * - Skip link is first focusable element
52
+ *
53
+ * 3. Language Attributes:
54
+ * - HTML lang attribute present
55
+ * - Lang attribute has valid value
56
+ *
57
+ * 4. Focus Management:
58
+ * - No tabindex > 0 (disrupts natural tab order)
59
+ * - Focusable elements not hidden
60
+ *
61
+ * 5. Motion & Animation:
62
+ * - Animations respect prefers-reduced-motion
63
+ * - Auto-playing media has controls
64
+ *
65
+ * 6. Tables:
66
+ * - Data tables have headers
67
+ * - Tables have captions or aria-label
68
+ *
69
+ * 7. Color & Contrast:
70
+ * - Color not sole means of conveying info
71
+ * - Focus indicators present
72
+ */
73
+ const fs = __importStar(require("node:fs"));
74
+ const path = __importStar(require("node:path"));
75
+ const glob_1 = require("glob");
76
+ const console_chars_1 = require("../../utils/console-chars");
77
+ exports.id = "accessibility/wcag-advanced-validation";
78
+ exports.name = "WCAG Advanced Validation";
79
+ exports.description = "Advanced WCAG 2.1 AA accessibility checks (landmarks, skip links, focus, motion)";
80
+ exports.category = "accessibility";
81
+ exports.blocking = true;
82
+ exports.tags = ["accessibility", "a11y", "wcag", "landmarks", "focus", "motion"];
83
+ function getLineNumber(content, index) {
84
+ return content.substring(0, index).split("\n").length;
85
+ }
86
+ async function checkLandmarkStructure() {
87
+ const issues = [];
88
+ // Check layout files for landmark structure
89
+ const layoutFiles = await (0, glob_1.glob)([
90
+ "app/layout.tsx",
91
+ "app/**/layout.tsx",
92
+ "components/**/Layout.tsx",
93
+ "components/**/layout.tsx",
94
+ ], {
95
+ cwd: process.cwd(),
96
+ absolute: true,
97
+ });
98
+ for (const file of layoutFiles) {
99
+ if (!fs.existsSync(file))
100
+ continue;
101
+ const content = fs.readFileSync(file, "utf-8");
102
+ const relativePath = path.relative(process.cwd(), file);
103
+ // Check for main landmark
104
+ const hasMain = /<main\s|role\s*=\s*["']main["']/i.test(content);
105
+ if (!hasMain && relativePath === "app/layout.tsx") {
106
+ issues.push({
107
+ rule: "landmark-main",
108
+ message: "Root layout missing <main> landmark",
109
+ file: relativePath,
110
+ severity: "warning",
111
+ suggestion: "Add <main> element to wrap primary content",
112
+ wcagCriterion: "1.3.1",
113
+ });
114
+ }
115
+ // Check for multiple main landmarks (not in conditional rendering)
116
+ const mainMatches = content.match(/<main\s/gi) || [];
117
+ if (mainMatches.length > 1) {
118
+ // Check if they're in conditional rendering
119
+ const conditionalPattern = /\{[^}]*<main\s/g;
120
+ const conditionalMatches = content.match(conditionalPattern) || [];
121
+ if (conditionalMatches.length < mainMatches.length - 1) {
122
+ issues.push({
123
+ rule: "landmark-main-unique",
124
+ message: "Multiple <main> landmarks found (should be unique)",
125
+ file: relativePath,
126
+ severity: "warning",
127
+ suggestion: "Ensure only one <main> landmark per page",
128
+ wcagCriterion: "1.3.1",
129
+ });
130
+ }
131
+ }
132
+ // Check for navigation landmark
133
+ const hasNav = /<nav\s|role\s*=\s*["']navigation["']/i.test(content);
134
+ if (!hasNav && content.includes("href=")) {
135
+ issues.push({
136
+ rule: "landmark-nav",
137
+ message: "Layout with links should have <nav> landmark",
138
+ file: relativePath,
139
+ severity: "info",
140
+ suggestion: "Wrap navigation links in <nav> element",
141
+ wcagCriterion: "1.3.1",
142
+ });
143
+ }
144
+ // Check for footer/contentinfo
145
+ const hasFooter = /<footer\s|role\s*=\s*["']contentinfo["']/i.test(content);
146
+ if (!hasFooter && relativePath === "app/layout.tsx") {
147
+ issues.push({
148
+ rule: "landmark-footer",
149
+ message: "Root layout missing <footer> landmark",
150
+ file: relativePath,
151
+ severity: "info",
152
+ suggestion: "Add <footer> element for page footer content",
153
+ wcagCriterion: "1.3.1",
154
+ });
155
+ }
156
+ }
157
+ return issues;
158
+ }
159
+ async function checkSkipLinks() {
160
+ const issues = [];
161
+ const layoutFile = path.join(process.cwd(), "app", "layout.tsx");
162
+ if (!fs.existsSync(layoutFile)) {
163
+ return issues;
164
+ }
165
+ const content = fs.readFileSync(layoutFile, "utf-8");
166
+ // Check for skip link patterns
167
+ const hasSkipLink = /skip.*main|skip.*content|skipLink|SkipLink/i.test(content) ||
168
+ /href\s*=\s*["']#main["']|href\s*=\s*["']#content["']/i.test(content);
169
+ if (!hasSkipLink) {
170
+ issues.push({
171
+ rule: "skip-link",
172
+ message: "Root layout missing skip to main content link",
173
+ file: "app/layout.tsx",
174
+ severity: "warning",
175
+ suggestion: "Add skip link as first focusable element: <a href=\"#main\" className=\"sr-only focus:not-sr-only\">Skip to main content</a>",
176
+ wcagCriterion: "2.4.1",
177
+ });
178
+ }
179
+ return issues;
180
+ }
181
+ async function checkLanguageAttribute() {
182
+ const issues = [];
183
+ const layoutFile = path.join(process.cwd(), "app", "layout.tsx");
184
+ if (!fs.existsSync(layoutFile)) {
185
+ return issues;
186
+ }
187
+ const content = fs.readFileSync(layoutFile, "utf-8");
188
+ // Check for html lang attribute
189
+ const htmlTagMatch = content.match(/<html\s[^>]*>/i);
190
+ if (htmlTagMatch) {
191
+ const htmlTag = htmlTagMatch[0];
192
+ const hasLang = /\blang\s*=/.test(htmlTag);
193
+ if (!hasLang) {
194
+ issues.push({
195
+ rule: "html-lang",
196
+ message: "<html> element missing lang attribute",
197
+ file: "app/layout.tsx",
198
+ line: getLineNumber(content, htmlTagMatch.index || 0),
199
+ severity: "error",
200
+ suggestion: 'Add lang attribute: <html lang="en">',
201
+ wcagCriterion: "3.1.1",
202
+ });
203
+ }
204
+ else {
205
+ // Check for empty lang
206
+ const langMatch = htmlTag.match(/\blang\s*=\s*["']([^"']*)["']/);
207
+ if (langMatch && !langMatch[1]) {
208
+ issues.push({
209
+ rule: "html-lang-valid",
210
+ message: "lang attribute is empty",
211
+ file: "app/layout.tsx",
212
+ line: getLineNumber(content, htmlTagMatch.index || 0),
213
+ severity: "error",
214
+ suggestion: 'Specify a valid language code: lang="en"',
215
+ wcagCriterion: "3.1.1",
216
+ });
217
+ }
218
+ }
219
+ }
220
+ return issues;
221
+ }
222
+ async function checkFocusManagement() {
223
+ const issues = [];
224
+ const files = await (0, glob_1.glob)([
225
+ "app/**/*.tsx",
226
+ "components/**/*.tsx",
227
+ "src/**/*.tsx",
228
+ ], {
229
+ cwd: process.cwd(),
230
+ ignore: ["**/node_modules/**", "**/*.test.tsx", "**/*.spec.tsx"],
231
+ absolute: true,
232
+ });
233
+ for (const file of files) {
234
+ if (!fs.existsSync(file))
235
+ continue;
236
+ const content = fs.readFileSync(file, "utf-8");
237
+ const relativePath = path.relative(process.cwd(), file);
238
+ // Check for positive tabindex (disrupts natural tab order)
239
+ const positiveTabIndexRegex = /tabIndex\s*=\s*\{?\s*([1-9]\d*)\s*\}?/g;
240
+ let match;
241
+ while ((match = positiveTabIndexRegex.exec(content)) !== null) {
242
+ issues.push({
243
+ rule: "tabindex-no-positive",
244
+ message: `Positive tabIndex (${match[1]}) disrupts natural tab order`,
245
+ file: relativePath,
246
+ line: getLineNumber(content, match.index),
247
+ severity: "error",
248
+ suggestion: "Use tabIndex={0} for focusable or tabIndex={-1} for programmatic focus only",
249
+ wcagCriterion: "2.4.3",
250
+ });
251
+ }
252
+ // Check for outline:none without alternative focus indicator
253
+ // Only in style attributes (CSS files would need separate analysis)
254
+ const outlineNoneRegex = /style\s*=\s*\{[^}]*outline\s*:\s*["']?none["']?/gi;
255
+ while ((match = outlineNoneRegex.exec(content)) !== null) {
256
+ // Check if there's a focus-visible or ring class nearby
257
+ const surroundingCode = content.substring(Math.max(0, match.index - 200), Math.min(content.length, match.index + 300));
258
+ const hasFocusIndicator = /focus-visible|focus:|ring-|focusRing|focusOutline/i.test(surroundingCode);
259
+ if (!hasFocusIndicator) {
260
+ issues.push({
261
+ rule: "focus-indicator",
262
+ message: "outline:none removes focus indicator",
263
+ file: relativePath,
264
+ line: getLineNumber(content, match.index),
265
+ severity: "warning",
266
+ suggestion: "Provide alternative focus indicator or use focus-visible",
267
+ wcagCriterion: "2.4.7",
268
+ });
269
+ }
270
+ }
271
+ }
272
+ return issues;
273
+ }
274
+ async function checkMotionPreferences() {
275
+ const issues = [];
276
+ const files = await (0, glob_1.glob)([
277
+ "app/**/*.tsx",
278
+ "components/**/*.tsx",
279
+ "src/**/*.tsx",
280
+ ], {
281
+ cwd: process.cwd(),
282
+ ignore: ["**/node_modules/**", "**/*.test.tsx", "**/*.spec.tsx"],
283
+ absolute: true,
284
+ });
285
+ let hasAnimations = false;
286
+ let hasMotionPreference = false;
287
+ for (const file of files) {
288
+ if (!fs.existsSync(file))
289
+ continue;
290
+ const content = fs.readFileSync(file, "utf-8");
291
+ // Check for animations
292
+ if (/animate-|transition-|framer-motion|react-spring|@keyframes/i.test(content)) {
293
+ hasAnimations = true;
294
+ }
295
+ // Check for motion preference handling
296
+ if (/prefers-reduced-motion|useReducedMotion|prefersReducedMotion/i.test(content)) {
297
+ hasMotionPreference = true;
298
+ }
299
+ // Check for autoplay video without controls
300
+ const autoplayVideoRegex = /<video[^>]*autoPlay[^>]*>/gi;
301
+ let match;
302
+ while ((match = autoplayVideoRegex.exec(content)) !== null) {
303
+ const videoTag = match[0];
304
+ if (!/\bcontrols\b/.test(videoTag) && !/\bmuted\b/.test(videoTag)) {
305
+ issues.push({
306
+ rule: "autoplay-controls",
307
+ message: "Autoplay video should have controls or be muted",
308
+ file: path.relative(process.cwd(), file),
309
+ line: getLineNumber(content, match.index),
310
+ severity: "warning",
311
+ suggestion: "Add controls attribute or muted for decorative video",
312
+ wcagCriterion: "1.4.2",
313
+ });
314
+ }
315
+ }
316
+ }
317
+ // Check CSS/Tailwind config for motion preferences
318
+ const cssFiles = await (0, glob_1.glob)([
319
+ "app/**/*.css",
320
+ "styles/**/*.css",
321
+ "**/*.module.css",
322
+ "tailwind.config.*",
323
+ ], {
324
+ cwd: process.cwd(),
325
+ ignore: ["**/node_modules/**"],
326
+ absolute: true,
327
+ });
328
+ for (const file of cssFiles) {
329
+ if (!fs.existsSync(file))
330
+ continue;
331
+ const content = fs.readFileSync(file, "utf-8");
332
+ if (/prefers-reduced-motion/i.test(content)) {
333
+ hasMotionPreference = true;
334
+ }
335
+ }
336
+ if (hasAnimations && !hasMotionPreference) {
337
+ issues.push({
338
+ rule: "motion-reduced",
339
+ message: "Animations detected but no prefers-reduced-motion handling",
340
+ file: "global",
341
+ severity: "warning",
342
+ suggestion: "Add @media (prefers-reduced-motion: reduce) styles or useReducedMotion hook",
343
+ wcagCriterion: "2.3.3",
344
+ });
345
+ }
346
+ return issues;
347
+ }
348
+ async function checkTableAccessibility() {
349
+ const issues = [];
350
+ const files = await (0, glob_1.glob)([
351
+ "app/**/*.tsx",
352
+ "components/**/*.tsx",
353
+ "src/**/*.tsx",
354
+ ], {
355
+ cwd: process.cwd(),
356
+ ignore: ["**/node_modules/**", "**/*.test.tsx", "**/*.spec.tsx"],
357
+ absolute: true,
358
+ });
359
+ for (const file of files) {
360
+ if (!fs.existsSync(file))
361
+ continue;
362
+ const content = fs.readFileSync(file, "utf-8");
363
+ const relativePath = path.relative(process.cwd(), file);
364
+ // Find table elements
365
+ const tableRegex = /<table\s[^>]*>/gi;
366
+ let match;
367
+ while ((match = tableRegex.exec(content)) !== null) {
368
+ const tableStart = match.index;
369
+ const tableEndMatch = content.indexOf("</table>", tableStart);
370
+ if (tableEndMatch === -1)
371
+ continue;
372
+ const tableContent = content.substring(tableStart, tableEndMatch + 8);
373
+ // Check for caption or aria-label
374
+ const hasCaption = /<caption/i.test(tableContent);
375
+ const hasAriaLabel = /aria-label\s*=/.test(match[0]);
376
+ const hasAriaLabelledby = /aria-labelledby\s*=/.test(match[0]);
377
+ if (!hasCaption && !hasAriaLabel && !hasAriaLabelledby) {
378
+ issues.push({
379
+ rule: "table-caption",
380
+ message: "Data table missing caption or aria-label",
381
+ file: relativePath,
382
+ line: getLineNumber(content, match.index),
383
+ severity: "warning",
384
+ suggestion: "Add <caption> or aria-label to describe table purpose",
385
+ wcagCriterion: "1.3.1",
386
+ });
387
+ }
388
+ // Check for th elements (header cells)
389
+ const hasTh = /<th\s|<th>/i.test(tableContent);
390
+ if (!hasTh) {
391
+ // Check if it's a data table (has multiple rows)
392
+ const rowCount = (tableContent.match(/<tr/gi) || []).length;
393
+ if (rowCount > 1) {
394
+ issues.push({
395
+ rule: "table-headers",
396
+ message: "Data table missing header cells (<th>)",
397
+ file: relativePath,
398
+ line: getLineNumber(content, match.index),
399
+ severity: "warning",
400
+ suggestion: "Use <th> elements for header cells with scope attribute",
401
+ wcagCriterion: "1.3.1",
402
+ });
403
+ }
404
+ }
405
+ else {
406
+ // Check if th has scope
407
+ const thWithoutScope = /<th(?![^>]*\bscope\s*=)[^>]*>/gi;
408
+ let thMatch;
409
+ while ((thMatch = thWithoutScope.exec(tableContent)) !== null) {
410
+ issues.push({
411
+ rule: "table-header-scope",
412
+ message: "Table header missing scope attribute",
413
+ file: relativePath,
414
+ line: getLineNumber(content, tableStart + thMatch.index),
415
+ severity: "info",
416
+ suggestion: 'Add scope="col" or scope="row" to <th> elements',
417
+ wcagCriterion: "1.3.1",
418
+ });
419
+ }
420
+ }
421
+ }
422
+ }
423
+ return issues;
424
+ }
425
+ async function checkColorIndependence() {
426
+ const issues = [];
427
+ const files = await (0, glob_1.glob)([
428
+ "app/**/*.tsx",
429
+ "components/**/*.tsx",
430
+ "src/**/*.tsx",
431
+ ], {
432
+ cwd: process.cwd(),
433
+ ignore: ["**/node_modules/**", "**/*.test.tsx", "**/*.spec.tsx"],
434
+ absolute: true,
435
+ });
436
+ for (const file of files) {
437
+ if (!fs.existsSync(file))
438
+ continue;
439
+ const content = fs.readFileSync(file, "utf-8");
440
+ const relativePath = path.relative(process.cwd(), file);
441
+ // Check for status indicators that might rely solely on color
442
+ // Look for patterns like "text-red" without accompanying icon or text
443
+ const colorOnlyPatterns = [
444
+ /className\s*=\s*["'][^"']*text-(red|green|yellow|orange)-[^"']*["'][^>]*>\s*\{[^}]*status/gi,
445
+ /className\s*=\s*["'][^"']*bg-(red|green|yellow|orange)-[^"']*["'][^>]*>\s*<\/(?:span|div)>/gi,
446
+ ];
447
+ for (const pattern of colorOnlyPatterns) {
448
+ let match;
449
+ while ((match = pattern.exec(content)) !== null) {
450
+ // Check if there's an icon or text nearby
451
+ const surroundingCode = content.substring(Math.max(0, match.index - 100), Math.min(content.length, match.index + match[0].length + 100));
452
+ const hasIcon = /Icon|<svg|aria-label|title=/.test(surroundingCode);
453
+ const hasText = />\w+</.test(surroundingCode);
454
+ if (!hasIcon && !hasText) {
455
+ issues.push({
456
+ rule: "color-not-sole-indicator",
457
+ message: "Status may rely solely on color",
458
+ file: relativePath,
459
+ line: getLineNumber(content, match.index),
460
+ severity: "info",
461
+ suggestion: "Add icon, text, or pattern to supplement color indication",
462
+ wcagCriterion: "1.4.1",
463
+ });
464
+ }
465
+ }
466
+ }
467
+ }
468
+ return issues;
469
+ }
470
+ async function checkAutocomplete() {
471
+ const issues = [];
472
+ const files = await (0, glob_1.glob)([
473
+ "app/**/*.tsx",
474
+ "components/**/*.tsx",
475
+ "src/**/*.tsx",
476
+ ], {
477
+ cwd: process.cwd(),
478
+ ignore: ["**/node_modules/**", "**/*.test.tsx", "**/*.spec.tsx"],
479
+ absolute: true,
480
+ });
481
+ // Common input types that should have autocomplete
482
+ const autocompleteInputs = {
483
+ email: ["email"],
484
+ password: ["current-password", "new-password"],
485
+ name: ["name", "given-name", "family-name"],
486
+ tel: ["tel"],
487
+ address: ["street-address", "address-line1"],
488
+ postal: ["postal-code"],
489
+ credit: ["cc-number", "cc-name", "cc-exp"],
490
+ };
491
+ for (const file of files) {
492
+ if (!fs.existsSync(file))
493
+ continue;
494
+ const content = fs.readFileSync(file, "utf-8");
495
+ const relativePath = path.relative(process.cwd(), file);
496
+ // Find inputs that should have autocomplete
497
+ const inputRegex = /<input\s[^>]*>/gi;
498
+ let match;
499
+ while ((match = inputRegex.exec(content)) !== null) {
500
+ const inputTag = match[0];
501
+ // Skip if already has autocomplete
502
+ if (/autoComplete\s*=/.test(inputTag))
503
+ continue;
504
+ // Check input type and name for common patterns
505
+ const typeMatch = inputTag.match(/type\s*=\s*["']([^"']+)["']/i);
506
+ const nameMatch = inputTag.match(/name\s*=\s*["']([^"']+)["']/i);
507
+ const type = typeMatch?.[1]?.toLowerCase() || "text";
508
+ const name = nameMatch?.[1]?.toLowerCase() || "";
509
+ // Check if this is a personal data input
510
+ for (const [keyword, suggestions] of Object.entries(autocompleteInputs)) {
511
+ if (type.includes(keyword) || name.includes(keyword)) {
512
+ issues.push({
513
+ rule: "autocomplete-valid",
514
+ message: `Input for ${keyword} data missing autocomplete attribute`,
515
+ file: relativePath,
516
+ line: getLineNumber(content, match.index),
517
+ severity: "info",
518
+ suggestion: `Add autoComplete="${suggestions[0]}" for better UX`,
519
+ wcagCriterion: "1.3.5",
520
+ });
521
+ break;
522
+ }
523
+ }
524
+ }
525
+ }
526
+ return issues;
527
+ }
528
+ async function run() {
529
+ const startTime = Date.now();
530
+ const allIssues = [];
531
+ // Run all WCAG checks
532
+ allIssues.push(...await checkLandmarkStructure());
533
+ allIssues.push(...await checkSkipLinks());
534
+ allIssues.push(...await checkLanguageAttribute());
535
+ allIssues.push(...await checkFocusManagement());
536
+ allIssues.push(...await checkMotionPreferences());
537
+ allIssues.push(...await checkTableAccessibility());
538
+ allIssues.push(...await checkColorIndependence());
539
+ allIssues.push(...await checkAutocomplete());
540
+ // Convert to findings
541
+ const findings = allIssues.map(issue => ({
542
+ level: issue.severity,
543
+ message: issue.message + (issue.wcagCriterion ? ` [WCAG ${issue.wcagCriterion}]` : ""),
544
+ file: issue.file,
545
+ startLine: issue.line,
546
+ ruleId: issue.rule,
547
+ suggestion: issue.suggestion,
548
+ }));
549
+ const errors = findings.filter(f => f.level === "error");
550
+ const warnings = findings.filter(f => f.level === "warning");
551
+ const infos = findings.filter(f => f.level === "info");
552
+ return {
553
+ passed: errors.length === 0,
554
+ findings,
555
+ duration: Date.now() - startTime,
556
+ metadata: {
557
+ errors: errors.length,
558
+ warnings: warnings.length,
559
+ infos: infos.length,
560
+ wcagCriteria: [...new Set(allIssues.map(i => i.wcagCriterion).filter(Boolean))],
561
+ },
562
+ };
563
+ }
564
+ async function main() {
565
+ console.log(`\n${console_chars_1.emoji.accessibility} WCAG ADVANCED VALIDATION`);
566
+ console.log((0, console_chars_1.createDivider)(65, "heavy"));
567
+ const result = await run();
568
+ const { errors, warnings, infos, wcagCriteria } = result.metadata || {};
569
+ console.log(`\n${console_chars_1.emoji.search} Checking WCAG 2.1 AA compliance...`);
570
+ console.log(` WCAG criteria checked: ${(wcagCriteria || []).join(", ")}`);
571
+ console.log(`\n${console_chars_1.emoji.chart} Summary:`);
572
+ console.log(` Errors: ${errors}`);
573
+ console.log(` Warnings: ${warnings}`);
574
+ console.log(` Info: ${infos}`);
575
+ if (result.passed && warnings === 0) {
576
+ console.log(`\n${console_chars_1.emoji.success} WCAG ADVANCED VALIDATION PASSED`);
577
+ process.exit(0);
578
+ }
579
+ // Print findings
580
+ const errorFindings = result.findings.filter(f => f.level === "error");
581
+ if (errorFindings.length > 0) {
582
+ console.log(`\n${console_chars_1.emoji.error} Errors (blocking):`);
583
+ for (const finding of errorFindings) {
584
+ console.log(`\n ${finding.file}${finding.startLine ? `:${finding.startLine}` : ""}`);
585
+ console.log(` ${finding.message}`);
586
+ if (finding.suggestion) {
587
+ console.log(` ${console_chars_1.emoji.hint} ${finding.suggestion}`);
588
+ }
589
+ }
590
+ }
591
+ const warningFindings = result.findings.filter(f => f.level === "warning");
592
+ if (warningFindings.length > 0) {
593
+ console.log(`\n${console_chars_1.emoji.warning} Warnings:`);
594
+ for (const finding of warningFindings.slice(0, 10)) {
595
+ console.log(`\n ${finding.file}${finding.startLine ? `:${finding.startLine}` : ""}`);
596
+ console.log(` ${finding.message}`);
597
+ }
598
+ if (warningFindings.length > 10) {
599
+ console.log(`\n ... and ${warningFindings.length - 10} more warnings`);
600
+ }
601
+ }
602
+ console.log(`\n${console_chars_1.emoji.info} WCAG 2.1 AA Requirements:`);
603
+ console.log(` - Landmarks: main, nav, footer structure`);
604
+ console.log(` - Skip links for keyboard navigation`);
605
+ console.log(` - HTML lang attribute`);
606
+ console.log(` - No positive tabIndex values`);
607
+ console.log(` - Motion preferences respected`);
608
+ console.log(` - Data tables properly structured`);
609
+ if (!result.passed) {
610
+ console.log(`\n${console_chars_1.emoji.error} WCAG ADVANCED VALIDATION FAILED`);
611
+ process.exit(1);
612
+ }
613
+ console.log(`\n${console_chars_1.emoji.success} WCAG ADVANCED VALIDATION PASSED`);
614
+ process.exit(0);
615
+ }
616
+ if (require.main === module) {
617
+ main().catch((err) => {
618
+ console.error(`${console_chars_1.emoji.error} Preflight failed:`, err);
619
+ process.exit(1);
620
+ });
621
+ }
622
+ //# sourceMappingURL=wcag-advanced-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wcag-advanced-validation.js","sourceRoot":"","sources":["../../../src/checks/accessibility/wcag-advanced-validation.ts"],"names":[],"mappings":"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"}