{ "name": "sendou.ink", "version": "3.0.0", "private": true, "sideEffects": false, "type": "module", "scripts": { "deploy": "npm ci && npm run build", "build": "remix vite:build", "dev": "cross-env DB_PATH=db.sqlite3 npm run migrate up && npm run setup && remix vite:dev --host", "dev:prod": "cross-env DB_PATH=db-prod.sqlite3 VITE_PROD_MODE=true remix vite:dev --host", "start": "npm run migrate up && remix-serve ./build/server/index.js", "migrate": "ley", "migrate:prod": "cross-env DB_PATH=db-prod.sqlite3 npm run migrate up", "check-translation-jsons": "node --experimental-strip-types scripts/check-translation-jsons.ts", "check-translation-jsons:no-write": "node --experimental-strip-types scripts/check-translation-jsons.ts --no-write", "check-homemade-badges": "node --experimental-strip-types scripts/check-homemade-badges.ts", "check-articles": "tsx scripts/check-articles.ts", "refresh-prod-db": "node --experimental-strip-types scripts/refresh-prod-db.ts && npm run migrate:prod", "biome:check": "npx @biomejs/biome check .", "biome:fix": "npx @biomejs/biome check --write .", "biome:fix:unsafe": "npx @biomejs/biome check --write --unsafe .", "typecheck": "tsc --noEmit", "test:unit": "cross-env VITE_SITE_DOMAIN=http://localhost:5173 vitest --silent=passed-only run", "test:e2e": "npx playwright test", "test:e2e:flaky-detect": "npx playwright test --repeat-each=10 --max-failures=1", "checks": "npm run biome:fix && npm run test:unit && npm run check-translation-jsons && npm run typecheck", "setup": "cross-env DB_PATH=db.sqlite3 vite-node ./scripts/setup.ts", "i18n:sync": "i18next-locales-sync -e true -p en -s da de es-ES es-US fr-CA fr-EU he it ja ko nl pl pt-BR ru zh -l locales && npm run biome:fix" }, "dependencies": { "@aws-sdk/client-s3": "^3.797.0", "@aws-sdk/lib-storage": "^3.797.0", "@date-fns/tz": "^1.2.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", "@epic-web/cachified": "^5.5.2", "@faker-js/faker": "^9.7.0", "@hookform/resolvers": "^5.1.1", "@remix-run/node": "^2.16.8", "@remix-run/react": "^2.16.8", "@remix-run/serve": "^2.16.8", "@tldraw/tldraw": "^3.12.1", "@zumer/snapdom": "^1.9.14", "aws-sdk": "^2.1692.0", "better-sqlite3": "^11.9.1", "clsx": "^2.1.1", "compressorjs": "^1.2.1", "date-fns": "^4.1.0", "edmonds-blossom-fixed": "^1.0.1", "gray-matter": "^4.0.3", "i18next": "^23.16.8", "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^2.6.2", "ics": "^3.8.1", "isbot": "^5.1.27", "jsoncrush": "^1.1.8", "kysely": "^0.28.2", "lru-cache": "^11.1.0", "markdown-to-jsx": "^7.7.6", "nanoid": "^5.1.5", "neverthrow": "^8.2.0", "node-cron": "3.0.3", "nprogress": "^0.2.0", "openskill": "^4.1.0", "p-limit": "^6.2.0", "partysocket": "^1.1.3", "react": "^18.3.1", "react-aria-components": "^1.10.0", "react-charts": "^3.0.0-beta.57", "react-compiler-runtime": "^19.1.0-rc.2", "react-dom": "^18.3.1", "react-error-boundary": "^5.0.0", "react-flip-toolkit": "7.2.4", "react-hook-form": "^7.56.1", "react-i18next": "^15.5.1", "react-use": "^17.6.0", "react-use-draggable-scroll": "^0.4.7", "remeda": "^2.21.3", "remix-auth": "^4.2.0", "remix-auth-oauth2": "^3.4.0", "remix-i18next": "^6.4.1", "remix-utils": "^7.7.0", "slugify": "^1.6.6", "swr": "^2.3.3", "web-push": "^3.6.7", "zod": "^3.25.61" }, "devDependencies": { "@biomejs/biome": "2.3.1", "@playwright/test": "^1.52.0", "@remix-run/dev": "^2.16.8", "@remix-run/route-config": "^2.16.8", "@types/better-sqlite3": "^7.6.13", "@types/node-cron": "^3.0.11", "@types/nprogress": "^0.2.3", "@types/react": "^18.3.12", "@types/react-dom": "^18.3.1", "@types/web-push": "^3.6.4", "babel-plugin-react-compiler": "^19.1.0-rc.2", "cross-env": "^7.0.3", "i18next-locales-sync": "^2.1.1", "ley": "^0.8.1", "sql-formatter": "^15.6.1", "tsx": "^4.19.4", "typescript": "^5.8.3", "vite": "^6.4.1", "vite-node": "^3.2.4", "vite-plugin-babel": "^1.3.2", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4" } }