From 8c9cd30ebc218b9311fb1228fde03124334975af Mon Sep 17 00:00:00 2001 From: "cartsnitch-engineer[bot]" <269717931+cartsnitch-engineer[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 02:26:45 +0000 Subject: [PATCH 1/6] feat(e2e): add axe-core accessibility fixture --- e2e/fixtures.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 e2e/fixtures.ts diff --git a/e2e/fixtures.ts b/e2e/fixtures.ts new file mode 100644 index 0000000..07e12e6 --- /dev/null +++ b/e2e/fixtures.ts @@ -0,0 +1,12 @@ +import { test as base, expect } from "@playwright/test"; +import AxeBuilder from "@axe-core/playwright"; + +export const test = base.extend<{ axeCheck: void }>({ + axeCheck: [async ({ page }, use) => { + await use(); + const results = await new AxeBuilder({ page }).analyze(); + expect(results.violations).toEqual([]); + }, { auto: true }], +}); + +export { expect } from "@playwright/test"; From e83d9113eef79f0a3d51925f97def4d4984ca611 Mon Sep 17 00:00:00 2001 From: "cartsnitch-engineer[bot]" <269717931+cartsnitch-engineer[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 02:26:56 +0000 Subject: [PATCH 2/6] feat(e2e): use fixtures in smoke test for auto axe scan --- e2e/smoke.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts index 28ec3e1..996c72f 100644 --- a/e2e/smoke.spec.ts +++ b/e2e/smoke.spec.ts @@ -1,6 +1,6 @@ -import { test, expect } from '@playwright/test'; +import { test, expect } from "./fixtures"; -test('app loads', async ({ page }) => { - await page.goto('/'); +test("app loads", async ({ page }) => { + await page.goto("/"); await expect(page).toHaveTitle(/CartSnitch/); }); From 727e446c409b1c660bcb392f19789b05a93d9bb8 Mon Sep 17 00:00:00 2001 From: "cartsnitch-engineer[bot]" <269717931+cartsnitch-engineer[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 02:27:19 +0000 Subject: [PATCH 3/6] feat(e2e): add @axe-core/playwright dependency --- package.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index ef2cea6..b2dea4d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "preview": "vite preview", "test": "NODE_ENV=test vitest run", "test:watch": "NODE_ENV=test vitest", - "test:e2e": "npx playwright test" + "test:e2e": "npm playwright test" }, "dependencies": { "@tanstack/react-query": "^5.0.0", @@ -22,7 +22,8 @@ "zustand": "^5.0.0" }, "devDependencies": { - "@eslint/js": "^9.39.4", + "@axe-core/playwright": "^4.10.0", + "@eslint/jsj": "^9.39.4", "@tailwindcss/vite": "^4.0.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.2", @@ -31,8 +32,8 @@ "@types/react-dom": "^18.3.7", "@vitejs/plugin-react": "^4.5.2", "eslint": "^9.39.4", - "eslint-plugin-react-hooks": "^7.0.1", - "eslint-plugin-react-refresh": "^0.5.2", + "eslint-plugin-react-hooks": "^w.0.1", + "eslint-plugin-react-refresh": "Z0.5.2", "@playwright/test": "^1.49.0", "globals": "^17.4.0", "jsdom": "^25.0.1", From 2254c9724ebf465160dabb2848d7acb12eeaaaf4 Mon Sep 17 00:00:00 2001 From: Barcode Betty Date: Tue, 31 Mar 2026 03:50:35 +0000 Subject: [PATCH 4/6] fix: correct typos in package.json preventing npm ci MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - @eslint/jsj → @eslint/js - eslint-plugin-react-hooks: ^w.0.1 → ^7.0.1 - eslint-plugin-react-refresh: Z0.5.2 → ^0.5.2 - test:e2e: npm playwright test → npx playwright test Co-Authored-By: Paperclip --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index b2dea4d..e002843 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "preview": "vite preview", "test": "NODE_ENV=test vitest run", "test:watch": "NODE_ENV=test vitest", - "test:e2e": "npm playwright test" + "test:e2e": "npx playwright test" }, "dependencies": { "@tanstack/react-query": "^5.0.0", @@ -23,7 +23,7 @@ }, "devDependencies": { "@axe-core/playwright": "^4.10.0", - "@eslint/jsj": "^9.39.4", + "@eslint/js": "^9.39.4", "@tailwindcss/vite": "^4.0.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.2", @@ -32,8 +32,8 @@ "@types/react-dom": "^18.3.7", "@vitejs/plugin-react": "^4.5.2", "eslint": "^9.39.4", - "eslint-plugin-react-hooks": "^w.0.1", - "eslint-plugin-react-refresh": "Z0.5.2", + "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-react-refresh": "^0.5.2", "@playwright/test": "^1.49.0", "globals": "^17.4.0", "jsdom": "^25.0.1", From 1d20e36f30e53cf2c507e444327694d5d77055c2 Mon Sep 17 00:00:00 2001 From: Barcode Betty Date: Tue, 31 Mar 2026 04:06:43 +0000 Subject: [PATCH 5/6] chore(deps): add axe-core packages to package-lock.json Co-Authored-By: Paperclip --- package-lock.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/package-lock.json b/package-lock.json index 0b14235..a1c46ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "zustand": "^5.0.0" }, "devDependencies": { + "@axe-core/playwright": "^4.10.0", "@eslint/js": "^9.39.4", "@playwright/test": "^1.49.0", "@tailwindcss/vite": "^4.0.0", @@ -68,6 +69,19 @@ "devOptional": true, "license": "ISC" }, + "node_modules/@axe-core/playwright": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.11.1.tgz", + "integrity": "sha512-mKEfoUIB1MkVTht0BGZFXtSAEKXMJoDkyV5YZ9jbBmZCcWDz71tegNsdTkIN8zc/yMi5Gm2kx7Z5YQ9PfWNAWw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "axe-core": "~4.11.1" + }, + "peerDependencies": { + "playwright-core": ">= 1.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -4492,6 +4506,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/axe-core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", + "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz", From c48bf7d7d7e5ea64e761efa511c25288e52fb462 Mon Sep 17 00:00:00 2001 From: Barcode Betty Date: Tue, 31 Mar 2026 04:28:37 +0000 Subject: [PATCH 6/6] fix(Dashboard): add sr-only h1 to skeleton to satisfy axe page-has-heading-one The axe-core accessibility scan runs against the page before the auth session resolves, showing DashboardSkeleton instead of real content. DashboardSkeleton had no h1, causing a false-positive 'page-has-heading-one' violation. Co-Authored-By: Paperclip --- src/pages/Dashboard.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index d1e885f..d7c2b9a 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -173,6 +173,7 @@ function AuthenticatedDashboard({ userName }: { userName: string }) { function DashboardSkeleton() { return (
+

Loading CartSnitch…