diff --git a/client/package.json b/client/package.json index 35be01fe2..7d84398c2 100644 --- a/client/package.json +++ b/client/package.json @@ -37,6 +37,7 @@ "mammoth": "^1.5.1", "mermaid": "^10.2.3", "mongoose": "^6.10.0", + "multer": "1.4.5-lts.1", "nanoid": "^4.0.1", "next": "13.1.6", "next-i18next": "^13.3.0", @@ -72,6 +73,7 @@ "@types/jsdom": "^21.1.1", "@types/jsonwebtoken": "^9.0.1", "@types/lodash": "^4.14.191", + "@types/multer": "^1.4.7", "@types/node": "18.14.0", "@types/papaparse": "^5.3.7", "@types/pg": "^8.6.6", diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index fec886f9c..3c6d39e45 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -1,4 +1,8 @@ -lockfileVersion: '6.0' +lockfileVersion: '6.1' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: '@chakra-ui/icons': @@ -85,12 +89,15 @@ dependencies: mongoose: specifier: ^6.10.0 version: registry.npmmirror.com/mongoose@6.10.0 + multer: + specifier: 1.4.5-lts.1 + version: registry.npmmirror.com/multer@1.4.5-lts.1 nanoid: specifier: ^4.0.1 version: registry.npmmirror.com/nanoid@4.0.1 next: specifier: 13.1.6 - version: registry.npmmirror.com/next@13.1.6(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + version: registry.npmmirror.com/next@13.1.6(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) next-i18next: specifier: ^13.3.0 version: registry.npmmirror.com/next-i18next@13.3.0(i18next@22.5.1)(next@13.1.6)(react-i18next@12.3.1)(react@18.2.0) @@ -186,6 +193,9 @@ devDependencies: '@types/lodash': specifier: ^4.14.191 version: registry.npmmirror.com/@types/lodash@4.14.191 + '@types/multer': + specifier: ^1.4.7 + version: registry.npmmirror.com/@types/multer@1.4.7 '@types/node': specifier: 18.14.0 version: registry.npmmirror.com/@types/node@18.14.0 @@ -230,7 +240,6 @@ packages: dependencies: '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.18 - dev: true registry.npmmirror.com/@aws-crypto/crc32@3.0.0: resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz} @@ -1211,7 +1220,6 @@ packages: name: '@babel/compat-data' version: 7.22.5 engines: {node: '>=6.9.0'} - dev: true registry.npmmirror.com/@babel/core@7.22.5: resolution: {integrity: sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/core/-/core-7.22.5.tgz} @@ -1236,7 +1244,6 @@ packages: semver: registry.npmmirror.com/semver@6.3.0 transitivePeerDependencies: - supports-color - dev: true registry.npmmirror.com/@babel/generator@7.22.5: resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/generator/-/generator-7.22.5.tgz} @@ -1248,7 +1255,6 @@ packages: '@jridgewell/gen-mapping': registry.npmmirror.com/@jridgewell/gen-mapping@0.3.3 '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.18 jsesc: registry.npmmirror.com/jsesc@2.5.2 - dev: true registry.npmmirror.com/@babel/helper-annotate-as-pure@7.22.5: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz} @@ -1283,7 +1289,6 @@ packages: browserslist: registry.npmmirror.com/browserslist@4.21.7 lru-cache: registry.npmmirror.com/lru-cache@5.1.1 semver: registry.npmmirror.com/semver@6.3.0 - dev: true registry.npmmirror.com/@babel/helper-create-class-features-plugin@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.5.tgz} @@ -1347,7 +1352,6 @@ packages: name: '@babel/helper-environment-visitor' version: 7.22.5 engines: {node: '>=6.9.0'} - dev: true registry.npmmirror.com/@babel/helper-function-name@7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz} @@ -1357,7 +1361,6 @@ packages: dependencies: '@babel/template': registry.npmmirror.com/@babel/template@7.22.5 '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 - dev: true registry.npmmirror.com/@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz} @@ -1366,7 +1369,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 - dev: true registry.npmmirror.com/@babel/helper-member-expression-to-functions@7.22.5: resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz} @@ -1401,7 +1403,6 @@ packages: '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 transitivePeerDependencies: - supports-color - dev: true registry.npmmirror.com/@babel/helper-optimise-call-expression@7.22.5: resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz} @@ -1460,7 +1461,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 - dev: true registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers@7.22.5: resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz} @@ -1478,7 +1478,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 - dev: true registry.npmmirror.com/@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz} @@ -1497,7 +1496,6 @@ packages: name: '@babel/helper-validator-option' version: 7.22.5 engines: {node: '>=6.9.0'} - dev: true registry.npmmirror.com/@babel/helper-wrap-function@7.22.5: resolution: {integrity: sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz} @@ -1524,7 +1522,6 @@ packages: '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 transitivePeerDependencies: - supports-color - dev: true registry.npmmirror.com/@babel/highlight@7.22.5: resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.5.tgz} @@ -1544,7 +1541,6 @@ packages: hasBin: true dependencies: '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 - dev: true registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.22.5(@babel/core@7.22.5): resolution: {integrity: sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz} @@ -2807,7 +2803,6 @@ packages: '@babel/code-frame': registry.npmmirror.com/@babel/code-frame@7.22.5 '@babel/parser': registry.npmmirror.com/@babel/parser@7.22.5 '@babel/types': registry.npmmirror.com/@babel/types@7.22.5 - dev: true registry.npmmirror.com/@babel/traverse@7.22.5: resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/traverse/-/traverse-7.22.5.tgz} @@ -2827,7 +2822,6 @@ packages: globals: registry.npmmirror.com/globals@11.12.0 transitivePeerDependencies: - supports-color - dev: true registry.npmmirror.com/@babel/types@7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@babel/types/-/types-7.22.5.tgz} @@ -4421,33 +4415,28 @@ packages: '@jridgewell/set-array': registry.npmmirror.com/@jridgewell/set-array@1.1.2 '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15 '@jridgewell/trace-mapping': registry.npmmirror.com/@jridgewell/trace-mapping@0.3.18 - dev: true registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz} name: '@jridgewell/resolve-uri' version: 3.1.0 engines: {node: '>=6.0.0'} - dev: true registry.npmmirror.com/@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz} name: '@jridgewell/set-array' version: 1.1.2 engines: {node: '>=6.0.0'} - dev: true registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz} name: '@jridgewell/sourcemap-codec' version: 1.4.14 - dev: true registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz} name: '@jridgewell/sourcemap-codec' version: 1.4.15 - dev: true registry.npmmirror.com/@jridgewell/trace-mapping@0.3.18: resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz} @@ -4456,7 +4445,6 @@ packages: dependencies: '@jridgewell/resolve-uri': registry.npmmirror.com/@jridgewell/resolve-uri@3.1.0 '@jridgewell/sourcemap-codec': registry.npmmirror.com/@jridgewell/sourcemap-codec@1.4.14 - dev: true registry.npmmirror.com/@motionone/animation@10.15.1: resolution: {integrity: sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@motionone/animation/-/animation-10.15.1.tgz} @@ -5126,6 +5114,23 @@ packages: engines: {node: '>=10.13.0'} dev: true + registry.npmmirror.com/@types/body-parser@1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.2.tgz} + name: '@types/body-parser' + version: 1.19.2 + dependencies: + '@types/connect': registry.npmmirror.com/@types/connect@3.4.35 + '@types/node': registry.npmmirror.com/@types/node@18.14.0 + dev: true + + registry.npmmirror.com/@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/connect/-/connect-3.4.35.tgz} + name: '@types/connect' + version: 3.4.35 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@18.14.0 + dev: true + registry.npmmirror.com/@types/cookie@0.5.1: resolution: {integrity: sha512-COUnqfB2+ckwXXSFInsFdOAWQzCCx+a5hq2ruyj+Vjund94RJQd4LG2u9hnvJrTgunKAaax7ancBYlDrNYxA0g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/cookie/-/cookie-0.5.1.tgz} name: '@types/cookie' @@ -5381,6 +5386,28 @@ packages: '@types/ms': registry.npmmirror.com/@types/ms@0.7.31 dev: false + registry.npmmirror.com/@types/express-serve-static-core@4.17.36: + resolution: {integrity: sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz} + name: '@types/express-serve-static-core' + version: 4.17.36 + dependencies: + '@types/node': registry.npmmirror.com/@types/node@18.14.0 + '@types/qs': registry.npmmirror.com/@types/qs@6.9.8 + '@types/range-parser': registry.npmmirror.com/@types/range-parser@1.2.4 + '@types/send': registry.npmmirror.com/@types/send@0.17.1 + dev: true + + registry.npmmirror.com/@types/express@4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/express/-/express-4.17.17.tgz} + name: '@types/express' + version: 4.17.17 + dependencies: + '@types/body-parser': registry.npmmirror.com/@types/body-parser@1.19.2 + '@types/express-serve-static-core': registry.npmmirror.com/@types/express-serve-static-core@4.17.36 + '@types/qs': registry.npmmirror.com/@types/qs@6.9.8 + '@types/serve-static': registry.npmmirror.com/@types/serve-static@1.15.2 + dev: true + registry.npmmirror.com/@types/formidable@2.0.5: resolution: {integrity: sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/formidable/-/formidable-2.0.5.tgz} name: '@types/formidable' @@ -5412,6 +5439,12 @@ packages: hoist-non-react-statics: registry.npmmirror.com/hoist-non-react-statics@3.3.2 dev: false + registry.npmmirror.com/@types/http-errors@2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.1.tgz} + name: '@types/http-errors' + version: 2.0.1 + dev: true + registry.npmmirror.com/@types/js-cookie@3.0.3: resolution: {integrity: sha512-Xe7IImK09HP1sv2M/aI+48a20VX+TdRJucfq4vfRVy6nWN8PYPOEnlMRSgxJAgYQIXJVL8dZ4/ilAM7dWNaOww==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/js-cookie/-/js-cookie-3.0.3.tgz} name: '@types/js-cookie' @@ -5475,12 +5508,32 @@ packages: '@types/unist': registry.npmmirror.com/@types/unist@2.0.6 dev: false + registry.npmmirror.com/@types/mime@1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/mime/-/mime-1.3.2.tgz} + name: '@types/mime' + version: 1.3.2 + dev: true + + registry.npmmirror.com/@types/mime@3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/mime/-/mime-3.0.1.tgz} + name: '@types/mime' + version: 3.0.1 + dev: true + registry.npmmirror.com/@types/ms@0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/ms/-/ms-0.7.31.tgz} name: '@types/ms' version: 0.7.31 dev: false + registry.npmmirror.com/@types/multer@1.4.7: + resolution: {integrity: sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/multer/-/multer-1.4.7.tgz} + name: '@types/multer' + version: 1.4.7 + dependencies: + '@types/express': registry.npmmirror.com/@types/express@4.17.17 + dev: true + registry.npmmirror.com/@types/node@18.14.0: resolution: {integrity: sha512-5EWrvLmglK+imbCJY0+INViFWUHg1AHel1sq4ZVSfdcNqGy9Edv3UB9IIzzg+xPaUcAgZYcfVs2fBcwDeZzU0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/node/-/node-18.14.0.tgz} name: '@types/node' @@ -5520,6 +5573,18 @@ packages: name: '@types/prop-types' version: 15.7.5 + registry.npmmirror.com/@types/qs@6.9.8: + resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/qs/-/qs-6.9.8.tgz} + name: '@types/qs' + version: 6.9.8 + dev: true + + registry.npmmirror.com/@types/range-parser@1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.4.tgz} + name: '@types/range-parser' + version: 1.2.4 + dev: true + registry.npmmirror.com/@types/react-dom@18.0.11: resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.0.11.tgz} name: '@types/react-dom' @@ -5558,6 +5623,25 @@ packages: name: '@types/scheduler' version: 0.16.3 + registry.npmmirror.com/@types/send@0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/send/-/send-0.17.1.tgz} + name: '@types/send' + version: 0.17.1 + dependencies: + '@types/mime': registry.npmmirror.com/@types/mime@1.3.2 + '@types/node': registry.npmmirror.com/@types/node@18.14.0 + dev: true + + registry.npmmirror.com/@types/serve-static@1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.2.tgz} + name: '@types/serve-static' + version: 1.15.2 + dependencies: + '@types/http-errors': registry.npmmirror.com/@types/http-errors@2.0.1 + '@types/mime': registry.npmmirror.com/@types/mime@3.0.1 + '@types/node': registry.npmmirror.com/@types/node@18.14.0 + dev: true + registry.npmmirror.com/@types/tough-cookie@4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz} name: '@types/tough-cookie' @@ -5766,6 +5850,12 @@ packages: picomatch: registry.npmmirror.com/picomatch@2.3.1 dev: false + registry.npmmirror.com/append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/append-field/-/append-field-1.0.0.tgz} + name: append-field + version: 1.0.0 + dev: false + registry.npmmirror.com/argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz} name: argparse @@ -6083,7 +6173,6 @@ packages: electron-to-chromium: registry.npmmirror.com/electron-to-chromium@1.4.425 node-releases: registry.npmmirror.com/node-releases@2.0.12 update-browserslist-db: registry.npmmirror.com/update-browserslist-db@1.0.11(browserslist@4.21.7) - dev: true registry.npmmirror.com/bson@1.1.6: resolution: {integrity: sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bson/-/bson-1.1.6.tgz} @@ -6107,6 +6196,12 @@ packages: version: 1.0.1 dev: false + registry.npmmirror.com/buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz} + name: buffer-from + version: 1.1.2 + dev: false + registry.npmmirror.com/buffer-writer@2.0.0: resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/buffer-writer/-/buffer-writer-2.0.0.tgz} name: buffer-writer @@ -6132,6 +6227,15 @@ packages: run-applescript: registry.npmmirror.com/run-applescript@5.0.0 dev: true + registry.npmmirror.com/busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/busboy/-/busboy-1.6.0.tgz} + name: busboy + version: 1.6.0 + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: registry.npmmirror.com/streamsearch@1.1.0 + dev: false + registry.npmmirror.com/call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz} name: call-bind @@ -6342,6 +6446,18 @@ packages: version: 0.0.1 dev: true + registry.npmmirror.com/concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/concat-stream/-/concat-stream-1.6.2.tgz} + name: concat-stream + version: 1.6.2 + engines: {'0': node >= 0.8} + dependencies: + buffer-from: registry.npmmirror.com/buffer-from@1.1.2 + inherits: registry.npmmirror.com/inherits@2.0.4 + readable-stream: registry.npmmirror.com/readable-stream@2.3.8 + typedarray: registry.npmmirror.com/typedarray@0.0.6 + dev: false + registry.npmmirror.com/convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.9.0.tgz} name: convert-source-map @@ -7165,7 +7281,6 @@ packages: resolution: {integrity: sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.425.tgz} name: electron-to-chromium version: 1.4.425 - dev: true registry.npmmirror.com/elkjs@0.8.2: resolution: {integrity: sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/elkjs/-/elkjs-0.8.2.tgz} @@ -7307,7 +7422,6 @@ packages: name: escalade version: 3.1.1 engines: {node: '>=6'} - dev: true registry.npmmirror.com/escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz} @@ -7947,7 +8061,6 @@ packages: name: gensync version: 1.0.0-beta.2 engines: {node: '>=6.9.0'} - dev: true registry.npmmirror.com/get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz} @@ -8039,7 +8152,6 @@ packages: name: globals version: 11.12.0 engines: {node: '>=4'} - dev: true registry.npmmirror.com/globals@13.20.0: resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/globals/-/globals-13.20.0.tgz} @@ -8859,7 +8971,6 @@ packages: version: 2.5.2 engines: {node: '>=4'} hasBin: true - dev: true registry.npmmirror.com/json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz} @@ -8893,7 +9004,6 @@ packages: version: 2.2.3 engines: {node: '>=6'} hasBin: true - dev: true registry.npmmirror.com/jsonwebtoken@9.0.0: resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz} @@ -9131,7 +9241,6 @@ packages: version: 5.1.1 dependencies: yallist: registry.npmmirror.com/yallist@3.1.1 - dev: true registry.npmmirror.com/lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz} @@ -9346,6 +9455,13 @@ packages: version: 2.0.14 dev: true + registry.npmmirror.com/media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz} + name: media-typer + version: 0.3.0 + engines: {node: '>= 0.6'} + dev: false + registry.npmmirror.com/memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/memory-pager/-/memory-pager-1.5.0.tgz} name: memory-pager @@ -9761,7 +9877,15 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz} name: minimist version: 1.2.8 - dev: true + + registry.npmmirror.com/mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz} + name: mkdirp + version: 0.5.6 + hasBin: true + dependencies: + minimist: registry.npmmirror.com/minimist@1.2.8 + dev: false registry.npmmirror.com/mongodb-connection-string-url@2.6.0: resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz} @@ -9876,6 +10000,21 @@ packages: name: ms version: 2.1.3 + registry.npmmirror.com/multer@1.4.5-lts.1: + resolution: {integrity: sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/multer/-/multer-1.4.5-lts.1.tgz} + name: multer + version: 1.4.5-lts.1 + engines: {node: '>= 6.0.0'} + dependencies: + append-field: registry.npmmirror.com/append-field@1.0.0 + busboy: registry.npmmirror.com/busboy@1.6.0 + concat-stream: registry.npmmirror.com/concat-stream@1.6.2 + mkdirp: registry.npmmirror.com/mkdirp@0.5.6 + object-assign: registry.npmmirror.com/object-assign@4.1.1 + type-is: registry.npmmirror.com/type-is@1.6.18 + xtend: registry.npmmirror.com/xtend@4.0.2 + dev: false + registry.npmmirror.com/nanoid@3.3.6: resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz} name: nanoid @@ -9916,12 +10055,12 @@ packages: hoist-non-react-statics: registry.npmmirror.com/hoist-non-react-statics@3.3.2 i18next: registry.npmmirror.com/i18next@22.5.1 i18next-fs-backend: registry.npmmirror.com/i18next-fs-backend@2.1.5 - next: registry.npmmirror.com/next@13.1.6(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + next: registry.npmmirror.com/next@13.1.6(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) react: registry.npmmirror.com/react@18.2.0 react-i18next: registry.npmmirror.com/react-i18next@12.3.1(i18next@22.5.1)(react-dom@18.2.0)(react@18.2.0) dev: false - registry.npmmirror.com/next@13.1.6(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3): + registry.npmmirror.com/next@13.1.6(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3): resolution: {integrity: sha512-hHlbhKPj9pW+Cymvfzc15lvhaOZ54l+8sXDXJWm3OBNBzgrVj6hwGPmqqsXg40xO1Leq+kXpllzRPuncpC0Phw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/next/-/next-13.1.6.tgz} id: registry.npmmirror.com/next/13.1.6 name: next @@ -9949,7 +10088,7 @@ packages: react: registry.npmmirror.com/react@18.2.0 react-dom: registry.npmmirror.com/react-dom@18.2.0(react@18.2.0) sass: registry.npmmirror.com/sass@1.58.3 - styled-jsx: registry.npmmirror.com/styled-jsx@5.1.1(react@18.2.0) + styled-jsx: registry.npmmirror.com/styled-jsx@5.1.1(@babel/core@7.22.5)(react@18.2.0) optionalDependencies: '@next/swc-android-arm-eabi': registry.npmmirror.com/@next/swc-android-arm-eabi@13.1.6 '@next/swc-android-arm64': registry.npmmirror.com/@next/swc-android-arm64@13.1.6 @@ -9978,14 +10117,13 @@ packages: next: ^8.1.1-canary.54 || ^9.0.0 || ^10.0.0-0 || ^11.0.0 || ^12.0.0 || ^13.0.0 dependencies: cors: registry.npmmirror.com/cors@2.8.5 - next: registry.npmmirror.com/next@13.1.6(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) + next: registry.npmmirror.com/next@13.1.6(@babel/core@7.22.5)(react-dom@18.2.0)(react@18.2.0)(sass@1.58.3) dev: false registry.npmmirror.com/node-releases@2.0.12: resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/node-releases/-/node-releases-2.0.12.tgz} name: node-releases version: 2.0.12 - dev: true registry.npmmirror.com/non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz} @@ -11172,7 +11310,6 @@ packages: name: semver version: 6.3.0 hasBin: true - dev: true registry.npmmirror.com/semver@7.5.1: resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/semver/-/semver-7.5.1.tgz} @@ -11343,6 +11480,13 @@ packages: internal-slot: registry.npmmirror.com/internal-slot@1.0.5 dev: true + registry.npmmirror.com/streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/streamsearch/-/streamsearch-1.1.0.tgz} + name: streamsearch + version: 1.1.0 + engines: {node: '>=10.0.0'} + dev: false + registry.npmmirror.com/string.prototype.matchall@4.0.8: resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz} name: string.prototype.matchall @@ -11449,7 +11593,7 @@ packages: inline-style-parser: registry.npmmirror.com/inline-style-parser@0.1.1 dev: false - registry.npmmirror.com/styled-jsx@5.1.1(react@18.2.0): + registry.npmmirror.com/styled-jsx@5.1.1(@babel/core@7.22.5)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.1.tgz} id: registry.npmmirror.com/styled-jsx/5.1.1 name: styled-jsx @@ -11465,6 +11609,7 @@ packages: babel-plugin-macros: optional: true dependencies: + '@babel/core': registry.npmmirror.com/@babel/core@7.22.5 client-only: registry.npmmirror.com/client-only@0.0.1 react: registry.npmmirror.com/react@18.2.0 dev: false @@ -11713,6 +11858,16 @@ packages: engines: {node: '>=10'} dev: true + registry.npmmirror.com/type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz} + name: type-is + version: 1.6.18 + engines: {node: '>= 0.6'} + dependencies: + media-typer: registry.npmmirror.com/media-typer@0.3.0 + mime-types: registry.npmmirror.com/mime-types@2.1.35 + dev: false + registry.npmmirror.com/typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.4.tgz} name: typed-array-length @@ -11723,6 +11878,12 @@ packages: is-typed-array: registry.npmmirror.com/is-typed-array@1.1.10 dev: true + registry.npmmirror.com/typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz} + name: typedarray + version: 0.0.6 + dev: false + registry.npmmirror.com/typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz} name: typescript @@ -11886,7 +12047,6 @@ packages: browserslist: registry.npmmirror.com/browserslist@4.21.7 escalade: registry.npmmirror.com/escalade@3.1.1 picocolors: registry.npmmirror.com/picocolors@1.0.0 - dev: true registry.npmmirror.com/uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz} @@ -12249,7 +12409,6 @@ packages: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz} name: yallist version: 3.1.1 - dev: true registry.npmmirror.com/yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz} @@ -12302,7 +12461,3 @@ packages: name: zwitch version: 2.0.4 dev: false - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false diff --git a/client/src/api/service/request.ts b/client/src/api/service/request.ts index 99eb0364e..a4e196418 100644 --- a/client/src/api/service/request.ts +++ b/client/src/api/service/request.ts @@ -1,5 +1,5 @@ import axios, { Method, InternalAxiosRequestConfig, AxiosResponse } from 'axios'; -import { baseUrl } from '../../service/ai/openai'; +import { baseUrl } from '../../service/lib/openai'; interface ConfigType { headers?: { [key: string]: string }; diff --git a/client/src/pages/api/openapi/plugin/vector.ts b/client/src/pages/api/openapi/plugin/vector.ts index 43eaeee74..5ea7f324e 100644 --- a/client/src/pages/api/openapi/plugin/vector.ts +++ b/client/src/pages/api/openapi/plugin/vector.ts @@ -2,7 +2,7 @@ import type { NextApiRequest, NextApiResponse } from 'next'; import { jsonRes } from '@/service/response'; import { authBalanceByUid, authUser } from '@/service/utils/auth'; import { withNextCors } from '@/service/utils/tools'; -import { getAIChatApi, axiosConfig } from '@/service/ai/openai'; +import { getAIChatApi, axiosConfig } from '@/service/lib/openai'; import { pushGenerateVectorBill } from '@/service/events/pushBill'; type Props = { diff --git a/client/src/pages/api/plugins/file/read.ts b/client/src/pages/api/plugins/file/read.ts new file mode 100644 index 000000000..9a7f0add8 --- /dev/null +++ b/client/src/pages/api/plugins/file/read.ts @@ -0,0 +1,36 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@/service/response'; +import { connectToDatabase } from '@/service/mongo'; +import { authUser } from '@/service/utils/auth'; +import { GridFSStorage } from '@/service/lib/gridfs'; + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + await connectToDatabase(); + + const { fileId } = req.query as { fileId: string }; + + if (!fileId) { + throw new Error('fileId is empty'); + } + + const { userId } = await authUser({ req }); + + const gridFs = new GridFSStorage('dataset', userId); + + const [file, buffer] = await Promise.all([ + gridFs.findAndAuthFile(fileId), + gridFs.download(fileId) + ]); + + res.setHeader('encoding', file.encoding); + res.setHeader('Content-Type', file.contentType); + + res.end(buffer); + } catch (error) { + jsonRes(res, { + code: 500, + error + }); + } +} diff --git a/client/src/pages/api/plugins/file/upload.ts b/client/src/pages/api/plugins/file/upload.ts new file mode 100644 index 000000000..0c4401caa --- /dev/null +++ b/client/src/pages/api/plugins/file/upload.ts @@ -0,0 +1,94 @@ +import type { NextApiRequest, NextApiResponse } from 'next'; +import { jsonRes } from '@/service/response'; +import { connectToDatabase } from '@/service/mongo'; +import { authUser } from '@/service/utils/auth'; +import { GridFSStorage } from '@/service/lib/gridfs'; +import { customAlphabet } from 'nanoid'; +import multer from 'multer'; +import path from 'path'; + +const nanoid = customAlphabet('1234567890abcdef', 12); + +type FileType = { + fieldname: string; + originalname: string; + encoding: string; + mimetype: string; + filename: string; + path: string; + size: number; +}; + +/** + * Creates the multer uploader + */ +const maxSize = 50 * 1024 * 1024; +class UploadModel { + uploader = multer({ + limits: { + fieldSize: maxSize + }, + storage: multer.diskStorage({ + filename: (_req, file, cb) => { + const { ext } = path.parse(file.originalname); + cb(null, nanoid() + ext); + } + }) + }).any(); + + async doUpload(req: NextApiRequest, res: NextApiResponse) { + return new Promise<{ files: FileType[] }>((resolve, reject) => { + // @ts-ignore + this.uploader(req, res, (error) => { + if (error) { + return reject(error); + } + + // @ts-ignore + resolve({ files: req.files }); + }); + }); + } +} + +const upload = new UploadModel(); + +export default async function handler(req: NextApiRequest, res: NextApiResponse) { + try { + await connectToDatabase(); + const { userId } = await authUser({ req }); + + const { files } = await upload.doUpload(req, res); + + const gridFs = new GridFSStorage('dataset', userId); + + const upLoadResults = await Promise.all( + files.map((file) => + gridFs.save({ + path: file.path, + filename: file.originalname, + metadata: { + contentType: file.mimetype, + encoding: file.encoding, + userId + } + }) + ) + ); + + jsonRes(res, { + data: upLoadResults + }); + } catch (error) { + jsonRes(res, { + code: 500, + error + }); + } +} + +export const config = { + api: { + bodyParser: false + } +}; diff --git a/client/src/pages/api/user/account/update.ts b/client/src/pages/api/user/account/update.ts index 482113825..4db5875c5 100644 --- a/client/src/pages/api/user/account/update.ts +++ b/client/src/pages/api/user/account/update.ts @@ -5,7 +5,7 @@ import { User } from '@/service/models/user'; import { connectToDatabase } from '@/service/mongo'; import { authUser } from '@/service/utils/auth'; import { UserUpdateParams } from '@/types/user'; -import { axiosConfig, getAIChatApi, openaiBaseUrl } from '@/service/ai/openai'; +import { axiosConfig, getAIChatApi, openaiBaseUrl } from '@/service/lib/openai'; /* update user info */ export default async function handler(req: NextApiRequest, res: NextApiResponse) { diff --git a/client/src/service/errorCode.ts b/client/src/service/errorCode.ts index 4f7114159..5c916117f 100644 --- a/client/src/service/errorCode.ts +++ b/client/src/service/errorCode.ts @@ -39,7 +39,8 @@ export enum ERROR_ENUM { unAuthorization = 'unAuthorization', insufficientQuota = 'insufficientQuota', unAuthModel = 'unAuthModel', - unAuthKb = 'unAuthKb' + unAuthKb = 'unAuthKb', + unAuthFile = 'unAuthFile' } export const ERROR_RESPONSE: Record< any, @@ -73,5 +74,11 @@ export const ERROR_RESPONSE: Record< statusText: ERROR_ENUM.unAuthKb, message: '无权使用该知识库', data: null + }, + [ERROR_ENUM.unAuthFile]: { + code: 513, + statusText: ERROR_ENUM.unAuthFile, + message: '无权阅读该文件', + data: null } }; diff --git a/client/src/service/events/generateQA.ts b/client/src/service/events/generateQA.ts index 2c814c12a..714dc4d01 100644 --- a/client/src/service/events/generateQA.ts +++ b/client/src/service/events/generateQA.ts @@ -5,7 +5,7 @@ import { TrainingModeEnum } from '@/constants/plugin'; import { ERROR_ENUM } from '../errorCode'; import { sendInform } from '@/pages/api/user/inform/send'; import { authBalanceByUid } from '../utils/auth'; -import { axiosConfig, getAIChatApi } from '../ai/openai'; +import { axiosConfig, getAIChatApi } from '../lib/openai'; import { ChatCompletionRequestMessage } from 'openai'; import { modelToolMap } from '@/utils/plugin'; import { gptMessage2ChatType } from '@/utils/adapt'; diff --git a/client/src/service/lib/gridfs.ts b/client/src/service/lib/gridfs.ts new file mode 100644 index 000000000..f6fe10e18 --- /dev/null +++ b/client/src/service/lib/gridfs.ts @@ -0,0 +1,119 @@ +import mongoose, { Types } from 'mongoose'; +import fs from 'fs'; +import fsp from 'fs/promises'; +import { ERROR_ENUM } from '../errorCode'; + +enum BucketNameEnum { + dataset = 'dataset' +} + +type FileInfo = { + id: string; + filename: string; + size: number; + contentType: string; + encoding: string; +}; + +export class GridFSStorage { + readonly type = 'gridfs'; + readonly bucket: `${BucketNameEnum}`; + readonly uid: string; + + constructor(bucket: `${BucketNameEnum}`, uid: string) { + this.bucket = bucket; + this.uid = String(uid); + } + GridFSBucket() { + return new mongoose.mongo.GridFSBucket(mongoose.connection.db, { + bucketName: this.bucket + }); + } + + async save({ + path, + filename, + metadata = {} + }: { + path: string; + filename: string; + metadata?: Record; + }) { + if (!path) return Promise.reject(`filePath is empty`); + if (!filename) return Promise.reject(`filename is empty`); + + const stats = await fsp.stat(path); + if (!stats.isFile()) return Promise.reject(`${path} is not a file`); + + metadata.userId = this.uid; + // create a gridfs bucket + const bucket = this.GridFSBucket(); + + const stream = bucket.openUploadStream(filename, { + metadata, + contentType: metadata?.contentType + }); + + // save to gridfs + await new Promise((resolve, reject) => { + fs.createReadStream(path) + .pipe(stream as any) + .on('finish', resolve) + .on('error', reject); + }); + + return String(stream.id); + } + async findAndAuthFile(id: string): Promise { + if (!id) { + return Promise.reject(`id is empty`); + } + + // create a gridfs bucket + const bucket = this.GridFSBucket(); + + // check if file exists + const files = await bucket.find({ _id: new Types.ObjectId(id) }).toArray(); + const file = files.shift(); + if (!file) { + return Promise.reject(`file not found`); + } + + if (String(file.metadata?.userId) !== this.uid) { + return Promise.reject(ERROR_ENUM.unAuthFile); + } + + return { + id: String(file._id), + filename: file.filename, + contentType: file.metadata?.contentType, + encoding: file.metadata?.encoding, + size: file.length + }; + } + + async delete(id: string) { + await this.findAndAuthFile(id); + const bucket = this.GridFSBucket(); + + await bucket.delete(new Types.ObjectId(id)); + return true; + } + + async download(id: string) { + await this.findAndAuthFile(id); + + const bucket = this.GridFSBucket(); + + const stream = bucket.openDownloadStream(new Types.ObjectId(id)); + + const buf: Buffer = await new Promise((resolve, reject) => { + const buffers: Buffer[] = []; + stream.on('data', (data) => buffers.push(data)); + stream.on('error', reject); + stream.on('end', () => resolve(Buffer.concat(buffers))); + }); + + return buf; + } +} diff --git a/client/src/service/ai/openai.ts b/client/src/service/lib/openai.ts similarity index 100% rename from client/src/service/ai/openai.ts rename to client/src/service/lib/openai.ts diff --git a/client/src/service/moduleDispatch/agent/classifyQuestion.ts b/client/src/service/moduleDispatch/agent/classifyQuestion.ts index 3b8ace2d9..679b902f4 100644 --- a/client/src/service/moduleDispatch/agent/classifyQuestion.ts +++ b/client/src/service/moduleDispatch/agent/classifyQuestion.ts @@ -2,7 +2,7 @@ import { adaptChatItem_openAI } from '@/utils/plugin/openai'; import { ChatContextFilter } from '@/service/utils/chat/index'; import type { ChatHistoryItemResType, ChatItemType } from '@/types/chat'; import { ChatModuleEnum, ChatRoleEnum, TaskResponseKeyEnum } from '@/constants/chat'; -import { getAIChatApi, axiosConfig } from '@/service/ai/openai'; +import { getAIChatApi, axiosConfig } from '@/service/lib/openai'; import type { ClassifyQuestionAgentItemType } from '@/types/app'; import { countModelPrice } from '@/service/events/pushBill'; import { UserModelSchema } from '@/types/mongoSchema'; diff --git a/client/src/service/moduleDispatch/agent/extract.ts b/client/src/service/moduleDispatch/agent/extract.ts index 0d6b471b4..2a2abccd9 100644 --- a/client/src/service/moduleDispatch/agent/extract.ts +++ b/client/src/service/moduleDispatch/agent/extract.ts @@ -2,7 +2,7 @@ import { adaptChatItem_openAI } from '@/utils/plugin/openai'; import { ChatContextFilter } from '@/service/utils/chat/index'; import type { ChatHistoryItemResType, ChatItemType } from '@/types/chat'; import { ChatModuleEnum, ChatRoleEnum, TaskResponseKeyEnum } from '@/constants/chat'; -import { getAIChatApi, axiosConfig } from '@/service/ai/openai'; +import { getAIChatApi, axiosConfig } from '@/service/lib/openai'; import type { ContextExtractAgentItemType } from '@/types/app'; import { ContextExtractEnum } from '@/constants/flow/flowField'; import { countModelPrice } from '@/service/events/pushBill'; diff --git a/client/src/service/moduleDispatch/chat/oneapi.ts b/client/src/service/moduleDispatch/chat/oneapi.ts index 720c8cc71..574aa4138 100644 --- a/client/src/service/moduleDispatch/chat/oneapi.ts +++ b/client/src/service/moduleDispatch/chat/oneapi.ts @@ -8,7 +8,7 @@ import type { ChatHistoryItemResType } from '@/types/chat'; import { ChatModuleEnum, ChatRoleEnum, sseResponseEventEnum } from '@/constants/chat'; import { SSEParseData, parseStreamChunk } from '@/utils/sse'; import { textAdaptGptResponse } from '@/utils/adapt'; -import { getAIChatApi, axiosConfig } from '@/service/ai/openai'; +import { getAIChatApi, axiosConfig } from '@/service/lib/openai'; import { TaskResponseKeyEnum } from '@/constants/chat'; import { getChatModel } from '@/service/utils/data'; import { countModelPrice } from '@/service/events/pushBill'; diff --git a/client/src/service/plugins/useSearch.ts b/client/src/service/plugins/useSearch.ts deleted file mode 100644 index e00a0f520..000000000 --- a/client/src/service/plugins/useSearch.ts +++ /dev/null @@ -1,34 +0,0 @@ -import axios from 'axios'; - -{ - /*Bing 搜索*/ -} -const BingSearch = async (wait_val: string) => { - const response = await axios.post('newbing中转服务器', { - prompt: wait_val - }); - const result = response.data.result; - return result; -}; - -{ - /*google 搜索*/ -} -const GoogleSearch = async (wait_val: string) => { - const response = await axios.get('https://www.googleapis.com/customsearch/v1', { - params: { - key: process.env.GOOGLE_KEY, - q: wait_val, - cx: process.env.searchEngineId, - start: 1, - num: 3, - dateRestrict: 'm[1]' //搜索结果限定为一个月内 - } - }); - const results = response.data.items; - if (results !== null) { - const result = results.map((item: { snippet: string }) => item.snippet).join('\n'); - return result; - } -}; -export { BingSearch, GoogleSearch };