← ubon
import { Rule } from '../types';
const rule: Rule = {
meta: {
id: 'A11Y001',
category: 'accessibility',
severity: 'medium',
message: 'Image without alt attribute',
fix: 'Add descriptive alt attribute to images',
helpUri: 'https://webaim.org/techniques/alttext/',
impact: 'Screen readers cannot describe images to visually impaired users'
},
impl: {
detect: (content: string, file: string, lines: string[]) => {
const results: import('../types').DetectionResult[] = [];
lines.forEach((line, index) => {
// Match <img> tags without alt attribute
const imgMatch = /<img\s+[^>]*>/gi.exec(line);
if (imgMatch && !/(^|\s)alt\s*=/i.test(imgMatch[0])) {
results.push({
line: index + 1,
match: imgMatch[0],
confidence: 0.9,
fixEdits: [{
file,
startLine: index + 1,
startColumn: 1,
endLine: index + 1,
endColumn: line.length,
replacement: line.replace(/<img(\s+[^>]*)>/gi, '<img$1 alt="">')
}]
});
}
});
return results;
},
fileTypes: ['jsx', 'tsx', 'svelte', 'astro', 'html']
}
};
export default rule;