Files
sendou.ink/package.json
Kalle abc36e3978 Move CV tools to scripts/cv, run via vite-node
- dedicated scripts/cv/vite-node.config.ts: the root config's opencv-js
  optimizeDeps entry would hand vite-node the browser prebundle (crashes
  on __dirname); this config externalizes it to the patched CJS bundle
- atlas builders read/write the local assets checkout (CV_ASSETS_DIR);
  fonts from the repo-root assets/fonts (gitignored)
- build-planner-signatures reads the assets repo's planner-maps with a
  filename adapter (<stageId>-<MODE>-<TYPE>.png); the MINI variant
  reproduces the committed signature atlas byte-identically
- build-localized-entries emits the id-keyed snap tables (StageId/
  ModeShort/CvLobby) — regenerated output is structurally identical to
  the converted localized-entries.ts, and localized-messages.ts survives
  unchanged; canonical-English validation now anchors on the en locale
- report.ts compares weaponIds; the accuracy table matches emberz's last
  run exactly, and the golden suite passes against a from-scratch atlas
  regen (bootstrap + font builder)
- pnpm scripts: cv:report, cv:fixtures, cv:bootstrap-atlas,
  cv:build-glyph-atlas, cv:build-localized-entries,
  cv:build-planner-signatures
2026-07-19 14:13:44 +03:00

140 lines
6.1 KiB
JSON

{
"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:sentry": "NODE_OPTIONS='--import ./instrument.server.mjs' pnpm dev",
"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 NODE_OPTIONS='--import ./instrument.server.mjs' react-router-serve ./build/server/index.js",
"migrate": "ley",
"migrate:prod": "cross-env DB_PATH=db-prod.sqlite3 pnpm 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-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",
"refresh-prod-db": "node --experimental-strip-types 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",
"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:cv": "vitest run --project cv",
"cv:report": "vite-node -c scripts/cv/vite-node.config.ts scripts/cv/report.ts",
"cv:fixtures": "vite-node -c scripts/cv/vite-node.config.ts scripts/cv/run-fixtures.ts",
"cv:bootstrap-atlas": "vite-node -c scripts/cv/vite-node.config.ts scripts/cv/bootstrap-atlas-from-fixture.ts",
"cv:build-glyph-atlas": "vite-node -c scripts/cv/vite-node.config.ts scripts/cv/build-glyph-atlas.ts",
"cv:build-localized-entries": "vite-node -c scripts/cv/vite-node.config.ts scripts/cv/build-localized-entries.ts",
"cv:build-planner-signatures": "vite-node -c scripts/cv/vite-node.config.ts scripts/cv/build-planner-signatures.ts",
"test:e2e": "playwright test",
"test:e2e:flaky-detect": "playwright test --repeat-each=10 --max-failures=1",
"test:e2e:generate-seeds": "cross-env DB_PATH=db-test.sqlite3 pnpm run migrate up && cross-env DB_PATH=db-test.sqlite3 vite-node scripts/generate-e2e-seed-dbs.ts",
"check-test-db-migrations": "node --experimental-strip-types scripts/check-test-db-migrations.ts",
"check-plural-collapse": "node --experimental-strip-types 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 knip && pnpm run check-test-db-migrations",
"setup": "cross-env DB_PATH=db.sqlite3 vite-node ./scripts/setup.ts",
"i18n:sync": "node --experimental-strip-types 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.1081.0",
"@aws-sdk/lib-storage": "3.1081.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",
"@faker-js/faker": "10.5.0",
"@formatjs/intl-durationformat": "0.10.15",
"@internationalized/date": "3.12.2",
"@react-router/node": "8.1.0",
"@react-router/serve": "8.1.0",
"@remix-run/form-data-parser": "0.17.4",
"@sentry/react-router": "10.64.0",
"@techstark/opencv-js": "5.0.0-release.1",
"@tldraw/tldraw": "3.12.1",
"@zumer/snapdom": "2.15.0",
"better-sqlite3": "12.11.1",
"chart.js": "4.5.1",
"clsx": "2.1.1",
"compressorjs": "1.3.0",
"date-fns": "4.4.0",
"edmonds-blossom-fixed": "1.0.1",
"gray-matter": "4.0.3",
"i18next": "26.3.4",
"i18next-browser-languagedetector": "8.2.1",
"i18next-http-backend": "4.0.0",
"ics": "3.12.0",
"isbot": "5.2.0",
"jsoncrush": "1.1.8",
"kysely": "0.29.0",
"lucide-react": "1.23.0",
"markdown-to-jsx": "9.8.2",
"mediabunny": "1.50.6",
"nanoid": "5.1.16",
"neverthrow": "8.2.0",
"node-cron": "4.6.0",
"nprogress": "0.2.0",
"openskill": "5.0.1",
"p-limit": "7.3.0",
"partysocket": "1.3.0",
"qrcode.react": "4.2.0",
"react": "19.2.7",
"react-aria-components": "1.19.0",
"react-chartjs-2": "5.3.1",
"react-dom": "19.2.7",
"react-error-boundary": "6.1.2",
"react-flip-toolkit": "7.2.4",
"react-i18next": "17.0.8",
"react-router": "8.1.0",
"react-use-draggable-scroll": "0.4.7",
"remeda": "2.39.0",
"remix-auth": "4.2.0",
"remix-auth-oauth2": "3.4.1",
"remix-i18next": "8.0.0",
"slugify": "1.6.9",
"swr": "2.4.2",
"web-haptics": "0.0.6",
"web-push": "3.6.7",
"zod": "4.4.3"
},
"devDependencies": {
"@babel/preset-typescript": "7.29.7",
"@biomejs/biome": "2.5.3",
"@napi-rs/canvas": "1.0.2",
"@playwright/test": "1.61.1",
"@react-router/dev": "8.1.0",
"@types/better-sqlite3": "7.6.13",
"@types/node": "26.1.1",
"@types/nprogress": "0.2.3",
"@types/react": "19.2.17",
"@types/react-dom": "19.2.3",
"@types/web-push": "3.6.4",
"@vitest/browser-playwright": "4.1.10",
"@vitest/ui": "4.1.10",
"babel-plugin-react-compiler": "19.1.0-rc.3",
"cross-env": "10.1.0",
"i18next-locales-sync": "2.1.1",
"knip": "6.25.0",
"ley": "0.8.1",
"sql-formatter": "15.8.2",
"typescript": "7.0.2",
"vite": "8.1.3",
"vite-node": "6.0.0",
"vite-plugin-babel": "1.7.3",
"vitest": "4.1.10",
"vitest-browser-react": "2.2.0"
}
}