@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.
- package/dist/checks/accessibility/accessibility-validation.d.ts.map +1 -1
- package/dist/checks/accessibility/accessibility-validation.js +131 -14
- package/dist/checks/accessibility/accessibility-validation.js.map +1 -1
- package/dist/checks/accessibility/wcag-advanced-validation.d.ts +10 -0
- package/dist/checks/accessibility/wcag-advanced-validation.d.ts.map +1 -0
- package/dist/checks/accessibility/wcag-advanced-validation.js +622 -0
- package/dist/checks/accessibility/wcag-advanced-validation.js.map +1 -0
- package/dist/checks/business/auto-approval-system-validation.d.ts +25 -0
- package/dist/checks/business/auto-approval-system-validation.d.ts.map +1 -0
- package/dist/checks/business/auto-approval-system-validation.js +458 -0
- package/dist/checks/business/auto-approval-system-validation.js.map +1 -0
- package/dist/checks/business/listing-submission-flow-validation.d.ts +21 -0
- package/dist/checks/business/listing-submission-flow-validation.d.ts.map +1 -0
- package/dist/checks/business/listing-submission-flow-validation.js +394 -0
- package/dist/checks/business/listing-submission-flow-validation.js.map +1 -0
- package/dist/checks/business/multi-user-sync-validation.d.ts +21 -0
- package/dist/checks/business/multi-user-sync-validation.d.ts.map +1 -0
- package/dist/checks/business/multi-user-sync-validation.js +383 -0
- package/dist/checks/business/multi-user-sync-validation.js.map +1 -0
- package/dist/checks/consolidated/ui-spacing-standards.js +59 -0
- package/dist/checks/consolidated/ui-spacing-standards.js.map +1 -1
- package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts +38 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.js +368 -0
- package/dist/checks/data-integrity/catalog-image-protection-validation.js.map +1 -0
- package/dist/checks/data-integrity/image-url-validation.d.ts +22 -0
- package/dist/checks/data-integrity/image-url-validation.d.ts.map +1 -0
- package/dist/checks/data-integrity/image-url-validation.js +310 -0
- package/dist/checks/data-integrity/image-url-validation.js.map +1 -0
- package/dist/checks/database/query-performance-validation.d.ts +10 -0
- package/dist/checks/database/query-performance-validation.d.ts.map +1 -0
- package/dist/checks/database/query-performance-validation.js +544 -0
- package/dist/checks/database/query-performance-validation.js.map +1 -0
- package/dist/checks/performance/async-batch-concurrency.d.ts +10 -0
- package/dist/checks/performance/async-batch-concurrency.d.ts.map +1 -0
- package/dist/checks/performance/async-batch-concurrency.js +352 -0
- package/dist/checks/performance/async-batch-concurrency.js.map +1 -0
- package/dist/checks/react/react-patterns-validation.d.ts +10 -0
- package/dist/checks/react/react-patterns-validation.d.ts.map +1 -0
- package/dist/checks/react/react-patterns-validation.js +559 -0
- package/dist/checks/react/react-patterns-validation.js.map +1 -0
- package/dist/checks/security/deprecated-node-apis-validation.d.ts +31 -0
- package/dist/checks/security/deprecated-node-apis-validation.d.ts.map +1 -0
- package/dist/checks/security/deprecated-node-apis-validation.js +324 -0
- package/dist/checks/security/deprecated-node-apis-validation.js.map +1 -0
- package/dist/checks/security/security-headers-validation.d.ts +10 -0
- package/dist/checks/security/security-headers-validation.d.ts.map +1 -0
- package/dist/checks/security/security-headers-validation.js +594 -0
- package/dist/checks/security/security-headers-validation.js.map +1 -0
- package/dist/reporters/github-reporter.d.ts +35 -0
- package/dist/reporters/github-reporter.d.ts.map +1 -0
- package/dist/reporters/github-reporter.js +397 -0
- package/dist/reporters/github-reporter.js.map +1 -0
- package/dist/reporters/html-report.d.ts +12 -0
- package/dist/reporters/html-report.d.ts.map +1 -0
- package/dist/reporters/html-report.js +469 -0
- package/dist/reporters/html-report.js.map +1 -0
- package/dist/reporters/index.d.ts +8 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +18 -0
- package/dist/reporters/index.js.map +1 -0
- 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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"}
|