From a09757852821b03da47d92ae3d50d5c76a98ffa7 Mon Sep 17 00:00:00 2001 From: Krishna Date: Tue, 7 Jul 2026 21:28:35 +0530 Subject: [PATCH 1/3] fix(inventory): preserve form state in AddItemModal by visually hiding inactive steps --- .../inventory-management/add-item-modal.tsx | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/app/blocks/inventory-management/add-item-modal.tsx b/app/blocks/inventory-management/add-item-modal.tsx index f1217bf..5035b7b 100644 --- a/app/blocks/inventory-management/add-item-modal.tsx +++ b/app/blocks/inventory-management/add-item-modal.tsx @@ -25,8 +25,7 @@ export function AddItemModal({ className, onClose, item }: Props) { {item && }
- {step === 0 && ( - <> +
@@ -34,10 +33,8 @@ export function AddItemModal({ className, onClose, item }: Props) {
- - )} - {step === 1 && ( - <> +
+
@@ -47,17 +44,14 @@ export function AddItemModal({ className, onClose, item }: Props) {
- - )} - {step === 2 && ( - <> +
+
- - )} +
{step > 0 ? ( From d436c42379d48ab00efe209bc5bc4ed2bf3728ca Mon Sep 17 00:00:00 2001 From: Krishna Date: Tue, 7 Jul 2026 21:28:46 +0530 Subject: [PATCH 2/3] test(e2e): setup playwright and fix strict mode violation in smoke test --- .gitignore | 6 ++ e2e/auth.setup.ts | 23 +++++++ e2e/inventory.spec.ts | 43 +++++++++++++ e2e/smoke.spec.ts | 11 ++++ package-lock.json | 120 +++++++++++++++++++++++++----------- package.json | 2 + playwright.config.ts | 35 +++++++++++ scripts/create-demo-user.ts | 34 +++++++--- vite.config.ts | 3 + 9 files changed, 231 insertions(+), 46 deletions(-) create mode 100644 e2e/auth.setup.ts create mode 100644 e2e/inventory.spec.ts create mode 100644 e2e/smoke.spec.ts create mode 100644 playwright.config.ts diff --git a/.gitignore b/.gitignore index 454d4a1..094f85d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,9 @@ prisma/*.db npm-debug.log* yarn-debug.log* yarn-error.log* + +# Playwright +/playwright/.auth/ +/playwright-report/ +/test-results/ +.env.test diff --git a/e2e/auth.setup.ts b/e2e/auth.setup.ts new file mode 100644 index 0000000..81c0855 --- /dev/null +++ b/e2e/auth.setup.ts @@ -0,0 +1,23 @@ +import { test as setup, expect } from '@playwright/test'; +const authFile = 'playwright/.auth/user.json'; + +setup('authenticate', async ({ page }) => { + // Use environment variables for credentials, falling back to the demo user for local e2e dev + const username = process.env.E2E_USERNAME || 'demo@fliptrack.app'; + const password = process.env.E2E_PASSWORD || 'password123'; + + await page.goto('/auth/login'); + + // Fill in the login form + // Using generic selectors that should match typical login forms if exact labels are unknown + // But wait, earlier I saw the button was 'text=Sign in to your account' + await page.locator('input[name="email"]').fill(username); + await page.locator('input[name="password"]').fill(password); + await page.locator('button', { hasText: /^Sign In$/ }).click(); + + // Wait for navigation to the dashboard + await page.waitForURL('**/app/dashboard*'); + + // Save storage state to a file + await page.context().storageState({ path: authFile }); +}); diff --git a/e2e/inventory.spec.ts b/e2e/inventory.spec.ts new file mode 100644 index 0000000..9560544 --- /dev/null +++ b/e2e/inventory.spec.ts @@ -0,0 +1,43 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Inventory Management', () => { + test('can create a new inventory item', async ({ page }) => { + // Generate a unique item name to avoid collisions with existing data + const uniqueId = Date.now(); + const itemName = `E2E Test Sneaker ${uniqueId}`; + const itemSku = `E2E-${uniqueId}`; + + // Navigate to inventory page + await page.goto('/app/inventory'); + await expect(page.getByRole('heading', { name: 'Inventory' })).toBeVisible(); + + // Open the Add Item modal via the header button + await page.getByRole('button', { name: 'Add Item' }).click(); + + // Verify modal opened — the modal title "Add Inventory Item" should be visible + await expect(page.getByText('Add Inventory Item')).toBeVisible(); + + // ── Step 0: Basic Info ── + // Labels lack for/id pairing, so we target inputs by their name attribute. + await page.locator('input[name="sku"]').fill(itemSku); + await page.locator('input[name="name"]').fill(itemName); + await page.locator('input[name="brand"]').fill('TestBrand'); + await page.locator('input[name="size"]').fill('10'); + await page.getByRole('button', { name: 'Next' }).click(); + + // ── Step 1: Purchase Details ── + await page.locator('input[name="purchasePrice"]').fill('150'); + await page.locator('input[name="purchaseDate"]').fill('2025-01-15'); + await page.getByRole('button', { name: 'Next' }).click(); + + // ── Step 2: Marketplace (optional fields — skip) ── + // Submit the form. On step 2, the submit button reads "Add Item". + await page.getByRole('button', { name: 'Add Item' }).click(); + + // Verify success toast appears (sonner toast) + await expect(page.getByText('Item added successfully')).toBeVisible(); + + // Verify the newly created item appears in the inventory table as a link + await expect(page.getByRole('link', { name: itemName })).toBeVisible(); + }); +}); diff --git a/e2e/smoke.spec.ts b/e2e/smoke.spec.ts new file mode 100644 index 0000000..94ac368 --- /dev/null +++ b/e2e/smoke.spec.ts @@ -0,0 +1,11 @@ +import { test, expect } from '@playwright/test'; + +test('application loads and displays dashboard for authenticated user', async ({ page }) => { + await page.goto('/app/dashboard'); + + // Verify we are not redirected to login + await expect(page).toHaveURL(/.*\/app\/dashboard/); + + // Verify dashboard content is visible + await expect(page.getByRole('heading', { name: 'Dashboard', exact: true })).toBeVisible(); +}); diff --git a/package-lock.json b/package-lock.json index 3170294..5e3bac7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "zod": "^4.4.3" }, "devDependencies": { + "@playwright/test": "^1.61.1", "@react-router/dev": "^7.16.0", "@types/node": "^24.12.4", "@types/react": "^19.2.16", @@ -133,6 +134,7 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -565,29 +567,6 @@ "node": ">=6.9.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", @@ -743,6 +722,22 @@ "url": "https://github.com/sponsors/Boshen" } }, + "node_modules/@playwright/test": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz", + "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@prisma/client": { "version": "5.22.0", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.22.0.tgz", @@ -2426,6 +2421,7 @@ "resolved": "https://registry.npmjs.org/@react-router/serve/-/serve-7.16.0.tgz", "integrity": "sha512-ZI26LhXH65HP6z89+VzTK4XXDibnJczCUNQOgZIabKXSx8bmSzwujHe0brFc/eBW8N+tFBn/OZ2UuqELi9MwBg==", "license": "MIT", + "peer": true, "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", "@react-router/express": "7.16.0", @@ -2863,6 +2859,7 @@ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.107.0.tgz", "integrity": "sha512-ChKzdlWVweMUUhr0U79JhMmgm1haS/C5JquaiCDr70JaGARRtjjoY9rkIheXWybXxTSNzRiQs3Sk8IAg1HS3ZA==", "license": "MIT", + "peer": true, "dependencies": { "@supabase/auth-js": "2.107.0", "@supabase/functions-js": "2.107.0", @@ -2980,6 +2977,7 @@ "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2990,6 +2988,7 @@ "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3000,6 +2999,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3187,6 +3187,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -3758,6 +3759,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -4102,18 +4104,6 @@ "node": ">=18" } }, - "node_modules/jiti": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", - "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -4688,6 +4678,7 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4714,6 +4705,53 @@ "dev": true, "license": "MIT" }, + "node_modules/playwright": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz", + "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.61.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.61.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz", + "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { "version": "8.5.15", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", @@ -4766,6 +4804,7 @@ "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@prisma/engines": "5.22.0" }, @@ -4913,6 +4952,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4922,6 +4962,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -4934,6 +4975,7 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.77.0.tgz", "integrity": "sha512-Sslh9YDYc0GDlWT/lxasnIduNo4v3yyvqRGvmGKUre5AFjDs/HV9/OafHGD8d+sB2yoL4UIL9L8X9i0WlZZebg==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -4957,6 +4999,7 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", "license": "MIT", + "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -5037,6 +5080,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.16.0.tgz", "integrity": "sha512-wArC8lVyJb3+jM9OpDyW6hLCizACWkvQR/sSGqSs+o5uEXEtGlqdZ4v8hENR3Jad6i+LRkK93q/+bQAcvl6V1A==", "license": "MIT", + "peer": true, "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -5137,7 +5181,8 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -5493,6 +5538,7 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5661,6 +5707,7 @@ "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -5782,6 +5829,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 94f598f..4c371e6 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "build": "prisma generate && react-router build", "dev": "react-router dev", "start": "react-router-serve ./build/server/index.js", + "test:e2e": "playwright test", "typecheck": "react-router typegen && tsc", "postinstall": "prisma generate" }, @@ -32,6 +33,7 @@ "zod": "^4.4.3" }, "devDependencies": { + "@playwright/test": "^1.61.1", "@react-router/dev": "^7.16.0", "@types/node": "^24.12.4", "@types/react": "^19.2.16", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..13262f0 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,35 @@ +import { defineConfig, devices } from '@playwright/test'; +import dotenv from 'dotenv'; + +// Read from .env.test +dotenv.config({ path: '.env.test' }); + +export default defineConfig({ + testDir: './e2e', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + use: { + baseURL: 'http://localhost:3000', + trace: 'on-first-retry', + }, + projects: [ + { name: 'setup', testMatch: /.*\.setup\.ts/ }, + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + storageState: 'playwright/.auth/user.json', + }, + dependencies: ['setup'], + }, + ], + webServer: { + command: 'npm run build && npm run start', + url: 'http://localhost:3000', + reuseExistingServer: !process.env.CI, + timeout: 120 * 1000, + }, +}); diff --git a/scripts/create-demo-user.ts b/scripts/create-demo-user.ts index bcc2c9c..b56f5e5 100644 --- a/scripts/create-demo-user.ts +++ b/scripts/create-demo-user.ts @@ -3,10 +3,11 @@ import { PrismaClient } from "@prisma/client"; import "dotenv/config"; const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!; -const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!; // We'll try with ANON key if service role is missing +const serviceRoleKey = process.env.SUPABASE_SERVICE_ROLE_KEY; +const anonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!; +const supabaseKey = serviceRoleKey || anonKey; const supabase = createClient(supabaseUrl, supabaseKey); const prisma = new PrismaClient(); - async function main() { console.log("Creating demo user..."); @@ -15,16 +16,29 @@ async function main() { const password = "password123"; const name = "Demo User"; - const { data, error } = await supabase.auth.signUp({ - email, - password, - options: { - data: { name }, - } - }); + let error; + + if (serviceRoleKey) { + const res = await supabase.auth.admin.createUser({ + email, + password, + user_metadata: { name }, + email_confirm: true, + }); + error = res.error; + } else { + const res = await supabase.auth.signUp({ + email, + password, + options: { + data: { name }, + } + }); + error = res.error; + } if (error) { - if (error.message.includes("User already registered")) { + if (error.message.includes("already registered") || error.message.includes("already exists") || error.message.includes("already been registered")) { console.log("Demo user already exists in Supabase Auth."); } else { console.error("Failed to create demo user in Auth:", error.message); diff --git a/vite.config.ts b/vite.config.ts index 964a614..4c7891a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -6,4 +6,7 @@ export default defineConfig({ resolve: { tsconfigPaths: true, }, + ssr: { + noExternal: ['@tabler/icons-react'], + }, }); From 714793102c518180b50173914c49af07e783a84d Mon Sep 17 00:00:00 2001 From: Krishna Date: Wed, 8 Jul 2026 01:57:17 +0530 Subject: [PATCH 3/3] chore: sync package-lock.json with npm v10 for CI compatibility --- package-lock.json | 47 +++++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a099a6..abfcb2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -136,7 +136,6 @@ "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -569,6 +568,31 @@ "node": ">=6.9.0" } }, + "node_modules/@emnapi/core": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.2.tgz", + "integrity": "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", + "integrity": "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/wasi-threads": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", @@ -576,6 +600,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "tslib": "^2.4.0" } @@ -2423,7 +2448,6 @@ "resolved": "https://registry.npmjs.org/@react-router/serve/-/serve-7.16.0.tgz", "integrity": "sha512-ZI26LhXH65HP6z89+VzTK4XXDibnJczCUNQOgZIabKXSx8bmSzwujHe0brFc/eBW8N+tFBn/OZ2UuqELi9MwBg==", "license": "MIT", - "peer": true, "dependencies": { "@mjackson/node-fetch-server": "^0.2.0", "@react-router/express": "7.16.0", @@ -2895,7 +2919,6 @@ "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.107.0.tgz", "integrity": "sha512-ChKzdlWVweMUUhr0U79JhMmgm1haS/C5JquaiCDr70JaGARRtjjoY9rkIheXWybXxTSNzRiQs3Sk8IAg1HS3ZA==", "license": "MIT", - "peer": true, "dependencies": { "@supabase/auth-js": "2.107.0", "@supabase/functions-js": "2.107.0", @@ -3013,7 +3036,6 @@ "integrity": "sha512-GUUEShf+PBCGW2KaXwcIt3Yk+e3pkKwWKb9GSyM9WQVE+ep2jzmHdGsHzu4wgcZy5fN9FBdVzjpBQsYlpfpgLA==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -3024,7 +3046,6 @@ "integrity": "sha512-esJiCAnl0kfpNdE69f3So4WJUXy95dLZydX0KwK46riIHDzHM7O9Vtf9xCHW0PXIqvgqNrswl522kA/5yx+F4w==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -3035,7 +3056,6 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "devOptional": true, "license": "MIT", - "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -3301,7 +3321,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", @@ -3910,7 +3929,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -4955,7 +4973,6 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -5081,7 +5098,6 @@ "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@prisma/engines": "5.22.0" }, @@ -5229,7 +5245,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5239,7 +5254,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -5252,7 +5266,6 @@ "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.77.0.tgz", "integrity": "sha512-Sslh9YDYc0GDlWT/lxasnIduNo4v3yyvqRGvmGKUre5AFjDs/HV9/OafHGD8d+sB2yoL4UIL9L8X9i0WlZZebg==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.0.0" }, @@ -5276,7 +5289,6 @@ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", "license": "MIT", - "peer": true, "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -5357,7 +5369,6 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.16.0.tgz", "integrity": "sha512-wArC8lVyJb3+jM9OpDyW6hLCizACWkvQR/sSGqSs+o5uEXEtGlqdZ4v8hENR3Jad6i+LRkK93q/+bQAcvl6V1A==", "license": "MIT", - "peer": true, "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -5472,8 +5483,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/redux-thunk": { "version": "3.1.0", @@ -5865,7 +5875,6 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6047,7 +6056,6 @@ "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", @@ -6209,7 +6217,6 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" }