{ "name": "shelf-webapp", "private": true, "sideEffects": false, "type": "module", "scripts": { "build": "NODE_ENV=production remix vite:build", "db:diff": "prisma migrate diff --from-url=${DATABASE_URL} --to-migrations=./app/database/migrations --shadow-database-url=${SHADOW_DATABASE_URL} --script > rollback.sql", "db:prepare-migration": "prisma generate && prisma migrate dev --create-only --skip-seed && tsx app/database/post-migration.ts", "db:generate-type": "prisma generate", "db:deploy": "prisma migrate deploy", "db:deploy-migration": "prisma migrate deploy && prisma generate", "db:deploy-migration:staging": "dotenv -e .env.staging -- prisma migrate deploy && prisma generate", "db:deploy-migration:production": "dotenv -e .env.production -- prisma migrate deploy && prisma generate", "dev": "vite --host", "production:dev": "dotenv -e .env.production -- vite --host", "staging:dev": "dotenv -e .env.staging -- vite --host", "format": "prettier --write .", "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint .", "setup": "prisma generate && prisma migrate deploy", "reset:db": "prisma migrate reset", "reset:db:staging": "dotenv -e .env.staging -- prisma migrate reset", "start": "NODE_ENV=production node ./build/server/index.js", "start:ci": "dotenv -- npm run start", "test": "vitest", "test:cov": "vitest --coverage", "test:e2e:dev": "start-server-and-test dev http://localhost:3000 'npx playwright test --ui'", "test:e2e:run": "start-server-and-test dev http://localhost:3000 'npx playwright test'", "test:e2e:install": "npx playwright install --with-deps chromium", "pretest:e2e:run": "npm run build", "typecheck": "tsc -b", "validate": "run-p \"test -- --run\" lint typecheck test:e2e:run", "lint:fix": "npm run lint -- --fix", "format-code": "npm run prettier:fix & npm run lint:fix", "stripe:webhook": "stripe listen --forward-to localhost:3000/api/stripe-webhook", "prepare": "husky install", "precommit": "npm run db:generate-type && npm run lint:fix && npm run format && npm run typecheck" }, "overrides": { "cross-spawn": "~7.0.6" }, "dependencies": { "@fullcalendar/core": "^6.1.11", "@fullcalendar/daygrid": "^6.1.11", "@fullcalendar/list": "^6.1.11", "@fullcalendar/react": "^6.1.11", "@fullcalendar/timegrid": "^6.1.15", "@markdoc/markdoc": "^0.4.0", "@paralleldrive/cuid2": "^2.2.2", "@prisma/client": "^6.2.1", "@radix-ui/react-alert-dialog": "^1.0.5", "@radix-ui/react-collapsible": "^1.1.1", "@radix-ui/react-dropdown-menu": "2.0.6", "@radix-ui/react-hover-card": "^1.0.7", "@radix-ui/react-icons": "^1.3.0", "@radix-ui/react-popover": "^1.0.7", "@radix-ui/react-select": "2.0.0", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tabs": "1.0.4", "@radix-ui/react-toast": "1.1.5", "@radix-ui/react-tooltip": "^1.0.7", "@react-email/components": "0.0.14", "@remix-run/node": "2.13.1", "@remix-run/react": "2.13.1", "@remix-run/serve": "2.13.1", "@sentry/remix": "^8.53.0", "@stripe/react-stripe-js": "^2.5.0", "@stripe/stripe-js": "^3.0.2", "@supabase/supabase-js": "^2.43.4", "@tremor/react": "^3.14.0", "@zxing/library": "^0.20.0", "changedpi": "^1.0.4", "chardet": "^2.0.0", "class-variance-authority": "^0.7.0", "cookie": "^0.7.0", "crisp-sdk-web": "^1.0.21", "csv-parse": "^5.5.3", "date-fns": "^3.3.1", "date-fns-tz": "^3.2.0", "detectrtc": "^1.4.1", "framer-motion": "^11.0.5", "html-to-image": "1.11.11", "iconv-lite": "^0.6.3", "input-otp": "^1.4.2", "intl-parse-accept-language": "^1.0.0", "isbot": "^4.4.0", "jotai": "^2.7.1", "jsonwebtoken": "^9.0.2", "jszip": "^3.10.1", "lodash": "^4.17.21", "lottie-react": "^2.4.0", "lru-cache": "^11.0.2", "lucide-react": "^0.462.0", "luxon": "^3.4.4", "mapbox-gl": "^3.1.2", "maplibre-gl": "^4.0.0", "nodemailer": "^6.9.9", "nprogress": "^0.2.0", "path-to-regexp": "^6.3.0", "pg-boss": "^9.0.3", "pino": "^8.19.0", "pino-pretty": "^10.3.1", "qrcode-generator": "^1.4.4", "react": "18.2.0", "react-day-picker": "^8.10.0", "react-dom": "18.2.0", "react-dropzone": "^14.2.3", "react-map-gl": "^7.1.7", "react-microsoft-clarity": "^1.2.0", "react-router-hono-server": "^1.0.0", "react-tag-autocomplete": "^7.1.0", "react-to-print": "^2.15.1", "react-webcam": "^7.2.0", "react-zorm": "^0.9.0", "remix-utils": "^7.5.0", "sharp": "^0.33.2", "stripe": "^14.16.0", "swiper": "^11.0.6", "tailwind-merge": "^2.2.1", "tailwindcss-animate": "^1.0.7", "tiny-invariant": "^1.3.1", "ua-parser-js": "^1.0.37", "zod": "^3.22.4", "zxing-wasm": "^2.0.1" }, "devDependencies": { "@faker-js/faker": "^8.4.1", "@playwright/test": "^1.41.2", "@remix-run/dev": "2.13.1", "@remix-run/eslint-config": "2.13.1", "@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/forms": "^0.5.7", "@tailwindcss/typography": "^0.5.10", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", "@testing-library/user-event": "^14.5.2", "@types/js-cookie": "^3.0.6", "@types/jsonwebtoken": "^9.0.5", "@types/lodash": "^4.17.9", "@types/luxon": "^3.4.2", "@types/nodemailer": "^6.4.14", "@types/nprogress": "^0.2.3", "@types/react": "^18.2.55", "@types/react-dom": "^18.2.19", "@types/ua-parser-js": "^0.7.39", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^2.1.9", "autoprefixer": "^10.4.19", "cross-env": "^7.0.3", "dotenv-cli": "^7.3.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-no-restricted-imports": "^0.0.0", "eslint-plugin-tailwindcss": "^3.14.2", "happy-dom": "^15.11.0", "husky": "^9.0.11", "msw": "^1.2.0", "nodemailer-mock": "^2.0.4", "npm-run-all": "^4.1.5", "postcss": "^8.4.38", "prettier": "3.0.3", "prettier-plugin-tailwindcss": "^0.5.11", "prisma": "^6.2.1", "remix-flat-routes": "^0.6.4", "start-server-and-test": "^2.0.3", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.1", "tsconfig-paths": "^4.2.0", "tsx": "^4.7.1", "typescript": "^5.1.0", "vite": "^5.4.14", "vite-plugin-cjs-interop": "^2.1.0", "vite-tsconfig-paths": "^4.3.2", "vitest": "^2.1.9" }, "engines": { "node": ">=20" }, "prisma": { "schema": "app/database/schema.prisma" } }