{
  "private": true,
  "scripts": {
    "start": "concurrently -n w: npm:start:*",
    "start:back": "nodemon",
    "start:front": "max dev",
    "build:front": "max build",
    "build:back": "tsc -p back/tsconfig.json",
    "panel": "npm run build:back && node static/build/app.js",
    "gen:proto": "protoc --experimental_allow_proto3_optional --plugin=./node_modules/.bin/protoc-gen-ts_proto ./back/protos/*.proto --ts_proto_out=./ --ts_proto_opt=outputServices=grpc-js,env=node,esModuleInterop=true,snakeToCamel=false",
    "gen:api": "python3 -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./back/protos/api.proto",
    "prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'",
    "postinstall": "max setup 2>/dev/null || true",
    "test": "umi-test",
    "test:coverage": "umi-test --coverage"
  },
  "gitHooks": {
    "pre-commit": "lint-staged"
  },
  "lint-staged": {
    "*.{js,jsx,less,md,json}": [
      "prettier --write"
    ],
    "*.ts?(x)": [
      "prettier --parser=typescript --write"
    ]
  },
  "pnpm": {
    "peerDependencyRules": {
      "ignoreMissing": [
        "react",
        "react-dom",
        "antd",
        "dva",
        "postcss",
        "webpack",
        "eslint",
        "stylelint",
        "redux",
        "@babel/core",
        "monaco-editor",
        "rc-field-form",
        "@types/lodash.merge",
        "rollup",
        "styled-components"
      ],
      "allowedVersions": {
        "react": "18",
        "react-dom": "18",
        "dva-core": "2"
      }
    },
    "overrides": {
      "sqlite3": "git+https://github.com/whyour/node-sqlite3.git#v1.0.3"
    }
  },
  "dependencies": {
    "@grpc/grpc-js": "^1.12.3",
    "@grpc/proto-loader": "^0.7.13",
    "@otplib/preset-default": "^12.0.1",
    "body-parser": "^1.20.3",
    "celebrate": "^15.0.3",
    "chokidar": "^4.0.1",
    "cors": "^2.8.5",
    "cron-parser": "^4.9.0",
    "cross-spawn": "^7.0.6",
    "dayjs": "^1.11.13",
    "dotenv": "^16.4.6",
    "express": "^4.21.2",
    "express-jwt": "^8.4.1",
    "express-rate-limit": "^7.4.1",
    "express-urlrewrite": "^2.0.3",
    "undici": "^7.9.0",
    "hpagent": "^1.2.0",
    "http-proxy-middleware": "^3.0.3",
    "iconv-lite": "^0.6.3",
    "js-yaml": "^4.1.0",
    "jsonwebtoken": "^9.0.2",
    "lodash": "^4.17.21",
    "multer": "1.4.5-lts.1",
    "node-schedule": "^2.1.0",
    "nodemailer": "^6.9.16",
    "p-queue-cjs": "7.3.4",
    "@bufbuild/protobuf": "^2.2.3",
    "ps-tree": "^1.2.0",
    "reflect-metadata": "^0.2.2",
    "sequelize": "^6.37.5",
    "serve-handler": "^6.1.6",
    "sockjs": "^0.3.24",
    "sqlite3": "git+https://github.com/whyour/node-sqlite3.git#v1.0.3",
    "toad-scheduler": "^3.0.1",
    "typedi": "^0.10.0",
    "uuid": "^11.0.3",
    "winston": "^3.17.0",
    "winston-daily-rotate-file": "^5.0.0",
    "request-ip": "3.3.0",
    "ip2region": "2.3.0",
    "keyv": "^5.2.3",
    "@keyv/sqlite": "^4.0.1",
    "proper-lockfile": "^4.1.2",
    "compression": "^1.7.4",
    "helmet": "^6.0.1"
  },
  "devDependencies": {
    "moment": "2.30.1",
    "@ant-design/icons": "^5.0.1",
    "@ant-design/pro-layout": "6.38.22",
    "@codemirror/view": "^6.34.1",
    "@codemirror/state": "^6.4.1",
    "@monaco-editor/react": "4.2.1",
    "@react-hook/resize-observer": "^2.0.2",
    "react-router-dom": "6.26.1",
    "@types/body-parser": "^1.19.2",
    "@types/cors": "^2.8.12",
    "@types/cross-spawn": "^6.0.2",
    "@types/express": "^4.17.13",
    "@types/express-jwt": "^6.0.4",
    "@types/file-saver": "2.0.2",
    "@types/js-yaml": "^4.0.5",
    "@types/jsonwebtoken": "^8.5.8",
    "@types/lodash": "^4.14.185",
    "@types/multer": "^1.4.7",
    "@types/node": "^17.0.21",
    "@types/node-schedule": "^1.3.2",
    "@types/nodemailer": "^6.4.4",
    "@types/qrcode.react": "^1.0.2",
    "@types/react": "^18.0.20",
    "@types/react-copy-to-clipboard": "^5.0.4",
    "@types/react-dom": "^18.0.6",
    "@types/serve-handler": "^6.1.1",
    "@types/sockjs": "^0.3.33",
    "@types/sockjs-client": "^1.5.1",
    "@types/uuid": "^8.3.4",
    "@types/request-ip": "0.0.41",
    "@types/proper-lockfile": "^4.1.4",
    "@types/ps-tree": "^1.1.6",
    "@uiw/codemirror-extensions-langs": "^4.21.9",
    "@uiw/react-codemirror": "^4.21.9",
    "@umijs/max": "^4.4.4",
    "@umijs/ssr-darkreader": "^4.9.45",
    "ahooks": "^3.7.8",
    "ansi-to-react": "^6.1.6",
    "antd": "^4.24.16",
    "antd-img-crop": "^4.23.0",
    "axios": "^1.4.0",
    "compression-webpack-plugin": "9.2.0",
    "concurrently": "^7.0.0",
    "react-hotkeys-hook": "^4.6.1",
    "file-saver": "2.0.2",
    "lint-staged": "^13.0.3",
    "monaco-editor": "0.33.0",
    "nodemon": "^3.0.1",
    "prettier": "^2.5.1",
    "pretty-bytes": "6.1.1",
    "qiniu": "^7.4.0",
    "qrcode.react": "^1.0.1",
    "query-string": "^7.1.1",
    "rc-tween-one": "^3.0.6",
    "rc-virtual-list": "3.15.0",
    "react": "18.3.1",
    "react-copy-to-clipboard": "^5.1.0",
    "react-diff-viewer": "^3.1.1",
    "react-dnd": "^16.0.1",
    "react-dnd-html5-backend": "^16.0.1",
    "react-dom": "18.3.1",
    "react-intl-universal": "^2.12.0",
    "react-split-pane": "^0.1.92",
    "sockjs-client": "^1.6.0",
    "ts-node": "^10.9.2",
    "ts-proto": "^2.6.1",
    "tslib": "^2.4.0",
    "typescript": "5.2.2",
    "vh-check": "^2.0.5",
    "virtualizedtableforantd4": "1.3.0",
    "@types/compression": "^1.7.2",
    "@types/helmet": "^4.0.0"
  }
}
