{ "name": "@shelf/webapp", "private": true, "sideEffects": false, "type": "module", "scripts": { "build": "prisma generate && NODE_ENV=production react-router build", "dev": "vite --host", "doctor": "react-doctor .", "production:dev": "dotenv -e ../../.env.production -- vite --host", "staging:dev": "dotenv -e ../../.env.staging -- vite --host", "format": "prettier --write --ignore-path ../../.prettierignore .", "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint --ext .js,.jsx,.ts,.tsx .", "setup": "prisma generate && prisma migrate deploy", "start": "NODE_ENV=production node ./build/server/index.js", "start:local": "dotenv -e ../../.env -- pnpm run start", "test": "vitest", "test:run": "vitest --run", "test:changed": "vitest --run --changed main", "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": "pnpm run build", "typecheck": "react-router typegen && tsc -b", "validate": "prisma generate && run-p test:changed lint typecheck", "validate:full": "prisma generate && run-p test:run lint typecheck", "lint:fix": "eslint --cache --cache-location ./node_modules/.cache/eslint --ext .js,.jsx,.ts,.tsx --fix .", "format-code": "pnpm run format && pnpm run lint:fix", "stripe:webhook": "stripe listen --forward-to https://localhost:3000/api/stripe-webhook", "seed:reporting-demo": "dotenv -e ../../.env -- tsx scripts/seed-reporting-demo.ts", "seed:reporting-demo:staging": "dotenv -e ../../.env.staging -- tsx scripts/seed-reporting-demo.ts", "clean:reporting-demo": "dotenv -e ../../.env -- tsx scripts/clean-reporting-demo.ts", "clean:reporting-demo:staging": "dotenv -e ../../.env.staging -- tsx scripts/clean-reporting-demo.ts", "docs:roles": "tsx scripts/render-roles-doc.ts" }, "dependencies": { "@bwip-js/browser": "^4.9.0", "@fullcalendar/core": "^6.1.20", "@fullcalendar/daygrid": "^6.1.20", "@fullcalendar/list": "^6.1.20", "@fullcalendar/luxon3": "6.1.20", "@fullcalendar/react": "^6.1.20", "@fullcalendar/resource": "^6.1.20", "@fullcalendar/resource-timeline": "^6.1.20", "@fullcalendar/timegrid": "^6.1.20", "@markdoc/markdoc": "^0.5.7", "@paralleldrive/cuid2": "^3.3.0", "@prisma/client": "^6.19.3", "@radix-ui/react-alert-dialog": "^1.1.15", "@radix-ui/react-collapsible": "^1.1.12", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-hover-card": "^1.1.15", "@radix-ui/react-icons": "^1.3.2", "@radix-ui/react-popover": "^1.1.15", "@radix-ui/react-progress": "^1.1.8", "@radix-ui/react-select": "^2.2.6", "@radix-ui/react-separator": "^1.1.8", "@radix-ui/react-switch": "^1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2", "@radix-ui/react-tooltip": "^1.2.8", "@react-email/components": "1.0.0", "@react-router/node": "7.18.4", "@react-router/serve": "7.18.4", "@remix-run/form-data-parser": "^0.14.0", "@sentry/react-router": "^10.76.2", "@shelf/database": "workspace:*", "@shelf/datetime": "workspace:*", "@shelf/labels": "workspace:*", "@shelf/links": "workspace:*", "@shelf/permissions": "workspace:*", "@shelf/quantity-control": "workspace:*", "@supabase/supabase-js": "^2.103.0", "@tanstack/react-table": "^8.21.3", "@tremor/react": "^3.18.7", "changedpi": "^1.0.4", "chardet": "^2.1.1", "class-variance-authority": "^0.7.1", "cmdk": "^1.1.1", "cookie": "^1.1.1", "crisp-sdk-web": "^1.0.28", "csv-parse": "^7.0.2", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "detectrtc": "^1.4.1", "expo-server-sdk": "^7.2.0", "framer-motion": "^12.38.0", "fuse.js": "^7.3.0", "hono": "^4.13.11", "hono-rate-limiter": "^0.5.3", "html-to-image": "1.11.11", "iconv-lite": "^0.7.2", "input-otp": "^1.4.2", "intl-parse-accept-language": "^1.0.0", "ipaddr.js": "^1.9.1", "isbot": "^5.1.37", "jotai": "^2.19.1", "js-cookie": "^3.0.7", "jsonwebtoken": "^9.0.3", "jszip": "^3.10.1", "lodash": "^4.18.1", "lottie-react": "^2.4.1", "lru-cache": "^11.3.3", "lucide-react": "^1.8.0", "luxon": "^3.7.2", "nodemailer": "^10.2.1", "nprogress": "^0.2.0", "path-to-regexp": "^8.4.2", "pg": "^8.18.0", "pg-boss": "^9.0.3", "pigeon-maps": "^0.22.1", "pino": "^10.3.1", "pino-pretty": "^13.1.3", "posthog-node": "^5.36.2", "prosemirror-commands": "^1.7.2", "prosemirror-gapcursor": "^1.4.1", "prosemirror-history": "^1.5.1", "prosemirror-inputrules": "^1.5.1", "prosemirror-keymap": "^1.2.3", "prosemirror-markdown": "^1.13.9", "prosemirror-model": "^1.25.12", "prosemirror-schema-basic": "^1.2.5", "prosemirror-schema-list": "^1.5.1", "prosemirror-state": "^1.4.4", "prosemirror-transform": "^1.12.4", "prosemirror-view": "^1.42.7", "qrcode-generator": "^2.0.4", "react": "19.2.1", "react-day-picker": "9.14.0", "react-dom": "19.2.1", "react-dropzone": "^15.0.0", "react-microsoft-clarity": "^2.0.0", "react-router": "7.18.4", "react-router-hono-server": "^2.25.2", "react-tag-autocomplete": "^7.5.1", "react-to-print": "^3.3.0", "react-webcam": "^7.2.0", "react-zorm": "^0.9.0", "recharts": "^3.8.1", "remix-hono": "^0.0.18", "remix-utils": "^9.3.1", "sharp": "^0.35.5", "stripe": "^22.0.1", "tailwind-merge": "^2.6.1", "tailwindcss-animate": "^1.0.7", "tiny-invariant": "^1.3.3", "ua-parser-js": "^1.0.41", "undici": "^7.30.1", "zod": "^3.25.76", "zxing-wasm": "^3.0.2" }, "devDependencies": { "@faker-js/faker": "^10.5.0", "@playwright/test": "^1.59.1", "@react-router/dev": "7.18.4", "@react-router/remix-routes-option-adapter": "7.18.4", "@tailwindcss/aspect-ratio": "^0.4.2", "@tailwindcss/forms": "^0.5.11", "@tailwindcss/typography": "^0.5.19", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", "@types/js-cookie": "^3.0.6", "@types/jsonwebtoken": "^9.0.10", "@types/lodash": "^4.17.24", "@types/luxon": "^3.7.1", "@types/nprogress": "^0.2.3", "@types/pg": "^8.23.1", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/ua-parser-js": "^0.7.39", "@typescript-eslint/eslint-plugin": "^8.58.1", "@typescript-eslint/parser": "^8.58.1", "@vitejs/plugin-react": "^5.2.0", "@vitest/coverage-v8": "^5.0.5", "autoprefixer": "^10.4.27", "cross-env": "^10.1.0", "dotenv-cli": "^11.0.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.2", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.2", "eslint-plugin-local-rules": "^3.0.2", "eslint-plugin-no-restricted-imports": "^0.0.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^4.6.2", "eslint-plugin-tailwindcss": "^3.18.2", "happy-dom": "21.0.4", "msw": "^2.13.2", "npm-run-all": "^4.1.5", "postcss": "^8.5.31", "prettier": "3.0.3", "prettier-plugin-tailwindcss": "^0.5.14", "prisma": "^6.19.3", "react-doctor": "0.0.39", "remix-flat-routes": "^0.8.5", "tailwind-scrollbar": "^3.1.0", "tailwindcss": "^3.4.19", "tsconfig-paths": "^4.2.0", "tsx": "^4.21.0", "typescript": "^6.0.2", "vite": "^7.3.7", "vite-plugin-cjs-interop": "^2.4.4", "vite-tsconfig-paths": "^6.1.1", "vitest": "^5.0.5" }, "engines": { "node": ">=24.22.1" } }