Commit 50f97279 authored by nanahira's avatar nanahira

get rid of express.Response

parent 68a40801
{
"collection": "@nestjs/schematics",
"sourceRoot": "src"
"sourceRoot": "src",
"compilerOptions": {
"plugins": ["@nestjs/swagger"]
}
}
......@@ -872,6 +872,11 @@
"uuid": "8.3.1"
}
},
"@nestjs/mapped-types": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-0.4.0.tgz",
"integrity": "sha512-TVtd/aTb7EqPhVczdeuvzF9dY0fyE3ivvCstc2eO+AkNqrfzSG1kXYYiUUznKjd0qDa8g2TmPSmHUQ21AXsV1Q=="
},
"@nestjs/platform-express": {
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.5.5.tgz",
......@@ -922,6 +927,31 @@
}
}
},
"@nestjs/serve-static": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-2.1.4.tgz",
"integrity": "sha512-w2PpLKzQOB8rJ+vMOy28xm8jwE8VjJfA9U+KOm0H0OY62g2oOWJ+OQPSDogP7XxAzZwq+Bt8wNU2oS8+z6v6Zg==",
"requires": {
"path-to-regexp": "0.1.7"
},
"dependencies": {
"path-to-regexp": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
}
}
},
"@nestjs/swagger": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-4.8.0.tgz",
"integrity": "sha512-YU+ahCOoOTZwSHrODHBiQDCqi7GWEjmSFg3Tot/lwVuQ321/3fIOz/lf+ehVQ5DFr7nVMhB7BRWFJLtE/+NhqQ==",
"requires": {
"@nestjs/mapped-types": "0.4.0",
"lodash": "4.17.21",
"path-to-regexp": "3.2.0"
}
},
"@nestjs/testing": {
"version": "7.5.5",
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.5.5.tgz",
......@@ -1005,9 +1035,9 @@
}
},
"@sqltools/formatter": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.2.tgz",
"integrity": "sha512-/5O7Fq6Vnv8L6ucmPjaWbVG1XkP4FO+w5glqfkIsq3Xw4oyNAdJddbnYodNDAfjVUvo/rrSCTom4kAND7T1o5Q=="
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz",
"integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg=="
},
"@types/anymatch": {
"version": "1.3.1",
......@@ -1067,9 +1097,9 @@
}
},
"@types/connect": {
"version": "3.4.33",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz",
"integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==",
"version": "3.4.34",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz",
"integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==",
"dev": true,
"requires": {
"@types/node": "*"
......@@ -1108,21 +1138,21 @@
"dev": true
},
"@types/express": {
"version": "4.17.9",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.9.tgz",
"integrity": "sha512-SDzEIZInC4sivGIFY4Sz1GG6J9UObPwCInYJjko2jzOf/Imx/dlpume6Xxwj1ORL82tBbmN4cPDIDkLbWHk9hw==",
"version": "4.17.12",
"resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz",
"integrity": "sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==",
"dev": true,
"requires": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "*",
"@types/express-serve-static-core": "^4.17.18",
"@types/qs": "*",
"@types/serve-static": "*"
}
},
"@types/express-serve-static-core": {
"version": "4.17.14",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.14.tgz",
"integrity": "sha512-uFTLwu94TfUFMToXNgRZikwPuZdOtDgs3syBtAIr/OXorL1kJqUJT9qCLnRZ5KBOWfZQikQ2xKgR2tnDj1OgDA==",
"version": "4.17.20",
"resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.20.tgz",
"integrity": "sha512-8qqFN4W53IEWa9bdmuVrUcVkFemQWnt5DKPQ/oa8xKDYgtjCr2OO6NX5TIK49NLFr3mPYU2cLh92DQquC3oWWQ==",
"dev": true,
"requires": {
"@types/node": "*",
......@@ -1130,14 +1160,6 @@
"@types/range-parser": "*"
}
},
"@types/formidable": {
"version": "1.0.32",
"resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-1.0.32.tgz",
"integrity": "sha512-jOAB5+GFW+C+2xdvUcpd/CnYg2rD5xCyagJLBJU+9PB4a/DKmsAqS9yZI3j/Q9zwvM7ztPHaAIH1ijzp4cezdQ==",
"requires": {
"@types/node": "*"
}
},
"@types/graceful-fs": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.4.tgz",
......@@ -1193,12 +1215,27 @@
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
"dev": true
},
"@types/lodash": {
"version": "4.14.170",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz",
"integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==",
"dev": true
},
"@types/mime": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz",
"integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==",
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz",
"integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==",
"dev": true
},
"@types/multer": {
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.5.tgz",
"integrity": "sha512-9b/0a8JyrR0r2nQhL73JR86obWL7cogfX12augvlrvcpciCo/hkvEsgu80Z4S2g2DHGVXHr8pUIi1VhqFJ8Ufw==",
"dev": true,
"requires": {
"@types/express": "*"
}
},
"@types/node": {
"version": "14.14.10",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.10.tgz",
......@@ -1231,9 +1268,9 @@
"dev": true
},
"@types/qs": {
"version": "6.9.5",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz",
"integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==",
"version": "6.9.6",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz",
"integrity": "sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==",
"dev": true
},
"@types/range-parser": {
......@@ -1243,12 +1280,12 @@
"dev": true
},
"@types/serve-static": {
"version": "1.13.8",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz",
"integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==",
"version": "1.13.9",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz",
"integrity": "sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==",
"dev": true,
"requires": {
"@types/mime": "*",
"@types/mime": "^1",
"@types/node": "*"
}
},
......@@ -1311,6 +1348,11 @@
"resolved": "https://registry.npmjs.org/@types/underscore/-/underscore-1.10.24.tgz",
"integrity": "sha512-T3NQD8hXNW2sRsSbLNjF/aBo18MyJlbw0lSpQHB/eZZtScPdexN4HSa8cByYwTw9Wy7KuOFr81mlDQcQQaZ79w=="
},
"@types/validator": {
"version": "13.1.3",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.1.3.tgz",
"integrity": "sha512-DaOWN1zf7j+8nHhqXhIgNmS+ltAC53NXqGxYuBhWqWgqolRhddKzfZU814lkHQSTG0IUfQxU7Cg0gb8fFWo2mA=="
},
"@types/webpack": {
"version": "4.41.25",
"resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.25.tgz",
......@@ -1359,6 +1401,11 @@
"integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
"dev": true
},
"@types/zen-observable": {
"version": "0.8.2",
"resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.2.tgz",
"integrity": "sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg=="
},
"@typescript-eslint/eslint-plugin": {
"version": "4.8.2",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.8.2.tgz",
......@@ -1859,6 +1906,7 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
}
......@@ -2121,6 +2169,11 @@
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true
},
"bignumber.js": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
"integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
},
"binary-extensions": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
......@@ -2209,12 +2262,12 @@
}
},
"buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
"ieee754": "^1.2.1"
}
},
"buffer-from": {
......@@ -2276,7 +2329,8 @@
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
"integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
"caniuse-lite": {
"version": "1.0.30001161",
......@@ -2369,6 +2423,11 @@
"integrity": "sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==",
"dev": true
},
"class-transformer": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.4.0.tgz",
"integrity": "sha512-ETWD/H2TbWbKEi7m9N4Km5+cw1hNcqJSxlSYhsLsNjQzWWiZIYA1zafxpK9PwVfaZ6AqR5rrjPVUBGESm5tQUA=="
},
"class-utils": {
"version": "0.3.6",
"resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
......@@ -2392,6 +2451,16 @@
}
}
},
"class-validator": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.1.tgz",
"integrity": "sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==",
"requires": {
"@types/validator": "^13.1.3",
"libphonenumber-js": "^1.9.7",
"validator": "^13.5.2"
}
},
"cli-cursor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
......@@ -2402,16 +2471,62 @@
}
},
"cli-highlight": {
"version": "2.1.8",
"resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.8.tgz",
"integrity": "sha512-mFuTW5UOV3/S0wZE9/1b0EcAM0XOJIhoAWPhWm5voiJ6ugVBkvYBIEL7sbHo9sEtWdEmwDIWab32qpaRI3cfqQ==",
"version": "2.1.11",
"resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz",
"integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==",
"requires": {
"chalk": "^4.0.0",
"highlight.js": "^10.0.0",
"highlight.js": "^10.7.1",
"mz": "^2.4.0",
"parse5": "^5.1.1",
"parse5-htmlparser2-tree-adapter": "^6.0.0",
"yargs": "^15.0.0"
"yargs": "^16.0.0"
},
"dependencies": {
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
"integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
}
},
"wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
}
},
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
},
"yargs": {
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
}
},
"yargs-parser": {
"version": "20.2.7",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
"integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw=="
}
}
},
"cli-spinners": {
......@@ -2474,6 +2589,7 @@
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
"integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"requires": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
......@@ -2705,6 +2821,21 @@
"which": "^2.0.1"
}
},
"crypto-random-string": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.3.1.tgz",
"integrity": "sha512-5j88ECEn6h17UePrLi6pn1JcLtAiANa3KExyr9y9Z5vo2mv56Gh3I4Aja/B9P9uyMwyxNHAHWv+nE72f30T5Dg==",
"requires": {
"type-fest": "^0.8.1"
},
"dependencies": {
"type-fest": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
"integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
}
}
},
"cssom": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
......@@ -2758,7 +2889,8 @@
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
"decimal.js": {
"version": "10.2.1",
......@@ -2935,9 +3067,9 @@
}
},
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
"integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
"version": "8.6.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz",
"integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="
},
"ecc-jsbn": {
"version": "0.1.2",
......@@ -3251,7 +3383,8 @@
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"esquery": {
"version": "1.3.1",
......@@ -3648,6 +3781,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
......@@ -3730,7 +3864,8 @@
"formidable": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz",
"integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q=="
"integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==",
"dev": true
},
"forwarded": {
"version": "0.1.2",
......@@ -4103,9 +4238,9 @@
}
},
"highlight.js": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.4.0.tgz",
"integrity": "sha512-EfrUGcQ63oLJbj0J0RI9ebX6TAITbsDBLbsjr881L/X5fMO9+oadKzEF21C7R3ULKG6Gv3uoab2HiqVJa/4+oA=="
"version": "10.7.2",
"resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.2.tgz",
"integrity": "sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg=="
},
"hosted-git-info": {
"version": "2.8.8",
......@@ -5026,6 +5161,7 @@
"version": "3.14.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
"integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
"dev": true,
"requires": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
......@@ -5183,6 +5319,11 @@
"type-check": "~0.4.0"
}
},
"libphonenumber-js": {
"version": "1.9.19",
"resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.19.tgz",
"integrity": "sha512-RjStfSE63LvXQEBw7pgQHPkY35z8feiMjC9wLvL1Hbt8PbhxpRrACwMXmLQgabb+IpVdcEx+olh8ll7UDXXkfA=="
},
"lines-and-columns": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
......@@ -5210,15 +5351,15 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
"requires": {
"p-locate": "^4.1.0"
}
},
"lodash": {
"version": "4.17.20",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
"integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash.memoize": {
"version": "4.1.2",
......@@ -5524,6 +5665,46 @@
"integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
"dev": true
},
"mysql": {
"version": "2.18.1",
"resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
"integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
"requires": {
"bignumber.js": "9.0.0",
"readable-stream": "2.3.7",
"safe-buffer": "5.1.2",
"sqlstring": "2.3.1"
},
"dependencies": {
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"readable-stream": {
"version": "2.3.7",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
}
}
},
"mz": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
......@@ -6028,6 +6209,7 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
"p-try": "^2.0.0"
}
......@@ -6036,6 +6218,7 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
"p-limit": "^2.2.0"
}
......@@ -6043,7 +6226,8 @@
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
"packet-reader": {
"version": "1.0.0",
......@@ -6110,7 +6294,8 @@
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true
},
"path-is-absolute": {
"version": "1.0.1",
......@@ -6596,7 +6781,8 @@
"require-main-filename": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
"integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
"resolve": {
"version": "1.19.0",
......@@ -7411,7 +7597,8 @@
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
"sqlite3": {
"version": "5.0.0",
......@@ -7423,6 +7610,11 @@
"node-pre-gyp": "^0.11.0"
}
},
"sqlstring": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
"integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A="
},
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
......@@ -7663,6 +7855,19 @@
"supports-color": "^7.0.0"
}
},
"swagger-ui-dist": {
"version": "3.49.0",
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.49.0.tgz",
"integrity": "sha512-R1+eT16XNP1bBLfacISifZAkFJlpwvWsS2vVurF5pbIFZnmCasD/hj+9r/q7urYdQyb0B6v11mDnuYU7rUpfQg=="
},
"swagger-ui-express": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.6.tgz",
"integrity": "sha512-Xs2BGGudvDBtL7RXcYtNvHsFtP1DBFPMJFRxHe5ez/VG/rzVOEjazJOOSc/kSCyxreCTKfJrII6MJlL9a6t8vw==",
"requires": {
"swagger-ui-dist": "^3.18.1"
}
},
"symbol-observable": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz",
......@@ -8234,28 +8439,34 @@
}
},
"typeorm": {
"version": "0.2.29",
"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.29.tgz",
"integrity": "sha512-ih1vrTe3gEAGKRcWlcsTRxTL7gNjacQE498wVGuJ3ZRujtMqPZlbAWuC7xDzWCRjQnkZYNwZQeG9UgKfxSHB5g==",
"version": "0.2.32",
"resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.32.tgz",
"integrity": "sha512-LOBZKZ9As3f8KRMPCUT2H0JZbZfWfkcUnO3w/1BFAbL/X9+cADTF6bczDGGaKVENJ3P8SaKheKmBgpt5h1x+EQ==",
"requires": {
"@sqltools/formatter": "1.2.2",
"@sqltools/formatter": "^1.2.2",
"app-root-path": "^3.0.0",
"buffer": "^5.5.0",
"buffer": "^6.0.3",
"chalk": "^4.1.0",
"cli-highlight": "^2.1.4",
"debug": "^4.1.1",
"cli-highlight": "^2.1.10",
"debug": "^4.3.1",
"dotenv": "^8.2.0",
"glob": "^7.1.6",
"js-yaml": "^3.14.0",
"js-yaml": "^4.0.0",
"mkdirp": "^1.0.4",
"reflect-metadata": "^0.1.13",
"sha.js": "^2.4.11",
"tslib": "^1.13.0",
"tslib": "^2.1.0",
"xml2js": "^0.4.23",
"yargonaut": "^1.1.2",
"yargs": "^16.0.3"
"yargonaut": "^1.1.4",
"yargs": "^16.2.0",
"zen-observable-ts": "^1.0.0"
},
"dependencies": {
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
},
"cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
......@@ -8274,6 +8485,14 @@
"ms": "2.1.2"
}
},
"js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"requires": {
"argparse": "^2.0.1"
}
},
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
......@@ -8285,9 +8504,9 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"tslib": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
"integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w=="
},
"wrap-ansi": {
"version": "7.0.0",
......@@ -8300,14 +8519,14 @@
}
},
"y18n": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
"integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg=="
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
},
"yargs": {
"version": "16.1.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.1.1.tgz",
"integrity": "sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w==",
"version": "16.2.0",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
"requires": {
"cliui": "^7.0.2",
"escalade": "^3.1.1",
......@@ -8319,9 +8538,9 @@
}
},
"yargs-parser": {
"version": "20.2.4",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
"integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA=="
"version": "20.2.7",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
"integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw=="
}
}
},
......@@ -8467,6 +8686,11 @@
"spdx-expression-parse": "^3.0.0"
}
},
"validator": {
"version": "13.6.0",
"resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz",
"integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg=="
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
......@@ -8657,7 +8881,8 @@
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
"wide-align": {
"version": "1.1.3",
......@@ -8715,6 +8940,7 @@
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
"integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
......@@ -8787,7 +9013,8 @@
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
"integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
"dev": true
},
"yallist": {
"version": "3.1.1",
......@@ -8851,6 +9078,7 @@
"version": "15.4.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
"integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
"requires": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
......@@ -8869,6 +9097,7 @@
"version": "18.1.3",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
"integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
......@@ -8885,6 +9114,20 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true
},
"zen-observable": {
"version": "0.8.15",
"resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
"integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
},
"zen-observable-ts": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.0.0.tgz",
"integrity": "sha512-KmWcbz+9kKUeAQ8btY8m1SsEFgBcp7h/Uf3V5quhan7ZWdjGsf0JcGLULQiwOZibbFWnHkYq8Nn2AZbJabovQg==",
"requires": {
"@types/zen-observable": "^0.8.2",
"zen-observable": "^0.8.15"
}
}
}
}
export const CardInfo = {
cn: {
'1010': '',
'1011': '',
'1012': '',
'1013': '',
'1014': '',
'1015': '',
'1016': '',
'1020': '战士',
'1021': '魔法师',
'1022': '天使',
'1023': '恶魔',
'1024': '不死',
'1025': '机械',
'1026': '',
'1027': '',
'1028': '岩石',
'1029': '鸟兽',
'1030': '植物',
'1031': '昆虫',
'1032': '',
'1033': '',
'1034': '',
'1035': '兽战士',
'1036': '恐龙',
'1037': '',
'1038': '海龙',
'1039': '爬虫',
'1040': '念动力',
'1041': '幻神兽',
'1042': '创造神',
'1043': '幻龙',
'1044': '电子界',
'1050': '怪兽',
'1051': '魔法',
'1052': '陷阱',
'1053': '???',
'1054': '通常',
'1055': '效果',
'1056': '融合',
'1057': '仪式',
'1058': '陷阱怪兽',
'1059': '灵魂',
'1060': '同盟',
'1061': '二重',
'1062': '调整',
'1063': '同调',
'1064': '衍生物',
'1065': '???',
'1066': '速攻',
'1067': '永续',
'1068': '装备',
'1069': '场地',
'1070': '反击',
'1071': '反转',
'1072': '卡通',
'1073': '超量',
'1074': '灵摆',
},
en: {
'1010': 'EARTH',
'1011': 'WATER',
'1012': 'FIRE',
'1013': 'WIND',
'1014': 'LIGHT',
'1015': 'DARK',
'1016': 'DIVINE',
'1020': 'Warrior',
'1021': 'Spellcaster',
'1022': 'Fairy',
'1023': 'Fiend',
'1024': 'Zombie',
'1025': 'Machine',
'1026': 'Aqua',
'1027': 'Pyro',
'1028': 'Rock',
'1029': 'Winged Beast',
'1030': 'Plant',
'1031': 'Insect',
'1032': 'Thunder',
'1033': 'Dragon',
'1034': 'Beast',
'1035': 'Beast-Warrior',
'1036': 'Dinosaur',
'1037': 'Fish',
'1038': 'Sea Serpent',
'1039': 'Reptile',
'1040': 'Psychic',
'1041': 'Divine-Beast',
'1042': 'Creator God',
'1043': 'Wyrm',
'1044': 'Cyberse',
'1050': 'Monster',
'1051': 'Spell',
'1052': 'Trap',
'1053': '???',
'1054': 'Normal',
'1055': 'Effect',
'1056': 'Fusion',
'1057': 'Ritual',
'1058': 'Trap Monster',
'1059': 'Spirit',
'1060': 'Union',
'1061': 'Gemini',
'1062': 'Tuner',
'1063': 'Synchro',
'1064': 'Token',
'1065': '???',
'1066': 'Quick-Play',
'1067': 'Continuous',
'1068': 'Equip',
'1069': 'Field',
'1070': 'Counter',
'1071': 'Flip',
'1072': 'Toon',
'1073': 'Xyz',
'1074': 'Pendulum',
},
};
export function getStringValueByMysticalNumber(
lang: string,
offset: number,
num: number,
) {
for (let i = 0; i < 32; i++) {
if (num & (1 << i)) {
const index = offset + i;
const key = index.toString();
return CardInfo[lang][key];
}
}
return '';
}
export class EloUtility {
static getExpScore(
expA: number,
expB: number,
scoreA: number,
scoreB: number,
) {
let rExpA = expA,
rExpB = expB;
if (scoreA === scoreB) {
rExpA += 0.5;
rExpB += 0.5;
} else if (scoreA > scoreB) {
rExpA += 1;
if (expA > expB) rExpB += 0.5;
} else if (scoreA < scoreB) {
rExpB += 1;
if (expA < expB) rExpA += 0.5;
}
return { expA: rExpA, expB: rExpB };
}
static getEloScore(rA: number, rB: number, sA: number, sB: number) {
//17.07.18 增加规则,平局不加分.
if (sA === sB) {
return { ptA: rA, ptB: rB };
}
const k = 24;
const eA = 1 / (1 + Math.pow(10, (rB - rA) / 400));
const eB = 1 / (1 + Math.pow(10, (rA - rB) / 400));
let diffA = k * (sA - eA);
// 如果算出的变动分数小于8或者大于16就按8和16计
if (diffA > 0 && diffA > 16) {
//console.log("diffA 加分大于16 按16分结算", diffA);
diffA = 16;
}
if (diffA > 0 && diffA < 8) {
//console.log("diffA 加分小于8 按8分结算", diffA);
diffA = 8;
}
if (diffA < 0 && diffA > -8) {
//console.log("diffA 扣分小于8 按8分结算算", diffA);
diffA = -8;
}
if (diffA < 0 && diffA < -15) {
//console.log("diffA 扣分大于16 按16分结算", diffA);
diffA = -15;
}
const rrA = rA + diffA;
let diffB = k * (sB - eB);
// 如果算出的变动分数小于8或者大于16就按8和16计
if (diffB > 0 && diffB > 16) {
//console.log("diffB 加分大于16 按16分结算", diffB);
diffB = 16;
}
if (diffB > 0 && diffB < 8) {
//console.log("diffB 加分小于8 按8分结算", diffB);
diffB = 8;
}
if (diffB < 0 && diffB > -8) {
//console.log("diffB 扣分小于8 按8分结算算", diffB);
diffB = -8;
}
if (diffB < 0 && diffB < -15) {
//console.log("diffB 扣分大于16 按16分结算", diffB);
diffB = -15;
}
const rrB = rB + diffB;
//console.log(diffA, diffB);
// // 加分高于16
// if( (rrB - rB) > 16 ) {
// rrB = rB + 16;
// }
// // 扣分低于8
// if( (rB - rrB) < 8 ) {
// rrB = rB - 8;
// }
return { ptA: rrA, ptB: rrB };
}
}
import {
BadRequestException,
Body,
Controller,
ForbiddenException,
Get,
HttpException,
InternalServerErrorException,
NotFoundException,
Param,
ParseIntPipe,
Post,
Query,
Req,
Res,
UploadedFile,
UploadedFiles,
UseInterceptors,
} from '@nestjs/common';
......@@ -15,36 +21,37 @@ import express from 'express';
import { AppService } from './app.service';
import { UserInfo } from './entities/mycard/UserInfo';
import { config } from './config';
import {
AnyFilesInterceptor,
FilesInterceptor,
} from '@nestjs/platform-express';
import { IncomingForm } from 'formidable';
import { AnyFilesInterceptor, FileInterceptor } from '@nestjs/platform-express';
import { HttpResponseService } from './http-response/http-response.service';
import { CodeResponseDto } from './dto/CodeResponse.dto';
import multer from 'multer';
import cryptoRandomString from 'crypto-random-string';
import { join } from 'path';
import { ApiBody, ApiConsumes, ApiTags } from '@nestjs/swagger';
import { FileUploadDto } from './dto/FileUploadDto';
@Controller('api')
@ApiTags('arena')
export class AppController {
constructor(private readonly appService: AppService) {}
constructor(
private readonly appService: AppService,
private readonly httpResponseService: HttpResponseService,
) {}
@Post('score')
async postScore(
@Body() body: any,
@Body('accesskey') accessKey,
@Res() res: express.Response,
) {
async postScore(@Body() body: any, @Body('accesskey') accessKey) {
if (accessKey !== config.accessKey) {
return res.status(403).json({
throw new ForbiddenException({
msg: 'accesskey error',
});
}
const message = await this.appService.postScore(body);
if (message) {
res.status(404).json({
msg: message,
});
throw new NotFoundException({ msg: message });
} else {
res.status(200).json({
return {
msg: 'success',
});
};
}
}
......@@ -54,22 +61,16 @@ export class AppController {
}
@Get('cardinfo')
async getCardInfo(
@Query('lang') language: string,
@Query('id') id: string,
@Res() res: express.Response,
) {
async getCardInfo(@Query('lang') language: string, @Query('id') id: string) {
const cardId = parseInt(id);
if (!cardId) {
res.status(404).end('card id is required!');
return;
throw new BadRequestException('card id is required!');
}
const result = await this.appService.getCardInfo(cardId, language);
if (!result) {
res.status(404).end('card info not found!');
return;
throw new NotFoundException('card not found.');
}
res.json(result);
return result;
}
@Get('report')
......@@ -81,60 +82,58 @@ export class AppController {
}
@Post('activity')
async updateActivity(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.updateActivity(body);
res.status(code).json({ code });
async updateActivity(@Body() body: any): Promise<CodeResponseDto> {
return this.httpResponseService.handlePostCodeResponse(
this.appService.updateActivity(body),
);
}
@Get('label')
async getLabel(@Res() res: express.Response) {
async getLabel() {
const value = await this.appService.getSiteConfig('label');
if (value != null) {
res.status(200).json({
return {
code: 200,
text: value,
});
};
} else {
res.status(500).json({
code: 500,
});
throw new InternalServerErrorException(new CodeResponseDto(500));
}
}
@Post('label')
async updateLabel(
@Body('labelone') value: string,
@Res() res: express.Response,
) {
const code = await this.appService.updateSiteConfig('label', value);
res.status(code).json({ code });
async updateLabel(@Body('labelone') value: string) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.updateSiteConfig('label', value),
);
}
@Post('adSwitchChange')
async updateAdvertisementSetting(
@Body('status') value: string,
@Res() res: express.Response,
) {
const code = await this.appService.updateSiteConfig('auto_close_ad', value);
res.status(code).json({ code });
async updateAdvertisementSetting(@Body('status') value: string) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.updateSiteConfig('auto_close_ad', value),
);
}
@Post('votes')
async updateVotes(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.updateVotes(body);
res.status(code).json({ code });
async updateVotes(@Body() body: any) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.updateVotes(body),
);
}
@Post('voteStatus')
async updateVoteStatus(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.updateVoteStatus(body);
res.status(code).json({ code });
async updateVoteStatus(@Body() body: any) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.updateVoteStatus(body),
);
}
@Post('submitVote')
async submitVote(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.submitVote(body);
res.status(code).json({ code });
async submitVote(@Body() body: any) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.submitVote(body),
);
}
@Get('votes')
......@@ -161,65 +160,64 @@ export class AppController {
return await this.appService.getDeckInfo(query);
}
@Post('upload')
uploadFile(@Req() req: express.Request, @Res() res: express.Response) {
const form = new IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = 'upload/';
form.keepExtensions = true;
form.maxFieldsSize = 2 * 1024 * 1024;
form.parse(req, function (err, fields, files) {
if (err) {
console.log(err);
return res.status(500).send('upload image fail!');
}
const response = {
code: 200,
};
if (err) {
response.code = 500;
} else {
response.code = 200;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
response.path = files.file.path;
}
res.status(response.code).json(response);
});
}
@Get('download/:id')
downloadFile(@Param('id') filename: string, @Res() res: express.Response) {
if (!filename) {
res.status(400).end('Missing filename.');
@ApiConsumes('multipart/form-data')
@ApiBody({
description: '要上传的文件',
type: FileUploadDto,
})
@UseInterceptors(
FileInterceptor('file', {
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, join(__dirname, '..', 'upload'));
},
filename: (req, file, cb) => {
const customFileName = cryptoRandomString({
length: 20,
type: 'alphanumeric',
}),
fileExtension = file.originalname.split('.')[1]; // get file extension from original file name
cb(null, customFileName + '.' + fileExtension);
},
}),
limits: {
fileSize: 2 * 1024 * 1024,
},
preservePath: true,
}),
)
uploadFile(@UploadedFile() file: Express.Multer.File) {
if (!file) {
throw new InternalServerErrorException(new CodeResponseDto(500));
}
const filepath = `upload/${filename}`;
res.download(filepath, filename);
return {
code: 200,
path: file.path,
};
}
@Get('deckdata/:id')
async getDeckData(
@Param('id') filename: string,
@Res() res: express.Response,
) {
async getDeckData(@Param('id') filename: string) {
if (!filename) {
res.status(400).end('Missing filename.');
throw new BadRequestException('Missing filename.');
}
const deck = await this.appService.getDeckData(filename);
if (!deck) {
res.status(404).end('File not found.');
throw new NotFoundException('File not found.');
}
res.json({ deck });
return { deck };
}
@Post('deckdemo')
async submitDeckDemo(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.submitDeckDemo(body);
res.status(code).json({ code });
async submitDeckDemo(@Body() body: any) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.submitDeckDemo(body),
);
}
@Post('deckinfo')
async submitDeckInfo(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.submitDeckInfo(body);
res.status(code).json({ code });
async submitDeckInfo(@Body() body: any) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.submitDeckInfo(body),
);
}
@Get('history')
async getBattleHistory(@Query() query: any) {
......@@ -230,9 +228,10 @@ export class AppController {
return await this.appService.getUser(username);
}
@Post('ads')
async updateAds(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.updateAds(body);
res.status(code).json({ code });
async updateAds(@Body() body: any) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.updateAds(body),
);
}
@Get('ads')
async getAds(@Query() query: any) {
......@@ -243,27 +242,22 @@ export class AppController {
return await this.appService.getRandomAd(type);
}
@Post('adsStatus')
async updateAdsStatus(@Body() body: any, @Res() res: express.Response) {
const code = await this.appService.updateAdsStatus(body);
res.status(code).json({ code });
async updateAdsStatus(@Body() body: any) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.updateAdsStatus(body),
);
}
@Post('adClick')
async adClick(@Body('id') id: string, @Res() res: express.Response) {
if (!id) {
res.status(400).json({ code: 400 });
return;
}
const code = await this.appService.increaseAds(parseInt(id), 'clk');
res.status(code).json({ code });
async adClick(@Body('id', ParseIntPipe) id: number) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.increaseAds(id, 'clk'),
);
}
@Post('adImpl')
async adImpl(@Body('id') id: string, @Res() res: express.Response) {
if (!id) {
res.status(400).json({ code: 400 });
return;
}
const code = await this.appService.increaseAds(parseInt(id), 'impl');
res.status(code).json({ code });
async adImpl(@Body('id', ParseIntPipe) id: number) {
return this.httpResponseService.handlePostCodeResponse(
this.appService.increaseAds(id, 'impl'),
);
}
@Get('firstwin')
async getFirstWinActivity(@Query('username') username: string) {
......
......@@ -46,6 +46,11 @@ import { DeckSeason } from './entities/mycard/DeckSeason';
import { DeckWeek } from './entities/mycard/DeckWeek';
import { UserInfo } from './entities/mycard/UserInfo';
import { AppLogger } from './app.logger';
import { HttpResponseService } from './http-response/http-response.service';
import { EloService } from './elo/elo.service';
import { CardInfoService } from './card-info/card-info.service';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
const ygoproEntities = [YGOProDatabaseDatas, YGOProDatabaseTexts];
const mycardEntities = [
......@@ -93,6 +98,10 @@ const mycardEntities = [
@Module({
imports: [
ServeStaticModule.forRoot({
rootPath: join(__dirname, '..', 'upload'),
serveRoot: '/api/download',
}),
TypeOrmModule.forRoot({
synchronize: false,
type: 'sqlite',
......@@ -120,6 +129,12 @@ const mycardEntities = [
}),
],
controllers: [AppController],
providers: [AppService, AppLogger],
providers: [
AppService,
AppLogger,
HttpResponseService,
EloService,
CardInfoService,
],
})
export class AppModule {}
......@@ -15,7 +15,6 @@ import Filter from 'bad-words-chinese';
import { ChineseDirtyWords } from './dirtyWordsChinese';
import { YGOProDatabaseDatas } from './entities/ygodb/YGOProDatabaseDatas';
import { YGOProDatabaseTexts } from './entities/ygodb/YGOProDatabaseTexts';
import { getStringValueByMysticalNumber } from './CardInfo';
import moment from 'moment';
import { BattleHistory } from './entities/mycard/BattleHistory';
import _ from 'underscore';
......@@ -24,7 +23,6 @@ import { AppLogger } from './app.logger';
import axios from 'axios';
import { config } from './config';
import qs from 'qs';
import { EloUtility } from './EloUtility';
import { Votes } from './entities/mycard/Votes';
import { VoteResult } from './entities/mycard/VoteResult';
import { promises as fs } from 'fs';
......@@ -32,10 +30,11 @@ import { scheduleJob } from 'node-schedule';
import { DeckInfo } from './entities/mycard/DeckInfo';
import { DeckInfoHistory } from './entities/mycard/DeckInfoHistory';
import { DeckDemo } from './entities/mycard/DeckDemo';
import { Deck } from './entities/mycard/Deck';
import { Ads } from './entities/mycard/Ads';
import { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialEntity';
import { DeckInfoOrHistory } from './entities/mycard/DeckInfoOrHistory';
import { EloService } from './elo/elo.service';
import { CardInfoService } from './card-info/card-info.service';
const attrOffset = 1010;
const raceOffset = 1020;
......@@ -99,7 +98,7 @@ interface VoteOption {
percentage: number;
}
interface DeckInfoCard {
export interface DeckInfoCard {
id: number;
num: number;
name?: string;
......@@ -117,6 +116,8 @@ export class AppService {
@InjectConnection('mycard')
private mcdb: Connection,
private log: AppLogger,
private eloService: EloService,
private cardInfoService: CardInfoService,
) {
this.log.setContext('ygopro-arena-revive');
this.chineseDirtyFilter = new Filter({
......@@ -259,17 +260,17 @@ export class AppService {
result.category = cardDatas.category;
result.type = getStringValueByMysticalNumber(
result.type = this.cardInfoService.getStringValueByMysticalNumber(
lang,
typeOffset,
cardDatas.type,
);
result.race = getStringValueByMysticalNumber(
result.race = this.cardInfoService.getStringValueByMysticalNumber(
lang,
raceOffset,
cardDatas.race,
);
result.attribute = getStringValueByMysticalNumber(
result.attribute = this.cardInfoService.getStringValueByMysticalNumber(
lang,
attrOffset,
cardDatas.attribute,
......@@ -630,8 +631,8 @@ export class AppService {
}
}
const ptResult = EloUtility.getEloScore(userA.pt, userB.pt, sa, sb);
const expResult = EloUtility.getExpScore(
const ptResult = this.eloService.getEloScore(userA.pt, userB.pt, sa, sb);
const expResult = this.eloService.getExpScore(
userA.exp,
userB.exp,
userscoreA,
......@@ -849,7 +850,7 @@ export class AppService {
}
});
} else {
const expResult = EloUtility.getExpScore(
const expResult = this.eloService.getExpScore(
userA.exp,
userB.exp,
userscoreA,
......@@ -1239,7 +1240,11 @@ export class AppService {
return;
}
item.name = card.texts.name;
item.type = getStringValueByMysticalNumber(lang, typeOffset, card.type);
item.type = this.cardInfoService.getStringValueByMysticalNumber(
lang,
typeOffset,
card.type,
);
}
private async fillCardInfoBatch(arr: DeckInfoCard[]) {
......
import { ApiProperty } from '@nestjs/swagger';
export class CodeResponseDto {
@ApiProperty({ description: '状态码' })
code: number;
@ApiProperty({ description: '是否成功' })
success: boolean;
constructor(code: number) {
this.success = code < 400;
this.code = code;
}
}
import { ApiProperty } from '@nestjs/swagger';
export class FileUploadDto {
@ApiProperty({ type: 'string', format: 'binary' })
file: any;
}
import { Column, Entity, PrimaryColumn } from 'typeorm';
import { ApiProperty } from '@nestjs/swagger';
@Entity('user_info', { schema: 'public' })
export class UserInfo {
@ApiProperty({ description: '用户名' })
@PrimaryColumn('character varying', { name: 'username', length: 100 })
username: string;
@ApiProperty({ description: 'EXP 数值' })
@Column('double precision', {
name: 'exp',
precision: 53,
......@@ -12,6 +15,7 @@ export class UserInfo {
})
exp: number;
@ApiProperty({ description: 'DP 数值' })
@Column('double precision', {
name: 'pt',
precision: 53,
......@@ -19,30 +23,39 @@ export class UserInfo {
})
pt: number;
@ApiProperty({ description: '娱乐匹配胜利数' })
@Column('integer', { name: 'entertain_win', default: 0 })
entertain_win: number;
@ApiProperty({ description: '娱乐匹配失败数' })
@Column('integer', { name: 'entertain_lose', default: 0 })
entertain_lose: number;
@ApiProperty({ description: '娱乐匹配平局数' })
@Column('integer', { name: 'entertain_draw', default: 0 })
entertain_draw: number;
@ApiProperty({ description: '娱乐匹配总数' })
@Column('integer', { name: 'entertain_all', default: 0 })
entertain_all: number;
@ApiProperty({ description: '竞技匹配胜利数' })
@Column('integer', { name: 'athletic_win', default: 0 })
athletic_win: number;
@ApiProperty({ description: '竞技匹配失败数' })
@Column('integer', { name: 'athletic_lose', default: 0 })
athletic_lose: number;
@ApiProperty({ description: '竞技匹配平局数' })
@Column('integer', { name: 'athletic_draw', default: 0 })
athletic_draw: number;
@ApiProperty({ description: '竞技匹配总数' })
@Column('integer', { name: 'athletic_all', default: 0 })
athletic_all: number;
@ApiProperty({ description: '玩家 ID' })
@Column('integer', { name: 'id', nullable: true })
id: number;
}
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import bodyParser from 'body-parser';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableCors();
const documentConfig = new DocumentBuilder()
.setTitle('ygopro-arena-api')
.setDescription('YGOPro 决斗数据库后台')
.setVersion('1.0')
.addTag('arena')
.build();
const document = SwaggerModule.createDocument(app, documentConfig);
SwaggerModule.setup('docs', app, document);
app.use(bodyParser.json({ limit: '50mb' }));
app.use(
bodyParser.urlencoded({
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment