Files
miracles_in_motion/package.json
T
defiQUGandCursor 4e4df13ab1 P1: path routing, prerender shells, E2E, and HelmetProvider donate fix.
Replace hash URLs with path-based routing, post-build prerender for money pages, Playwright smoke tests, and wrap the app in HelmetProvider so /donate mounts correctly.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-16 11:11:20 -07:00

121 lines
4.8 KiB
JSON

{
"name": "miracles-in-motion-web",
"private": true,
"version": "1.0.0",
"type": "module",
"description": "Public website for Miracles In Motion 501(c)3 non-profit organization",
"scripts": {
"dev": "vite",
"brand:export": "bash scripts/brand/export-brand-assets.sh",
"photos:optimize": "bash scripts/optimize-community-photos.sh",
"prebuild": "npm run brand:export && npm run photos:optimize",
"build": "tsc && vite build",
"postbuild": "node scripts/prerender-money-pages.mjs",
"test": "vitest run",
"test:ci": "vitest run --reporter=verbose && npm run test:api",
"test:api": "npm --prefix mim-api test",
"test:e2e": "playwright test",
"test:e2e:lan": "MIM_E2E_BASE_URL=http://192.168.11.37 playwright test",
"test:watch": "vitest",
"type-check": "tsc --noEmit",
"validate:ci": "npm run type-check && npm run test:ci && npm run a11y:header-audit",
"validate:ci:strict": "npm run validate:ci && npm run perf:gate",
"perf:gate": "node scripts/a11y/audit-perf-gate.mjs --min=72 --max-lcp=2600",
"perf:gate:world-class": "node scripts/a11y/audit-perf-gate.mjs --min=85 --max-lcp=2500",
"brand:trace-svg": "node scripts/brand/trace-nav-svg.mjs",
"a11y:header-audit": "node scripts/a11y/audit-header-wcag.mjs",
"a11y:header-audit:live": "node scripts/a11y/audit-header-wcag.mjs --lighthouse",
"a11y:site-lighthouse": "node scripts/a11y/audit-site-lighthouse.mjs",
"evidence:header-screenshots": "node scripts/evidence/capture-header-screenshots.mjs",
"evidence:full": "npm run a11y:site-lighthouse && npm run perf:gate && npm run evidence:header-screenshots",
"lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
"prepreview": "npm run build",
"preview": "vite preview",
"deploy": "echo 'Production deploy: use proxmox/scripts/mim4u-deploy-to-7810.sh' && exit 1",
"diagram:png": "node scripts/export-architecture.mjs --format=png",
"diagram:svg": "node scripts/export-architecture.mjs --format=svg",
"docs:index": "node scripts/generate-doc-index.mjs",
"docs:refresh": "npm run docs:index && npm run diagram:png",
"lighthouse": "npx lighthouse https://mim4u.org --only-categories=accessibility --output=json --output-path=./reports/status/lighthouse-a11y-mim4u-latest.json --chrome-flags='--headless --no-sandbox'",
"lighthouse:local": "CHROME_PATH=${CHROME_PATH:-/usr/bin/google-chrome} npm run lighthouse"
},
"keywords": [
"non-profit",
"charity",
"501c3",
"miracles-in-motion",
"community",
"donations",
"volunteers",
"react",
"vite",
"tailwind"
],
"author": "Miracles In Motion",
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/Miracles-In-Motion/public-web.git"
},
"homepage": "https://mim4u.org",
"dependencies": {
"@fontsource/inter": "^5.2.8",
"@fontsource/playfair-display": "^5.2.8",
"@react-three/fiber": "^8.16.8",
"@stripe/react-stripe-js": "^2.8.1",
"@stripe/stripe-js": "^4.7.0",
"@tanstack/react-query": "^5.59.20",
"@tensorflow/tfjs": "^4.22.0",
"@testing-library/dom": "^10.4.1",
"@types/node": "^24.6.2",
"date-fns": "^4.1.0",
"framer-motion": "^11.11.17",
"framer-motion-3d": "^11.5.6",
"i18next": "^25.5.3",
"i18next-browser-languagedetector": "^8.2.0",
"i18next-http-backend": "^3.0.2",
"lucide-react": "^0.446.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^16.0.0",
"react-query": "^3.39.3",
"recharts": "^3.2.1",
"socket.io-client": "^4.8.1",
"three": "^0.180.0",
"zustand": "^5.0.8"
},
"devDependencies": {
"@playwright/test": "^1.61.0",
"@resvg/resvg-js": "^2.6.2",
"@tailwindcss/typography": "^0.5.10",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@types/jest": "^30.0.0",
"@types/react": "^18.3.25",
"@types/react-dom": "^18.3.7",
"@types/react-helmet-async": "^1.0.1",
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
"@vitejs/plugin-react": "^4.7.0",
"@vitest/ui": "^3.2.4",
"autoprefixer": "^10.4.16",
"eslint": "^8.57.1",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-react-refresh": "^0.4.4",
"gh-pages": "^6.0.0",
"jsdom": "^27.0.0",
"playwright": "^1.61.0",
"postcss": "^8.4.31",
"potrace": "^2.1.8",
"react-helmet-async": "^2.0.5",
"tailwindcss": "^3.4.18",
"terser": "^5.44.0",
"typescript": "^5.6.3",
"vite": "^7.1.9",
"vite-bundle-analyzer": "^1.2.3",
"vite-plugin-pwa": "^1.0.3",
"vitest": "^3.2.4"
}
}