diff --git a/src/bundlewatch.config.json b/src/bundlewatch.config.json new file mode 100644 index 00000000..89eadf29 --- /dev/null +++ b/src/bundlewatch.config.json @@ -0,0 +1,18 @@ +{ + "files": [ + { + "path": "frontend/dist/assets/*.js", + "maxSize": "250 kB", + "compression": "gzip" + }, + { + "path": "frontend/dist/assets/*.css", + "maxSize": "50 kB", + "compression": "gzip" + } + ], + "ci": { + "trackBranches": ["main"], + "githubAccessor": "comment" + } +} \ No newline at end of file diff --git a/src/lighthouserc.js b/src/lighthouserc.js new file mode 100644 index 00000000..1b78d64f --- /dev/null +++ b/src/lighthouserc.js @@ -0,0 +1,19 @@ +module.exports = { + ci: { + collect: { + numberOfRuns: 3, + staticDistDir: './frontend/dist', // Points directly to the built bundle output + }, + assert: { + assertions: { + 'categories:performance': ['error', { minScore: 0.90 }], + // Task Requirement: Enforce strict performance budgets for LCP and CLS + 'largest-contentful-paint': ['error', { maxNumericValue: 2500 }], // LCP <= 2.5s (Good threshold) + 'cumulative-layout-shift': ['error', { maxNumericValue: 0.1 }], // CLS <= 0.1 (Good threshold) + }, + }, + upload: { + target: 'temporary-public-storage', // Uploads auditable HTML reports for triage + }, + }, +}; \ No newline at end of file diff --git a/tests/accessibility.spec.ts b/tests/accessibility.spec.ts new file mode 100644 index 00000000..79b68cca --- /dev/null +++ b/tests/accessibility.spec.ts @@ -0,0 +1,17 @@ +import { test, expect } from '@playwright/test'; +import AxeBuilder from '@axe-core/playwright'; + +test.describe('Accessibility Quality Gate Matrix', () => { + test('should pass standard automated a11y checking algorithms without strict violations', async ({ page }) => { + // Navigate to a critical landing view route + await page.goto('/'); + + // Scan page elements using WCAG 2.1 AA benchmarks + const accessibilityScanResults = await new AxeBuilder({ page }) + .withTags(['wcag2a', 'wcag2aa']) + .analyze(); + + // Task Requirement: Verify zero violations to avoid regression failures + expect(accessibilityScanResults.violations).toEqual([]); + }); +}); \ No newline at end of file