{ "name": "sendou.ink", "version": "3.0.0", "private": true, "packageManager": "pnpm@11.0.9", "sideEffects": false, "type": "module", "scripts": { "deploy": "pnpm install --frozen-lockfile && pnpm run build", "build": "react-router build", "dev": "cross-env DB_PATH=db.sqlite3 pnpm run migrate up && pnpm run setup && react-router dev --host", "dev:fast": "react-router dev --host", "dev:prod": "cross-env DB_PATH=db-prod.sqlite3 VITE_PROD_MODE=true react-router dev --host", "start": "pnpm run migrate up && NODE_ENV=production react-router-serve ./build/server/index.js", "migrate": "node scripts/migrate.ts", "migrate:new": "node scripts/create-migration.ts", "migrate:prod": "cross-env DB_PATH=db-prod.sqlite3 pnpm run migrate up", "check-translation-jsons": "node scripts/check-translation-jsons.ts", "check-translation-jsons:no-write": "node scripts/check-translation-jsons.ts --no-write", "check-articles": "vite-node scripts/check-articles.ts", "bench:db": "cross-env DB_PATH=db-prod.sqlite3 VITE_PROD_MODE=true vite-node scripts/benchmark-db.ts", "compute-luti-divs": "vite-node scripts/compute-luti-divs.ts", "download-prod-db": "node scripts/download-prod-db.ts", "refresh-prod-db": "node scripts/refresh-prod-db.ts && pnpm run migrate:prod", "biome:check": "biome check --error-on-warnings .", "biome:fix": "biome check --error-on-warnings --write .", "biome:fix:unsafe": "biome check --error-on-warnings --write --unsafe .", "typecheck": "react-router typegen && tsc --noEmit", "typecheck:scripts": "tsc --noEmit -p scripts", "test:unit:browser": "cross-env VITE_SITE_DOMAIN=http://localhost:5173 BROWSER_HEADLESS=true vitest --silent=passed-only run --project unit --project browser", "test:browser:ui": "cross-env VITE_SITE_DOMAIN=http://localhost:5173 vitest --silent=passed-only --project browser", "test:unit:browser:ui": "cross-env VITE_SITE_DOMAIN=http://localhost:5173 vitest --silent=passed-only", "test:scanner": "vitest run --project scanner", "scanner:report": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/report.ts", "scanner:scan-vod": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/scan-vod.ts", "scanner:status-audit": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/status-audit.ts", "scanner:fixtures": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/run-fixtures.ts", "scanner:replay": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/replay-frames.ts", "scanner:bootstrap-atlas": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/bootstrap-atlas-from-fixture.ts", "scanner:build-glyph-atlas": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/build-glyph-atlas.ts", "scanner:build-localized-entries": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/build-localized-entries.ts", "scanner:build-planner-signatures": "vite-node -c scripts/scanner/vite-node.config.ts scripts/scanner/build-planner-signatures.ts", "test:e2e": "playwright test", "test:e2e:flaky-detect": "playwright test --repeat-each=10 --max-failures=1", "check-plural-collapse": "node scripts/collapse-single-plural-keys.ts --check", "checks": "pnpm run biome:fix && pnpm run test:unit:browser && pnpm run check-translation-jsons && pnpm run check-plural-collapse && pnpm run typecheck && pnpm run typecheck:scripts && pnpm run knip", "checks:scanner": "pnpm checks && pnpm test:scanner", "seed": "cross-env DB_PATH=db.sqlite3 vite-node ./scripts/seed.ts", "setup": "cross-env DB_PATH=db.sqlite3 vite-node ./scripts/setup.ts", "og:generate": "node scripts/generate-og-images.ts", "changelog:image": "node scripts/generate-changelog-image.ts", "notification:test": "cross-env DB_PATH=db.sqlite3 vite-node ./scripts/send-test-notification.ts", "i18n:sync": "node scripts/collapse-single-plural-keys.ts && 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 && pnpm run biome:fix", "knip": "knip" }, "dependencies": { "@aws-sdk/client-s3": "3.1119.0", "@aws-sdk/lib-storage": "3.1119.0", "@date-fns/tz": "1.5.0", "@dnd-kit/core": "6.3.1", "@dnd-kit/modifiers": "9.0.0", "@dnd-kit/sortable": "10.0.0", "@dnd-kit/utilities": "3.2.2", "@epic-web/cachified": "5.6.3", "@react-router/node": "8.3.0", "@react-router/serve": "8.1.0", "@techstark/opencv-js": "5.0.0-release.1", "@tldraw/tldraw": "3.12.1", "@zumer/snapdom": "2.24.10", "chart.js": "4.5.1", "clsx": "2.1.1", "compressorjs": "1.3.0", "date-fns": "4.4.0", "edmonds-blossom-fixed": "1.0.1", "fflate": "0.8.3", "gray-matter": "4.0.3", "i18next": "26.3.6", "i18next-browser-languagedetector": "8.2.1", "i18next-http-backend": "4.0.1", "ics": "3.12.0", "isbot": "5.2.1", "kysely": "0.29.0", "lucide-react": "1.34.0", "markdown-to-jsx": "9.10.2", "mediabunny": "1.55.3", "nanoid": "6.0.1", "node-cron": "4.6.0", "nprogress": "0.2.0", "openskill": "5.0.1", "p-limit": "7.3.1", "picocad2-web": "1.4.0-beta.2", "qrcode.react": "4.2.0", "react": "19.2.8", "react-chartjs-2": "5.3.1", "react-dom": "19.2.8", "react-error-boundary": "6.1.3", "react-flip-toolkit": "7.2.4", "react-i18next": "17.0.11", "react-router": "8.3.0", "remeda": "2.45.0", "remix-auth": "4.2.0", "remix-auth-oauth2": "3.4.1", "remix-i18next": "8.0.0", "slugify": "1.6.9", "swr": "2.5.1", "valibot": "^1.4.2", "web-haptics": "0.0.6", "web-push": "3.6.7" }, "devDependencies": { "@babel/preset-typescript": "7.29.7", "@biomejs/biome": "2.5.10", "@faker-js/faker": "10.6.0", "@napi-rs/canvas": "1.0.8", "@playwright/test": "1.62.1", "@react-router/dev": "8.3.0", "@types/node": "26.4.0", "@types/nprogress": "0.2.3", "@types/react": "19.2.18", "@types/react-dom": "19.2.5", "@types/web-push": "3.6.4", "@vitest/browser-playwright": "4.1.11", "@vitest/ui": "4.1.11", "babel-plugin-react-compiler": "19.1.0-rc.3", "cross-env": "10.1.0", "i18next-locales-sync": "2.1.1", "knip": "6.32.3", "magic-string": "1.2.3", "sharp": "^0.35.4", "sql-formatter": "15.8.2", "typescript": "7.0.2", "vite": "8.2.2", "vite-node": "6.0.0", "vite-plugin-babel": "1.7.3", "vitest": "4.1.11", "vitest-browser-react": "2.2.0" } }