{ "name": "openfront-client", "scripts": { "build-dev": "concurrently \"tsc --noEmit\" \"vite build --mode development\"", "build-prod": "concurrently --kill-others-on-fail \"tsc --noEmit\" \"vite build\"", "start:client": "vite", "start:server": "tsx src/server/Server.ts", "start:server-dev": "cross-env GAME_ENV=dev tsx src/server/Server.ts", "dev": "cross-env GAME_ENV=dev concurrently \"npm run start:client\" \"npm run start:server-dev\"", "dev:staging": "cross-env GAME_ENV=dev API_DOMAIN=api.openfront.dev concurrently \"npm run start:client\" \"npm run start:server-dev\"", "dev:prod": "cross-env GAME_ENV=dev API_DOMAIN=api.openfront.io concurrently \"npm run start:client\" \"npm run start:server-dev\"", "docs:map-generator": "cd map-generator && go doc -cmd -u -all", "tunnel": "npm run build-prod && npm run start:server", "test": "vitest run", "perf": "npx tsx tests/perf/*.ts", "test:coverage": "vitest run --coverage", "format": "prettier --ignore-unknown --write .", "format:map-generator": "cd map-generator && go fmt .", "lint": "eslint", "lint:fix": "eslint --fix", "prepare": "husky", "gen-maps": "cd map-generator && go run . && npm run format", "inst": "npm ci --ignore-scripts", "sync-assets": "node scripts/sync-assets.mjs", "predev": "npm run sync-assets", "prebuild-dev": "npm run sync-assets", "prebuild-prod": "npm run sync-assets", "prestart:client": "npm run sync-assets", "pretest": "npm run sync-assets", "pretest:coverage": "npm run sync-assets" }, "lint-staged": { "**/*": [ "eslint --fix", "prettier --ignore-unknown --write" ] }, "devDependencies": { "@datastructures-js/priority-queue": "^6.3.3", "@eslint/compat": "^1.2.7", "@eslint/js": "^9.21.0", "@types/benchmark": "^2.1.5", "@types/chai": "^4.3.17", "@types/d3": "^7.4.3", "@types/express": "^4.17.23", "@types/google-protobuf": "^3.15.12", "@types/hammerjs": "^2.0.46", "@types/howler": "^2.2.12", "@types/jquery": "^3.5.31", "@types/js-yaml": "^4.0.9", "@types/msgpack5": "^3.4.6", "@types/node": "^22.10.2", "@types/pg": "^8.11.11", "@types/seedrandom": "^3.0.8", "@types/sinon": "^17.0.3", "@types/systeminformation": "^3.23.1", "@types/ws": "^8.5.11", "@vitest/coverage-v8": "^4.0.16", "@vitest/ui": "^4.0.16", "autoprefixer": "^10.4.20", "benchmark": "^2.1.4", "canvas": "^3.1.0", "chai": "^5.1.1", "concurrently": "^8.2.2", "cross-env": "^7.0.3", "d3": "^7.9.0", "eslint": "^9.21.0", "eslint-config-prettier": "^10.1.1", "eslint-formatter-gha": "^1.5.2", "globals": "^16.0.0", "husky": "^9.1.7", "jsdom": "^27.4.0", "lint-staged": "^16.1.2", "lit": "^3.3.1", "lit-markdown": "^1.3.2", "mrmime": "^2.0.0", "pixi-filters": "^6.1.4", "pixi.js": "^8.11.0", "postcss": "^8.5.1", "prettier": "^3.5.3", "prettier-plugin-organize-imports": "^4.1.0", "prettier-plugin-sh": "^0.17.4", "protobufjs": "^7.5.3", "sinon": "^21.0.0", "sinon-chai": "^4.0.0", "tailwindcss": "^3.4.17", "tsconfig-paths": "^4.2.0", "tsx": "^4.17.0", "typescript": "^5.7.2", "typescript-eslint": "^8.26.0", "vite": "^7.3.0", "vite-plugin-html": "^3.2.2", "vite-plugin-static-copy": "^3.1.4", "vite-tsconfig-paths": "^6.0.3", "vitest": "^4.0.16" }, "dependencies": { "@aws-sdk/client-s3": "^3.758.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/api-logs": "^0.200.0", "@opentelemetry/exporter-logs-otlp-http": "^0.200.0", "@opentelemetry/exporter-metrics-otlp-http": "^0.200.0", "@opentelemetry/resources": "^2.0.0", "@opentelemetry/sdk-logs": "^0.200.0", "@opentelemetry/sdk-metrics": "^2.0.0", "@opentelemetry/semantic-conventions": "^1.32.0", "@opentelemetry/winston-transport": "^0.11.0", "@types/compression": "^1.8.1", "colord": "^2.9.3", "colorjs.io": "^0.5.2", "compression": "^1.8.1", "dompurify": "^3.1.7", "dotenv": "^16.5.0", "express": "^4.21.1", "express-rate-limit": "^7.5.0", "fastpriorityqueue": "^0.7.5", "howler": "^2.2.4", "intl-messageformat": "^10.7.16", "ip-anonymize": "^0.1.0", "jose": "^6.0.10", "js-yaml": "^4.1.1", "nanoid": "^3.3.6", "obscenity": "^0.4.3", "seedrandom": "^3.0.5", "ts-node": "^10.9.2", "uuid": "^11.1.0", "winston": "^3.17.0", "ws": "^8.18.0", "zod": "^4.0.5" }, "type": "module" }