mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-08 21:34:33 +00:00
Stop hand-writing OpenAPI response examples, which kept drifting from the real payloads (clients/traffic missing fields, inbounds/list exposing userId which is json:"-", the fictional inbound-443 tag instead of the real in-<port>-<transport> form).
tools/openapigen now emits frontend/src/generated/examples.ts: a per-struct example instance built from type defaults, validate oneof/min bounds, and example: struct tags, with nested-ref expansion and a cycle guard. build-openapi.mjs composes the {success,obj} envelope from it for any endpoint annotated with responseSchema (+ responseSchemaArray for lists); the hand-written response is dropped for those. Service DTOs InboundOption/ApiTokenView/ProbeResultUI are added to the walker.
#4996: client password regeneration now produces a valid Shadowsocks 2022 PSK (correct base64 length per cipher) when an SS2022 inbound is attached, in both the single and bulk client forms; backend surfaces ssMethod on /inbounds/options so the UI can pick the right length.
Also: Swagger UI persists the Authorization token across reloads (persistAuthorization).
70 lines
1.9 KiB
JSON
70 lines
1.9 KiB
JSON
{
|
|
"name": "3x-ui-frontend",
|
|
"private": true,
|
|
"version": "0.2.7",
|
|
"type": "module",
|
|
"description": "3x-ui panel frontend (React 19 + Ant Design 6 + Vite 8).",
|
|
"engines": {
|
|
"node": ">=22.0.0",
|
|
"npm": ">=10.0.0"
|
|
},
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "npm run gen:api && vite build",
|
|
"preview": "vite preview",
|
|
"lint": "eslint src",
|
|
"typecheck": "tsc --noEmit",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest",
|
|
"gen": "npm run gen:zod && npm run gen:api",
|
|
"gen:api": "node --experimental-strip-types --disable-warning=ExperimentalWarning scripts/build-openapi.mjs",
|
|
"gen:zod": "cd .. && go run ./tools/openapigen"
|
|
},
|
|
"dependencies": {
|
|
"@ant-design/icons": "^6.2.5",
|
|
"@codemirror/lang-json": "^6.0.2",
|
|
"@codemirror/theme-one-dark": "^6.1.3",
|
|
"@tanstack/react-query": "^5.101.0",
|
|
"@tanstack/react-query-devtools": "^5.101.0",
|
|
"antd": "^6.4.3",
|
|
"axios": "^1.17.0",
|
|
"codemirror": "^6.0.2",
|
|
"dayjs": "^1.11.21",
|
|
"i18next": "^26.3.1",
|
|
"otpauth": "^9.5.1",
|
|
"persian-calendar-suite": "^1.5.5",
|
|
"qs": "^6.15.2",
|
|
"react": "^19.2.7",
|
|
"react-dom": "^19.2.7",
|
|
"react-i18next": "^17.0.8",
|
|
"react-router-dom": "^7.16.0",
|
|
"recharts": "^3.8.1",
|
|
"swagger-ui-react": "^5.32.6",
|
|
"zod": "^4.4.3"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^10.0.1",
|
|
"@testing-library/dom": "^10.4.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@types/react": "^19.2.16",
|
|
"@types/react-dom": "^19.2.3",
|
|
"@types/swagger-ui-react": "^5.18.0",
|
|
"@vitejs/plugin-react": "^6.0.2",
|
|
"eslint": "^10.4.1",
|
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
"globals": "^17.6.0",
|
|
"jsdom": "^29.1.1",
|
|
"typescript": "^6.0.3",
|
|
"typescript-eslint": "^8.60.1",
|
|
"vite": "8.0.16",
|
|
"vitest": "^4.1.8"
|
|
},
|
|
"overrides": {
|
|
"react-copy-to-clipboard": "^5.1.1",
|
|
"react-inspector": "^9.0.0",
|
|
"react-debounce-input": {
|
|
"react": "^19.0.0"
|
|
}
|
|
}
|
|
}
|