feat:V3.0.1

This commit is contained in:
Tianpao
2025-10-19 16:25:49 +08:00
parent 5c11a2662c
commit 1e7affe0e2
17 changed files with 297 additions and 726 deletions

View File

@@ -13,7 +13,6 @@
"express": "^5.1.0",
"fs-extra": "^11.3.1",
"got": "^14.4.8",
"inquirer": "^12.9.4",
"multer": "^2.0.2",
"p-map": "^7.0.3",
"p-retry": "^7.0.0",
@@ -25,6 +24,7 @@
"@rollup/plugin-commonjs": "^28.0.6",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.1",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^12.1.4",
"@types/cors": "^2.8.19",
"@types/express": "^5.0.3",
@@ -54,343 +54,6 @@
"node": ">=14.17.0"
}
},
"node_modules/@inquirer/checkbox": {
"version": "4.2.2",
"resolved": "https://registry.npmmirror.com/@inquirer/checkbox/-/checkbox-4.2.2.tgz",
"integrity": "sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/confirm": {
"version": "5.1.16",
"resolved": "https://registry.npmmirror.com/@inquirer/confirm/-/confirm-5.1.16.tgz",
"integrity": "sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/type": "^3.0.8"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/core": {
"version": "10.2.0",
"resolved": "https://registry.npmmirror.com/@inquirer/core/-/core-10.2.0.tgz",
"integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==",
"license": "MIT",
"dependencies": {
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"cli-width": "^4.1.0",
"mute-stream": "^2.0.0",
"signal-exit": "^4.1.0",
"wrap-ansi": "^6.2.0",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/core/node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
"license": "ISC",
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@inquirer/editor": {
"version": "4.2.18",
"resolved": "https://registry.npmmirror.com/@inquirer/editor/-/editor-4.2.18.tgz",
"integrity": "sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/external-editor": "^1.0.1",
"@inquirer/type": "^3.0.8"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/expand": {
"version": "4.0.18",
"resolved": "https://registry.npmmirror.com/@inquirer/expand/-/expand-4.0.18.tgz",
"integrity": "sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/type": "^3.0.8",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/external-editor": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/@inquirer/external-editor/-/external-editor-1.0.1.tgz",
"integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==",
"license": "MIT",
"dependencies": {
"chardet": "^2.1.0",
"iconv-lite": "^0.6.3"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/figures": {
"version": "1.0.13",
"resolved": "https://registry.npmmirror.com/@inquirer/figures/-/figures-1.0.13.tgz",
"integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==",
"license": "MIT",
"engines": {
"node": ">=18"
}
},
"node_modules/@inquirer/input": {
"version": "4.2.2",
"resolved": "https://registry.npmmirror.com/@inquirer/input/-/input-4.2.2.tgz",
"integrity": "sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/type": "^3.0.8"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/number": {
"version": "3.0.18",
"resolved": "https://registry.npmmirror.com/@inquirer/number/-/number-3.0.18.tgz",
"integrity": "sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/type": "^3.0.8"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/password": {
"version": "4.0.18",
"resolved": "https://registry.npmmirror.com/@inquirer/password/-/password-4.0.18.tgz",
"integrity": "sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/prompts": {
"version": "7.8.4",
"resolved": "https://registry.npmmirror.com/@inquirer/prompts/-/prompts-7.8.4.tgz",
"integrity": "sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==",
"license": "MIT",
"dependencies": {
"@inquirer/checkbox": "^4.2.2",
"@inquirer/confirm": "^5.1.16",
"@inquirer/editor": "^4.2.18",
"@inquirer/expand": "^4.0.18",
"@inquirer/input": "^4.2.2",
"@inquirer/number": "^3.0.18",
"@inquirer/password": "^4.0.18",
"@inquirer/rawlist": "^4.1.6",
"@inquirer/search": "^3.1.1",
"@inquirer/select": "^4.3.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/rawlist": {
"version": "4.1.6",
"resolved": "https://registry.npmmirror.com/@inquirer/rawlist/-/rawlist-4.1.6.tgz",
"integrity": "sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/type": "^3.0.8",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/search": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/@inquirer/search/-/search-3.1.1.tgz",
"integrity": "sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/select": {
"version": "4.3.2",
"resolved": "https://registry.npmmirror.com/@inquirer/select/-/select-4.3.2.tgz",
"integrity": "sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/figures": "^1.0.13",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"yoctocolors-cjs": "^2.1.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@inquirer/type": {
"version": "3.0.8",
"resolved": "https://registry.npmmirror.com/@inquirer/type/-/type-3.0.8.tgz",
"integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -583,6 +246,29 @@
}
}
},
"node_modules/@rollup/plugin-terser": {
"version": "0.4.4",
"resolved": "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz",
"integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"serialize-javascript": "^6.0.1",
"smob": "^1.0.0",
"terser": "^5.17.4"
},
"engines": {
"node": ">=14.0.0"
},
"peerDependencies": {
"rollup": "^2.0.0||^3.0.0||^4.0.0"
},
"peerDependenciesMeta": {
"rollup": {
"optional": true
}
}
},
"node_modules/@rollup/plugin-typescript": {
"version": "12.1.4",
"resolved": "https://registry.npmmirror.com/@rollup/plugin-typescript/-/plugin-typescript-12.1.4.tgz",
@@ -1124,7 +810,7 @@
"version": "24.3.1",
"resolved": "https://registry.npmmirror.com/@types/node/-/node-24.3.1.tgz",
"integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==",
"devOptional": true,
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~7.10.0"
@@ -1607,33 +1293,6 @@
"ajv": "^8.8.2"
}
},
"node_modules/ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
"integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
"license": "MIT",
"dependencies": {
"type-fest": "^0.21.3"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ansi-escapes/node_modules/type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz",
"integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ansi-regex": {
"version": "4.1.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz",
@@ -2171,12 +1830,6 @@
"node": ">=4"
}
},
"node_modules/chardet": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/chardet/-/chardet-2.1.0.tgz",
"integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==",
"license": "MIT"
},
"node_modules/chrome-trace-event": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
@@ -2213,15 +1866,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cli-width": {
"version": "4.1.0",
"resolved": "https://registry.npmmirror.com/cli-width/-/cli-width-4.1.0.tgz",
"integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
"license": "ISC",
"engines": {
"node": ">= 12"
}
},
"node_modules/clone": {
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz",
@@ -3093,12 +2737,6 @@
"dev": true,
"license": "ISC"
},
"node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -4060,32 +3698,6 @@
"dev": true,
"license": "ISC"
},
"node_modules/inquirer": {
"version": "12.9.4",
"resolved": "https://registry.npmmirror.com/inquirer/-/inquirer-12.9.4.tgz",
"integrity": "sha512-5bV3LOgLtMAiJq1QpaUddfRrvaX59wiMYppS7z2jNRSQ64acI0yqx7WMxWhgymenSXOyD657g9tlsTjqGYM8sg==",
"license": "MIT",
"dependencies": {
"@inquirer/core": "^10.2.0",
"@inquirer/prompts": "^7.8.4",
"@inquirer/type": "^3.0.8",
"ansi-escapes": "^4.3.2",
"mute-stream": "^2.0.0",
"run-async": "^4.0.5",
"rxjs": "^7.8.2"
},
"engines": {
"node": ">=18"
},
"peerDependencies": {
"@types/node": ">=18"
},
"peerDependenciesMeta": {
"@types/node": {
"optional": true
}
}
},
"node_modules/interpret": {
"version": "3.1.1",
"resolved": "https://registry.npmmirror.com/interpret/-/interpret-3.1.1.tgz",
@@ -4158,15 +3770,6 @@
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
@@ -4832,15 +4435,6 @@
"readable-stream": "^3.6.0"
}
},
"node_modules/mute-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-2.0.0.tgz",
"integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
"license": "ISC",
"engines": {
"node": "^18.17.0 || >=20.5.0"
}
},
"node_modules/negotiator": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz",
@@ -5783,15 +5377,6 @@
"node": ">= 18"
}
},
"node_modules/run-async": {
"version": "4.0.6",
"resolved": "https://registry.npmmirror.com/run-async/-/run-async-4.0.6.tgz",
"integrity": "sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==",
"license": "MIT",
"engines": {
"node": ">=0.12.0"
}
},
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
@@ -5827,15 +5412,6 @@
"run-script-os": "index.js"
}
},
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -6114,6 +5690,13 @@
"node": ">=8"
}
},
"node_modules/smob": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/smob/-/smob-1.5.0.tgz",
"integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==",
"dev": true,
"license": "MIT"
},
"node_modules/sort-keys": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz",
@@ -6244,41 +5827,6 @@
"webpack": "^5"
}
},
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/string-width/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/string-width/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/strip-ansi": {
"version": "5.2.0",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -6624,6 +6172,7 @@
"version": "2.8.1",
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true,
"license": "0BSD"
},
"node_modules/tunnel-agent": {
@@ -6727,7 +6276,7 @@
"version": "7.10.0",
"resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.10.0.tgz",
"integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
"devOptional": true,
"dev": true,
"license": "MIT"
},
"node_modules/universalify": {
@@ -7032,74 +6581,6 @@
"dev": true,
"license": "MIT"
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/wrap-ansi/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/wrap-ansi/node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/wrap-ansi/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"license": "MIT"
},
"node_modules/wrap-ansi/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
@@ -7149,18 +6630,6 @@
"node": ">=12"
}
},
"node_modules/yoctocolors-cjs": {
"version": "2.1.3",
"resolved": "https://registry.npmmirror.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz",
"integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==",
"license": "MIT",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/zip-stream": {
"version": "4.1.1",
"resolved": "https://registry.npmmirror.com/zip-stream/-/zip-stream-4.1.1.tgz",

View File

@@ -16,6 +16,7 @@
"@rollup/plugin-commonjs": "^28.0.6",
"@rollup/plugin-json": "^6.1.0",
"@rollup/plugin-node-resolve": "^16.0.1",
"@rollup/plugin-terser": "^0.4.4",
"@rollup/plugin-typescript": "^12.1.4",
"@types/cors": "^2.8.19",
"@types/express": "^5.0.3",
@@ -32,7 +33,6 @@
"express": "^5.1.0",
"fs-extra": "^11.3.1",
"got": "^14.4.8",
"inquirer": "^12.9.4",
"multer": "^2.0.2",
"p-map": "^7.0.3",
"p-retry": "^7.0.0",

View File

@@ -3,6 +3,7 @@ import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs'
import json from '@rollup/plugin-json';
import { nodeResolve } from '@rollup/plugin-node-resolve';
import terser from '@rollup/plugin-terser';
/** @type {import('rollup').RollupOptions} */
// ---cut---
export default {
@@ -17,6 +18,7 @@ export default {
nodeResolve(),
resolve({preferBuiltins: true}),
commonjs(),
json()
json(),
terser()
]
};

View File

@@ -1,16 +1,13 @@
import fs from "node:fs";
import p from "node:path"
import websocket, { WebSocketServer } from "ws";
import { yauzl_promise } from "./utils/yauzl.promise.js";
import { pipeline } from "node:stream/promises";
import { platform, what_platform } from "./platform/index.js";
import { DeEarth } from "./utils/DeEarth.js";
import { mlsetup } from "./modloader/index.js";
import { console } from "node:inspector";
interface Iinfo{
name:string
buffer:Buffer
}
import { dinstall, mlsetup } from "./modloader/index.js";
import config from "./utils/config.js";
import { execPromise } from "./utils/utils.js";
export class Dex {
wsx!: WebSocketServer;
@@ -18,79 +15,128 @@ export class Dex {
ws!: websocket;
constructor(ws: WebSocketServer) {
this.wsx = ws;
this.wsx.on('connection',(e)=>{
this.ws = e
})
this.in = {}
}
this.wsx.on("connection", (e) => {
this.ws = e;
});
this.in = {};
}
public async Main(buffer: Buffer) {
const first = Date.now()
const info = await this._getinfo(buffer)
const plat = what_platform(info)
const mpname = this.in.name
const unpath = `./instance/${mpname}`
public async Main(buffer: Buffer, dser: boolean) {
const first = Date.now();
const info = await this._getinfo(buffer);
const plat = what_platform(info);
const mpname = this.in.name;
const unpath = `./instance/${mpname}`;
await Promise.all([
this._unzip(buffer,mpname),
await platform(plat).downloadfile(this.in,unpath,this.ws)
]) // 解压和下载
this.ws.send(JSON.stringify({
this._unzip(buffer, mpname),
await platform(plat).downloadfile(this.in, unpath, this.ws),
]); // 解压和下载
this.ws.send(
JSON.stringify({
status: "changed",
result: undefined
})); //改变状态
await new DeEarth(`${unpath}/mods`,`./.rubbish/${mpname}`).Main()
this.ws.send(JSON.stringify({
result: undefined,
})
); //改变状态
await new DeEarth(`${unpath}/mods`, `./.rubbish/${mpname}`).Main();
this.ws.send(
JSON.stringify({
status: "changed",
result: undefined
})); //改变状态(DeEarth筛选模组完毕)
const mlinfo = await platform(plat).getinfo(this.in)
await mlsetup(mlinfo.loader,mlinfo.minecraft,mlinfo.loader_version,unpath) //安装服务端
const latest = Date.now()
this.ws.send(JSON.stringify({
result: undefined,
})
); //改变状态(DeEarth筛选模组完毕)
const mlinfo = await platform(plat).getinfo(this.in);
if (dser) {
await mlsetup(
mlinfo.loader,
mlinfo.minecraft,
mlinfo.loader_version,
unpath
); //安装服务端
}
if (!dser) {
dinstall(mlinfo.loader, mlinfo.minecraft, mlinfo.loader_version, unpath);
}
const latest = Date.now();
this.ws.send(
JSON.stringify({
status: "finish",
result: latest - first
}))
result: latest - first,
})
);
if (config.oaf) {
await execPromise(`start ${p.join("./instance")}`);
}
//await this._unzip(buffer);
}
private async _getinfo(buffer: Buffer){
const important_name = ["manifest.json","modrinth.index.json"]
let contain:string = ""
private async _getinfo(buffer: Buffer) {
const important_name = ["manifest.json", "modrinth.index.json"];
let contain: string = "";
const zip = await yauzl_promise(buffer);
zip.forEach(async e=>{
if (important_name.includes(e.fileName)){
contain = e.fileName
this.in = JSON.parse((e.ReadEntrySync).toString())
zip.forEach(async (e) => {
if (important_name.includes(e.fileName)) {
contain = e.fileName;
this.in = JSON.parse(e.ReadEntrySync.toString());
return;
}
})
});
return contain;
}
private async _unzip(buffer: Buffer,instancename:string) {
private async _unzip(buffer: Buffer, instancename: string) {
/* 解压Zip */
const zip = await yauzl_promise(buffer);
let index = 1;
for await (const entry of zip) {
const ew = entry.fileName.endsWith("/");
if (ew) {
await fs.promises.mkdir(`./instance/${instancename}/${entry.fileName}`, {
await fs.promises.mkdir(
`./instance/${instancename}/${entry.fileName}`,
{
recursive: true,
});
}
if (!ew&&entry.fileName.startsWith("overrides/")) {
const dirPath = `./instance/${instancename}/${entry.fileName.substring(
0,
entry.fileName.lastIndexOf("/")
).replace("overrides/","")}`;
);
}
if (!ew && entry.fileName.startsWith("overrides/")) {
const dirPath = `./instance/${instancename}/${entry.fileName
.substring(0, entry.fileName.lastIndexOf("/"))
.replace("overrides/", "")}`;
if (this._ublack(entry.fileName)) {
index++;
continue;
}
await fs.promises.mkdir(dirPath, { recursive: true });
const stream = await entry.openReadStream;
const write = fs.createWriteStream(`./instance/${instancename}/${entry.fileName.replace("overrides/","")}`);
const write = fs.createWriteStream(
`./instance/${instancename}/${entry.fileName.replace(
"overrides/",
""
)}`
);
await pipeline(stream, write);
}
this.ws.send(JSON.stringify({ status: "unzip", result: { name: entry.fileName,total: zip.length, current:index } }));
index++
this.ws.send(
JSON.stringify({
status: "unzip",
result: { name: entry.fileName, total: zip.length, current: index },
})
);
index++;
}
/* 解压完成 */
}
private _ublack(filename: string) {
if (filename === "overrides/") {
return true;
}
if (
filename.includes("shaderpacks") ||
filename.includes("essential") ||
filename.includes("resourcepacks") ||
filename === "overrides/options.txt"
) {
return true;
}
}
}

View File

@@ -3,12 +3,9 @@ import multer from "multer";
import cors from "cors"
import websocket, { WebSocketServer } from "ws"
import { createServer, Server } from "node:http";
import fs from "node:fs"
import { pipeline } from "node:stream/promises";
import { Config, IConfig } from "./utils/config.js";
import { yauzl_promise } from "./utils/yauzl.promise.js";
import { Dex } from "./Dex.js";
import { mlsetup } from "./modloader/index.js";
import { exec } from "node:child_process";
export class Core {
private config: IConfig;
private readonly app: Application;
@@ -30,14 +27,36 @@ export class Core {
this.dex = new Dex(this.ws)
}
javachecker(){
exec("java -version",(err,stdout,stderr)=>{
if(err){
this.wsx.send(JSON.stringify({
type:"error",
message:"jini"
}))
}
})
}
express() {
this.app.use(cors());
this.app.use(express.json());
this.app.get('/',(req,res)=>{
res.json({
status:200,
by:"DeEarthX.Core",
qqg:"559349662",
bilibili:"https://space.bilibili.com/1728953419"
})
})
this.app.post("/start", this.upload.single("file"), (req, res) => {
if (!req.file) {
return;
}
this.dex.Main(req.file.buffer) //Dex
if (!req.query.mode){
return;
}
this.dex.Main(req.file.buffer,req.query.mode == "server") //Dex
//this.dex.Main(req.file.buffer)
res.json({
status:200,

View File

@@ -31,7 +31,7 @@ export class Fabric{
}
async setup():Promise<void>{
await this.getLaestLoader()
await this.installer()
await this.libraries()
await this.install()
await this.wshell()
@@ -59,7 +59,7 @@ export class Fabric{
await xfastdownload(_downlist)
}
async getLaestLoader(){
async installer(){
let downurl = ""
const res = await this.got.get("fabric-meta/v2/versions/installer").json<ILatestLoader[]>()
res.forEach(e=>{

View File

@@ -4,7 +4,8 @@ import { Minecraft } from "./minecraft.js";
import { NeoForge } from "./neoforge.js";
interface XModloader {
setup(): Promise<void>
setup(): Promise<void>;
installer(): Promise<void>;
}
export function modloader(ml:string,mcv:string,mlv:string,path:string){
let modloader:XModloader
@@ -34,3 +35,7 @@ export async function mlsetup(ml:string,mcv:string,mlv:string,path:string){
await modloader(ml,mcv,mlv,path).setup()
await minecraft.setup()
}
export async function dinstall(ml:string,mcv:string,mlv:string,path:string){
await modloader(ml,mcv,mlv,path).installer();
}

View File

@@ -109,6 +109,10 @@ export class Minecraft {
// 依赖解压
}
async installer(){ //占位
}
async eula(){
const context = `#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).\n#Spawn by DeEarthX(QQgroup:559349662) Tianpao:(https://space.bilibili.com/1728953419)\neula=true`
await fs.promises.writeFile(`${this.path}/eula.txt`,context)

View File

@@ -9,6 +9,7 @@ export interface IConfig {
dexpub: boolean;
mixins: boolean;
};
oaf: boolean
}
export class Config {
@@ -22,6 +23,7 @@ export class Config {
dexpub: false,
mixins: true,
},
oaf:true
};
config(): IConfig {
if (!fs.existsSync("./config.json")) {

View File

@@ -49,7 +49,7 @@ export function version_compare(v1: string, v2: string) {
return 0;
}
export function execPromise(cmd:string,options:ExecOptions){
export function execPromise(cmd:string,options?:ExecOptions){
return new Promise((resolve,reject)=>{
exec(cmd,options,(err,stdout,stderr)=>{
if(err){

BIN
front/public/dex.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

View File

@@ -1,5 +1,3 @@
use tauri::Manager;
// Learn more about Tauri commands at https://tauri.app/develop/calling-rust/
#[tauri::command]
fn greet(name: &str) -> String {

View File

@@ -78,51 +78,36 @@ const handleClick: MenuProps['onClick'] = (e) => {
break;
}
}
const theme = ref({
"token": {
"colorPrimary": "#67eac3",
}
})
</script>
<template>
<a-config-provider :theme="theme">
<div class="tw:h-screen tw:w-screen">
<a-page-header class="tw:fixed tw:h-16" style="border: 1px solid rgb(235, 237, 240)" title="DeEarthX"
sub-title="V3"
:avatar="{ src: '../assets/tianpao.jpg' }"
>
sub-title="V3" :avatar="{ src: './public/dex.png' }">
<template #extra>
<a-button @click="contant">作者B站</a-button>
</template>
</a-page-header>
<div class="tw:flex tw:full tw:h-89/100">
<a-menu id="menu" style="width: 144px;" :selectedKeys="selectedKeys" mode="inline" :items="items" @click="handleClick"/>
<a-menu id="menu" style="width: 144px;" :selectedKeys="selectedKeys" mode="inline" :items="items"
@click="handleClick" />
<RouterView />
</div>
</div>
</a-config-provider>
</template>
<style>
/* 禁止选择文本的样式 */
h1 {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select:none;
}
li {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select:none;
}
p {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select:none;
}
span {
h1,li,p,span {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;

View File

@@ -4,8 +4,9 @@ import { InboxOutlined } from '@ant-design/icons-vue';
import { message, StepsProps } from 'ant-design-vue';
import type { UploadFile, UploadChangeParam } from 'ant-design-vue';
import {sendNotification,} from '@tauri-apps/plugin-notification';
import { SelectProps } from 'ant-design-vue/es/vc-select';
interface IWSM {
status: "unzip"|"finish"|"changed"|"downloading",
status: "unzip"|"finish"|"changed"|"downloading"|"error",
result: any
}
/* 进度显示区 */
@@ -72,7 +73,7 @@ function runDeEarthX(data: Blob) {
const fd = new FormData();
fd.append('file', data);
console.log(fd.getAll('file'))
fetch('http://localhost:37019/start',{
fetch(`http://localhost:37019/start?mode=${Cselect.value}`,{
method:'POST',
body:fd
}).then(async res=>res.json()).then(()=>{
@@ -81,6 +82,7 @@ function runDeEarthX(data: Blob) {
}
const prog = ref({status:"active",percent:0,display:true})
const dprog = ref({status:"active",percent:0,display:true})
const CanO = ref(true);
function prews(){
const ws = new WebSocket('ws://localhost:37019/')
// ws.addEventListener('message',(wsm)=>{
@@ -93,6 +95,10 @@ function prews(){
ws.addEventListener('message',(wsm)=>{
const _data = JSON.parse(wsm.data) as IWSM
//console.log(_data)
if (_data.status === "error" && _data.result === "jini") {
CanO.value = false;
message.error("未在系统变量中找到Java请安装Java否则开服模式将无法使用")
}
if (_data.status === "changed") { //状态更改
setyps_current.value ++;
}
@@ -126,6 +132,26 @@ function prews(){
}
})
}
/* 选择区 */
const Moptions = ref<SelectProps['options']>([
{
label: '开服模式',
value: 'server',
disabled: CanO.value ? false : true
},
{
label: '上传模式',
value: 'upload',
disabled: false
}
])
const Cselect = ref(CanO ? 'server' : 'upload')
function handleSelect(value: string) {
Cselect.value = value;
}
</script>
<template>
<div class="tw:h-full tw:w-full tw:relative">
@@ -145,7 +171,14 @@ function prews(){
请使用.zipCurseForgeMCBBS.mrpckModrinth文件
</p>
</a-upload-dragger>
<a-button :disabled="BtnisDisabled" type="primary" @click="handleUpload" style="margin-top: 32px">
<a-select
ref="select"
:options="Moptions"
:value="Cselect"
style="width: 120px;margin-top: 32px"
@select="handleSelect"
></a-select>
<a-button :disabled="BtnisDisabled" type="primary" @click="handleUpload" style="margin-top: 6px">
开始
</a-button>
</div>

View File

@@ -12,26 +12,27 @@ interface IConfig {
dexpub: boolean;
mixins: boolean;
};
oaf: boolean
}
const config = ref<IConfig>({mirror: {bmclapi: false, mcimirror: false}, filter: {hashes: false, dexpub: false, mixins: false}})
fetch('http://localhost:37019/config/get',{
const config = ref<IConfig>({ mirror: { bmclapi: false, mcimirror: false }, filter: { hashes: false, dexpub: false, mixins: false }, oaf: false})
fetch('http://localhost:37019/config/get', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
}).then(res=>res.json()).then(res=>config.value = res)
}).then(res => res.json()).then(res => config.value = res)
let first = true;
watch(config,(newv)=>{ //写入Config
if(!first){
fetch('http://localhost:37019/config/post',{
watch(config, (newv) => { //写入Config
if (!first) {
fetch('http://localhost:37019/config/post', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(newv)
}).then(res=>{
if(res.status === 200){
}).then(res => {
if (res.status === 200) {
message.success('配置已保存')
}
})
@@ -40,9 +41,9 @@ watch(config,(newv)=>{ //写入Config
// })
console.log(newv)
return
}
}
first = false;
},{deep:true})
}, { deep: true })
</script>
<template>
@@ -80,5 +81,13 @@ watch(config,(newv)=>{ //写入Config
<a-switch class="tw:left-2" v-model:checked="config.mirror.mcimirror" />
</div>
</div>
<div class="tw:border-t-2 tw:border-gray-400 tw:mt-6 tw:mb-2"></div>
<!-- DeEarthX管理 -->
<div class="tw:flex">
<div class="tw:flex tw:ml-5 tw:mt-2">
<p class="tw:text-gray-600">完毕后打开目录</p>
<a-switch class="tw:left-2" v-model:checked="config.oaf" />
</div>
</div>
</div>
</template>

View File

@@ -1,3 +1,2 @@
安装DeEarthX V3时默认安装至C:\Program Files\DeEarthX-V3 建议不要装在C盘因为权限问题
请自行记好安装目录!!!
QQ群559349662