From fadb8c51869726849303330582a634599905a366 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sat, 2 Oct 2021 18:39:49 -0500 Subject: [PATCH 01/16] FIX - Markdown table responsive header render incorrect #321 Signed-off-by: RaenonX --- src/components/elements/markdown/components/table.tsx | 8 ++++++-- src/components/elements/markdown/main.test.tsx | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/elements/markdown/components/table.tsx b/src/components/elements/markdown/components/table.tsx index fc44944b..26cdd1ef 100644 --- a/src/components/elements/markdown/components/table.tsx +++ b/src/components/elements/markdown/components/table.tsx @@ -7,7 +7,7 @@ import {TextChildren} from '../transformers/text/main'; import {MarkdownComponentProps} from '../types'; -const headers: Array> = [] as Array>; +const headers: Array = [] as Array; let idxCounter = 0; export const renderTable = ({children}: MarkdownComponentProps) => { @@ -19,7 +19,11 @@ export const renderTable = ({children}: MarkdownComponentProps) => { }; export const renderTableHeader = ({children}: MarkdownComponentProps) => { - headers.push(children); + headers.push( + + {children} + , + ); return ( diff --git a/src/components/elements/markdown/main.test.tsx b/src/components/elements/markdown/main.test.tsx index 8bb481ec..bab51fdf 100644 --- a/src/components/elements/markdown/main.test.tsx +++ b/src/components/elements/markdown/main.test.tsx @@ -45,6 +45,15 @@ describe('Markdown', () => { expect(screen.getAllByText('C')).toHaveLength(2); expect(screen.getAllByText('D')).toHaveLength(2); }); + + it('renders unit icon correctly in responsive header', async () => { + const text = `--10750105/Y!Cleo-- | B\n:---: | :---:\nA1 | B1`; + + renderReact(() => {text}); + + // Should only have 2 elements available for each header: 1 for desktop, 1 for mobile (responsive header) + expect(screen.getAllByText('Y!Cleo')).toHaveLength(2); + }); }); describe('Markdown - Syntax Nesting', () => { From 721e9149f250265279b8da646a9d757f24bde527 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 06:33:48 -0500 Subject: [PATCH 02/16] ADD - CHS unit name searching support #307 Signed-off-by: RaenonX --- package-lock.json | 877 ++++++++++++++++-- package.json | 3 +- src/api-def | 2 +- .../gameData/unit/filter/utils.test.tsx | 25 + .../elements/gameData/unit/filter/utils.ts | 20 +- test/data/resources | 2 +- 6 files changed, 850 insertions(+), 79 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68bb505d..8233f9d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "dragalia-site-front", - "version": "2.15.0-beta.1", + "version": "2.15.0-beta.4", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "2.15.0-beta.1", + "version": "2.15.0-beta.4", "dependencies": { "@ctrl/react-adsense": "^1.3.1", "@reduxjs/toolkit": "^1.6.1", @@ -19,6 +19,7 @@ "next": "^11.1.2", "next-auth": "^3.29.0", "node-fetch": "^2.6.2", + "opencc": "^1.1.3", "pm2": "^5.1.1", "react": "^17.0.2", "react-audio-player": "^0.17.0", @@ -2853,9 +2854,9 @@ } }, "node_modules/@pm2/agent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.0.tgz", - "integrity": "sha512-W1LvdyF1tGaVU5f/hV8DjpI5joI7MEgXiQMLZnTwZlFwDVP00O9s86571Q8xSiweTcFZFyye0F4wORN/PjSgGA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.1.tgz", + "integrity": "sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw==", "dependencies": { "async": "~3.2.0", "chalk": "~3.0.0", @@ -2867,7 +2868,7 @@ "nssocket": "0.6.0", "pm2-axon": "~4.0.1", "pm2-axon-rpc": "~0.7.0", - "proxy-agent": "~4.0.1", + "proxy-agent": "~5.0.0", "semver": "~7.2.0", "ws": "~7.4.0" } @@ -3924,8 +3925,7 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "node_modules/abstract-logging": { "version": "2.0.1", @@ -4158,6 +4158,11 @@ "node": ">= 6.0.0" } }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -4183,6 +4188,37 @@ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/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==", + "dependencies": { + "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" + } + }, + "node_modules/are-we-there-yet/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -5482,6 +5518,11 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -5692,6 +5733,14 @@ "node": ">= 0.12.0" } }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -5844,6 +5893,11 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -6406,7 +6460,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, "engines": { "node": ">=4.0.0" } @@ -6451,13 +6504,14 @@ } }, "node_modules/degenerator": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz", + "integrity": "sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==", "dependencies": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", - "esprima": "^4.0.0" + "esprima": "^4.0.0", + "vm2": "^3.9.3" }, "engines": { "node": ">= 6" @@ -6557,6 +6611,11 @@ "node": ">=0.4.0" } }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "node_modules/denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", @@ -6590,6 +6649,17 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8342,6 +8412,14 @@ "node": ">=10" } }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8412,6 +8490,64 @@ "node": ">=8" } }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/generic-names": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", @@ -8915,6 +9051,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -9197,6 +9338,14 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, "node_modules/image-size": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", @@ -12409,6 +12558,23 @@ "node": ">= 6" } }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dependencies": { + "minipass": "^2.9.0" + } + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -12588,8 +12754,7 @@ "node_modules/nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" }, "node_modules/nanoid": { "version": "3.1.25", @@ -13153,6 +13318,69 @@ "node": ">=0.10.0" } }, + "node_modules/node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/node-pre-gyp/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/node-pre-gyp/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/node-pre-gyp/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/node-pre-gyp/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/node-releases": { "version": "1.1.75", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", @@ -13299,6 +13527,29 @@ "node": ">=8" } }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "node_modules/npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -13474,6 +13725,17 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "node_modules/nssocket": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", @@ -13497,6 +13759,14 @@ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -13649,6 +13919,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opencc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/opencc/-/opencc-1.1.3.tgz", + "integrity": "sha512-MCVhahNoF+YaVUc6LX5U0vUrsjY8KF/IEbVFUHeEDnVxhwBZkXawYpyp+oVRoMzvjMGP4QHAKxYzJ03OMRsfiA==", + "hasInstallScript": true, + "dependencies": { + "nan": "^2.14.2", + "node-pre-gyp": "^0.14.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/optional-require": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.7.tgz", @@ -13716,15 +13999,31 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, "node_modules/ospath": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", @@ -13829,9 +14128,9 @@ } }, "node_modules/pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "dependencies": { "@tootallnate/once": "1", "agent-base": "6", @@ -13839,25 +14138,25 @@ "get-uri": "3", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", + "pac-resolver": "^5.0.0", "raw-body": "^2.2.0", "socks-proxy-agent": "5" }, "engines": { - "node": ">= 6" + "node": ">= 8" } }, "node_modules/pac-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz", - "integrity": "sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", + "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", "dependencies": { - "degenerator": "^2.2.0", + "degenerator": "^3.0.1", "ip": "^1.1.5", "netmask": "^2.0.1" }, "engines": { - "node": ">= 6" + "node": ">= 8" } }, "node_modules/package-json": { @@ -15552,21 +15851,21 @@ } }, "node_modules/proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", - "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "dependencies": { "agent-base": "^6.0.0", "debug": "4", "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", + "pac-proxy-agent": "^5.0.0", "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">= 8" } }, "node_modules/proxy-from-env": { @@ -15770,7 +16069,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -15784,14 +16082,12 @@ "node_modules/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -16744,6 +17040,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "node_modules/set-cookie-parser": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", @@ -18047,6 +18348,53 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/tar/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -19263,6 +19611,17 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, + "node_modules/vm2": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.3.tgz", + "integrity": "sha512-smLS+18RjXYMl9joyJxMNI9l4w7biW8ilSDaVRvFBDwOH8P0BK1ognFQTpg0wyQ6wIKLTblHJvROW692L/E53Q==", + "bin": { + "vm2": "bin/vm2" + }, + "engines": { + "node": ">=6.0" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -19449,6 +19808,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -19572,7 +19978,10 @@ "node_modules/xregexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", - "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "engines": { + "node": "*" + } }, "node_modules/xtend": { "version": "4.0.2", @@ -21777,9 +22186,9 @@ "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" }, "@pm2/agent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.0.tgz", - "integrity": "sha512-W1LvdyF1tGaVU5f/hV8DjpI5joI7MEgXiQMLZnTwZlFwDVP00O9s86571Q8xSiweTcFZFyye0F4wORN/PjSgGA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@pm2/agent/-/agent-2.0.1.tgz", + "integrity": "sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw==", "requires": { "async": "~3.2.0", "chalk": "~3.0.0", @@ -21791,7 +22200,7 @@ "nssocket": "0.6.0", "pm2-axon": "~4.0.1", "pm2-axon-rpc": "~0.7.0", - "proxy-agent": "~4.0.1", + "proxy-agent": "~5.0.0", "semver": "~7.2.0", "ws": "~7.4.0" }, @@ -22655,8 +23064,7 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, "abstract-logging": { "version": "2.0.1", @@ -22834,6 +23242,11 @@ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -22845,6 +23258,39 @@ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "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" + } + } + } + }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -23851,6 +24297,11 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -24010,6 +24461,11 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -24130,6 +24586,11 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -24599,8 +25060,7 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, "deep-is": { "version": "0.1.4", @@ -24636,13 +25096,14 @@ } }, "degenerator": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-2.2.0.tgz", - "integrity": "sha512-aiQcQowF01RxFI4ZLFMpzyotbQonhNpBao6dkI8JPk5a+hmSjR5ErHp2CQySmQe8os3VBqLCIh87nDBgZXvsmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.1.tgz", + "integrity": "sha512-LFsIFEeLPlKvAKXu7j3ssIG6RT0TbI7/GhsqrI0DnHASEQjXQ0LUSYcjJteGgRGmZbl1TnMSxpNQIAiJ7Du5TQ==", "requires": { "ast-types": "^0.13.2", "escodegen": "^1.8.1", - "esprima": "^4.0.0" + "esprima": "^4.0.0", + "vm2": "^3.9.3" }, "dependencies": { "escodegen": { @@ -24711,6 +25172,11 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, "denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", @@ -24735,6 +25201,11 @@ "minimalistic-assert": "^1.0.0" } }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -26099,6 +26570,14 @@ "universalify": "^2.0.0" } }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -26158,6 +26637,54 @@ "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.4.2.tgz", "integrity": "sha512-2BggwLEJOTfXzKq4Tl2bIT37p0IqqKkblH4e0cMp2sXTdmwg/ADBKMxvxaEytYYcgdxgng8+acsi3WgMVUl6CQ==" }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "generic-names": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", @@ -26540,6 +27067,11 @@ "has-symbols": "^1.0.2" } }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -26752,6 +27284,14 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, "image-size": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", @@ -29180,6 +29720,23 @@ "kind-of": "^6.0.3" } }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -29303,8 +29860,7 @@ "nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "optional": true + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" }, "nanoid": { "version": "3.1.25", @@ -29761,6 +30317,55 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, + "node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "node-releases": { "version": "1.1.75", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", @@ -29873,6 +30478,29 @@ "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -30006,6 +30634,17 @@ "path-key": "^3.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "nssocket": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", @@ -30028,6 +30667,11 @@ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -30135,6 +30779,15 @@ "mimic-fn": "^2.1.0" } }, + "opencc": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/opencc/-/opencc-1.1.3.tgz", + "integrity": "sha512-MCVhahNoF+YaVUc6LX5U0vUrsjY8KF/IEbVFUHeEDnVxhwBZkXawYpyp+oVRoMzvjMGP4QHAKxYzJ03OMRsfiA==", + "requires": { + "nan": "^2.14.2", + "node-pre-gyp": "^0.14.0" + } + }, "optional-require": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.7.tgz", @@ -30192,11 +30845,24 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } }, "ospath": { "version": "1.2.2", @@ -30271,9 +30937,9 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pac-proxy-agent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-4.1.0.tgz", - "integrity": "sha512-ejNgYm2HTXSIYX9eFlkvqFp8hyJ374uDf0Zq5YUAifiSh1D6fo+iBivQZirGvVv8dCYUsLhmLBRhlAYvBKI5+Q==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz", + "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==", "requires": { "@tootallnate/once": "1", "agent-base": "6", @@ -30281,17 +30947,17 @@ "get-uri": "3", "http-proxy-agent": "^4.0.1", "https-proxy-agent": "5", - "pac-resolver": "^4.1.0", + "pac-resolver": "^5.0.0", "raw-body": "^2.2.0", "socks-proxy-agent": "5" } }, "pac-resolver": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-4.2.0.tgz", - "integrity": "sha512-rPACZdUyuxT5Io/gFKUeeZFfE5T7ve7cAkE5TUZRRfuKP0u5Hocwe48X7ZEm6mYB+bTB0Qf+xlVlA/RM/i6RCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.0.tgz", + "integrity": "sha512-H+/A6KitiHNNW+bxBKREk2MCGSxljfqRX76NjummWEYIat7ldVXRU3dhRIE3iXZ0nvGBk6smv3nntxKkzRL8NA==", "requires": { - "degenerator": "^2.2.0", + "degenerator": "^3.0.1", "ip": "^1.1.5", "netmask": "^2.0.1" } @@ -31637,16 +32303,16 @@ } }, "proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-4.0.1.tgz", - "integrity": "sha512-ODnQnW2jc/FUVwHHuaZEfN5otg/fMbvMxz9nMSUQfJ9JU7q2SZvSULSsjLloVgJOiv9yhc8GlNMKc4GkFmcVEA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz", + "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==", "requires": { "agent-base": "^6.0.0", "debug": "4", "http-proxy-agent": "^4.0.0", "https-proxy-agent": "^5.0.0", "lru-cache": "^5.1.1", - "pac-proxy-agent": "^4.1.0", + "pac-proxy-agent": "^5.0.0", "proxy-from-env": "^1.0.0", "socks-proxy-agent": "^5.0.0" } @@ -31815,7 +32481,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -31826,14 +32491,12 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" } } }, @@ -32558,6 +33221,11 @@ "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, "set-cookie-parser": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", @@ -33596,6 +34264,35 @@ } } }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, "term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -34481,6 +35178,11 @@ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" }, + "vm2": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.3.tgz", + "integrity": "sha512-smLS+18RjXYMl9joyJxMNI9l4w7biW8ilSDaVRvFBDwOH8P0BK1ognFQTpg0wyQ6wIKLTblHJvROW692L/E53Q==" + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -34636,6 +35338,43 @@ "is-typed-array": "^1.1.7" } }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index 74eb2b75..f6539932 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "dragalia-site-front", "description": "Frontend of Dragalia Lost info website by OM.", "repository": "https://github.com/RaenonX-DL/dragalia-site-front", - "version": "2.15.0-beta.1", + "version": "2.15.0-beta.4", "engines": { "node": "14.x", "npm": "^7.12.0" @@ -36,6 +36,7 @@ "next": "^11.1.2", "next-auth": "^3.29.0", "node-fetch": "^2.6.2", + "opencc": "^1.1.3", "pm2": "^5.1.1", "react": "^17.0.2", "react-audio-player": "^0.17.0", diff --git a/src/api-def b/src/api-def index b03e69b7..e8df9c41 160000 --- a/src/api-def +++ b/src/api-def @@ -1 +1 @@ -Subproject commit b03e69b7223435856e9eb65d70691c90fb0a8b67 +Subproject commit e8df9c412eda2eb384315f4de2d21cc08999778a diff --git a/src/components/elements/gameData/unit/filter/utils.test.tsx b/src/components/elements/gameData/unit/filter/utils.test.tsx index 000b129f..c04039ea 100644 --- a/src/components/elements/gameData/unit/filter/utils.test.tsx +++ b/src/components/elements/gameData/unit/filter/utils.test.tsx @@ -257,4 +257,29 @@ describe('Get filtered unit info', () => { expect(unitIds).toStrictEqual([10750404]); }); + + it('filters using CHS name', async () => { + const inputData: UnitFilterInputData<'unitId'> = overrideObject( + generateFilterInput('unitId'), + {keyword: '谢斯'}, + ); + + const unitIds = getFilteredUnitInfo(inputData, charaInfo, dragonInfo, {}) + .map((unit) => unit.id); + + expect(unitIds).toStrictEqual([10750404, 10650503, 10950501]); + }); + + it('filters using CHS alias', async () => { + const inputData: UnitFilterInputData<'unitId'> = overrideObject( + generateFilterInput('unitId'), + {keyword: '龙爸'}, + ); + + // noinspection NonAsciiCharacters + const unitIds = getFilteredUnitInfo(inputData, charaInfo, dragonInfo, {'龍爸': 10750404}) + .map((unit) => unit.id); + + expect(unitIds).toStrictEqual([10750404]); + }); }); diff --git a/src/components/elements/gameData/unit/filter/utils.ts b/src/components/elements/gameData/unit/filter/utils.ts index a7fc0637..bc90986c 100644 --- a/src/components/elements/gameData/unit/filter/utils.ts +++ b/src/components/elements/gameData/unit/filter/utils.ts @@ -1,3 +1,5 @@ +import {OpenCC} from 'opencc'; + import {UnitNameRefData, UnitType} from '../../../../../api-def/api'; import {CharaInfo, CharaInfoData, DragonInfo, UnitInfoData, UnitInfoDataBase} from '../../../../../api-def/resources'; import {UnitFilterInputData} from './types'; @@ -21,31 +23,39 @@ export const getFilteredUnitInfo = ( return []; } + // Config name doc: https://github.com/BYVoid/OpenCC#configurations-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6 + const openCC: OpenCC = new OpenCC('s2t.json'); const ret: Array = []; const isUnitElementMatch = (unit: UnitInfoDataBase) => ( !inputData.elements.length || inputData.elements.includes(unit.element) ); + const isUnitWeaponMatch = (unit: CharaInfoData) => ( !inputData.weaponTypes.length || inputData.weaponTypes.includes(unit.weapon) ); + const isUnitNameMatch = (unit: UnitInfoDataBase) => { if (!inputData.keyword) { return true; } - const keywordLower = inputData.keyword.toLowerCase(); + const keywordProcessed = openCC.convertSync(inputData.keyword.toLowerCase()); const isKeywordPartialUnitName = Object .values(unit.name) - .some((name) => name.toLowerCase().indexOf(keywordLower) >= 0); + .some((name) => name.toLowerCase().indexOf(keywordProcessed) >= 0); const isKeywordPartialCustomName = Object.entries(unitNameRef) .filter(([_, referencedUnitId]) => unit.id === referencedUnitId) - .some(([name, _]) => name.toLowerCase().indexOf(keywordLower) >= 0); + .some(([name, _]) => name.toLowerCase().indexOf(keywordProcessed) >= 0); return isKeywordPartialUnitName || isKeywordPartialCustomName; }; + const isInfoChara = (info: any): info is CharaInfoData => { + return info.type === UnitType.CHARACTER; + }; + if (inputData.type === UnitType.CHARACTER) { ret.push( ...charaInfo @@ -62,10 +72,6 @@ export const getFilteredUnitInfo = ( ); } - const isInfoChara = (info: any): info is CharaInfoData => { - return info.type === UnitType.CHARACTER; - }; - return ret.sort((a, b) => ( a.type - b.type || // Type ASC (CHARA -> DRAGON) b.rarity - a.rarity || // Rarity DESC (5 -> 3) diff --git a/test/data/resources b/test/data/resources index 416a6bde..5008a95d 160000 --- a/test/data/resources +++ b/test/data/resources @@ -1 +1 @@ -Subproject commit 416a6bdee0cb7b94d6543a57abc51e3eb3f39784 +Subproject commit 5008a95d96e3521ff3e6e1caa5a0d8035be9ca8a From dc67754a76198fbf7b57c37eb528140a1442f213 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 06:52:31 -0500 Subject: [PATCH 03/16] IMP - Refactor textual searching utils Signed-off-by: RaenonX --- .../elements/gameData/unit/filter/utils.ts | 15 ++++---- src/utils/text.ts | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 src/utils/text.ts diff --git a/src/components/elements/gameData/unit/filter/utils.ts b/src/components/elements/gameData/unit/filter/utils.ts index bc90986c..726a2beb 100644 --- a/src/components/elements/gameData/unit/filter/utils.ts +++ b/src/components/elements/gameData/unit/filter/utils.ts @@ -1,7 +1,6 @@ -import {OpenCC} from 'opencc'; - import {UnitNameRefData, UnitType} from '../../../../../api-def/api'; import {CharaInfo, CharaInfoData, DragonInfo, UnitInfoData, UnitInfoDataBase} from '../../../../../api-def/resources'; +import {transformForSearch} from '../../../../../utils/text'; import {UnitFilterInputData} from './types'; @@ -23,8 +22,6 @@ export const getFilteredUnitInfo = ( return []; } - // Config name doc: https://github.com/BYVoid/OpenCC#configurations-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6 - const openCC: OpenCC = new OpenCC('s2t.json'); const ret: Array = []; const isUnitElementMatch = (unit: UnitInfoDataBase) => ( @@ -40,14 +37,18 @@ export const getFilteredUnitInfo = ( return true; } - const keywordProcessed = openCC.convertSync(inputData.keyword.toLowerCase()); + const keywordProcessed = transformForSearch(inputData.keyword.toLowerCase()); const isKeywordPartialUnitName = Object .values(unit.name) - .some((name) => name.toLowerCase().indexOf(keywordProcessed) >= 0); + .some((name) => ( + transformForSearch(name, {variantInsensitive: false}).indexOf(keywordProcessed) >= 0 + )); const isKeywordPartialCustomName = Object.entries(unitNameRef) .filter(([_, referencedUnitId]) => unit.id === referencedUnitId) - .some(([name, _]) => name.toLowerCase().indexOf(keywordProcessed) >= 0); + .some(([name, _]) => ( + transformForSearch(name, {variantInsensitive: false}).indexOf(keywordProcessed) >= 0 + )); return isKeywordPartialUnitName || isKeywordPartialCustomName; }; diff --git a/src/utils/text.ts b/src/utils/text.ts new file mode 100644 index 00000000..b96cbe84 --- /dev/null +++ b/src/utils/text.ts @@ -0,0 +1,34 @@ +import {OpenCC} from 'opencc'; + +import {overrideObject} from './override'; +import {DeepPartial} from './types'; + + +// Config name doc: https://github.com/BYVoid/OpenCC#configurations-%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6 +const openCC: OpenCC = new OpenCC('s2t.json'); + +type TransformOptions = { + caseInsensitive: boolean, + variantInsensitive: boolean, +} + +export const transformForSearch = (text: string, options?: DeepPartial): string => { + const transformOptions: TransformOptions = overrideObject( + { + caseInsensitive: true, + variantInsensitive: true, + }, + options, + {originalOnly: true}, + ); + + if (transformOptions.caseInsensitive) { + text = text.toLowerCase(); + } + + if (transformOptions.variantInsensitive) { + text = openCC.convertSync(text); + } + + return text; +}; From e314845e56fcaeedaabd9e1e79076fb282775496 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 07:05:06 -0500 Subject: [PATCH 04/16] ADD - CHS quest title searching support #307 Signed-off-by: RaenonX --- .../elements/input/search/main.test.tsx | 19 ++++++++++++++++++- src/components/elements/input/search/main.tsx | 8 ++++---- src/components/elements/posts/list/main.tsx | 5 ++++- .../pages/tier/points/index/main.tsx | 5 ++++- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/components/elements/input/search/main.test.tsx b/src/components/elements/input/search/main.test.tsx index fe3a087f..1d333033 100644 --- a/src/components/elements/input/search/main.test.tsx +++ b/src/components/elements/input/search/main.test.tsx @@ -13,7 +13,7 @@ describe('Search input', () => { const SearchWrapper = () => ( option === searchTextLowered} + isOptionMatchSearch={(option, searchText) => option === searchText} renderMatchedSelection={(option) => {option}} /> ); @@ -45,4 +45,21 @@ describe('Search input', () => { expect(screen.getByText('option 1')).toBeInTheDocument(); expect(screen.getByText('option 2')).toBeInTheDocument(); }); + + it('searches in CHS', async () => { + const {rerender} = renderReact(() => ( + option === searchText} + renderMatchedSelection={(option) => {option}} + /> + )); + + const keywordInput = screen.getByPlaceholderText(/Enter keyword/); + typeInput(keywordInput, '汉字', {rerender}); + userEvent.clear(keywordInput); + rerender(); + + expect(screen.getByText('漢字')).toBeInTheDocument(); + }); }); diff --git a/src/components/elements/input/search/main.tsx b/src/components/elements/input/search/main.tsx index 4692d162..34e98584 100644 --- a/src/components/elements/input/search/main.tsx +++ b/src/components/elements/input/search/main.tsx @@ -4,12 +4,13 @@ import {Property} from 'csstype'; import Form from 'react-bootstrap/Form'; import {useI18n} from '../../../../i18n/hook'; +import {transformForSearch} from '../../../../utils/text'; import {SearchResults} from './results'; type Props = { options: Array - isOptionMatchSearch: (option: E, searchTextLowered: string) => boolean, + isOptionMatchSearch: (option: E, searchTextTransformed: string) => boolean, renderMatchedSelection: (option: E) => React.ReactNode, height?: Property.Height, } @@ -25,10 +26,9 @@ export const Search = ({ let matchedOptions = options; - // `toLowerCase()` is faster than `match()` - const searchTextLowered = searchText.toLowerCase(); + const searchTextTransformed = transformForSearch(searchText); if (!!searchText) { - matchedOptions = options.filter((option) => isOptionMatchSearch(option, searchTextLowered)); + matchedOptions = options.filter((option) => isOptionMatchSearch(option, searchTextTransformed)); } return ( diff --git a/src/components/elements/posts/list/main.tsx b/src/components/elements/posts/list/main.tsx index 1e4e9396..2d08accb 100644 --- a/src/components/elements/posts/list/main.tsx +++ b/src/components/elements/posts/list/main.tsx @@ -1,6 +1,7 @@ import React from 'react'; import {SequencedPostInfo} from '../../../../api-def/api'; +import {transformForSearch} from '../../../../utils/text'; import {Search} from '../../input/search/main'; import {PostEntry, PostEntryProps} from './entry'; @@ -14,7 +15,9 @@ export const PostList = ({entries, ...props}: PostL return ( option.title.toLowerCase().includes(textLowered)} + isOptionMatchSearch={(option, searchText) => ( + transformForSearch(option.title, {variantInsensitive: false}).includes(searchText) + )} renderMatchedSelection={(entry) => } height="70vh" /> diff --git a/src/components/pages/tier/points/index/main.tsx b/src/components/pages/tier/points/index/main.tsx index afa82854..9bf4e41e 100644 --- a/src/components/pages/tier/points/index/main.tsx +++ b/src/components/pages/tier/points/index/main.tsx @@ -6,6 +6,7 @@ import Row from 'react-bootstrap/Row'; import {DataPath} from '../../../../../const/path/definitions'; import {useI18n} from '../../../../../i18n/hook'; import {makeDataUrl} from '../../../../../utils/path/make'; +import {transformForSearch} from '../../../../../utils/text'; import {AdsPageTop, AdsUnitKeyPointIndexEnd} from '../../../../elements/common/ads/main'; import {InternalLink} from '../../../../elements/common/link/internal'; import {Loading} from '../../../../elements/common/loading'; @@ -28,7 +29,9 @@ export const KeyPointIndexPage = () => { ({id, ...entry}))} - isOptionMatchSearch={(option, textLowered) => option.description.toLowerCase().includes(textLowered)} + isOptionMatchSearch={(option, searchText) => ( + transformForSearch(option.description, {variantInsensitive: false}).includes(searchText) + )} renderMatchedSelection={({id, type, description}) => ( From 779986afbfcc828b9c3ec95d82b4effbdcf7ee40 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 08:11:41 -0500 Subject: [PATCH 05/16] FIX - `opencc` not supporting client-side operations Signed-off-by: RaenonX --- package-lock.json | 784 +----------------- package.json | 3 +- .../elements/gameData/unit/filter/utils.ts | 2 +- src/components/elements/posts/list/main.tsx | 1 - src/utils/text.ts | 11 +- 5 files changed, 54 insertions(+), 747 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8233f9d0..4788203f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "next": "^11.1.2", "next-auth": "^3.29.0", "node-fetch": "^2.6.2", - "opencc": "^1.1.3", + "opencc-js": "^1.0.3", "pm2": "^5.1.1", "react": "^17.0.2", "react-audio-player": "^0.17.0", @@ -42,6 +42,7 @@ "@types/mongodb": "^3.6.20", "@types/node": "^14.17.14", "@types/node-fetch": "^2.5.12", + "@types/opencc-js": "^1.0.0", "@types/react": "^17.0.20", "@types/react-dom": "^17.0.9", "@types/react-timeago": "^4.1.3", @@ -3577,6 +3578,12 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, + "node_modules/@types/opencc-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/opencc-js/-/opencc-js-1.0.0.tgz", + "integrity": "sha512-vde1AUIJIEC2WvvHuqKWu/7P6WBqbcs4sB/B6zVFTNw/mFIUgSvWlFtYdg+NEEdkxBOeehdSZmEVVheikItS3A==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -3925,7 +3932,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/abstract-logging": { "version": "2.0.1", @@ -4158,11 +4166,6 @@ "node": ">= 6.0.0" } }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, "node_modules/arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -4188,37 +4191,6 @@ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/are-we-there-yet/node_modules/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==", - "dependencies": { - "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" - } - }, - "node_modules/are-we-there-yet/node_modules/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==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -5518,11 +5490,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -5733,14 +5700,6 @@ "node": ">= 0.12.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -5893,11 +5852,6 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -6460,6 +6414,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, "engines": { "node": ">=4.0.0" } @@ -6611,11 +6566,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "node_modules/denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", @@ -6649,17 +6599,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -8412,14 +8351,6 @@ "node": ">=10" } }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dependencies": { - "minipass": "^2.6.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8490,64 +8421,6 @@ "node": ">=8" } }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/generic-names": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", @@ -9051,11 +8924,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "node_modules/has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -9338,14 +9206,6 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dependencies": { - "minimatch": "^3.0.4" - } - }, "node_modules/image-size": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", @@ -12558,23 +12418,6 @@ "node": ">= 6" } }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dependencies": { - "minipass": "^2.9.0" - } - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -12754,7 +12597,8 @@ "node_modules/nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "optional": true }, "node_modules/nanoid": { "version": "3.1.25", @@ -13318,69 +13162,6 @@ "node": ">=0.10.0" } }, - "node_modules/node-pre-gyp": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", - "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/node-pre-gyp/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/node-pre-gyp/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/node-pre-gyp/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/node-pre-gyp/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/node-releases": { "version": "1.1.75", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", @@ -13527,29 +13308,6 @@ "node": ">=8" } }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "node_modules/npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -13725,17 +13483,6 @@ "node": ">=8" } }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "node_modules/nssocket": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", @@ -13759,14 +13506,6 @@ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -13919,18 +13658,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/opencc": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/opencc/-/opencc-1.1.3.tgz", - "integrity": "sha512-MCVhahNoF+YaVUc6LX5U0vUrsjY8KF/IEbVFUHeEDnVxhwBZkXawYpyp+oVRoMzvjMGP4QHAKxYzJ03OMRsfiA==", - "hasInstallScript": true, - "dependencies": { - "nan": "^2.14.2", - "node-pre-gyp": "^0.14.0" - }, - "engines": { - "node": ">= 8.0.0" - } + "node_modules/opencc-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/opencc-js/-/opencc-js-1.0.3.tgz", + "integrity": "sha512-WaifP9DpNc199fvEqmQtSjxmiQxYB5nqO8NgE7N3CkER+hP8I8o2caiNrEUs1RUvVfSlph/3qWwymYt5hmiQbg==" }, "node_modules/optional-require": { "version": "1.1.7", @@ -13999,31 +13730,15 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "node_modules/ospath": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", @@ -16069,6 +15784,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -16082,12 +15798,14 @@ "node_modules/rc/node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "node_modules/rc/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -17040,11 +16758,6 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "node_modules/set-cookie-parser": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", @@ -18348,53 +18061,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tar/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -19808,53 +19474,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -22793,6 +22412,12 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, + "@types/opencc-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/opencc-js/-/opencc-js-1.0.0.tgz", + "integrity": "sha512-vde1AUIJIEC2WvvHuqKWu/7P6WBqbcs4sB/B6zVFTNw/mFIUgSvWlFtYdg+NEEdkxBOeehdSZmEVVheikItS3A==", + "dev": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -23064,7 +22689,8 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "abstract-logging": { "version": "2.0.1", @@ -23242,11 +22868,6 @@ "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, "arch": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", @@ -23258,39 +22879,6 @@ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "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" - } - } - } - }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -24297,11 +23885,6 @@ "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -24461,11 +24044,6 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, "collect-v8-coverage": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", @@ -24586,11 +24164,6 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", @@ -25060,7 +24633,8 @@ "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true }, "deep-is": { "version": "0.1.4", @@ -25172,11 +24746,6 @@ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, "denque": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", @@ -25201,11 +24770,6 @@ "minimalistic-assert": "^1.0.0" } }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" - }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -26570,14 +26134,6 @@ "universalify": "^2.0.0" } }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "requires": { - "minipass": "^2.6.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -26637,54 +26193,6 @@ "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.4.2.tgz", "integrity": "sha512-2BggwLEJOTfXzKq4Tl2bIT37p0IqqKkblH4e0cMp2sXTdmwg/ADBKMxvxaEytYYcgdxgng8+acsi3WgMVUl6CQ==" }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, "generic-names": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", @@ -27067,11 +26575,6 @@ "has-symbols": "^1.0.2" } }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, "has-yarn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", @@ -27284,14 +26787,6 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "requires": { - "minimatch": "^3.0.4" - } - }, "image-size": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.0.tgz", @@ -29720,23 +29215,6 @@ "kind-of": "^6.0.3" } }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "requires": { - "minipass": "^2.9.0" - } - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -29860,7 +29338,8 @@ "nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "optional": true }, "nanoid": { "version": "3.1.25", @@ -30317,55 +29796,6 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", "dev": true }, - "node-pre-gyp": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, "node-releases": { "version": "1.1.75", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", @@ -30478,29 +29908,6 @@ "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", @@ -30634,17 +30041,6 @@ "path-key": "^3.0.0" } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, "nssocket": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz", @@ -30667,11 +30063,6 @@ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -30779,14 +30170,10 @@ "mimic-fn": "^2.1.0" } }, - "opencc": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/opencc/-/opencc-1.1.3.tgz", - "integrity": "sha512-MCVhahNoF+YaVUc6LX5U0vUrsjY8KF/IEbVFUHeEDnVxhwBZkXawYpyp+oVRoMzvjMGP4QHAKxYzJ03OMRsfiA==", - "requires": { - "nan": "^2.14.2", - "node-pre-gyp": "^0.14.0" - } + "opencc-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/opencc-js/-/opencc-js-1.0.3.tgz", + "integrity": "sha512-WaifP9DpNc199fvEqmQtSjxmiQxYB5nqO8NgE7N3CkER+hP8I8o2caiNrEUs1RUvVfSlph/3qWwymYt5hmiQbg==" }, "optional-require": { "version": "1.1.7", @@ -30845,24 +30232,11 @@ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "ospath": { "version": "1.2.2", @@ -32481,6 +31855,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -32491,12 +31866,14 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true } } }, @@ -33221,11 +32598,6 @@ "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, "set-cookie-parser": { "version": "2.4.8", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz", @@ -34264,35 +33636,6 @@ } } }, - "tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "requires": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - } - } - }, "term-size": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", @@ -35338,43 +34681,6 @@ "is-typed-array": "^1.1.7" } }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", diff --git a/package.json b/package.json index f6539932..46bb718e 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "next": "^11.1.2", "next-auth": "^3.29.0", "node-fetch": "^2.6.2", - "opencc": "^1.1.3", + "opencc-js": "^1.0.3", "pm2": "^5.1.1", "react": "^17.0.2", "react-audio-player": "^0.17.0", @@ -57,6 +57,7 @@ "@types/color": "^3.0.2", "@types/jest": "^27.0.1", "@types/mongodb": "^3.6.20", + "@types/opencc-js": "^1.0.0", "@types/node": "^14.17.14", "@types/node-fetch": "^2.5.12", "@types/react": "^17.0.20", diff --git a/src/components/elements/gameData/unit/filter/utils.ts b/src/components/elements/gameData/unit/filter/utils.ts index 726a2beb..d37a3359 100644 --- a/src/components/elements/gameData/unit/filter/utils.ts +++ b/src/components/elements/gameData/unit/filter/utils.ts @@ -37,7 +37,7 @@ export const getFilteredUnitInfo = ( return true; } - const keywordProcessed = transformForSearch(inputData.keyword.toLowerCase()); + const keywordProcessed = transformForSearch(inputData.keyword); const isKeywordPartialUnitName = Object .values(unit.name) diff --git a/src/components/elements/posts/list/main.tsx b/src/components/elements/posts/list/main.tsx index 2d08accb..34f5ad22 100644 --- a/src/components/elements/posts/list/main.tsx +++ b/src/components/elements/posts/list/main.tsx @@ -10,7 +10,6 @@ type PostListProps = PostEntryProps & { entries: Array, }; - export const PostList = ({entries, ...props}: PostListProps) => { return ( ): string => { +export const transformForSearch =(text: string, options?: DeepPartial): string => { const transformOptions: TransformOptions = overrideObject( { caseInsensitive: true, @@ -23,11 +23,12 @@ export const transformForSearch = (text: string, options?: DeepPartial Date: Sun, 3 Oct 2021 08:55:52 -0500 Subject: [PATCH 06/16] FIX - typing errors Signed-off-by: RaenonX --- src/components/pages/tier/out/all/entry.test.tsx | 9 ++++++++- src/components/pages/tier/out/dimensional/entry.test.tsx | 9 ++++++++- src/components/pages/tier/utils.test.ts | 3 ++- test/data/mock/exAbilityData.ts | 3 ++- test/data/mock/skill.ts | 3 ++- test/data/mock/unitInfo.ts | 3 +++ 6 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/components/pages/tier/out/all/entry.test.tsx b/src/components/pages/tier/out/all/entry.test.tsx index 68642ad2..dbc5065e 100644 --- a/src/components/pages/tier/out/all/entry.test.tsx +++ b/src/components/pages/tier/out/all/entry.test.tsx @@ -4,7 +4,13 @@ import {screen} from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import {renderReact} from '../../../../../../test/render/main'; -import {KeyPointData, SupportedLanguages, UnitTierNote, UnitType} from '../../../../../api-def/api'; +import { + KeyPointData, + PartiallySupportedLanguages, + SupportedLanguages, + UnitTierNote, + UnitType, +} from '../../../../../api-def/api'; import {Element, UnitInfoData} from '../../../../../api-def/resources'; import {overrideObject} from '../../../../../utils/override'; import {TierListEntry} from './entry'; @@ -21,6 +27,7 @@ describe('Tier list entry', () => { [SupportedLanguages.CHT]: 'CHT name', [SupportedLanguages.EN]: 'EN name', [SupportedLanguages.JP]: 'JP name', + [PartiallySupportedLanguages.CHS]: 'CHS name', }, cvEn: { [SupportedLanguages.CHT]: 'CHT EN CV name', diff --git a/src/components/pages/tier/out/dimensional/entry.test.tsx b/src/components/pages/tier/out/dimensional/entry.test.tsx index d778ab59..6d5aec7b 100644 --- a/src/components/pages/tier/out/dimensional/entry.test.tsx +++ b/src/components/pages/tier/out/dimensional/entry.test.tsx @@ -4,7 +4,13 @@ import {screen} from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import {renderReact} from '../../../../../../test/render/main'; -import {KeyPointData, SupportedLanguages, UnitTierNote, UnitType} from '../../../../../api-def/api'; +import { + KeyPointData, + PartiallySupportedLanguages, + SupportedLanguages, + UnitTierNote, + UnitType, +} from '../../../../../api-def/api'; import {Element, UnitInfoData} from '../../../../../api-def/resources'; import {overrideObject} from '../../../../../utils/override'; import {TierListEntry} from './entry'; @@ -21,6 +27,7 @@ describe('Tier list entry', () => { [SupportedLanguages.CHT]: 'CHT name', [SupportedLanguages.EN]: 'EN name', [SupportedLanguages.JP]: 'JP name', + [PartiallySupportedLanguages.CHS]: 'CHS name', }, cvEn: { [SupportedLanguages.CHT]: 'CHT EN CV name', diff --git a/src/components/pages/tier/utils.test.ts b/src/components/pages/tier/utils.test.ts index ec0f3a93..d0f678b0 100644 --- a/src/components/pages/tier/utils.test.ts +++ b/src/components/pages/tier/utils.test.ts @@ -1,4 +1,4 @@ -import {SupportedLanguages, UnitTierNote, UnitType} from '../../../api-def/api'; +import {PartiallySupportedLanguages, SupportedLanguages, UnitTierNote, UnitType} from '../../../api-def/api'; import {Element, UnitInfoData} from '../../../api-def/resources'; import {categorizeEntryPack} from './utils'; @@ -14,6 +14,7 @@ describe('Categorize entry pack', () => { [SupportedLanguages.CHT]: 'CHT name', [SupportedLanguages.EN]: 'EN name', [SupportedLanguages.JP]: 'JP name', + [PartiallySupportedLanguages.CHS]: 'CHS name', }, cvEn: { [SupportedLanguages.CHT]: 'CHT EN CV name', diff --git a/test/data/mock/exAbilityData.ts b/test/data/mock/exAbilityData.ts index 083b7e77..7ae0872b 100644 --- a/test/data/mock/exAbilityData.ts +++ b/test/data/mock/exAbilityData.ts @@ -1,4 +1,4 @@ -import {SupportedLanguages, UnitType} from '../../../src/api-def/api'; +import {PartiallySupportedLanguages, SupportedLanguages, UnitType} from '../../../src/api-def/api'; import {CharaExAbilityDataEntry, Element, Weapon} from '../../../src/api-def/resources'; @@ -14,6 +14,7 @@ export const generateExAbilityDataEntry = (): CharaExAbilityDataEntry => { [SupportedLanguages.CHT]: 'CHT name', [SupportedLanguages.EN]: 'EN name', [SupportedLanguages.JP]: 'JP name', + [PartiallySupportedLanguages.CHS]: 'CHS name', }, cvEn: { [SupportedLanguages.CHT]: 'CHT EN CV name', diff --git a/test/data/mock/skill.ts b/test/data/mock/skill.ts index 99a9d35b..74599f66 100644 --- a/test/data/mock/skill.ts +++ b/test/data/mock/skill.ts @@ -1,4 +1,4 @@ -import {SupportedLanguages, UnitType} from '../../../src/api-def/api'; +import {PartiallySupportedLanguages, SupportedLanguages, UnitType} from '../../../src/api-def/api'; import {AttackingSkillData, Element} from '../../../src/api-def/resources'; import {CalculatedSkillEntry} from '../../../src/components/pages/gameData/skillAtk/out/types'; @@ -14,6 +14,7 @@ export const generateAttackingSkillEntry = (): AttackingSkillData => ({ [SupportedLanguages.CHT]: 'CHT name', [SupportedLanguages.EN]: 'EN name', [SupportedLanguages.JP]: 'JP name', + [PartiallySupportedLanguages.CHS]: 'CHS name', }, cvEn: { [SupportedLanguages.CHT]: 'CHT EN CV name', diff --git a/test/data/mock/unitInfo.ts b/test/data/mock/unitInfo.ts index 061d6702..3601ad2c 100644 --- a/test/data/mock/unitInfo.ts +++ b/test/data/mock/unitInfo.ts @@ -21,6 +21,7 @@ export const generateGalaMymInfo = (): UnitInfoData => ({ cht: '慕慕(龍絆日Ver.)', en: 'Gala Mym', jp: 'ムム(ドラフェスVer.)', + chs: '穆穆(Fes限定Ver.)', }, rarity: 5, releaseEpoch: 1609480800.0, @@ -45,6 +46,7 @@ export const generateBrunhildaInfo = (): UnitInfoData => ({ cht: '布倫希爾德', en: 'Brunhilda', jp: 'ブリュンヒルデ', + chs: '布伦希尔德', }, rarity: 4, releaseEpoch: 1609480800.0, @@ -69,6 +71,7 @@ export const generateHighBrunhildaInfo = (): UnitInfoData => ({ cht: '真‧布倫希爾德', en: 'High Brunhilda', jp: '真ブリュンヒルデ', + chs: '真布伦希尔德', }, rarity: 5, releaseEpoch: 1609480800.0, From 89abc1e50ca07f10ab2344b74362f499f4020c94 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 14:30:37 -0500 Subject: [PATCH 07/16] IMP - Unit info to click unit name for related links Signed-off-by: RaenonX --- .../unitInfo/output/elements/links.tsx | 30 ------------------- .../unitInfo/output/elements/name.tsx | 28 ++++++++++------- .../pages/gameData/unitInfo/output/main.tsx | 3 -- src/i18n/translations/cht/translation.ts | 3 ++ src/i18n/translations/definition.ts | 3 ++ src/i18n/translations/en/translation.ts | 3 ++ src/i18n/translations/jp/translation.ts | 3 ++ 7 files changed, 30 insertions(+), 43 deletions(-) delete mode 100644 src/components/pages/gameData/unitInfo/output/elements/links.tsx diff --git a/src/components/pages/gameData/unitInfo/output/elements/links.tsx b/src/components/pages/gameData/unitInfo/output/elements/links.tsx deleted file mode 100644 index fa597df6..00000000 --- a/src/components/pages/gameData/unitInfo/output/elements/links.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; - -import Col from 'react-bootstrap/Col'; -import Row from 'react-bootstrap/Row'; - -import {PostPath} from '../../../../../../const/path/definitions'; -import {useI18n} from '../../../../../../i18n/hook'; -import {makePostUrl} from '../../../../../../utils/path/make'; -import {InternalLink} from '../../../../../elements/common/link/internal'; - - -type Props = { - unitId: number, -} - -export const RelatedLinks = ({unitId}: Props) => { - const {t, lang} = useI18n(); - - return ( - - - t.game.unitInfo.links.analysis)} - /> - - - ); -}; diff --git a/src/components/pages/gameData/unitInfo/output/elements/name.tsx b/src/components/pages/gameData/unitInfo/output/elements/name.tsx index 8c9f9ada..f8e308f7 100644 --- a/src/components/pages/gameData/unitInfo/output/elements/name.tsx +++ b/src/components/pages/gameData/unitInfo/output/elements/name.tsx @@ -7,6 +7,7 @@ import {CharaInfoData, UnitInfoDataBase} from '../../../../../../api-def/resourc import {useI18n} from '../../../../../../i18n/hook'; import {reverseEnumLookup} from '../../../../../../utils/services/resources/utils'; import {EnumEntryImageIcon} from '../../../../../elements/gameData/enumIcon'; +import {UnitLink} from '../../../../../elements/gameData/unit/link'; import {useUnitProps} from '../../../../../hooks/unitProps'; @@ -30,20 +31,27 @@ export type UnitNameBlockProps = { } export const UnitNameBlock = ({info}: UnitNameBlockProps) => { - const {lang} = useI18n(); + const {t, lang} = useI18n(); const {elemEnums} = useUnitProps(); const elemEnum = reverseEnumLookup(elemEnums.elemental, info.element); return ( - - -   - {isCharaInfo(info) && <> } -

- {info.name[lang]} -

- -
+ <> + + +   + {isCharaInfo(info) && <> } +

+ +

+ +
+ + + {t((t) => t.game.unitInfo.tips.clickNameForLinks)} + + + ); }; diff --git a/src/components/pages/gameData/unitInfo/output/main.tsx b/src/components/pages/gameData/unitInfo/output/main.tsx index 205bc4e0..a37117bd 100644 --- a/src/components/pages/gameData/unitInfo/output/main.tsx +++ b/src/components/pages/gameData/unitInfo/output/main.tsx @@ -11,7 +11,6 @@ import {Image} from '../../../../elements/common/image'; import {Loading} from '../../../../elements/common/loading'; import {useUnitId} from '../../../../elements/gameData/hook'; import {AbilityBlock} from './elements/ability/main'; -import {RelatedLinks} from './elements/links'; import {UnitNameBlock} from './elements/name'; import {NormalAttackSection} from './elements/normalAttack/section'; import {SkillSection} from './elements/skill/section'; @@ -43,8 +42,6 @@ export const UnitInfo = () => { return ( <> -
-
diff --git a/src/i18n/translations/cht/translation.ts b/src/i18n/translations/cht/translation.ts index e70ea9f9..07a68dd0 100644 --- a/src/i18n/translations/cht/translation.ts +++ b/src/i18n/translations/cht/translation.ts @@ -403,6 +403,9 @@ export const translation: TranslationStruct = { total: '(總計)', relatedLinks: '相關連結', }, + tips: { + clickNameForLinks: '點擊上方角色名稱以查看相關連結。', + }, }, unitTier: { tier: { diff --git a/src/i18n/translations/definition.ts b/src/i18n/translations/definition.ts index 2e6acda3..bea9e5fa 100644 --- a/src/i18n/translations/definition.ts +++ b/src/i18n/translations/definition.ts @@ -398,6 +398,9 @@ export type TranslationStruct = { total: string, relatedLinks: string, }, + tips: { + clickNameForLinks: string, + }, }, unitTier: { tier: { diff --git a/src/i18n/translations/en/translation.ts b/src/i18n/translations/en/translation.ts index 2875a651..e55da489 100644 --- a/src/i18n/translations/en/translation.ts +++ b/src/i18n/translations/en/translation.ts @@ -435,6 +435,9 @@ export const translation: TranslationStruct = { total: '(Total)', relatedLinks: 'Related Links', }, + tips: { + clickNameForLinks: 'Click the unit name above for related links.', + }, }, unitTier: { tier: { diff --git a/src/i18n/translations/jp/translation.ts b/src/i18n/translations/jp/translation.ts index 818a9a3b..f8bce256 100644 --- a/src/i18n/translations/jp/translation.ts +++ b/src/i18n/translations/jp/translation.ts @@ -410,6 +410,9 @@ export const translation: TranslationStruct = { total: '(総計)', relatedLinks: 'に関するリンク', }, + tips: { + clickNameForLinks: 'TBA', + }, }, unitTier: { tier: { From 8c7d7a34f142583712b4ab4a2a0e963679039a0d Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 14:45:26 -0500 Subject: [PATCH 08/16] IMP - Redirect to individual tier note page on edited Signed-off-by: RaenonX --- src/components/pages/tier/edit/main.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/pages/tier/edit/main.tsx b/src/components/pages/tier/edit/main.tsx index 1262fc0e..601df08c 100644 --- a/src/components/pages/tier/edit/main.tsx +++ b/src/components/pages/tier/edit/main.tsx @@ -2,11 +2,11 @@ import React from 'react'; import {Dimension, DimensionKey} from '../../../../api-def/api'; -import {GeneralPath} from '../../../../const/path/definitions'; +import {UnitPath} from '../../../../const/path/definitions'; import {AppReactContext} from '../../../../context/app/main'; import {useI18n} from '../../../../i18n/hook'; import {overrideObject} from '../../../../utils/override'; -import {makeGeneralUrl} from '../../../../utils/path/make'; +import {makeUnitUrl} from '../../../../utils/path/make'; import {processText} from '../../../../utils/process/text'; import {ApiRequestSender} from '../../../../utils/services/api/requestSender'; import {useUnitInfo} from '../../../../utils/services/resources/unitInfo/hooks'; @@ -76,7 +76,7 @@ export const TierNoteEdit = () => { variant: 'outline-light', submitText: t((t) => t.misc.update), }} - getRedirectUrlOnSuccess={() => makeGeneralUrl(GeneralPath.TIER_LOOKUP, {lang})} + getRedirectUrlOnSuccess={() => makeUnitUrl(UnitPath.UNIT_TIER, {id: unitId, lang})} >
From b41f9f0e40ea0d2603cfe4aa62db5bec304d8b86 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 14:48:47 -0500 Subject: [PATCH 09/16] IMP - Fix incorrect extension Signed-off-by: RaenonX --- src/components/pages/tier/edit/{hook.tsx => hook.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/components/pages/tier/edit/{hook.tsx => hook.ts} (100%) diff --git a/src/components/pages/tier/edit/hook.tsx b/src/components/pages/tier/edit/hook.ts similarity index 100% rename from src/components/pages/tier/edit/hook.tsx rename to src/components/pages/tier/edit/hook.ts From 6caa542e75c9d2db1655f7588c245562fc066002 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 15:39:50 -0500 Subject: [PATCH 10/16] ADD - Individual tier note viewing page #301 Signed-off-by: RaenonX --- src/api-def | 2 +- .../elements/markdown/main.test.tsx | 2 +- .../pages/tier/out/elements/points.tsx | 4 +- src/components/pages/tier/unit/admin.tsx | 32 +++++++ src/components/pages/tier/unit/dimension.tsx | 48 ++++++++++ src/components/pages/tier/unit/hook.ts | 68 ++++++++++++++ src/components/pages/tier/unit/keyPoints.tsx | 15 ++++ .../pages/tier/unit/main.module.css | 5 ++ .../pages/tier/unit/main.module.css.map | 1 + .../pages/tier/unit/main.module.scss | 5 ++ src/components/pages/tier/unit/main.test.tsx | 90 +++++++++++++++++++ src/components/pages/tier/unit/main.tsx | 50 ++++++++++- src/i18n/translations/cht/translation.ts | 1 + src/i18n/translations/definition.ts | 1 + src/i18n/translations/en/translation.ts | 1 + src/i18n/translations/jp/translation.ts | 1 + src/utils/services/api/requestSender.ts | 26 ++++-- src/utils/services/resources/loader.ts | 2 +- 18 files changed, 343 insertions(+), 11 deletions(-) create mode 100644 src/components/pages/tier/unit/admin.tsx create mode 100644 src/components/pages/tier/unit/dimension.tsx create mode 100644 src/components/pages/tier/unit/hook.ts create mode 100644 src/components/pages/tier/unit/keyPoints.tsx create mode 100644 src/components/pages/tier/unit/main.module.css create mode 100644 src/components/pages/tier/unit/main.module.css.map create mode 100644 src/components/pages/tier/unit/main.module.scss create mode 100644 src/components/pages/tier/unit/main.test.tsx diff --git a/src/api-def b/src/api-def index e8df9c41..129497a9 160000 --- a/src/api-def +++ b/src/api-def @@ -1 +1 @@ -Subproject commit e8df9c412eda2eb384315f4de2d21cc08999778a +Subproject commit 129497a9fc480df0640d7aa00a7909168a82d408 diff --git a/src/components/elements/markdown/main.test.tsx b/src/components/elements/markdown/main.test.tsx index bab51fdf..751bfb37 100644 --- a/src/components/elements/markdown/main.test.tsx +++ b/src/components/elements/markdown/main.test.tsx @@ -335,7 +335,7 @@ describe('Markdown', () => { }); it('transforms to unit link in a sentence', async () => { - const markdown = 'Some text --10950101-- about an unit.'; + const markdown = 'Some text --10950101-- about a unit.'; renderReact( () => {markdown}, diff --git a/src/components/pages/tier/out/elements/points.tsx b/src/components/pages/tier/out/elements/points.tsx index 09dee496..2e1c6a1e 100644 --- a/src/components/pages/tier/out/elements/points.tsx +++ b/src/components/pages/tier/out/elements/points.tsx @@ -17,12 +17,12 @@ import {CategorizedPointEntries} from '../types'; import {KeyPointListItem} from './pointItem'; -type Props = { +export type TierKeyPointsProps = { keyPointsIds: Array, keyPointsData: KeyPointData, } -export const TierKeyPoints = ({keyPointsIds, keyPointsData}: Props) => { +export const TierKeyPoints = ({keyPointsIds, keyPointsData}: TierKeyPointsProps) => { const {t, lang} = useI18n(); const context = React.useContext(AppReactContext); diff --git a/src/components/pages/tier/unit/admin.tsx b/src/components/pages/tier/unit/admin.tsx new file mode 100644 index 00000000..4c3b1b85 --- /dev/null +++ b/src/components/pages/tier/unit/admin.tsx @@ -0,0 +1,32 @@ +import React from 'react'; + +import {GeneralPath, UnitPath} from '../../../../const/path/definitions'; +import {useI18n} from '../../../../i18n/hook'; +import {makeUnitUrl} from '../../../../utils/path/make'; +import {ButtonBar} from '../../../elements/common/buttonBar'; + + +type Props = { + unitId: number +} + +export const TierNoteUnitAdmin = ({unitId}: Props) => { + const {t, lang} = useI18n(); + + return ( + t.game.unitTier.tier.edit), + pathname: makeUnitUrl(UnitPath.UNIT_TIER_EDIT, {id: unitId, lang}), + }, + { + variant: 'outline-success', + text: t((t) => t.game.unitTier.points.edit), + pathname: GeneralPath.TIER_POINTS_EDIT, + }, + ]} + /> + ); +}; diff --git a/src/components/pages/tier/unit/dimension.tsx b/src/components/pages/tier/unit/dimension.tsx new file mode 100644 index 00000000..e964ca4c --- /dev/null +++ b/src/components/pages/tier/unit/dimension.tsx @@ -0,0 +1,48 @@ +import React from 'react'; + +import Col from 'react-bootstrap/Col'; +import Row from 'react-bootstrap/Row'; + +import {DimensionKey, TierNote} from '../../../../api-def/api'; +import {useI18n} from '../../../../i18n/hook'; +import {Markdown} from '../../../elements/markdown/main'; +import {rankingColor} from '../const'; +import {IconCompDependent} from '../icons'; +import styles from './main.module.css'; + + +type Props = { + dimension: DimensionKey, + note: TierNote | undefined, +} + +export const UnitTierNoteDimension = ({dimension, note}: Props) => { + const {t} = useI18n(); + + return ( +
+ + +
{t((t) => t.game.unitTier.dimension[dimension].name)}
+ +
+ + { + note ? + <> + + {note.ranking} + {note.isCompDependent && <> } + + + {note.note} + + : + + - + + } + +
+ ); +}; diff --git a/src/components/pages/tier/unit/hook.ts b/src/components/pages/tier/unit/hook.ts new file mode 100644 index 00000000..b3709739 --- /dev/null +++ b/src/components/pages/tier/unit/hook.ts @@ -0,0 +1,68 @@ +import React from 'react'; + +import {UnitTierNote} from '../../../../api-def/api/tier/notes/elements'; +import {isFailedResponse} from '../../../../api-def/api/utils'; +import {AppReactContext} from '../../../../context/app/main'; +import {useI18n} from '../../../../i18n/hook'; +import {ApiRequestSender} from '../../../../utils/services/api/requestSender'; +import {useFetchState} from '../../../elements/common/fetch'; +import {useUnitId} from '../../../elements/gameData/hook'; + + +type UseSingleUnitTierNoteResourcesReturn = { + unitId: number | undefined, + isAdmin: boolean, +} & ({ + fetchStatus: 'fetching', + data: undefined, +} | { + fetchStatus: 'noUnitId', + data: undefined, +} | { + fetchStatus: 'completed', + data: UnitTierNote | null, +}) + +export const useSingleUnitTierNoteResources = (): UseSingleUnitTierNoteResourcesReturn => { + const {lang} = useI18n(); + const context = React.useContext(AppReactContext); + + const unitId = useUnitId(); + const isAdmin = context?.session?.user.isAdmin || false; + + if (unitId === undefined) { + return { + fetchStatus: 'noUnitId', + data: undefined, + unitId, + isAdmin, + }; + } + + const { + fetchStatus: unitTierNote, + fetchFunction: fetchTierNote, + } = useFetchState( + undefined, + () => ApiRequestSender.getUnitTierNoteSingle(context?.session?.user.id.toString() || '', lang, unitId), + `Failed to fetch the unit tier note of #${unitId}.`, + ); + + fetchTierNote(); + + if (!unitTierNote.fetched || !unitTierNote.data || isFailedResponse(unitTierNote.data)) { + return { + fetchStatus: 'fetching', + data: undefined, + unitId, + isAdmin, + }; + } + + return { + fetchStatus: 'completed', + data: unitTierNote.data.data, + unitId, + isAdmin, + }; +}; diff --git a/src/components/pages/tier/unit/keyPoints.tsx b/src/components/pages/tier/unit/keyPoints.tsx new file mode 100644 index 00000000..b0e3b4c9 --- /dev/null +++ b/src/components/pages/tier/unit/keyPoints.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +import {useKeyPointData} from '../hooks'; +import {TierKeyPoints, TierKeyPointsProps} from '../out/elements/points'; + + +type Props = Pick + +export const UnitTierNoteKeyPoints = ({...props}: Props) => { + const {keyPointData} = useKeyPointData(); + + return ( + + ); +}; diff --git a/src/components/pages/tier/unit/main.module.css b/src/components/pages/tier/unit/main.module.css new file mode 100644 index 00000000..3b03b8a8 --- /dev/null +++ b/src/components/pages/tier/unit/main.module.css @@ -0,0 +1,5 @@ +span.ranking { + font-size: 2rem; +} + +/*# sourceMappingURL=main.module.css.map */ diff --git a/src/components/pages/tier/unit/main.module.css.map b/src/components/pages/tier/unit/main.module.css.map new file mode 100644 index 00000000..0a219714 --- /dev/null +++ b/src/components/pages/tier/unit/main.module.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["main.module.scss"],"names":[],"mappings":"AACE;EACE","file":"main.module.css"} \ No newline at end of file diff --git a/src/components/pages/tier/unit/main.module.scss b/src/components/pages/tier/unit/main.module.scss new file mode 100644 index 00000000..863b9eca --- /dev/null +++ b/src/components/pages/tier/unit/main.module.scss @@ -0,0 +1,5 @@ +span { + &.ranking { + font-size: 2rem; + } +} diff --git a/src/components/pages/tier/unit/main.test.tsx b/src/components/pages/tier/unit/main.test.tsx new file mode 100644 index 00000000..e702447d --- /dev/null +++ b/src/components/pages/tier/unit/main.test.tsx @@ -0,0 +1,90 @@ +import React from 'react'; + +import {screen} from '@testing-library/react'; + +import {generateKeyPointData, generateUnitTierNote} from '../../../../../test/data/mock/tierNote'; +import {renderReact} from '../../../../../test/render/main'; +import {ApiResponseCode} from '../../../../api-def/api/responseCode'; +import {translation as translationEN} from '../../../../i18n/translations/en/translation'; +import {ApiRequestSender} from '../../../../utils/services/api/requestSender'; +import {TierNoteUnit} from './main'; + + +describe('Single unit tier note', () => { + const keyPointsData = generateKeyPointData(); + + const tierNote = generateUnitTierNote(); + + beforeEach(() => { + jest.spyOn(ApiRequestSender, 'getUnitTierNoteSingle').mockResolvedValue({ + code: ApiResponseCode.SUCCESS, + success: true, + data: tierNote, + }); + jest.spyOn(ApiRequestSender, 'getKeyPointsData').mockResolvedValue({ + code: ApiResponseCode.SUCCESS, + success: true, + data: keyPointsData, + }); + }); + + it('shows unit tier notes correctly', async () => { + renderReact( + () => , + {user: {isAdmin: true}, contextParams: {unitId: 10750101}}, + ); + + expect(await screen.findByText(translationEN.game.unitTier.tier.edit)).toBeInTheDocument(); + // Con co-op note in mock data + expect(screen.getByText('Some note.')).toBeInTheDocument(); + // Con co-op ranking in mock data + expect(screen.getByText('B')).toBeInTheDocument(); + // Key point description + expect(screen.getByText('point')).toBeInTheDocument(); + }); + + it('shows buttons for editing if the user is an admin', async () => { + renderReact( + () => , + {user: {isAdmin: true}, contextParams: {unitId: 10750101}}, + ); + + expect(await screen.findByText(translationEN.game.unitTier.tier.edit)).toBeInTheDocument(); + expect(screen.getByText(translationEN.game.unitTier.points.edit)).toBeInTheDocument(); + }); + + it('hides buttons for editing if the user is not an admin', async () => { + renderReact( + () => , + {contextParams: {unitId: 10750101}}, + ); + + expect(await screen.findByText(translationEN.game.unitTier.points.title)).toBeInTheDocument(); + expect(screen.queryByText(translationEN.game.unitTier.tier.edit)).not.toBeInTheDocument(); + expect(screen.queryByText(translationEN.game.unitTier.points.edit)).not.toBeInTheDocument(); + }); + + it('shows ads', async () => { + renderReact( + () => , + {contextParams: {unitId: 10750101}}, + ); + + expect(await screen.findByText(translationEN.game.unitTier.points.title)).toBeInTheDocument(); + expect(screen.getByTestId('ads-page-top')).toBeInTheDocument(); + expect(screen.getByTestId('ads-unit-key-point-top')).toBeInTheDocument(); + expect(screen.getByTestId('ads-tier-results-end')).toBeInTheDocument(); + }); + + it('hides ads', async () => { + renderReact( + () => , + {user: {adsFreeExpiry: new Date()}, contextParams: {unitId: 10750101}}, + ); + + expect(await screen.findByText(translationEN.game.unitTier.points.title)).toBeInTheDocument(); + expect(screen.queryByTestId('ads-page-top')).not.toBeInTheDocument(); + expect(screen.queryByTestId('ads-unit-key-point-top')).not.toBeInTheDocument(); + expect(screen.queryByTestId('ads-tier-results-end')).not.toBeInTheDocument(); + }); +}); diff --git a/src/components/pages/tier/unit/main.tsx b/src/components/pages/tier/unit/main.tsx index b11c4afd..bda6e7ab 100644 --- a/src/components/pages/tier/unit/main.tsx +++ b/src/components/pages/tier/unit/main.tsx @@ -1,6 +1,54 @@ import React from 'react'; +import Alert from 'react-bootstrap/Alert'; + +import {Dimension, DimensionKey} from '../../../../api-def/api'; +import {useI18n} from '../../../../i18n/hook'; +import {TimeAgo} from '../../../../utils/timeago'; +import {AdsPageTop, AdsTierResultsEnd} from '../../../elements/common/ads/main'; +import {Loading} from '../../../elements/common/loading'; +import {TierNoteUnitAdmin} from './admin'; +import {UnitTierNoteDimension} from './dimension'; +import {useSingleUnitTierNoteResources} from './hook'; +import {UnitTierNoteKeyPoints} from './keyPoints'; + export const TierNoteUnit = () => { - return <>WIP; + const {t} = useI18n(); + const {fetchStatus, data, unitId, isAdmin} = useSingleUnitTierNoteResources(); + + if (fetchStatus === 'fetching') { + return ; + } else if (!unitId) { + return <>No Unit ID; + } + + return ( + <> + {isAdmin && } + + {t((t) => t.game.unitTier.tips.main)} +

{t((t) => t.game.unitTier.tier.title)}

+ {Object.keys(Dimension).map((dimension) => ( + + ))} +

{t((t) => t.game.unitTier.points.title)}

+ { + data && + <> + +
+
+ {t((t) => t.misc.timestamp.lastUpdated)} +   +
+ + } + + + ); }; diff --git a/src/i18n/translations/cht/translation.ts b/src/i18n/translations/cht/translation.ts index 07a68dd0..11649dce 100644 --- a/src/i18n/translations/cht/translation.ts +++ b/src/i18n/translations/cht/translation.ts @@ -413,6 +413,7 @@ export const translation: TranslationStruct = { ranking: '評級', isCompDependent: '依賴組合', notRanked: '未評級', + edit: '編輯評級', }, tips: { main: '以下評價僅供參考,強烈建議閱讀該角色評測以了解該角色的實際強度、用法及其他詳細資訊!', diff --git a/src/i18n/translations/definition.ts b/src/i18n/translations/definition.ts index bea9e5fa..63b6e4e9 100644 --- a/src/i18n/translations/definition.ts +++ b/src/i18n/translations/definition.ts @@ -408,6 +408,7 @@ export type TranslationStruct = { ranking: string, isCompDependent: string, notRanked: string, + edit: string, }, tips: { main: string, diff --git a/src/i18n/translations/en/translation.ts b/src/i18n/translations/en/translation.ts index e55da489..a8f9d44a 100644 --- a/src/i18n/translations/en/translation.ts +++ b/src/i18n/translations/en/translation.ts @@ -445,6 +445,7 @@ export const translation: TranslationStruct = { ranking: 'Ranking', isCompDependent: 'Comp-dependent', notRanked: 'Not Ranked', + edit: 'Edit Ranking', }, tips: { main: 'It is strongly recommended to read the unit analysis to know ' + diff --git a/src/i18n/translations/jp/translation.ts b/src/i18n/translations/jp/translation.ts index f8bce256..5eb7aa0b 100644 --- a/src/i18n/translations/jp/translation.ts +++ b/src/i18n/translations/jp/translation.ts @@ -420,6 +420,7 @@ export const translation: TranslationStruct = { ranking: 'ランキング', isCompDependent: 'チームのサポートが必要。', notRanked: '未評価', + edit: 'TBA', }, tips: { main: '下のランキングはご参考まで、キャラの強さ/手順はキャラの評価ページへご覧ください!', diff --git a/src/utils/services/api/requestSender.ts b/src/utils/services/api/requestSender.ts index 5f83aac3..e69fb6e0 100644 --- a/src/utils/services/api/requestSender.ts +++ b/src/utils/services/api/requestSender.ts @@ -70,7 +70,7 @@ import { UnitTierNoteEditPayload, UnitTierNoteEditResponse, UnitTierNoteGetPayload, - UnitTierNoteGetResponse, + UnitTierNoteGetResponse, UnitTierNoteSinglePayload, UnitTierNoteSingleResponse, UnitTierNoteUpdatePayload, UnitTierNoteUpdateResponse, UnitType, @@ -292,7 +292,7 @@ export class ApiRequestSender { } /** - * Send an unit info lookup info request on landing. + * Send a unit info lookup info request on landing. * * @param {string} uid user ID to get the unit info lookup * @param {SupportedLanguages} lang language to use for getting the unit info lookup @@ -597,7 +597,7 @@ export class ApiRequestSender { } /** - * Get tier note of an unit. + * Get the tier notes of all units. * * @param {string} uid user ID * @param {SupportedLanguages} lang language of the tier note @@ -612,7 +612,23 @@ export class ApiRequestSender { } /** - * Get tier note of an unit for editing. + * Get the tier note of a unit. + * + * @param {string} uid user ID + * @param {SupportedLanguages} lang language of the tier note + * @param {number} unitId unit ID of the tier note + * @return {Promise} promise returned from `fetch` + */ + static getUnitTierNoteSingle(uid: string, lang: SupportedLanguages, unitId: number) { + return ApiRequestSender.sendRequest( + 'GET', + ApiEndPoints.TIER_UNIT, + {uid, lang, unitId}, + ); + } + + /** + * Get tier note of a unit for editing. * * @param {string} uid user ID * @param {SupportedLanguages} lang language of the tier note @@ -628,7 +644,7 @@ export class ApiRequestSender { } /** - * Get tier note of an unit for editing. + * Get tier note of a unit for editing. * * @param {string} uid user ID * @param {SupportedLanguages} lang language of the tier note diff --git a/src/utils/services/resources/loader.ts b/src/utils/services/resources/loader.ts index 262659dd..1c560cc7 100644 --- a/src/utils/services/resources/loader.ts +++ b/src/utils/services/resources/loader.ts @@ -192,7 +192,7 @@ export class ResourceLoader { } /** - * Get all normal attack chain data of an unit. + * Get all normal attack chain data of a unit. * * @function * @param {number} unitId unit ID of the combo chain From c22b97511e77caabb139f41841370009c7242c29 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 15:52:21 -0500 Subject: [PATCH 11/16] IMP - Use mock data generation utils in tests Signed-off-by: RaenonX --- src/components/pages/tier/const.test.ts | 39 ++++--------------- .../pages/tier/out/all/entry.test.tsx | 22 ++--------- .../pages/tier/out/dimensional/entry.test.tsx | 22 ++--------- src/components/pages/tier/utils.test.ts | 9 +++-- test/data/mock/tierNote.ts | 22 +++++++++++ 5 files changed, 41 insertions(+), 73 deletions(-) create mode 100644 test/data/mock/tierNote.ts diff --git a/src/components/pages/tier/const.test.ts b/src/components/pages/tier/const.test.ts index e1f255fd..19005f2c 100644 --- a/src/components/pages/tier/const.test.ts +++ b/src/components/pages/tier/const.test.ts @@ -1,35 +1,14 @@ -import {UnitTierNote, UnitType} from '../../../api-def/api'; -import {UnitInfoData} from '../../../api-def/resources'; +import {generateUnitTierNote} from '../../../../test/data/mock/tierNote'; +import {generateGalaMymInfo} from '../../../../test/data/mock/unitInfo'; +import {overrideObject} from '../../../utils/override'; import {sortFunc} from './const'; import {EntryPack} from './types'; describe('Sorting function', () => { - const unitInfo: UnitInfoData = { - type: UnitType.CHARACTER, - cvEn: { - cht: 'Kelly Marie', - en: 'Kelly Marie', - jp: 'Kelly Marie', - }, - cvJp: { - cht: '遠藤綾', - en: 'Aya Endo', - jp: '遠藤綾', - }, - element: 1, - iconName: '100010_04_r05', - id: 10550101, - name: { - cht: '慕慕(龍絆日Ver.)', - en: 'Gala Mym', - jp: 'ムム(ドラフェスVer.)', - }, - rarity: 5, - releaseEpoch: 1609480800.0, - }; + const unitInfo = generateGalaMymInfo(); - const tierNote1: UnitTierNote = { + const tierNote1 = overrideObject(generateUnitTierNote(), { tier: { conCoop: { isCompDependent: false, @@ -37,11 +16,9 @@ describe('Sorting function', () => { note: 'Some note.', }, }, - lastUpdateEpoch: 1618734262003, - }; + }); - const tierNote2: UnitTierNote = { - points: ['61174cef5dc5094fe82e9eea'], + const tierNote2 = overrideObject(generateUnitTierNote(), { tier: { conAi: { isCompDependent: false, @@ -55,7 +32,7 @@ describe('Sorting function', () => { }, }, lastUpdateEpoch: 1578734262003, - }; + }); it('ignores N/A ranking when sorting in average ranking', async () => { const entries: Array = [ diff --git a/src/components/pages/tier/out/all/entry.test.tsx b/src/components/pages/tier/out/all/entry.test.tsx index dbc5065e..2e60f1fb 100644 --- a/src/components/pages/tier/out/all/entry.test.tsx +++ b/src/components/pages/tier/out/all/entry.test.tsx @@ -3,12 +3,11 @@ import React from 'react'; import {screen} from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import {generateKeyPointData, generateUnitTierNote} from '../../../../../../test/data/mock/tierNote'; import {renderReact} from '../../../../../../test/render/main'; import { - KeyPointData, PartiallySupportedLanguages, SupportedLanguages, - UnitTierNote, UnitType, } from '../../../../../api-def/api'; import {Element, UnitInfoData} from '../../../../../api-def/resources'; @@ -42,24 +41,9 @@ describe('Tier list entry', () => { releaseEpoch: 1, }; - const keyPointsData: KeyPointData = { - id1: { - type: 'strength', - description: 'point', - }, - }; + const keyPointsData = generateKeyPointData(); - const tierNote: UnitTierNote = { - points: ['id1'], - tier: { - conCoop: { - isCompDependent: true, - ranking: 'B', - note: 'Some note.', - }, - }, - lastUpdateEpoch: 1618734262003, - }; + const tierNote = generateUnitTierNote(); it('renders tier note on clicking note icon', async () => { renderReact( diff --git a/src/components/pages/tier/out/dimensional/entry.test.tsx b/src/components/pages/tier/out/dimensional/entry.test.tsx index 6d5aec7b..ceca1946 100644 --- a/src/components/pages/tier/out/dimensional/entry.test.tsx +++ b/src/components/pages/tier/out/dimensional/entry.test.tsx @@ -3,12 +3,11 @@ import React from 'react'; import {screen} from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import {generateKeyPointData, generateUnitTierNote} from '../../../../../../test/data/mock/tierNote'; import {renderReact} from '../../../../../../test/render/main'; import { - KeyPointData, PartiallySupportedLanguages, SupportedLanguages, - UnitTierNote, UnitType, } from '../../../../../api-def/api'; import {Element, UnitInfoData} from '../../../../../api-def/resources'; @@ -42,24 +41,9 @@ describe('Tier list entry', () => { releaseEpoch: 1, }; - const keyPointsData: KeyPointData = { - id1: { - type: 'strength', - description: 'point', - }, - }; + const keyPointsData = generateKeyPointData(); - const tierNote: UnitTierNote = { - points: ['id1'], - tier: { - conCoop: { - isCompDependent: true, - ranking: 'B', - note: 'Some note.', - }, - }, - lastUpdateEpoch: 1618734262003, - }; + const tierNote = generateUnitTierNote(); it('renders tier note on clicking note icon', async () => { renderReact(() => ( diff --git a/src/components/pages/tier/utils.test.ts b/src/components/pages/tier/utils.test.ts index d0f678b0..b6a29b5d 100644 --- a/src/components/pages/tier/utils.test.ts +++ b/src/components/pages/tier/utils.test.ts @@ -1,5 +1,7 @@ -import {PartiallySupportedLanguages, SupportedLanguages, UnitTierNote, UnitType} from '../../../api-def/api'; +import {generateUnitTierNote} from '../../../../test/data/mock/tierNote'; +import {PartiallySupportedLanguages, SupportedLanguages, UnitType} from '../../../api-def/api'; import {Element, UnitInfoData} from '../../../api-def/resources'; +import {overrideObject} from '../../../utils/override'; import {categorizeEntryPack} from './utils'; @@ -29,7 +31,7 @@ describe('Categorize entry pack', () => { releaseEpoch: 1, }; - const tierNote: UnitTierNote = { + const tierNote = overrideObject(generateUnitTierNote(), { points: [], tier: { conAi: { @@ -38,8 +40,7 @@ describe('Categorize entry pack', () => { isCompDependent: false, }, }, - lastUpdateEpoch: 0, - }; + }); it('returns entries in certain dimension', async () => { const categorized = categorizeEntryPack('conAi', [{unitInfo, tierNote}]); diff --git a/test/data/mock/tierNote.ts b/test/data/mock/tierNote.ts new file mode 100644 index 00000000..277e1b8c --- /dev/null +++ b/test/data/mock/tierNote.ts @@ -0,0 +1,22 @@ +import {KeyPointData, UnitTierNote} from '../../../src/api-def/api'; + + +export const generateUnitTierNote = (): UnitTierNote => ({ + points: ['id1'], + tier: { + conCoop: { + isCompDependent: true, + ranking: 'B', + note: 'Some note.', + }, + }, + lastUpdateEpoch: 1618734262003, +}); + + +export const generateKeyPointData = (): KeyPointData => ({ + id1: { + type: 'strength', + description: 'point', + }, +}); From 7b6b05c5d29a4cbc1ad1ef9d04feb773128617a2 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 15:59:20 -0500 Subject: [PATCH 12/16] FIX - Typing error in tests Signed-off-by: RaenonX --- src/components/pages/gameData/nameRef/main.test.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/pages/gameData/nameRef/main.test.tsx b/src/components/pages/gameData/nameRef/main.test.tsx index f8fe16cc..5130305e 100644 --- a/src/components/pages/gameData/nameRef/main.test.tsx +++ b/src/components/pages/gameData/nameRef/main.test.tsx @@ -5,7 +5,7 @@ import userEvent from '@testing-library/user-event'; import {renderReact} from '../../../../../test/render/main'; import {typeInput} from '../../../../../test/utils/event'; -import {ApiResponseCode, SupportedLanguages, UnitType} from '../../../../api-def/api'; +import {ApiResponseCode, PartiallySupportedLanguages, SupportedLanguages, UnitType} from '../../../../api-def/api'; import {Element, Weapon} from '../../../../api-def/resources'; import {translation as translationEN} from '../../../../i18n/translations/en/translation'; import {ApiRequestSender} from '../../../../utils/services/api/requestSender'; @@ -58,6 +58,7 @@ describe('Name reference management', () => { [SupportedLanguages.CHT]: 'CHARA CHT 1', [SupportedLanguages.EN]: 'CHARA EN 1', [SupportedLanguages.JP]: 'CHARA JP 1', + [PartiallySupportedLanguages.CHS]: 'CHARA CHS 1', }, rarity: 5, releaseEpoch: 0, @@ -83,6 +84,7 @@ describe('Name reference management', () => { [SupportedLanguages.CHT]: 'CHARA CHT 2', [SupportedLanguages.EN]: 'CHARA EN 2', [SupportedLanguages.JP]: 'CHARA JP 2', + [PartiallySupportedLanguages.CHS]: 'CHARA CHS 1', }, rarity: 5, releaseEpoch: 0, @@ -108,6 +110,7 @@ describe('Name reference management', () => { [SupportedLanguages.CHT]: 'CHARA CHT 3', [SupportedLanguages.EN]: 'CHARA EN 3', [SupportedLanguages.JP]: 'CHARA JP 3', + [PartiallySupportedLanguages.CHS]: 'CHARA CHS 1', }, rarity: 5, releaseEpoch: 0, From b2b9b36249008ce4b7f53c580bb6a6e9dea5fbdf Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 16:06:06 -0500 Subject: [PATCH 13/16] IMP - Shows tips for unranked unit tier note #301 Signed-off-by: RaenonX --- src/components/pages/tier/unit/main.tsx | 32 +++++++++++++++--------- src/i18n/translations/cht/translation.ts | 1 + src/i18n/translations/definition.ts | 1 + src/i18n/translations/en/translation.ts | 1 + src/i18n/translations/jp/translation.ts | 1 + 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/components/pages/tier/unit/main.tsx b/src/components/pages/tier/unit/main.tsx index bda6e7ab..de4c090a 100644 --- a/src/components/pages/tier/unit/main.tsx +++ b/src/components/pages/tier/unit/main.tsx @@ -19,10 +19,23 @@ export const TierNoteUnit = () => { if (fetchStatus === 'fetching') { return ; - } else if (!unitId) { + } + + if (!unitId) { return <>No Unit ID; } + if (!data) { + return ( + <> + + + {t((t) => t.game.unitTier.tips.notRanked)} + + + ); + } + return ( <> {isAdmin && } @@ -37,17 +50,12 @@ export const TierNoteUnit = () => { /> ))}

{t((t) => t.game.unitTier.points.title)}

- { - data && - <> - -
-
- {t((t) => t.misc.timestamp.lastUpdated)} -   -
- - } + +
+
+ {t((t) => t.misc.timestamp.lastUpdated)} +   +
); diff --git a/src/i18n/translations/cht/translation.ts b/src/i18n/translations/cht/translation.ts index 11649dce..1be17421 100644 --- a/src/i18n/translations/cht/translation.ts +++ b/src/i18n/translations/cht/translation.ts @@ -417,6 +417,7 @@ export const translation: TranslationStruct = { }, tips: { main: '以下評價僅供參考,強烈建議閱讀該角色評測以了解該角色的實際強度、用法及其他詳細資訊!', + notRanked: '此角色尚無評級。', compIcon: '需要搭配特定隊友以達到對應評級', }, points: { diff --git a/src/i18n/translations/definition.ts b/src/i18n/translations/definition.ts index 63b6e4e9..7983a41c 100644 --- a/src/i18n/translations/definition.ts +++ b/src/i18n/translations/definition.ts @@ -412,6 +412,7 @@ export type TranslationStruct = { }, tips: { main: string, + notRanked: string, compIcon: string, }, points: { diff --git a/src/i18n/translations/en/translation.ts b/src/i18n/translations/en/translation.ts index a8f9d44a..fd9ad633 100644 --- a/src/i18n/translations/en/translation.ts +++ b/src/i18n/translations/en/translation.ts @@ -450,6 +450,7 @@ export const translation: TranslationStruct = { tips: { main: 'It is strongly recommended to read the unit analysis to know ' + 'the actual strength, how-to-use, and the other details!', + notRanked: 'This unit is not yet ranked.', compIcon: 'Needs specific companion for the corresponding tier', }, points: { diff --git a/src/i18n/translations/jp/translation.ts b/src/i18n/translations/jp/translation.ts index 5eb7aa0b..5d0e2b61 100644 --- a/src/i18n/translations/jp/translation.ts +++ b/src/i18n/translations/jp/translation.ts @@ -424,6 +424,7 @@ export const translation: TranslationStruct = { }, tips: { main: '下のランキングはご参考まで、キャラの強さ/手順はキャラの評価ページへご覧ください!', + notRanked: 'TBA', compIcon: '固定のサポートキャラが必要。', }, points: { From fb1e9c5d96e8b16d585731c1135eb39985700ee2 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 16:08:22 -0500 Subject: [PATCH 14/16] ADD - Tests for tips of unranked unit #301 Signed-off-by: RaenonX --- src/components/pages/tier/unit/main.test.tsx | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/components/pages/tier/unit/main.test.tsx b/src/components/pages/tier/unit/main.test.tsx index e702447d..09bc5e9d 100644 --- a/src/components/pages/tier/unit/main.test.tsx +++ b/src/components/pages/tier/unit/main.test.tsx @@ -15,8 +15,10 @@ describe('Single unit tier note', () => { const tierNote = generateUnitTierNote(); + let fnGetTierNote: jest.SpyInstance; + beforeEach(() => { - jest.spyOn(ApiRequestSender, 'getUnitTierNoteSingle').mockResolvedValue({ + fnGetTierNote = jest.spyOn(ApiRequestSender, 'getUnitTierNoteSingle').mockResolvedValue({ code: ApiResponseCode.SUCCESS, success: true, data: tierNote, @@ -43,6 +45,21 @@ describe('Single unit tier note', () => { expect(screen.getByText('point')).toBeInTheDocument(); }); + it('shows unranked tips', async () => { + fnGetTierNote.mockResolvedValueOnce({ + code: ApiResponseCode.SUCCESS, + success: true, + data: null, + }); + + renderReact( + () => , + {user: {isAdmin: true}, contextParams: {unitId: 10750101}}, + ); + + expect(await screen.findByText(translationEN.game.unitTier.tips.notRanked)).toBeInTheDocument(); + }); + it('shows buttons for editing if the user is an admin', async () => { renderReact( () => , From 4e58fe963dfe29b2521b8a72d62f1559d6d6bcf1 Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 16:10:40 -0500 Subject: [PATCH 15/16] OTH - Update API definitions Signed-off-by: RaenonX --- src/api-def | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api-def b/src/api-def index 129497a9..cf00a893 160000 --- a/src/api-def +++ b/src/api-def @@ -1 +1 @@ -Subproject commit 129497a9fc480df0640d7aa00a7909168a82d408 +Subproject commit cf00a893c45d18d0306e7b7631e315e64e76444d From 5c1b275bb60fb5b19c1bfe09aa225d4ffd77d93b Mon Sep 17 00:00:00 2001 From: RaenonX Date: Sun, 3 Oct 2021 20:33:46 -0500 Subject: [PATCH 16/16] OTH - Update app version Signed-off-by: RaenonX --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 46bb718e..2f8a7919 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "dragalia-site-front", "description": "Frontend of Dragalia Lost info website by OM.", "repository": "https://github.com/RaenonX-DL/dragalia-site-front", - "version": "2.15.0-beta.4", + "version": "2.15.0", "engines": { "node": "14.x", "npm": "^7.12.0"