├── .eslintrc ├── .gitignore ├── .vscode └── launch.json ├── LICENSE ├── README.md ├── package-lock.json ├── package.json └── src ├── index.js └── lib ├── LANG.js ├── limited-queue.js ├── logger.js ├── scrapy.js ├── str.js └── verbose.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true, 4 | "node": true 5 | }, 6 | "parserOptions": { 7 | "ecmaVersion": 8 8 | }, 9 | "rules": { 10 | 11 | "no-undef": "error", 12 | "array-bracket-spacing": [ 13 | 2, 14 | "never" 15 | ], 16 | "block-scoped-var": 2, 17 | "computed-property-spacing": [ 18 | 2, 19 | "never" 20 | ], 21 | "eol-last": 2, 22 | "eqeqeq": [ 23 | 2, 24 | "smart" 25 | ], 26 | "max-depth": [ 27 | 1, 28 | 5 29 | ], 30 | "max-len": [ 31 | 1, 32 | 260 33 | ], 34 | "max-statements": [ 35 | 1, 36 | 150 37 | ], 38 | "new-cap": "off", 39 | "no-extend-native": 2, 40 | "no-mixed-spaces-and-tabs": 2, 41 | "no-trailing-spaces": 2, 42 | "no-unused-vars": 1, 43 | "no-use-before-define": [ 44 | 2, 45 | "nofunc" 46 | ], 47 | "object-curly-spacing": [ 48 | 2, 49 | "always" 50 | ], 51 | "quotes": [ 52 | 2, 53 | "single", 54 | "avoid-escape" 55 | ], 56 | "keyword-spacing": [ 57 | 2, 58 | { 59 | "before": true, 60 | "after": true 61 | } 62 | ], 63 | "space-unary-ops": 2 64 | } 65 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # by blackmatch 61 | downloads 62 | debug 63 | .cache 64 | dist-mac 65 | dist-win 66 | 67 | .DS_Store 68 | 69 | pack.sh 70 | dlist.txt 71 | search.log 72 | config.json 73 | 74 | *.sh 75 | *.gz 76 | *.tgz 77 | *.zip -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // 使用 IntelliSense 了解相关属性。 3 | // 悬停以查看现有属性的描述。 4 | // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Debug-Key", 11 | "skipFiles": [ 12 | "/**" 13 | ], 14 | "program": "${workspaceFolder}/src/index.js", 15 | "args": ["-k", "ph5dd68958332dd", "--verbose"] 16 | }, 17 | { 18 | "type": "node", 19 | "request": "launch", 20 | "name": "Debug-Search", 21 | "skipFiles": [ 22 | "/**" 23 | ], 24 | "program": "${workspaceFolder}/src/index.js", 25 | "args": ["-s", "妹妹", "--verbose"] 26 | }, 27 | { 28 | "type": "node", 29 | "request": "launch", 30 | "name": "启动程序", 31 | "skipFiles": [ 32 | "/**" 33 | ], 34 | "program": "${workspaceFolder}/src/index.js" 35 | } 36 | ] 37 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 RoyShen12 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # pornhub-DL 3 | 4 | Download highest quality videos from [pornhub](https://pornhub.com). 5 | 下载 [pornhub](https://pornhub.com) 上的高清视频。 6 | 7 | ## statement 8 | 9 | **This repo is just for studying, not for other purpose.** 10 | **本项目仅供学习交流,如作他用所承受的法律风险概与作者无关** 11 | 12 | ## Features 13 | 14 | * Support http or socks5 proxy. 支持 http 和 socks5 代理 15 | 16 | * Always select highest quality video. 永远选择最高清的画质选项 17 | 18 | * Support keyword searching. 关键词搜索下载 19 | 20 | * Show progress. 显示下载进度条 21 | 22 | * Skip repeat & previously downloaded file. 跳过重复/已下载过的文件 23 | 24 | * Support Keyword filtering. 支持关键词过滤 25 | 26 | * Support direct downloading from PH viewkey. 支持根据ph代码直接下载视频 27 | 28 | ## Requirement 29 | 30 | * Node.js 8.3.0+. 31 | 32 | * Internet that can access [pornhub.com](https://www.pornhub.com). 33 | 34 | ## Usage 使用方法 35 | 36 | ```shell 37 | git clone https://github.com/RoyShen12/pornhub-downloader.git 38 | npm install 39 | node src -s 40 | ``` 41 | 42 | ##### npm install failed on Linux 43 | 44 | 1. install pip, command on Ubuntu 16/18 is `apt install python-pip -y` 45 | 46 | 2. `pip install ast` 47 | 48 | ### Example 例子 49 | 50 | #### Multi Keywords Searching 多关键词搜索 51 | 52 | ```shell 53 | node src -s Lesbian+muscle 54 | ``` 55 | 56 | #### Keywords Searching With Keywords Excluding 搜索并过滤部分结果 57 | 58 | ```shell 59 | node src -s Lesbian -e japanese,jav 60 | ``` 61 | 62 | #### ~~Jumping First Four ADs 跳过前4个推广视频~~ Now support ADs auto jumping 现在支持自动跳过推广视频 63 | 64 | ```shell 65 | node src -s --skip 4 66 | ``` 67 | 68 | #### Preview Videos And Don't Download(only on Mac with iTerm>2.9) 仅预览视频缩略图,并不实际下载(需要Mac与iTerm版本>2.9) 69 | 70 | ```shell 71 | node src -s -f --preview --preview-size 50 72 | # or 73 | node src -s --list-only --preview --preview-size 50 74 | ``` 75 | 76 | ## More Options 77 | 78 | see with `--help` argument. 79 | 更多功能和选项见 --help 帮助内容。 80 | 81 | ## Configuration 82 | 83 | Configuration is available from `config.json`. 84 | 配置文件 `config.json` 存放一些不常改动的设置。 85 | 86 | - `proxyUrl`: set up the proxy with port. For example `http://127.0.0.1:1087` or `socks5://127.0.0.1:1080`. 87 | If you don't need it, just keep it empty. 88 | 89 | - `timeout`: request timeout (second). 90 | 91 | - `downloadDir`: the directory for saving videos. 92 | 93 | - `httpChunkSizeKB`: splitting size of each video while downloading, the default value is 2048. 94 | 95 | ## LICENCE 96 | 97 | MIT 98 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pornhub-downloader", 3 | "version": "1.1.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.5.5", 9 | "resolved": "https://registry.npm.taobao.org/@babel/code-frame/download/@babel/code-frame-7.5.5.tgz", 10 | "integrity": "sha1-vAeC9tafe31JUxIZaZuYj2aaj50=", 11 | "requires": { 12 | "@babel/highlight": "^7.0.0" 13 | } 14 | }, 15 | "@babel/highlight": { 16 | "version": "7.5.0", 17 | "resolved": "https://registry.npm.taobao.org/@babel/highlight/download/@babel/highlight-7.5.0.tgz", 18 | "integrity": "sha1-VtETEr2SSPphlZHQJHK+boyzJUA=", 19 | "requires": { 20 | "chalk": "^2.0.0", 21 | "esutils": "^2.0.2", 22 | "js-tokens": "^4.0.0" 23 | } 24 | }, 25 | "@babel/parser": { 26 | "version": "7.10.1", 27 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.1.tgz", 28 | "integrity": "sha512-AUTksaz3FqugBkbTZ1i+lDLG5qy8hIzCaAxEtttU6C0BtZZU9pkNZtWSVAht4EW9kl46YBiyTGMp9xTTGqViNg==", 29 | "dev": true 30 | }, 31 | "@babel/runtime": { 32 | "version": "7.10.1", 33 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.1.tgz", 34 | "integrity": "sha512-nQbbCbQc9u/rpg1XCxoMYQTbSMVZjCDxErQ1ClCn9Pvcmv1lGads19ep0a2VsEiIJeHqjZley6EQGEC3Yo1xMA==", 35 | "dev": true, 36 | "requires": { 37 | "regenerator-runtime": "^0.13.4" 38 | } 39 | }, 40 | "@nodelib/fs.scandir": { 41 | "version": "2.1.3", 42 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", 43 | "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", 44 | "dev": true, 45 | "requires": { 46 | "@nodelib/fs.stat": "2.0.3", 47 | "run-parallel": "^1.1.9" 48 | } 49 | }, 50 | "@nodelib/fs.stat": { 51 | "version": "2.0.3", 52 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", 53 | "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", 54 | "dev": true 55 | }, 56 | "@nodelib/fs.walk": { 57 | "version": "1.2.4", 58 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", 59 | "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", 60 | "dev": true, 61 | "requires": { 62 | "@nodelib/fs.scandir": "2.1.3", 63 | "fastq": "^1.6.0" 64 | } 65 | }, 66 | "@tootallnate/once": { 67 | "version": "1.1.2", 68 | "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", 69 | "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" 70 | }, 71 | "@types/color-name": { 72 | "version": "1.1.1", 73 | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", 74 | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", 75 | "dev": true 76 | }, 77 | "@types/minimist": { 78 | "version": "1.2.0", 79 | "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", 80 | "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=" 81 | }, 82 | "@types/node": { 83 | "version": "12.7.4", 84 | "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-12.7.4.tgz", 85 | "integrity": "sha1-ZNth4DWetajZm1XgXHKfEwpniwQ=" 86 | }, 87 | "@types/normalize-package-data": { 88 | "version": "2.4.0", 89 | "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 90 | "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==" 91 | }, 92 | "abbrev": { 93 | "version": "1.1.1", 94 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 95 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 96 | }, 97 | "acorn": { 98 | "version": "6.4.1", 99 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", 100 | "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", 101 | "dev": true 102 | }, 103 | "acorn-jsx": { 104 | "version": "5.0.2", 105 | "resolved": "https://registry.npm.taobao.org/acorn-jsx/download/acorn-jsx-5.0.2.tgz", 106 | "integrity": "sha1-hLaOpEs3PE+GhgI6VR9hoht8Sk8=", 107 | "dev": true 108 | }, 109 | "agent-base": { 110 | "version": "6.0.0", 111 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", 112 | "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", 113 | "requires": { 114 | "debug": "4" 115 | } 116 | }, 117 | "agentkeepalive": { 118 | "version": "4.1.2", 119 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.2.tgz", 120 | "integrity": "sha512-waNHE7tQBBn+2qXucI8HY0o2Y0OBPWldWOWsZwY71JcCm4SvrPnWdceFfB5NIXSqE8Ewq6VR/Qt5b1i69P6KCQ==", 121 | "requires": { 122 | "debug": "^4.1.0", 123 | "depd": "^1.1.2", 124 | "humanize-ms": "^1.2.1" 125 | } 126 | }, 127 | "aggregate-error": { 128 | "version": "3.0.1", 129 | "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", 130 | "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", 131 | "requires": { 132 | "clean-stack": "^2.0.0", 133 | "indent-string": "^4.0.0" 134 | } 135 | }, 136 | "ajv": { 137 | "version": "6.10.2", 138 | "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.10.2.tgz", 139 | "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=", 140 | "requires": { 141 | "fast-deep-equal": "^2.0.1", 142 | "fast-json-stable-stringify": "^2.0.0", 143 | "json-schema-traverse": "^0.4.1", 144 | "uri-js": "^4.2.2" 145 | } 146 | }, 147 | "ansi-escapes": { 148 | "version": "3.2.0", 149 | "resolved": "https://registry.npm.taobao.org/ansi-escapes/download/ansi-escapes-3.2.0.tgz", 150 | "integrity": "sha1-h4C5j/nb9WOBUtHx/lwde0RCl2s=", 151 | "dev": true 152 | }, 153 | "ansi-regex": { 154 | "version": "3.0.0", 155 | "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", 156 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 157 | "dev": true 158 | }, 159 | "ansi-styles": { 160 | "version": "3.2.1", 161 | "resolved": "http://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", 162 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 163 | "requires": { 164 | "color-convert": "^1.9.0" 165 | } 166 | }, 167 | "app-path": { 168 | "version": "2.2.0", 169 | "resolved": "https://registry.npmjs.org/app-path/-/app-path-2.2.0.tgz", 170 | "integrity": "sha1-KvXCtUSkDhX8GsVVSDFDl0YIRdA=", 171 | "requires": { 172 | "execa": "^0.4.0" 173 | } 174 | }, 175 | "argparse": { 176 | "version": "1.0.10", 177 | "resolved": "http://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz", 178 | "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", 179 | "dev": true, 180 | "requires": { 181 | "sprintf-js": "~1.0.2" 182 | } 183 | }, 184 | "array-find-index": { 185 | "version": "1.0.2", 186 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 187 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 188 | }, 189 | "array-union": { 190 | "version": "2.1.0", 191 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", 192 | "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", 193 | "dev": true 194 | }, 195 | "arrify": { 196 | "version": "2.0.1", 197 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 198 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" 199 | }, 200 | "asn1": { 201 | "version": "0.2.4", 202 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 203 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 204 | "requires": { 205 | "safer-buffer": "~2.1.0" 206 | } 207 | }, 208 | "assert-plus": { 209 | "version": "1.0.0", 210 | "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", 211 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 212 | }, 213 | "astral-regex": { 214 | "version": "1.0.0", 215 | "resolved": "https://registry.npm.taobao.org/astral-regex/download/astral-regex-1.0.0.tgz", 216 | "integrity": "sha1-bIw/uCfdQ+45GPJ7gngqt2WKb9k=", 217 | "dev": true 218 | }, 219 | "asynckit": { 220 | "version": "0.4.0", 221 | "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", 222 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 223 | }, 224 | "aws-sign2": { 225 | "version": "0.7.0", 226 | "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", 227 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 228 | }, 229 | "aws4": { 230 | "version": "1.9.1", 231 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", 232 | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" 233 | }, 234 | "balanced-match": { 235 | "version": "1.0.0", 236 | "resolved": "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", 237 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 238 | }, 239 | "base64-js": { 240 | "version": "1.2.0", 241 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.0.tgz", 242 | "integrity": "sha1-o5mS1yNYSBGYK+XikLtqU9hnAPE=" 243 | }, 244 | "bcrypt-pbkdf": { 245 | "version": "1.0.2", 246 | "resolved": "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz", 247 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 248 | "requires": { 249 | "tweetnacl": "^0.14.3" 250 | } 251 | }, 252 | "boolbase": { 253 | "version": "1.0.0", 254 | "resolved": "http://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", 255 | "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" 256 | }, 257 | "brace-expansion": { 258 | "version": "1.1.11", 259 | "resolved": "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", 260 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 261 | "requires": { 262 | "balanced-match": "^1.0.0", 263 | "concat-map": "0.0.1" 264 | } 265 | }, 266 | "braces": { 267 | "version": "3.0.2", 268 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 269 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 270 | "dev": true, 271 | "requires": { 272 | "fill-range": "^7.0.1" 273 | } 274 | }, 275 | "byline": { 276 | "version": "5.0.0", 277 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", 278 | "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", 279 | "dev": true 280 | }, 281 | "cacache": { 282 | "version": "15.0.3", 283 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.3.tgz", 284 | "integrity": "sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==", 285 | "requires": { 286 | "chownr": "^2.0.0", 287 | "fs-minipass": "^2.0.0", 288 | "glob": "^7.1.4", 289 | "infer-owner": "^1.0.4", 290 | "lru-cache": "^5.1.1", 291 | "minipass": "^3.1.1", 292 | "minipass-collect": "^1.0.2", 293 | "minipass-flush": "^1.0.5", 294 | "minipass-pipeline": "^1.2.2", 295 | "mkdirp": "^1.0.3", 296 | "move-file": "^2.0.0", 297 | "p-map": "^4.0.0", 298 | "promise-inflight": "^1.0.1", 299 | "rimraf": "^3.0.2", 300 | "ssri": "^8.0.0", 301 | "tar": "^6.0.2", 302 | "unique-filename": "^1.1.1" 303 | }, 304 | "dependencies": { 305 | "lru-cache": { 306 | "version": "5.1.1", 307 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 308 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 309 | "requires": { 310 | "yallist": "^3.0.2" 311 | } 312 | }, 313 | "mkdirp": { 314 | "version": "1.0.4", 315 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 316 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 317 | }, 318 | "rimraf": { 319 | "version": "3.0.2", 320 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 321 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 322 | "requires": { 323 | "glob": "^7.1.3" 324 | } 325 | }, 326 | "yallist": { 327 | "version": "3.1.1", 328 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 329 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 330 | } 331 | } 332 | }, 333 | "callsites": { 334 | "version": "3.1.0", 335 | "resolved": "https://registry.npm.taobao.org/callsites/download/callsites-3.1.0.tgz", 336 | "integrity": "sha1-s2MKvYlDQy9Us/BRkjjjPNffL3M=", 337 | "dev": true 338 | }, 339 | "camelcase": { 340 | "version": "6.0.0", 341 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", 342 | "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==" 343 | }, 344 | "camelcase-keys": { 345 | "version": "6.2.2", 346 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", 347 | "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", 348 | "requires": { 349 | "camelcase": "^5.3.1", 350 | "map-obj": "^4.0.0", 351 | "quick-lru": "^4.0.1" 352 | }, 353 | "dependencies": { 354 | "camelcase": { 355 | "version": "5.3.1", 356 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 357 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 358 | } 359 | } 360 | }, 361 | "caseless": { 362 | "version": "0.12.0", 363 | "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", 364 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 365 | }, 366 | "chalk": { 367 | "version": "2.4.2", 368 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 369 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 370 | "requires": { 371 | "ansi-styles": "^3.2.1", 372 | "escape-string-regexp": "^1.0.5", 373 | "supports-color": "^5.3.0" 374 | } 375 | }, 376 | "chardet": { 377 | "version": "0.7.0", 378 | "resolved": "http://registry.npm.taobao.org/chardet/download/chardet-0.7.0.tgz", 379 | "integrity": "sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=", 380 | "dev": true 381 | }, 382 | "cheerio": { 383 | "version": "1.0.0-rc.3", 384 | "resolved": "https://registry.npm.taobao.org/cheerio/download/cheerio-1.0.0-rc.3.tgz", 385 | "integrity": "sha1-CUY21CWy6cD065GkbAVjDJoai/Y=", 386 | "requires": { 387 | "css-select": "~1.2.0", 388 | "dom-serializer": "~0.1.1", 389 | "entities": "~1.1.1", 390 | "htmlparser2": "^3.9.1", 391 | "lodash": "^4.15.0", 392 | "parse5": "^3.0.1" 393 | } 394 | }, 395 | "chownr": { 396 | "version": "2.0.0", 397 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", 398 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" 399 | }, 400 | "clean-stack": { 401 | "version": "2.2.0", 402 | "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", 403 | "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" 404 | }, 405 | "cli-cursor": { 406 | "version": "2.1.0", 407 | "resolved": "http://registry.npm.taobao.org/cli-cursor/download/cli-cursor-2.1.0.tgz", 408 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 409 | "dev": true, 410 | "requires": { 411 | "restore-cursor": "^2.0.0" 412 | } 413 | }, 414 | "cli-width": { 415 | "version": "2.2.0", 416 | "resolved": "http://registry.npm.taobao.org/cli-width/download/cli-width-2.2.0.tgz", 417 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 418 | "dev": true 419 | }, 420 | "co": { 421 | "version": "4.6.0", 422 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 423 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 424 | }, 425 | "code-point-at": { 426 | "version": "1.1.0", 427 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 428 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 429 | }, 430 | "color-convert": { 431 | "version": "1.9.3", 432 | "resolved": "http://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", 433 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 434 | "requires": { 435 | "color-name": "1.1.3" 436 | } 437 | }, 438 | "color-name": { 439 | "version": "1.1.3", 440 | "resolved": "http://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", 441 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 442 | }, 443 | "combined-stream": { 444 | "version": "1.0.8", 445 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 446 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 447 | "requires": { 448 | "delayed-stream": "~1.0.0" 449 | } 450 | }, 451 | "commander": { 452 | "version": "2.20.3", 453 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 454 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 455 | }, 456 | "concat-map": { 457 | "version": "0.0.1", 458 | "resolved": "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", 459 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 460 | }, 461 | "condense-newlines": { 462 | "version": "0.2.1", 463 | "resolved": "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz", 464 | "integrity": "sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=", 465 | "requires": { 466 | "extend-shallow": "^2.0.1", 467 | "is-whitespace": "^0.3.0", 468 | "kind-of": "^3.0.2" 469 | } 470 | }, 471 | "config-chain": { 472 | "version": "1.1.12", 473 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", 474 | "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", 475 | "requires": { 476 | "ini": "^1.3.4", 477 | "proto-list": "~1.2.1" 478 | } 479 | }, 480 | "core-util-is": { 481 | "version": "1.0.2", 482 | "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", 483 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 484 | }, 485 | "cross-spawn": { 486 | "version": "6.0.5", 487 | "resolved": "http://registry.npm.taobao.org/cross-spawn/download/cross-spawn-6.0.5.tgz", 488 | "integrity": "sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=", 489 | "dev": true, 490 | "requires": { 491 | "nice-try": "^1.0.4", 492 | "path-key": "^2.0.1", 493 | "semver": "^5.5.0", 494 | "shebang-command": "^1.2.0", 495 | "which": "^1.2.9" 496 | } 497 | }, 498 | "cross-spawn-async": { 499 | "version": "2.2.5", 500 | "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", 501 | "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", 502 | "requires": { 503 | "lru-cache": "^4.0.0", 504 | "which": "^1.2.8" 505 | } 506 | }, 507 | "css-select": { 508 | "version": "1.2.0", 509 | "resolved": "http://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", 510 | "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", 511 | "requires": { 512 | "boolbase": "~1.0.0", 513 | "css-what": "2.1", 514 | "domutils": "1.5.1", 515 | "nth-check": "~1.0.1" 516 | } 517 | }, 518 | "css-what": { 519 | "version": "2.1.3", 520 | "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz?cache=0&sync_timestamp=1564773794818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-what%2Fdownload%2Fcss-what-2.1.3.tgz", 521 | "integrity": "sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI=" 522 | }, 523 | "currently-unhandled": { 524 | "version": "0.4.1", 525 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 526 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 527 | "requires": { 528 | "array-find-index": "^1.0.1" 529 | } 530 | }, 531 | "dashdash": { 532 | "version": "1.14.1", 533 | "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", 534 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 535 | "requires": { 536 | "assert-plus": "^1.0.0" 537 | } 538 | }, 539 | "debug": { 540 | "version": "4.1.1", 541 | "resolved": "https://registry.npm.taobao.org/debug/download/debug-4.1.1.tgz", 542 | "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=", 543 | "requires": { 544 | "ms": "^2.1.1" 545 | } 546 | }, 547 | "decamelize": { 548 | "version": "1.2.0", 549 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 550 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 551 | }, 552 | "decamelize-keys": { 553 | "version": "1.1.0", 554 | "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", 555 | "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", 556 | "requires": { 557 | "decamelize": "^1.1.0", 558 | "map-obj": "^1.0.0" 559 | }, 560 | "dependencies": { 561 | "map-obj": { 562 | "version": "1.0.1", 563 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 564 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 565 | } 566 | } 567 | }, 568 | "deep-is": { 569 | "version": "0.1.3", 570 | "resolved": "http://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", 571 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 572 | "dev": true 573 | }, 574 | "delayed-stream": { 575 | "version": "1.0.0", 576 | "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", 577 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 578 | }, 579 | "depd": { 580 | "version": "1.1.2", 581 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 582 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 583 | }, 584 | "dir-glob": { 585 | "version": "3.0.1", 586 | "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", 587 | "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", 588 | "dev": true, 589 | "requires": { 590 | "path-type": "^4.0.0" 591 | } 592 | }, 593 | "diskusage": { 594 | "version": "1.1.3", 595 | "resolved": "https://registry.npmjs.org/diskusage/-/diskusage-1.1.3.tgz", 596 | "integrity": "sha512-EAyaxl8hy4Ph07kzlzGTfpbZMNAAAHXSZtNEMwdlnSd1noHzvA6HsgKt4fEMSvaEXQYLSphe5rPMxN4WOj0hcQ==", 597 | "requires": { 598 | "es6-promise": "^4.2.5", 599 | "nan": "^2.14.0" 600 | } 601 | }, 602 | "doctrine": { 603 | "version": "3.0.0", 604 | "resolved": "https://registry.npm.taobao.org/doctrine/download/doctrine-3.0.0.tgz", 605 | "integrity": "sha1-rd6+rXKmV023g2OdyHoSF3OXOWE=", 606 | "dev": true, 607 | "requires": { 608 | "esutils": "^2.0.2" 609 | } 610 | }, 611 | "dom-serializer": { 612 | "version": "0.1.1", 613 | "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.1.tgz?cache=0&sync_timestamp=1564710970695&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdom-serializer%2Fdownload%2Fdom-serializer-0.1.1.tgz", 614 | "integrity": "sha1-HsQFnihLq+027sKUHUqXChic58A=", 615 | "requires": { 616 | "domelementtype": "^1.3.0", 617 | "entities": "^1.1.1" 618 | } 619 | }, 620 | "domelementtype": { 621 | "version": "1.3.1", 622 | "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz", 623 | "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=" 624 | }, 625 | "domhandler": { 626 | "version": "2.4.2", 627 | "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz", 628 | "integrity": "sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=", 629 | "requires": { 630 | "domelementtype": "1" 631 | } 632 | }, 633 | "domutils": { 634 | "version": "1.5.1", 635 | "resolved": "http://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", 636 | "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", 637 | "requires": { 638 | "dom-serializer": "0", 639 | "domelementtype": "1" 640 | } 641 | }, 642 | "ecc-jsbn": { 643 | "version": "0.1.2", 644 | "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz", 645 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 646 | "requires": { 647 | "jsbn": "~0.1.0", 648 | "safer-buffer": "^2.1.0" 649 | } 650 | }, 651 | "editorconfig": { 652 | "version": "0.15.3", 653 | "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", 654 | "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", 655 | "requires": { 656 | "commander": "^2.19.0", 657 | "lru-cache": "^4.1.5", 658 | "semver": "^5.6.0", 659 | "sigmund": "^1.0.1" 660 | } 661 | }, 662 | "emoji-regex": { 663 | "version": "7.0.3", 664 | "resolved": "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz", 665 | "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", 666 | "dev": true 667 | }, 668 | "encoding": { 669 | "version": "0.1.12", 670 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 671 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 672 | "optional": true, 673 | "requires": { 674 | "iconv-lite": "~0.4.13" 675 | } 676 | }, 677 | "end-of-stream": { 678 | "version": "1.4.4", 679 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 680 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 681 | "requires": { 682 | "once": "^1.4.0" 683 | } 684 | }, 685 | "entities": { 686 | "version": "1.1.2", 687 | "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz", 688 | "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=" 689 | }, 690 | "err-code": { 691 | "version": "1.1.2", 692 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", 693 | "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" 694 | }, 695 | "error-ex": { 696 | "version": "1.3.2", 697 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 698 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 699 | "requires": { 700 | "is-arrayish": "^0.2.1" 701 | } 702 | }, 703 | "es6-promise": { 704 | "version": "4.2.8", 705 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 706 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 707 | }, 708 | "escape-string-regexp": { 709 | "version": "1.0.5", 710 | "resolved": "http://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", 711 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 712 | }, 713 | "escodegen": { 714 | "version": "1.14.1", 715 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", 716 | "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", 717 | "dev": true, 718 | "requires": { 719 | "esprima": "^4.0.1", 720 | "estraverse": "^4.2.0", 721 | "esutils": "^2.0.2", 722 | "optionator": "^0.8.1", 723 | "source-map": "~0.6.1" 724 | } 725 | }, 726 | "eslint": { 727 | "version": "5.16.0", 728 | "resolved": "https://registry.npm.taobao.org/eslint/download/eslint-5.16.0.tgz?cache=0&sync_timestamp=1567195069923&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint%2Fdownload%2Feslint-5.16.0.tgz", 729 | "integrity": "sha1-oeOsGq5KP72Clvz496tzFMu2q+o=", 730 | "dev": true, 731 | "requires": { 732 | "@babel/code-frame": "^7.0.0", 733 | "ajv": "^6.9.1", 734 | "chalk": "^2.1.0", 735 | "cross-spawn": "^6.0.5", 736 | "debug": "^4.0.1", 737 | "doctrine": "^3.0.0", 738 | "eslint-scope": "^4.0.3", 739 | "eslint-utils": "^1.3.1", 740 | "eslint-visitor-keys": "^1.0.0", 741 | "espree": "^5.0.1", 742 | "esquery": "^1.0.1", 743 | "esutils": "^2.0.2", 744 | "file-entry-cache": "^5.0.1", 745 | "functional-red-black-tree": "^1.0.1", 746 | "glob": "^7.1.2", 747 | "globals": "^11.7.0", 748 | "ignore": "^4.0.6", 749 | "import-fresh": "^3.0.0", 750 | "imurmurhash": "^0.1.4", 751 | "inquirer": "^6.2.2", 752 | "js-yaml": "^3.13.0", 753 | "json-stable-stringify-without-jsonify": "^1.0.1", 754 | "levn": "^0.3.0", 755 | "lodash": "^4.17.11", 756 | "minimatch": "^3.0.4", 757 | "mkdirp": "^0.5.1", 758 | "natural-compare": "^1.4.0", 759 | "optionator": "^0.8.2", 760 | "path-is-inside": "^1.0.2", 761 | "progress": "^2.0.0", 762 | "regexpp": "^2.0.1", 763 | "semver": "^5.5.1", 764 | "strip-ansi": "^4.0.0", 765 | "strip-json-comments": "^2.0.1", 766 | "table": "^5.2.3", 767 | "text-table": "^0.2.0" 768 | } 769 | }, 770 | "eslint-scope": { 771 | "version": "4.0.3", 772 | "resolved": "https://registry.npm.taobao.org/eslint-scope/download/eslint-scope-4.0.3.tgz", 773 | "integrity": "sha1-ygODMxD2iJoyZHgaqC5j65z+eEg=", 774 | "dev": true, 775 | "requires": { 776 | "esrecurse": "^4.1.0", 777 | "estraverse": "^4.1.1" 778 | } 779 | }, 780 | "eslint-utils": { 781 | "version": "1.4.2", 782 | "resolved": "https://registry.npm.taobao.org/eslint-utils/download/eslint-utils-1.4.2.tgz?cache=0&sync_timestamp=1566297013046&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-utils%2Fdownload%2Feslint-utils-1.4.2.tgz", 783 | "integrity": "sha1-FmpRgO9qt+tGLxYv0ObyRj1zCas=", 784 | "dev": true, 785 | "requires": { 786 | "eslint-visitor-keys": "^1.0.0" 787 | } 788 | }, 789 | "eslint-visitor-keys": { 790 | "version": "1.1.0", 791 | "resolved": "https://registry.npm.taobao.org/eslint-visitor-keys/download/eslint-visitor-keys-1.1.0.tgz?cache=0&sync_timestamp=1565705523991&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Feslint-visitor-keys%2Fdownload%2Feslint-visitor-keys-1.1.0.tgz", 792 | "integrity": "sha1-4qgs6oT/JGrW+1f5veW0ZiFFnsI=", 793 | "dev": true 794 | }, 795 | "espree": { 796 | "version": "5.0.1", 797 | "resolved": "https://registry.npm.taobao.org/espree/download/espree-5.0.1.tgz?cache=0&sync_timestamp=1566612152812&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fespree%2Fdownload%2Fespree-5.0.1.tgz", 798 | "integrity": "sha1-XWUm+k/H8HiKXPdbFfMDI+L4H3o=", 799 | "dev": true, 800 | "requires": { 801 | "acorn": "^6.0.7", 802 | "acorn-jsx": "^5.0.0", 803 | "eslint-visitor-keys": "^1.0.0" 804 | } 805 | }, 806 | "esprima": { 807 | "version": "4.0.1", 808 | "resolved": "http://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz", 809 | "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", 810 | "dev": true 811 | }, 812 | "esquery": { 813 | "version": "1.0.1", 814 | "resolved": "http://registry.npm.taobao.org/esquery/download/esquery-1.0.1.tgz", 815 | "integrity": "sha1-QGxRZYsfWZGl+bYrHcJbAOPlxwg=", 816 | "dev": true, 817 | "requires": { 818 | "estraverse": "^4.0.0" 819 | } 820 | }, 821 | "esrecurse": { 822 | "version": "4.2.1", 823 | "resolved": "http://registry.npm.taobao.org/esrecurse/download/esrecurse-4.2.1.tgz", 824 | "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", 825 | "dev": true, 826 | "requires": { 827 | "estraverse": "^4.1.0" 828 | } 829 | }, 830 | "estraverse": { 831 | "version": "4.3.0", 832 | "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz", 833 | "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=", 834 | "dev": true 835 | }, 836 | "esutils": { 837 | "version": "2.0.3", 838 | "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz", 839 | "integrity": "sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=" 840 | }, 841 | "execa": { 842 | "version": "0.4.0", 843 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", 844 | "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", 845 | "requires": { 846 | "cross-spawn-async": "^2.1.1", 847 | "is-stream": "^1.1.0", 848 | "npm-run-path": "^1.0.0", 849 | "object-assign": "^4.0.1", 850 | "path-key": "^1.0.0", 851 | "strip-eof": "^1.0.0" 852 | }, 853 | "dependencies": { 854 | "path-key": { 855 | "version": "1.0.0", 856 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", 857 | "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" 858 | } 859 | } 860 | }, 861 | "expand-template": { 862 | "version": "2.0.3", 863 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", 864 | "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", 865 | "dev": true 866 | }, 867 | "extend": { 868 | "version": "3.0.2", 869 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 870 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 871 | }, 872 | "extend-shallow": { 873 | "version": "2.0.1", 874 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 875 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 876 | "requires": { 877 | "is-extendable": "^0.1.0" 878 | } 879 | }, 880 | "external-editor": { 881 | "version": "3.1.0", 882 | "resolved": "https://registry.npm.taobao.org/external-editor/download/external-editor-3.1.0.tgz?cache=0&sync_timestamp=1562602052556&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fexternal-editor%2Fdownload%2Fexternal-editor-3.1.0.tgz", 883 | "integrity": "sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=", 884 | "dev": true, 885 | "requires": { 886 | "chardet": "^0.7.0", 887 | "iconv-lite": "^0.4.24", 888 | "tmp": "^0.0.33" 889 | } 890 | }, 891 | "extsprintf": { 892 | "version": "1.3.0", 893 | "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", 894 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 895 | }, 896 | "fast-deep-equal": { 897 | "version": "2.0.1", 898 | "resolved": "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz", 899 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 900 | }, 901 | "fast-glob": { 902 | "version": "3.2.2", 903 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", 904 | "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", 905 | "dev": true, 906 | "requires": { 907 | "@nodelib/fs.stat": "^2.0.2", 908 | "@nodelib/fs.walk": "^1.2.3", 909 | "glob-parent": "^5.1.0", 910 | "merge2": "^1.3.0", 911 | "micromatch": "^4.0.2", 912 | "picomatch": "^2.2.1" 913 | } 914 | }, 915 | "fast-json-stable-stringify": { 916 | "version": "2.0.0", 917 | "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", 918 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 919 | }, 920 | "fast-levenshtein": { 921 | "version": "2.0.6", 922 | "resolved": "http://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", 923 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 924 | "dev": true 925 | }, 926 | "fastq": { 927 | "version": "1.8.0", 928 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", 929 | "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", 930 | "dev": true, 931 | "requires": { 932 | "reusify": "^1.0.4" 933 | } 934 | }, 935 | "figures": { 936 | "version": "2.0.0", 937 | "resolved": "http://registry.npm.taobao.org/figures/download/figures-2.0.0.tgz", 938 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 939 | "dev": true, 940 | "requires": { 941 | "escape-string-regexp": "^1.0.5" 942 | } 943 | }, 944 | "file-entry-cache": { 945 | "version": "5.0.1", 946 | "resolved": "https://registry.npm.taobao.org/file-entry-cache/download/file-entry-cache-5.0.1.tgz", 947 | "integrity": "sha1-yg9u+m3T1WEzP7FFFQZcL6/fQ5w=", 948 | "dev": true, 949 | "requires": { 950 | "flat-cache": "^2.0.1" 951 | } 952 | }, 953 | "fill-range": { 954 | "version": "7.0.1", 955 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 956 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 957 | "dev": true, 958 | "requires": { 959 | "to-regex-range": "^5.0.1" 960 | } 961 | }, 962 | "find-up": { 963 | "version": "4.1.0", 964 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 965 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 966 | "requires": { 967 | "locate-path": "^5.0.0", 968 | "path-exists": "^4.0.0" 969 | } 970 | }, 971 | "flat-cache": { 972 | "version": "2.0.1", 973 | "resolved": "https://registry.npm.taobao.org/flat-cache/download/flat-cache-2.0.1.tgz", 974 | "integrity": "sha1-XSltbwS9pEpGMKMBQTvbwuwIXsA=", 975 | "dev": true, 976 | "requires": { 977 | "flatted": "^2.0.0", 978 | "rimraf": "2.6.3", 979 | "write": "1.0.3" 980 | } 981 | }, 982 | "flatted": { 983 | "version": "2.0.1", 984 | "resolved": "https://registry.npm.taobao.org/flatted/download/flatted-2.0.1.tgz?cache=0&sync_timestamp=1561466276595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fflatted%2Fdownload%2Fflatted-2.0.1.tgz", 985 | "integrity": "sha1-aeV8qo8OrLwoHS4stFjUb9tEngg=", 986 | "dev": true 987 | }, 988 | "forever-agent": { 989 | "version": "0.6.1", 990 | "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", 991 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 992 | }, 993 | "form-data": { 994 | "version": "2.3.3", 995 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 996 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 997 | "requires": { 998 | "asynckit": "^0.4.0", 999 | "combined-stream": "^1.0.6", 1000 | "mime-types": "^2.1.12" 1001 | } 1002 | }, 1003 | "from2": { 1004 | "version": "2.3.0", 1005 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 1006 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 1007 | "dev": true, 1008 | "requires": { 1009 | "inherits": "^2.0.1", 1010 | "readable-stream": "^2.0.0" 1011 | }, 1012 | "dependencies": { 1013 | "readable-stream": { 1014 | "version": "2.3.7", 1015 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1016 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1017 | "dev": true, 1018 | "requires": { 1019 | "core-util-is": "~1.0.0", 1020 | "inherits": "~2.0.3", 1021 | "isarray": "~1.0.0", 1022 | "process-nextick-args": "~2.0.0", 1023 | "safe-buffer": "~5.1.1", 1024 | "string_decoder": "~1.1.1", 1025 | "util-deprecate": "~1.0.1" 1026 | } 1027 | }, 1028 | "string_decoder": { 1029 | "version": "1.1.1", 1030 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1031 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1032 | "dev": true, 1033 | "requires": { 1034 | "safe-buffer": "~5.1.0" 1035 | } 1036 | } 1037 | } 1038 | }, 1039 | "fs-extra": { 1040 | "version": "8.1.0", 1041 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", 1042 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", 1043 | "dev": true, 1044 | "requires": { 1045 | "graceful-fs": "^4.2.0", 1046 | "jsonfile": "^4.0.0", 1047 | "universalify": "^0.1.0" 1048 | } 1049 | }, 1050 | "fs-minipass": { 1051 | "version": "2.1.0", 1052 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", 1053 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", 1054 | "requires": { 1055 | "minipass": "^3.0.0" 1056 | } 1057 | }, 1058 | "fs.realpath": { 1059 | "version": "1.0.0", 1060 | "resolved": "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz", 1061 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1062 | }, 1063 | "functional-red-black-tree": { 1064 | "version": "1.0.1", 1065 | "resolved": "http://registry.npm.taobao.org/functional-red-black-tree/download/functional-red-black-tree-1.0.1.tgz", 1066 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1067 | "dev": true 1068 | }, 1069 | "get-stdin": { 1070 | "version": "4.0.1", 1071 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 1072 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" 1073 | }, 1074 | "get-stream": { 1075 | "version": "5.1.0", 1076 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", 1077 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", 1078 | "requires": { 1079 | "pump": "^3.0.0" 1080 | } 1081 | }, 1082 | "getpass": { 1083 | "version": "0.1.7", 1084 | "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", 1085 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1086 | "requires": { 1087 | "assert-plus": "^1.0.0" 1088 | } 1089 | }, 1090 | "glob": { 1091 | "version": "7.1.4", 1092 | "resolved": "https://registry.npm.taobao.org/glob/download/glob-7.1.4.tgz", 1093 | "integrity": "sha1-qmCKL2xXetNX4a5aXCbZqNGWklU=", 1094 | "requires": { 1095 | "fs.realpath": "^1.0.0", 1096 | "inflight": "^1.0.4", 1097 | "inherits": "2", 1098 | "minimatch": "^3.0.4", 1099 | "once": "^1.3.0", 1100 | "path-is-absolute": "^1.0.0" 1101 | } 1102 | }, 1103 | "glob-parent": { 1104 | "version": "5.1.1", 1105 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", 1106 | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", 1107 | "dev": true, 1108 | "requires": { 1109 | "is-glob": "^4.0.1" 1110 | } 1111 | }, 1112 | "globals": { 1113 | "version": "11.12.0", 1114 | "resolved": "https://registry.npm.taobao.org/globals/download/globals-11.12.0.tgz?cache=0&sync_timestamp=1563721993391&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglobals%2Fdownload%2Fglobals-11.12.0.tgz", 1115 | "integrity": "sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=", 1116 | "dev": true 1117 | }, 1118 | "globby": { 1119 | "version": "11.0.0", 1120 | "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.0.tgz", 1121 | "integrity": "sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg==", 1122 | "dev": true, 1123 | "requires": { 1124 | "array-union": "^2.1.0", 1125 | "dir-glob": "^3.0.1", 1126 | "fast-glob": "^3.1.1", 1127 | "ignore": "^5.1.4", 1128 | "merge2": "^1.3.0", 1129 | "slash": "^3.0.0" 1130 | }, 1131 | "dependencies": { 1132 | "ignore": { 1133 | "version": "5.1.6", 1134 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.6.tgz", 1135 | "integrity": "sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==", 1136 | "dev": true 1137 | } 1138 | } 1139 | }, 1140 | "graceful-fs": { 1141 | "version": "4.2.2", 1142 | "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.2.tgz", 1143 | "integrity": "sha1-bwlSYF0BQMHP2xOO0AV3W5LWewI=" 1144 | }, 1145 | "har-schema": { 1146 | "version": "2.0.0", 1147 | "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", 1148 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1149 | }, 1150 | "har-validator": { 1151 | "version": "5.1.3", 1152 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 1153 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 1154 | "requires": { 1155 | "ajv": "^6.5.5", 1156 | "har-schema": "^2.0.0" 1157 | } 1158 | }, 1159 | "hard-rejection": { 1160 | "version": "2.1.0", 1161 | "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", 1162 | "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==" 1163 | }, 1164 | "has-flag": { 1165 | "version": "3.0.0", 1166 | "resolved": "http://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", 1167 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1168 | }, 1169 | "hosted-git-info": { 1170 | "version": "2.8.5", 1171 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", 1172 | "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==" 1173 | }, 1174 | "htmlparser2": { 1175 | "version": "3.10.1", 1176 | "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1564773692945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz", 1177 | "integrity": "sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=", 1178 | "requires": { 1179 | "domelementtype": "^1.3.1", 1180 | "domhandler": "^2.3.0", 1181 | "domutils": "^1.5.1", 1182 | "entities": "^1.1.1", 1183 | "inherits": "^2.0.1", 1184 | "readable-stream": "^3.1.1" 1185 | } 1186 | }, 1187 | "http-cache-semantics": { 1188 | "version": "4.1.0", 1189 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", 1190 | "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" 1191 | }, 1192 | "http-proxy-agent": { 1193 | "version": "4.0.1", 1194 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", 1195 | "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", 1196 | "requires": { 1197 | "@tootallnate/once": "1", 1198 | "agent-base": "6", 1199 | "debug": "4" 1200 | } 1201 | }, 1202 | "http-signature": { 1203 | "version": "1.2.0", 1204 | "resolved": "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", 1205 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1206 | "requires": { 1207 | "assert-plus": "^1.0.0", 1208 | "jsprim": "^1.2.2", 1209 | "sshpk": "^1.7.0" 1210 | } 1211 | }, 1212 | "https-proxy-agent": { 1213 | "version": "5.0.0", 1214 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 1215 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 1216 | "requires": { 1217 | "agent-base": "6", 1218 | "debug": "4" 1219 | } 1220 | }, 1221 | "human-signals": { 1222 | "version": "1.1.1", 1223 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", 1224 | "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" 1225 | }, 1226 | "human-size": { 1227 | "version": "1.1.0", 1228 | "resolved": "https://registry.npmjs.org/human-size/-/human-size-1.1.0.tgz", 1229 | "integrity": "sha1-BSVivpmYQcA3AiwgJZmQxW6plvk=" 1230 | }, 1231 | "humanize-ms": { 1232 | "version": "1.2.1", 1233 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1234 | "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", 1235 | "requires": { 1236 | "ms": "^2.0.0" 1237 | } 1238 | }, 1239 | "iconv-lite": { 1240 | "version": "0.4.24", 1241 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.24.tgz", 1242 | "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", 1243 | "requires": { 1244 | "safer-buffer": ">= 2.1.2 < 3" 1245 | } 1246 | }, 1247 | "ignore": { 1248 | "version": "4.0.6", 1249 | "resolved": "http://registry.npm.taobao.org/ignore/download/ignore-4.0.6.tgz", 1250 | "integrity": "sha1-dQ49tYYgh7RzfrrIIH/9HvJ7Jfw=", 1251 | "dev": true 1252 | }, 1253 | "imgcat": { 1254 | "version": "2.3.0", 1255 | "resolved": "https://registry.npmjs.org/imgcat/-/imgcat-2.3.0.tgz", 1256 | "integrity": "sha1-MtBYbBoAbcx9thk7jiy8GAfrHoE=", 1257 | "requires": { 1258 | "co": "^4.6.0", 1259 | "is-url": "^1.2.1", 1260 | "pget": "^0.1.1", 1261 | "tempfile": "^1.1.1", 1262 | "term-img2": "^2.0.0" 1263 | } 1264 | }, 1265 | "import-fresh": { 1266 | "version": "3.1.0", 1267 | "resolved": "https://registry.npm.taobao.org/import-fresh/download/import-fresh-3.1.0.tgz?cache=0&sync_timestamp=1561888919431&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fimport-fresh%2Fdownload%2Fimport-fresh-3.1.0.tgz", 1268 | "integrity": "sha1-bTP6Hc7235MPrgA0RvM0Fa+QURg=", 1269 | "dev": true, 1270 | "requires": { 1271 | "parent-module": "^1.0.0", 1272 | "resolve-from": "^4.0.0" 1273 | } 1274 | }, 1275 | "imurmurhash": { 1276 | "version": "0.1.4", 1277 | "resolved": "http://registry.npm.taobao.org/imurmurhash/download/imurmurhash-0.1.4.tgz", 1278 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 1279 | }, 1280 | "indent-string": { 1281 | "version": "4.0.0", 1282 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", 1283 | "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" 1284 | }, 1285 | "infer-owner": { 1286 | "version": "1.0.4", 1287 | "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", 1288 | "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" 1289 | }, 1290 | "inflight": { 1291 | "version": "1.0.6", 1292 | "resolved": "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", 1293 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1294 | "requires": { 1295 | "once": "^1.3.0", 1296 | "wrappy": "1" 1297 | } 1298 | }, 1299 | "inherits": { 1300 | "version": "2.0.3", 1301 | "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 1302 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1303 | }, 1304 | "ini": { 1305 | "version": "1.3.8", 1306 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1307 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1308 | }, 1309 | "inquirer": { 1310 | "version": "6.5.2", 1311 | "resolved": "https://registry.npm.taobao.org/inquirer/download/inquirer-6.5.2.tgz", 1312 | "integrity": "sha1-rVCUI3XQNtMn/1KMCL1fqwiZKMo=", 1313 | "dev": true, 1314 | "requires": { 1315 | "ansi-escapes": "^3.2.0", 1316 | "chalk": "^2.4.2", 1317 | "cli-cursor": "^2.1.0", 1318 | "cli-width": "^2.0.0", 1319 | "external-editor": "^3.0.3", 1320 | "figures": "^2.0.0", 1321 | "lodash": "^4.17.12", 1322 | "mute-stream": "0.0.7", 1323 | "run-async": "^2.2.0", 1324 | "rxjs": "^6.4.0", 1325 | "string-width": "^2.1.0", 1326 | "strip-ansi": "^5.1.0", 1327 | "through": "^2.3.6" 1328 | }, 1329 | "dependencies": { 1330 | "ansi-regex": { 1331 | "version": "4.1.0", 1332 | "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", 1333 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 1334 | "dev": true 1335 | }, 1336 | "strip-ansi": { 1337 | "version": "5.2.0", 1338 | "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", 1339 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 1340 | "dev": true, 1341 | "requires": { 1342 | "ansi-regex": "^4.1.0" 1343 | } 1344 | } 1345 | } 1346 | }, 1347 | "into-stream": { 1348 | "version": "5.1.1", 1349 | "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz", 1350 | "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==", 1351 | "dev": true, 1352 | "requires": { 1353 | "from2": "^2.3.0", 1354 | "p-is-promise": "^3.0.0" 1355 | } 1356 | }, 1357 | "invert-kv": { 1358 | "version": "3.0.1", 1359 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz", 1360 | "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==" 1361 | }, 1362 | "ip": { 1363 | "version": "1.1.5", 1364 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 1365 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 1366 | }, 1367 | "is-arrayish": { 1368 | "version": "0.2.1", 1369 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1370 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1371 | }, 1372 | "is-buffer": { 1373 | "version": "1.1.6", 1374 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1375 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1376 | }, 1377 | "is-extendable": { 1378 | "version": "0.1.1", 1379 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1380 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1381 | }, 1382 | "is-extglob": { 1383 | "version": "2.1.1", 1384 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1385 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1386 | "dev": true 1387 | }, 1388 | "is-finite": { 1389 | "version": "1.0.2", 1390 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1391 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1392 | "requires": { 1393 | "number-is-nan": "^1.0.0" 1394 | } 1395 | }, 1396 | "is-fullwidth-code-point": { 1397 | "version": "2.0.0", 1398 | "resolved": "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz", 1399 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 1400 | "dev": true 1401 | }, 1402 | "is-glob": { 1403 | "version": "4.0.1", 1404 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1405 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1406 | "dev": true, 1407 | "requires": { 1408 | "is-extglob": "^2.1.1" 1409 | } 1410 | }, 1411 | "is-lambda": { 1412 | "version": "1.0.1", 1413 | "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", 1414 | "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=" 1415 | }, 1416 | "is-number": { 1417 | "version": "7.0.0", 1418 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1419 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1420 | "dev": true 1421 | }, 1422 | "is-plain-obj": { 1423 | "version": "1.1.0", 1424 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 1425 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 1426 | }, 1427 | "is-promise": { 1428 | "version": "2.1.0", 1429 | "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", 1430 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1431 | "dev": true 1432 | }, 1433 | "is-stream": { 1434 | "version": "1.1.0", 1435 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1436 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 1437 | }, 1438 | "is-typedarray": { 1439 | "version": "1.0.0", 1440 | "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", 1441 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1442 | }, 1443 | "is-url": { 1444 | "version": "1.2.4", 1445 | "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", 1446 | "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" 1447 | }, 1448 | "is-utf8": { 1449 | "version": "0.2.1", 1450 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1451 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 1452 | }, 1453 | "is-whitespace": { 1454 | "version": "0.3.0", 1455 | "resolved": "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz", 1456 | "integrity": "sha1-Fjnssb4DauxppUy7QBz77XEUq38=" 1457 | }, 1458 | "isarray": { 1459 | "version": "1.0.0", 1460 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1461 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1462 | }, 1463 | "isexe": { 1464 | "version": "2.0.0", 1465 | "resolved": "http://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", 1466 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1467 | }, 1468 | "isstream": { 1469 | "version": "0.1.2", 1470 | "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", 1471 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1472 | }, 1473 | "iterm2-version": { 1474 | "version": "2.3.0", 1475 | "resolved": "https://registry.npmjs.org/iterm2-version/-/iterm2-version-2.3.0.tgz", 1476 | "integrity": "sha1-rmQABGHgK18f5TMfC58Oxxzg4Tg=", 1477 | "requires": { 1478 | "app-path": "^2.1.0", 1479 | "plist": "^2.0.1" 1480 | } 1481 | }, 1482 | "js-beautify": { 1483 | "version": "1.11.0", 1484 | "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz", 1485 | "integrity": "sha512-a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==", 1486 | "requires": { 1487 | "config-chain": "^1.1.12", 1488 | "editorconfig": "^0.15.3", 1489 | "glob": "^7.1.3", 1490 | "mkdirp": "~1.0.3", 1491 | "nopt": "^4.0.3" 1492 | }, 1493 | "dependencies": { 1494 | "mkdirp": { 1495 | "version": "1.0.4", 1496 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 1497 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 1498 | } 1499 | } 1500 | }, 1501 | "js-tokens": { 1502 | "version": "4.0.0", 1503 | "resolved": "http://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz", 1504 | "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=" 1505 | }, 1506 | "js-yaml": { 1507 | "version": "3.13.1", 1508 | "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.13.1.tgz", 1509 | "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", 1510 | "dev": true, 1511 | "requires": { 1512 | "argparse": "^1.0.7", 1513 | "esprima": "^4.0.0" 1514 | } 1515 | }, 1516 | "jsbn": { 1517 | "version": "0.1.1", 1518 | "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", 1519 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1520 | }, 1521 | "json-parse-better-errors": { 1522 | "version": "1.0.2", 1523 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1524 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 1525 | }, 1526 | "json-schema": { 1527 | "version": "0.2.3", 1528 | "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", 1529 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1530 | }, 1531 | "json-schema-traverse": { 1532 | "version": "0.4.1", 1533 | "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz", 1534 | "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=" 1535 | }, 1536 | "json-stable-stringify-without-jsonify": { 1537 | "version": "1.0.1", 1538 | "resolved": "http://registry.npm.taobao.org/json-stable-stringify-without-jsonify/download/json-stable-stringify-without-jsonify-1.0.1.tgz", 1539 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1540 | "dev": true 1541 | }, 1542 | "json-stringify-safe": { 1543 | "version": "5.0.1", 1544 | "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", 1545 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1546 | }, 1547 | "jsonfile": { 1548 | "version": "4.0.0", 1549 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1550 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1551 | "dev": true, 1552 | "requires": { 1553 | "graceful-fs": "^4.1.6" 1554 | } 1555 | }, 1556 | "jsprim": { 1557 | "version": "1.4.1", 1558 | "resolved": "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", 1559 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1560 | "requires": { 1561 | "assert-plus": "1.0.0", 1562 | "extsprintf": "1.3.0", 1563 | "json-schema": "0.2.3", 1564 | "verror": "1.10.0" 1565 | } 1566 | }, 1567 | "kind-of": { 1568 | "version": "3.2.2", 1569 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1570 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1571 | "requires": { 1572 | "is-buffer": "^1.1.5" 1573 | } 1574 | }, 1575 | "lcid": { 1576 | "version": "3.1.1", 1577 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz", 1578 | "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==", 1579 | "requires": { 1580 | "invert-kv": "^3.0.0" 1581 | } 1582 | }, 1583 | "levn": { 1584 | "version": "0.3.0", 1585 | "resolved": "http://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", 1586 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1587 | "dev": true, 1588 | "requires": { 1589 | "prelude-ls": "~1.1.2", 1590 | "type-check": "~0.3.2" 1591 | } 1592 | }, 1593 | "lines-and-columns": { 1594 | "version": "1.1.6", 1595 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", 1596 | "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" 1597 | }, 1598 | "locate-path": { 1599 | "version": "5.0.0", 1600 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 1601 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 1602 | "requires": { 1603 | "p-locate": "^4.1.0" 1604 | } 1605 | }, 1606 | "lodash": { 1607 | "version": "4.17.19", 1608 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 1609 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" 1610 | }, 1611 | "loud-rejection": { 1612 | "version": "1.6.0", 1613 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 1614 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 1615 | "requires": { 1616 | "currently-unhandled": "^0.4.1", 1617 | "signal-exit": "^3.0.0" 1618 | } 1619 | }, 1620 | "lru-cache": { 1621 | "version": "4.1.5", 1622 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 1623 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 1624 | "requires": { 1625 | "pseudomap": "^1.0.2", 1626 | "yallist": "^2.1.2" 1627 | } 1628 | }, 1629 | "make-fetch-happen": { 1630 | "version": "8.0.7", 1631 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.7.tgz", 1632 | "integrity": "sha512-rkDA4c1nMXVqLkfOaM5RK2dxkUndjLOCrPycTDZgbkFDzhmaCO3P1dmCW//yt1I/G1EcedJqMsSjWkV79Hh4hQ==", 1633 | "requires": { 1634 | "agentkeepalive": "^4.1.0", 1635 | "cacache": "^15.0.0", 1636 | "http-cache-semantics": "^4.0.4", 1637 | "http-proxy-agent": "^4.0.1", 1638 | "https-proxy-agent": "^5.0.0", 1639 | "is-lambda": "^1.0.1", 1640 | "lru-cache": "^5.1.1", 1641 | "minipass": "^3.1.3", 1642 | "minipass-collect": "^1.0.2", 1643 | "minipass-fetch": "^1.1.2", 1644 | "minipass-flush": "^1.0.5", 1645 | "minipass-pipeline": "^1.2.2", 1646 | "promise-retry": "^1.1.1", 1647 | "socks-proxy-agent": "^5.0.0", 1648 | "ssri": "^8.0.0" 1649 | }, 1650 | "dependencies": { 1651 | "lru-cache": { 1652 | "version": "5.1.1", 1653 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 1654 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 1655 | "requires": { 1656 | "yallist": "^3.0.2" 1657 | } 1658 | }, 1659 | "yallist": { 1660 | "version": "3.1.1", 1661 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1662 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1663 | } 1664 | } 1665 | }, 1666 | "map-age-cleaner": { 1667 | "version": "0.1.3", 1668 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 1669 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 1670 | "requires": { 1671 | "p-defer": "^1.0.0" 1672 | } 1673 | }, 1674 | "map-obj": { 1675 | "version": "4.1.0", 1676 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", 1677 | "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==" 1678 | }, 1679 | "mem": { 1680 | "version": "5.1.1", 1681 | "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz", 1682 | "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==", 1683 | "requires": { 1684 | "map-age-cleaner": "^0.1.3", 1685 | "mimic-fn": "^2.1.0", 1686 | "p-is-promise": "^2.1.0" 1687 | }, 1688 | "dependencies": { 1689 | "mimic-fn": { 1690 | "version": "2.1.0", 1691 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1692 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 1693 | }, 1694 | "p-is-promise": { 1695 | "version": "2.1.0", 1696 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 1697 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" 1698 | } 1699 | } 1700 | }, 1701 | "meow": { 1702 | "version": "7.0.1", 1703 | "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", 1704 | "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", 1705 | "requires": { 1706 | "@types/minimist": "^1.2.0", 1707 | "arrify": "^2.0.1", 1708 | "camelcase": "^6.0.0", 1709 | "camelcase-keys": "^6.2.2", 1710 | "decamelize-keys": "^1.1.0", 1711 | "hard-rejection": "^2.1.0", 1712 | "minimist-options": "^4.0.2", 1713 | "normalize-package-data": "^2.5.0", 1714 | "read-pkg-up": "^7.0.1", 1715 | "redent": "^3.0.0", 1716 | "trim-newlines": "^3.0.0", 1717 | "type-fest": "^0.13.1", 1718 | "yargs-parser": "^18.1.3" 1719 | } 1720 | }, 1721 | "merge-stream": { 1722 | "version": "2.0.0", 1723 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1724 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" 1725 | }, 1726 | "merge2": { 1727 | "version": "1.3.0", 1728 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", 1729 | "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", 1730 | "dev": true 1731 | }, 1732 | "micromatch": { 1733 | "version": "4.0.2", 1734 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", 1735 | "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", 1736 | "dev": true, 1737 | "requires": { 1738 | "braces": "^3.0.1", 1739 | "picomatch": "^2.0.5" 1740 | } 1741 | }, 1742 | "mime-db": { 1743 | "version": "1.44.0", 1744 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 1745 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 1746 | }, 1747 | "mime-types": { 1748 | "version": "2.1.27", 1749 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 1750 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 1751 | "requires": { 1752 | "mime-db": "1.44.0" 1753 | } 1754 | }, 1755 | "mimic-fn": { 1756 | "version": "1.2.0", 1757 | "resolved": "http://registry.npm.taobao.org/mimic-fn/download/mimic-fn-1.2.0.tgz", 1758 | "integrity": "sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI=", 1759 | "dev": true 1760 | }, 1761 | "min-indent": { 1762 | "version": "1.0.0", 1763 | "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz", 1764 | "integrity": "sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY=" 1765 | }, 1766 | "minimatch": { 1767 | "version": "3.0.4", 1768 | "resolved": "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", 1769 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 1770 | "requires": { 1771 | "brace-expansion": "^1.1.7" 1772 | } 1773 | }, 1774 | "minimist": { 1775 | "version": "1.2.5", 1776 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1777 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", 1778 | "dev": true 1779 | }, 1780 | "minimist-options": { 1781 | "version": "4.0.2", 1782 | "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz", 1783 | "integrity": "sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w==", 1784 | "requires": { 1785 | "arrify": "^1.0.1", 1786 | "is-plain-obj": "^1.1.0" 1787 | }, 1788 | "dependencies": { 1789 | "arrify": { 1790 | "version": "1.0.1", 1791 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 1792 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 1793 | } 1794 | } 1795 | }, 1796 | "minipass": { 1797 | "version": "3.1.3", 1798 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", 1799 | "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", 1800 | "requires": { 1801 | "yallist": "^4.0.0" 1802 | }, 1803 | "dependencies": { 1804 | "yallist": { 1805 | "version": "4.0.0", 1806 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1807 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1808 | } 1809 | } 1810 | }, 1811 | "minipass-collect": { 1812 | "version": "1.0.2", 1813 | "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", 1814 | "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", 1815 | "requires": { 1816 | "minipass": "^3.0.0" 1817 | } 1818 | }, 1819 | "minipass-fetch": { 1820 | "version": "1.2.1", 1821 | "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", 1822 | "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", 1823 | "requires": { 1824 | "encoding": "^0.1.12", 1825 | "minipass": "^3.1.0", 1826 | "minipass-pipeline": "^1.2.2", 1827 | "minipass-sized": "^1.0.3", 1828 | "minizlib": "^2.0.0" 1829 | } 1830 | }, 1831 | "minipass-flush": { 1832 | "version": "1.0.5", 1833 | "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", 1834 | "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", 1835 | "requires": { 1836 | "minipass": "^3.0.0" 1837 | } 1838 | }, 1839 | "minipass-pipeline": { 1840 | "version": "1.2.3", 1841 | "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", 1842 | "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", 1843 | "requires": { 1844 | "minipass": "^3.0.0" 1845 | } 1846 | }, 1847 | "minipass-sized": { 1848 | "version": "1.0.3", 1849 | "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", 1850 | "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", 1851 | "requires": { 1852 | "minipass": "^3.0.0" 1853 | } 1854 | }, 1855 | "minizlib": { 1856 | "version": "2.1.0", 1857 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", 1858 | "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", 1859 | "requires": { 1860 | "minipass": "^3.0.0", 1861 | "yallist": "^4.0.0" 1862 | }, 1863 | "dependencies": { 1864 | "yallist": { 1865 | "version": "4.0.0", 1866 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1867 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1868 | } 1869 | } 1870 | }, 1871 | "mkdirp": { 1872 | "version": "0.5.5", 1873 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 1874 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 1875 | "dev": true, 1876 | "requires": { 1877 | "minimist": "^1.2.5" 1878 | } 1879 | }, 1880 | "move-file": { 1881 | "version": "2.0.0", 1882 | "resolved": "https://registry.npmjs.org/move-file/-/move-file-2.0.0.tgz", 1883 | "integrity": "sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==", 1884 | "requires": { 1885 | "path-exists": "^4.0.0" 1886 | } 1887 | }, 1888 | "ms": { 1889 | "version": "2.1.2", 1890 | "resolved": "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz", 1891 | "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" 1892 | }, 1893 | "multistream": { 1894 | "version": "2.1.1", 1895 | "resolved": "https://registry.npmjs.org/multistream/-/multistream-2.1.1.tgz", 1896 | "integrity": "sha512-xasv76hl6nr1dEy3lPvy7Ej7K/Lx3O/FCvwge8PeVJpciPPoNCbaANcNiBug3IpdvTveZUcAV0DJzdnUDMesNQ==", 1897 | "dev": true, 1898 | "requires": { 1899 | "inherits": "^2.0.1", 1900 | "readable-stream": "^2.0.5" 1901 | }, 1902 | "dependencies": { 1903 | "readable-stream": { 1904 | "version": "2.3.7", 1905 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1906 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1907 | "dev": true, 1908 | "requires": { 1909 | "core-util-is": "~1.0.0", 1910 | "inherits": "~2.0.3", 1911 | "isarray": "~1.0.0", 1912 | "process-nextick-args": "~2.0.0", 1913 | "safe-buffer": "~5.1.1", 1914 | "string_decoder": "~1.1.1", 1915 | "util-deprecate": "~1.0.1" 1916 | } 1917 | }, 1918 | "string_decoder": { 1919 | "version": "1.1.1", 1920 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1921 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1922 | "dev": true, 1923 | "requires": { 1924 | "safe-buffer": "~5.1.0" 1925 | } 1926 | } 1927 | } 1928 | }, 1929 | "mute-stream": { 1930 | "version": "0.0.7", 1931 | "resolved": "http://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", 1932 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 1933 | "dev": true 1934 | }, 1935 | "nan": { 1936 | "version": "2.14.0", 1937 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 1938 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 1939 | }, 1940 | "natural-compare": { 1941 | "version": "1.4.0", 1942 | "resolved": "http://registry.npm.taobao.org/natural-compare/download/natural-compare-1.4.0.tgz", 1943 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1944 | "dev": true 1945 | }, 1946 | "nice-try": { 1947 | "version": "1.0.5", 1948 | "resolved": "http://registry.npm.taobao.org/nice-try/download/nice-try-1.0.5.tgz", 1949 | "integrity": "sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=", 1950 | "dev": true 1951 | }, 1952 | "nopt": { 1953 | "version": "4.0.3", 1954 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", 1955 | "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", 1956 | "requires": { 1957 | "abbrev": "1", 1958 | "osenv": "^0.1.4" 1959 | } 1960 | }, 1961 | "normalize-package-data": { 1962 | "version": "2.5.0", 1963 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 1964 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 1965 | "requires": { 1966 | "hosted-git-info": "^2.1.4", 1967 | "resolve": "^1.10.0", 1968 | "semver": "2 || 3 || 4 || 5", 1969 | "validate-npm-package-license": "^3.0.1" 1970 | } 1971 | }, 1972 | "npm-run-path": { 1973 | "version": "1.0.0", 1974 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", 1975 | "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", 1976 | "requires": { 1977 | "path-key": "^1.0.0" 1978 | }, 1979 | "dependencies": { 1980 | "path-key": { 1981 | "version": "1.0.0", 1982 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", 1983 | "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=" 1984 | } 1985 | } 1986 | }, 1987 | "nth-check": { 1988 | "version": "1.0.2", 1989 | "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz", 1990 | "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", 1991 | "requires": { 1992 | "boolbase": "~1.0.0" 1993 | } 1994 | }, 1995 | "nugget": { 1996 | "version": "2.0.1", 1997 | "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", 1998 | "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", 1999 | "requires": { 2000 | "debug": "^2.1.3", 2001 | "minimist": "^1.1.0", 2002 | "pretty-bytes": "^1.0.2", 2003 | "progress-stream": "^1.1.0", 2004 | "request": "^2.45.0", 2005 | "single-line-log": "^1.1.2", 2006 | "throttleit": "0.0.2" 2007 | }, 2008 | "dependencies": { 2009 | "debug": { 2010 | "version": "2.6.9", 2011 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 2012 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 2013 | "requires": { 2014 | "ms": "2.0.0" 2015 | } 2016 | }, 2017 | "isarray": { 2018 | "version": "0.0.1", 2019 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 2020 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 2021 | }, 2022 | "minimist": { 2023 | "version": "1.2.0", 2024 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2025 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 2026 | }, 2027 | "ms": { 2028 | "version": "2.0.0", 2029 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2030 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2031 | }, 2032 | "progress-stream": { 2033 | "version": "1.2.0", 2034 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", 2035 | "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", 2036 | "requires": { 2037 | "speedometer": "~0.1.2", 2038 | "through2": "~0.2.3" 2039 | } 2040 | }, 2041 | "readable-stream": { 2042 | "version": "1.1.14", 2043 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", 2044 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", 2045 | "requires": { 2046 | "core-util-is": "~1.0.0", 2047 | "inherits": "~2.0.1", 2048 | "isarray": "0.0.1", 2049 | "string_decoder": "~0.10.x" 2050 | } 2051 | }, 2052 | "speedometer": { 2053 | "version": "0.1.4", 2054 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", 2055 | "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=" 2056 | }, 2057 | "string_decoder": { 2058 | "version": "0.10.31", 2059 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 2060 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 2061 | }, 2062 | "throttleit": { 2063 | "version": "0.0.2", 2064 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", 2065 | "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=" 2066 | }, 2067 | "through2": { 2068 | "version": "0.2.3", 2069 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", 2070 | "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", 2071 | "requires": { 2072 | "readable-stream": "~1.1.9", 2073 | "xtend": "~2.1.1" 2074 | } 2075 | }, 2076 | "xtend": { 2077 | "version": "2.1.2", 2078 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 2079 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 2080 | "requires": { 2081 | "object-keys": "~0.4.0" 2082 | } 2083 | } 2084 | } 2085 | }, 2086 | "number-is-nan": { 2087 | "version": "1.0.1", 2088 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2089 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2090 | }, 2091 | "oauth-sign": { 2092 | "version": "0.9.0", 2093 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2094 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 2095 | }, 2096 | "object-assign": { 2097 | "version": "4.1.1", 2098 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2099 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2100 | }, 2101 | "object-keys": { 2102 | "version": "0.4.0", 2103 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 2104 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" 2105 | }, 2106 | "once": { 2107 | "version": "1.4.0", 2108 | "resolved": "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz", 2109 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2110 | "requires": { 2111 | "wrappy": "1" 2112 | } 2113 | }, 2114 | "onetime": { 2115 | "version": "2.0.1", 2116 | "resolved": "http://registry.npm.taobao.org/onetime/download/onetime-2.0.1.tgz", 2117 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 2118 | "dev": true, 2119 | "requires": { 2120 | "mimic-fn": "^1.0.0" 2121 | } 2122 | }, 2123 | "optionator": { 2124 | "version": "0.8.2", 2125 | "resolved": "http://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", 2126 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 2127 | "dev": true, 2128 | "requires": { 2129 | "deep-is": "~0.1.3", 2130 | "fast-levenshtein": "~2.0.4", 2131 | "levn": "~0.3.0", 2132 | "prelude-ls": "~1.1.2", 2133 | "type-check": "~0.3.2", 2134 | "wordwrap": "~1.0.0" 2135 | } 2136 | }, 2137 | "os-homedir": { 2138 | "version": "1.0.2", 2139 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 2140 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 2141 | }, 2142 | "os-locale": { 2143 | "version": "5.0.0", 2144 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz", 2145 | "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==", 2146 | "requires": { 2147 | "execa": "^4.0.0", 2148 | "lcid": "^3.0.0", 2149 | "mem": "^5.0.0" 2150 | }, 2151 | "dependencies": { 2152 | "cross-spawn": { 2153 | "version": "7.0.3", 2154 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 2155 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 2156 | "requires": { 2157 | "path-key": "^3.1.0", 2158 | "shebang-command": "^2.0.0", 2159 | "which": "^2.0.1" 2160 | } 2161 | }, 2162 | "execa": { 2163 | "version": "4.0.2", 2164 | "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", 2165 | "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", 2166 | "requires": { 2167 | "cross-spawn": "^7.0.0", 2168 | "get-stream": "^5.0.0", 2169 | "human-signals": "^1.1.1", 2170 | "is-stream": "^2.0.0", 2171 | "merge-stream": "^2.0.0", 2172 | "npm-run-path": "^4.0.0", 2173 | "onetime": "^5.1.0", 2174 | "signal-exit": "^3.0.2", 2175 | "strip-final-newline": "^2.0.0" 2176 | } 2177 | }, 2178 | "is-stream": { 2179 | "version": "2.0.0", 2180 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 2181 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 2182 | }, 2183 | "mimic-fn": { 2184 | "version": "2.1.0", 2185 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 2186 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 2187 | }, 2188 | "npm-run-path": { 2189 | "version": "4.0.1", 2190 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", 2191 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", 2192 | "requires": { 2193 | "path-key": "^3.0.0" 2194 | } 2195 | }, 2196 | "onetime": { 2197 | "version": "5.1.0", 2198 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 2199 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 2200 | "requires": { 2201 | "mimic-fn": "^2.1.0" 2202 | } 2203 | }, 2204 | "path-key": { 2205 | "version": "3.1.1", 2206 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2207 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 2208 | }, 2209 | "shebang-command": { 2210 | "version": "2.0.0", 2211 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2212 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2213 | "requires": { 2214 | "shebang-regex": "^3.0.0" 2215 | } 2216 | }, 2217 | "shebang-regex": { 2218 | "version": "3.0.0", 2219 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2220 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 2221 | }, 2222 | "which": { 2223 | "version": "2.0.2", 2224 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2225 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2226 | "requires": { 2227 | "isexe": "^2.0.0" 2228 | } 2229 | } 2230 | } 2231 | }, 2232 | "os-tmpdir": { 2233 | "version": "1.0.2", 2234 | "resolved": "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", 2235 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 2236 | }, 2237 | "osenv": { 2238 | "version": "0.1.5", 2239 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 2240 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 2241 | "requires": { 2242 | "os-homedir": "^1.0.0", 2243 | "os-tmpdir": "^1.0.0" 2244 | } 2245 | }, 2246 | "p-defer": { 2247 | "version": "1.0.0", 2248 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 2249 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" 2250 | }, 2251 | "p-is-promise": { 2252 | "version": "3.0.0", 2253 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", 2254 | "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", 2255 | "dev": true 2256 | }, 2257 | "p-limit": { 2258 | "version": "2.3.0", 2259 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 2260 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 2261 | "requires": { 2262 | "p-try": "^2.0.0" 2263 | } 2264 | }, 2265 | "p-locate": { 2266 | "version": "4.1.0", 2267 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 2268 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 2269 | "requires": { 2270 | "p-limit": "^2.2.0" 2271 | } 2272 | }, 2273 | "p-map": { 2274 | "version": "4.0.0", 2275 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", 2276 | "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", 2277 | "requires": { 2278 | "aggregate-error": "^3.0.0" 2279 | } 2280 | }, 2281 | "p-try": { 2282 | "version": "2.2.0", 2283 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 2284 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 2285 | }, 2286 | "parent-module": { 2287 | "version": "1.0.1", 2288 | "resolved": "https://registry.npm.taobao.org/parent-module/download/parent-module-1.0.1.tgz", 2289 | "integrity": "sha1-aR0nCeeMefrjoVZiJFLQB2LKqqI=", 2290 | "dev": true, 2291 | "requires": { 2292 | "callsites": "^3.0.0" 2293 | } 2294 | }, 2295 | "parse-json": { 2296 | "version": "5.0.0", 2297 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", 2298 | "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", 2299 | "requires": { 2300 | "@babel/code-frame": "^7.0.0", 2301 | "error-ex": "^1.3.1", 2302 | "json-parse-better-errors": "^1.0.1", 2303 | "lines-and-columns": "^1.1.6" 2304 | } 2305 | }, 2306 | "parse-ms": { 2307 | "version": "2.1.0", 2308 | "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", 2309 | "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==" 2310 | }, 2311 | "parse5": { 2312 | "version": "3.0.3", 2313 | "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-3.0.3.tgz", 2314 | "integrity": "sha1-BC95L/3TaFFVHPTp4Gazh0q0W1w=", 2315 | "requires": { 2316 | "@types/node": "*" 2317 | } 2318 | }, 2319 | "path-exists": { 2320 | "version": "4.0.0", 2321 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2322 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 2323 | }, 2324 | "path-is-absolute": { 2325 | "version": "1.0.1", 2326 | "resolved": "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", 2327 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2328 | }, 2329 | "path-is-inside": { 2330 | "version": "1.0.2", 2331 | "resolved": "http://registry.npm.taobao.org/path-is-inside/download/path-is-inside-1.0.2.tgz", 2332 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2333 | "dev": true 2334 | }, 2335 | "path-key": { 2336 | "version": "2.0.1", 2337 | "resolved": "http://registry.npm.taobao.org/path-key/download/path-key-2.0.1.tgz", 2338 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 2339 | "dev": true 2340 | }, 2341 | "path-parse": { 2342 | "version": "1.0.6", 2343 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2344 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 2345 | }, 2346 | "path-type": { 2347 | "version": "4.0.0", 2348 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", 2349 | "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", 2350 | "dev": true 2351 | }, 2352 | "performance-now": { 2353 | "version": "2.1.0", 2354 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2355 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2356 | }, 2357 | "pget": { 2358 | "version": "0.1.1", 2359 | "resolved": "https://registry.npmjs.org/pget/-/pget-0.1.1.tgz", 2360 | "integrity": "sha1-lFm1lLb3vS+N2n404Kt26BYbGmI=", 2361 | "requires": { 2362 | "es6-promise": "^3.0.2", 2363 | "nugget": "^2.0.0" 2364 | }, 2365 | "dependencies": { 2366 | "es6-promise": { 2367 | "version": "3.3.1", 2368 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", 2369 | "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" 2370 | } 2371 | } 2372 | }, 2373 | "picomatch": { 2374 | "version": "2.2.2", 2375 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 2376 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 2377 | "dev": true 2378 | }, 2379 | "pinkie": { 2380 | "version": "2.0.4", 2381 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2382 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 2383 | }, 2384 | "pinkie-promise": { 2385 | "version": "2.0.1", 2386 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2387 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2388 | "requires": { 2389 | "pinkie": "^2.0.0" 2390 | } 2391 | }, 2392 | "pkg": { 2393 | "version": "4.4.8", 2394 | "resolved": "https://registry.npmjs.org/pkg/-/pkg-4.4.8.tgz", 2395 | "integrity": "sha512-Fqqv0iaX48U3CFZxd6Dq6JKe7BrAWbgRAqMJkz/m8W3H5cqJ6suvsUWe5AJPRlN/AhbBYXBJ0XG9QlYPTXcVFA==", 2396 | "dev": true, 2397 | "requires": { 2398 | "@babel/parser": "^7.9.4", 2399 | "@babel/runtime": "^7.9.2", 2400 | "chalk": "^3.0.0", 2401 | "escodegen": "^1.14.1", 2402 | "fs-extra": "^8.1.0", 2403 | "globby": "^11.0.0", 2404 | "into-stream": "^5.1.1", 2405 | "minimist": "^1.2.5", 2406 | "multistream": "^2.1.1", 2407 | "pkg-fetch": "^2.6.7", 2408 | "progress": "^2.0.3", 2409 | "resolve": "^1.15.1", 2410 | "stream-meter": "^1.0.4" 2411 | }, 2412 | "dependencies": { 2413 | "ansi-styles": { 2414 | "version": "4.2.1", 2415 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 2416 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 2417 | "dev": true, 2418 | "requires": { 2419 | "@types/color-name": "^1.1.1", 2420 | "color-convert": "^2.0.1" 2421 | } 2422 | }, 2423 | "chalk": { 2424 | "version": "3.0.0", 2425 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 2426 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 2427 | "dev": true, 2428 | "requires": { 2429 | "ansi-styles": "^4.1.0", 2430 | "supports-color": "^7.1.0" 2431 | } 2432 | }, 2433 | "color-convert": { 2434 | "version": "2.0.1", 2435 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2436 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2437 | "dev": true, 2438 | "requires": { 2439 | "color-name": "~1.1.4" 2440 | } 2441 | }, 2442 | "color-name": { 2443 | "version": "1.1.4", 2444 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2445 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2446 | "dev": true 2447 | }, 2448 | "has-flag": { 2449 | "version": "4.0.0", 2450 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2451 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2452 | "dev": true 2453 | }, 2454 | "resolve": { 2455 | "version": "1.17.0", 2456 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 2457 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 2458 | "dev": true, 2459 | "requires": { 2460 | "path-parse": "^1.0.6" 2461 | } 2462 | }, 2463 | "supports-color": { 2464 | "version": "7.1.0", 2465 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 2466 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 2467 | "dev": true, 2468 | "requires": { 2469 | "has-flag": "^4.0.0" 2470 | } 2471 | } 2472 | } 2473 | }, 2474 | "pkg-fetch": { 2475 | "version": "2.6.8", 2476 | "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-2.6.8.tgz", 2477 | "integrity": "sha512-CFG7jOeVD38lltLGA7xCJxYsD//GKLjl1P9tc/n9By2a4WEHQjfkBMrYdMS8WOHVP+r9L20fsZNbaKcubDAiQg==", 2478 | "dev": true, 2479 | "requires": { 2480 | "@babel/runtime": "^7.9.2", 2481 | "byline": "^5.0.0", 2482 | "chalk": "^3.0.0", 2483 | "expand-template": "^2.0.3", 2484 | "fs-extra": "^8.1.0", 2485 | "minimist": "^1.2.5", 2486 | "progress": "^2.0.3", 2487 | "request": "^2.88.0", 2488 | "request-progress": "^3.0.0", 2489 | "semver": "^6.3.0", 2490 | "unique-temp-dir": "^1.0.0" 2491 | }, 2492 | "dependencies": { 2493 | "ansi-styles": { 2494 | "version": "4.2.1", 2495 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", 2496 | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", 2497 | "dev": true, 2498 | "requires": { 2499 | "@types/color-name": "^1.1.1", 2500 | "color-convert": "^2.0.1" 2501 | } 2502 | }, 2503 | "chalk": { 2504 | "version": "3.0.0", 2505 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", 2506 | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", 2507 | "dev": true, 2508 | "requires": { 2509 | "ansi-styles": "^4.1.0", 2510 | "supports-color": "^7.1.0" 2511 | } 2512 | }, 2513 | "color-convert": { 2514 | "version": "2.0.1", 2515 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2516 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2517 | "dev": true, 2518 | "requires": { 2519 | "color-name": "~1.1.4" 2520 | } 2521 | }, 2522 | "color-name": { 2523 | "version": "1.1.4", 2524 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2525 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2526 | "dev": true 2527 | }, 2528 | "has-flag": { 2529 | "version": "4.0.0", 2530 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2531 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2532 | "dev": true 2533 | }, 2534 | "semver": { 2535 | "version": "6.3.0", 2536 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2537 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 2538 | "dev": true 2539 | }, 2540 | "supports-color": { 2541 | "version": "7.1.0", 2542 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", 2543 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", 2544 | "dev": true, 2545 | "requires": { 2546 | "has-flag": "^4.0.0" 2547 | } 2548 | } 2549 | } 2550 | }, 2551 | "plist": { 2552 | "version": "2.1.0", 2553 | "resolved": "https://registry.npmjs.org/plist/-/plist-2.1.0.tgz", 2554 | "integrity": "sha1-V8zbeggh3yGDEhejytVOPhRqECU=", 2555 | "requires": { 2556 | "base64-js": "1.2.0", 2557 | "xmlbuilder": "8.2.2", 2558 | "xmldom": "0.1.x" 2559 | } 2560 | }, 2561 | "prelude-ls": { 2562 | "version": "1.1.2", 2563 | "resolved": "http://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", 2564 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2565 | "dev": true 2566 | }, 2567 | "pretty": { 2568 | "version": "2.0.0", 2569 | "resolved": "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz", 2570 | "integrity": "sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=", 2571 | "requires": { 2572 | "condense-newlines": "^0.2.1", 2573 | "extend-shallow": "^2.0.1", 2574 | "js-beautify": "^1.6.12" 2575 | } 2576 | }, 2577 | "pretty-bytes": { 2578 | "version": "1.0.4", 2579 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", 2580 | "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", 2581 | "requires": { 2582 | "get-stdin": "^4.0.1", 2583 | "meow": "^3.1.0" 2584 | }, 2585 | "dependencies": { 2586 | "camelcase": { 2587 | "version": "2.1.1", 2588 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 2589 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 2590 | }, 2591 | "camelcase-keys": { 2592 | "version": "2.1.0", 2593 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 2594 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 2595 | "requires": { 2596 | "camelcase": "^2.0.0", 2597 | "map-obj": "^1.0.0" 2598 | } 2599 | }, 2600 | "find-up": { 2601 | "version": "1.1.2", 2602 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 2603 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 2604 | "requires": { 2605 | "path-exists": "^2.0.0", 2606 | "pinkie-promise": "^2.0.0" 2607 | } 2608 | }, 2609 | "indent-string": { 2610 | "version": "2.1.0", 2611 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 2612 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 2613 | "requires": { 2614 | "repeating": "^2.0.0" 2615 | } 2616 | }, 2617 | "load-json-file": { 2618 | "version": "1.1.0", 2619 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 2620 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 2621 | "requires": { 2622 | "graceful-fs": "^4.1.2", 2623 | "parse-json": "^2.2.0", 2624 | "pify": "^2.0.0", 2625 | "pinkie-promise": "^2.0.0", 2626 | "strip-bom": "^2.0.0" 2627 | } 2628 | }, 2629 | "map-obj": { 2630 | "version": "1.0.1", 2631 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 2632 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 2633 | }, 2634 | "meow": { 2635 | "version": "3.7.0", 2636 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 2637 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 2638 | "requires": { 2639 | "camelcase-keys": "^2.0.0", 2640 | "decamelize": "^1.1.2", 2641 | "loud-rejection": "^1.0.0", 2642 | "map-obj": "^1.0.1", 2643 | "minimist": "^1.1.3", 2644 | "normalize-package-data": "^2.3.4", 2645 | "object-assign": "^4.0.1", 2646 | "read-pkg-up": "^1.0.1", 2647 | "redent": "^1.0.0", 2648 | "trim-newlines": "^1.0.0" 2649 | } 2650 | }, 2651 | "minimist": { 2652 | "version": "1.2.0", 2653 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2654 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 2655 | }, 2656 | "parse-json": { 2657 | "version": "2.2.0", 2658 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 2659 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 2660 | "requires": { 2661 | "error-ex": "^1.2.0" 2662 | } 2663 | }, 2664 | "path-exists": { 2665 | "version": "2.1.0", 2666 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 2667 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 2668 | "requires": { 2669 | "pinkie-promise": "^2.0.0" 2670 | } 2671 | }, 2672 | "path-type": { 2673 | "version": "1.1.0", 2674 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 2675 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 2676 | "requires": { 2677 | "graceful-fs": "^4.1.2", 2678 | "pify": "^2.0.0", 2679 | "pinkie-promise": "^2.0.0" 2680 | } 2681 | }, 2682 | "pify": { 2683 | "version": "2.3.0", 2684 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2685 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 2686 | }, 2687 | "read-pkg": { 2688 | "version": "1.1.0", 2689 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 2690 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 2691 | "requires": { 2692 | "load-json-file": "^1.0.0", 2693 | "normalize-package-data": "^2.3.2", 2694 | "path-type": "^1.0.0" 2695 | } 2696 | }, 2697 | "read-pkg-up": { 2698 | "version": "1.0.1", 2699 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 2700 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 2701 | "requires": { 2702 | "find-up": "^1.0.0", 2703 | "read-pkg": "^1.0.0" 2704 | } 2705 | }, 2706 | "redent": { 2707 | "version": "1.0.0", 2708 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 2709 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 2710 | "requires": { 2711 | "indent-string": "^2.1.0", 2712 | "strip-indent": "^1.0.1" 2713 | } 2714 | }, 2715 | "strip-bom": { 2716 | "version": "2.0.0", 2717 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2718 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2719 | "requires": { 2720 | "is-utf8": "^0.2.0" 2721 | } 2722 | }, 2723 | "strip-indent": { 2724 | "version": "1.0.1", 2725 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 2726 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 2727 | "requires": { 2728 | "get-stdin": "^4.0.1" 2729 | } 2730 | }, 2731 | "trim-newlines": { 2732 | "version": "1.0.0", 2733 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 2734 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" 2735 | } 2736 | } 2737 | }, 2738 | "pretty-ms": { 2739 | "version": "5.1.0", 2740 | "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-5.1.0.tgz", 2741 | "integrity": "sha512-4gaK1skD2gwscCfkswYQRmddUb2GJZtzDGRjHWadVHtK/DIKFufa12MvES6/xu1tVbUYeia5bmLcwJtZJQUqnw==", 2742 | "requires": { 2743 | "parse-ms": "^2.1.0" 2744 | } 2745 | }, 2746 | "process-nextick-args": { 2747 | "version": "2.0.1", 2748 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2749 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2750 | }, 2751 | "progress": { 2752 | "version": "2.0.3", 2753 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2754 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 2755 | }, 2756 | "progress-stream": { 2757 | "version": "2.0.0", 2758 | "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-2.0.0.tgz", 2759 | "integrity": "sha1-+sY6Cz0R3qy7CWmrzJOyFLzhntU=", 2760 | "requires": { 2761 | "speedometer": "~1.0.0", 2762 | "through2": "~2.0.3" 2763 | } 2764 | }, 2765 | "promise-inflight": { 2766 | "version": "1.0.1", 2767 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 2768 | "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" 2769 | }, 2770 | "promise-retry": { 2771 | "version": "1.1.1", 2772 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", 2773 | "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", 2774 | "requires": { 2775 | "err-code": "^1.0.0", 2776 | "retry": "^0.10.0" 2777 | } 2778 | }, 2779 | "proto-list": { 2780 | "version": "1.2.4", 2781 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 2782 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" 2783 | }, 2784 | "pseudomap": { 2785 | "version": "1.0.2", 2786 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 2787 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 2788 | }, 2789 | "psl": { 2790 | "version": "1.8.0", 2791 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 2792 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 2793 | }, 2794 | "pump": { 2795 | "version": "3.0.0", 2796 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 2797 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 2798 | "requires": { 2799 | "end-of-stream": "^1.1.0", 2800 | "once": "^1.3.1" 2801 | } 2802 | }, 2803 | "punycode": { 2804 | "version": "2.1.1", 2805 | "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz", 2806 | "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=" 2807 | }, 2808 | "qs": { 2809 | "version": "6.5.2", 2810 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2811 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2812 | }, 2813 | "quick-lru": { 2814 | "version": "4.0.1", 2815 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", 2816 | "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" 2817 | }, 2818 | "read-pkg": { 2819 | "version": "5.2.0", 2820 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", 2821 | "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", 2822 | "requires": { 2823 | "@types/normalize-package-data": "^2.4.0", 2824 | "normalize-package-data": "^2.5.0", 2825 | "parse-json": "^5.0.0", 2826 | "type-fest": "^0.6.0" 2827 | }, 2828 | "dependencies": { 2829 | "type-fest": { 2830 | "version": "0.6.0", 2831 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", 2832 | "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" 2833 | } 2834 | } 2835 | }, 2836 | "read-pkg-up": { 2837 | "version": "7.0.1", 2838 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", 2839 | "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", 2840 | "requires": { 2841 | "find-up": "^4.1.0", 2842 | "read-pkg": "^5.2.0", 2843 | "type-fest": "^0.8.1" 2844 | }, 2845 | "dependencies": { 2846 | "type-fest": { 2847 | "version": "0.8.1", 2848 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2849 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 2850 | } 2851 | } 2852 | }, 2853 | "readable-stream": { 2854 | "version": "3.4.0", 2855 | "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.4.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.4.0.tgz", 2856 | "integrity": "sha1-pRwmdUZY4KPCHb9ZFjvUW6b0R/w=", 2857 | "requires": { 2858 | "inherits": "^2.0.3", 2859 | "string_decoder": "^1.1.1", 2860 | "util-deprecate": "^1.0.1" 2861 | } 2862 | }, 2863 | "redent": { 2864 | "version": "3.0.0", 2865 | "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", 2866 | "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", 2867 | "requires": { 2868 | "indent-string": "^4.0.0", 2869 | "strip-indent": "^3.0.0" 2870 | } 2871 | }, 2872 | "regenerator-runtime": { 2873 | "version": "0.13.5", 2874 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", 2875 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==", 2876 | "dev": true 2877 | }, 2878 | "regexpp": { 2879 | "version": "2.0.1", 2880 | "resolved": "http://registry.npm.taobao.org/regexpp/download/regexpp-2.0.1.tgz", 2881 | "integrity": "sha1-jRnTHPYySCtYkEn4KB+T28uk0H8=", 2882 | "dev": true 2883 | }, 2884 | "repeating": { 2885 | "version": "2.0.1", 2886 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 2887 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 2888 | "requires": { 2889 | "is-finite": "^1.0.0" 2890 | } 2891 | }, 2892 | "request": { 2893 | "version": "2.88.2", 2894 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 2895 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 2896 | "requires": { 2897 | "aws-sign2": "~0.7.0", 2898 | "aws4": "^1.8.0", 2899 | "caseless": "~0.12.0", 2900 | "combined-stream": "~1.0.6", 2901 | "extend": "~3.0.2", 2902 | "forever-agent": "~0.6.1", 2903 | "form-data": "~2.3.2", 2904 | "har-validator": "~5.1.3", 2905 | "http-signature": "~1.2.0", 2906 | "is-typedarray": "~1.0.0", 2907 | "isstream": "~0.1.2", 2908 | "json-stringify-safe": "~5.0.1", 2909 | "mime-types": "~2.1.19", 2910 | "oauth-sign": "~0.9.0", 2911 | "performance-now": "^2.1.0", 2912 | "qs": "~6.5.2", 2913 | "safe-buffer": "^5.1.2", 2914 | "tough-cookie": "~2.5.0", 2915 | "tunnel-agent": "^0.6.0", 2916 | "uuid": "^3.3.2" 2917 | }, 2918 | "dependencies": { 2919 | "safe-buffer": { 2920 | "version": "5.2.1", 2921 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2922 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 2923 | } 2924 | } 2925 | }, 2926 | "request-progress": { 2927 | "version": "3.0.0", 2928 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", 2929 | "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", 2930 | "dev": true, 2931 | "requires": { 2932 | "throttleit": "^1.0.0" 2933 | } 2934 | }, 2935 | "resolve": { 2936 | "version": "1.12.0", 2937 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", 2938 | "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", 2939 | "requires": { 2940 | "path-parse": "^1.0.6" 2941 | } 2942 | }, 2943 | "resolve-from": { 2944 | "version": "4.0.0", 2945 | "resolved": "https://registry.npm.taobao.org/resolve-from/download/resolve-from-4.0.0.tgz", 2946 | "integrity": "sha1-SrzYUq0y3Xuqv+m0DgCjbbXzkuY=", 2947 | "dev": true 2948 | }, 2949 | "restore-cursor": { 2950 | "version": "2.0.0", 2951 | "resolved": "http://registry.npm.taobao.org/restore-cursor/download/restore-cursor-2.0.0.tgz", 2952 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 2953 | "dev": true, 2954 | "requires": { 2955 | "onetime": "^2.0.0", 2956 | "signal-exit": "^3.0.2" 2957 | } 2958 | }, 2959 | "retry": { 2960 | "version": "0.10.1", 2961 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", 2962 | "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" 2963 | }, 2964 | "reusify": { 2965 | "version": "1.0.4", 2966 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2967 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2968 | "dev": true 2969 | }, 2970 | "rimraf": { 2971 | "version": "2.6.3", 2972 | "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.6.3.tgz", 2973 | "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", 2974 | "dev": true, 2975 | "requires": { 2976 | "glob": "^7.1.3" 2977 | } 2978 | }, 2979 | "run-async": { 2980 | "version": "2.3.0", 2981 | "resolved": "http://registry.npm.taobao.org/run-async/download/run-async-2.3.0.tgz", 2982 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 2983 | "dev": true, 2984 | "requires": { 2985 | "is-promise": "^2.1.0" 2986 | } 2987 | }, 2988 | "run-parallel": { 2989 | "version": "1.1.9", 2990 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", 2991 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", 2992 | "dev": true 2993 | }, 2994 | "rxjs": { 2995 | "version": "6.5.3", 2996 | "resolved": "https://registry.npm.taobao.org/rxjs/download/rxjs-6.5.3.tgz", 2997 | "integrity": "sha1-UQ4mMX9NuRp+sd532d2boKSJmjo=", 2998 | "dev": true, 2999 | "requires": { 3000 | "tslib": "^1.9.0" 3001 | } 3002 | }, 3003 | "safe-buffer": { 3004 | "version": "5.1.1", 3005 | "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", 3006 | "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" 3007 | }, 3008 | "safer-buffer": { 3009 | "version": "2.1.2", 3010 | "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz", 3011 | "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" 3012 | }, 3013 | "semver": { 3014 | "version": "5.7.1", 3015 | "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1565627380363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", 3016 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=" 3017 | }, 3018 | "shebang-command": { 3019 | "version": "1.2.0", 3020 | "resolved": "http://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz", 3021 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 3022 | "dev": true, 3023 | "requires": { 3024 | "shebang-regex": "^1.0.0" 3025 | } 3026 | }, 3027 | "shebang-regex": { 3028 | "version": "1.0.0", 3029 | "resolved": "http://registry.npm.taobao.org/shebang-regex/download/shebang-regex-1.0.0.tgz", 3030 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 3031 | "dev": true 3032 | }, 3033 | "sigmund": { 3034 | "version": "1.0.1", 3035 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 3036 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" 3037 | }, 3038 | "signal-exit": { 3039 | "version": "3.0.2", 3040 | "resolved": "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz", 3041 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 3042 | }, 3043 | "single-line-log": { 3044 | "version": "1.1.2", 3045 | "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", 3046 | "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", 3047 | "requires": { 3048 | "string-width": "^1.0.1" 3049 | }, 3050 | "dependencies": { 3051 | "ansi-regex": { 3052 | "version": "2.1.1", 3053 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 3054 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 3055 | }, 3056 | "is-fullwidth-code-point": { 3057 | "version": "1.0.0", 3058 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 3059 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 3060 | "requires": { 3061 | "number-is-nan": "^1.0.0" 3062 | } 3063 | }, 3064 | "string-width": { 3065 | "version": "1.0.2", 3066 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3067 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3068 | "requires": { 3069 | "code-point-at": "^1.0.0", 3070 | "is-fullwidth-code-point": "^1.0.0", 3071 | "strip-ansi": "^3.0.0" 3072 | } 3073 | }, 3074 | "strip-ansi": { 3075 | "version": "3.0.1", 3076 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3077 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3078 | "requires": { 3079 | "ansi-regex": "^2.0.0" 3080 | } 3081 | } 3082 | } 3083 | }, 3084 | "slash": { 3085 | "version": "3.0.0", 3086 | "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", 3087 | "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", 3088 | "dev": true 3089 | }, 3090 | "slice-ansi": { 3091 | "version": "2.1.0", 3092 | "resolved": "https://registry.npm.taobao.org/slice-ansi/download/slice-ansi-2.1.0.tgz", 3093 | "integrity": "sha1-ys12k0YaY3pXiNkqfdT7oGjoFjY=", 3094 | "dev": true, 3095 | "requires": { 3096 | "ansi-styles": "^3.2.0", 3097 | "astral-regex": "^1.0.0", 3098 | "is-fullwidth-code-point": "^2.0.0" 3099 | } 3100 | }, 3101 | "smart-buffer": { 3102 | "version": "4.1.0", 3103 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", 3104 | "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" 3105 | }, 3106 | "socks": { 3107 | "version": "2.3.3", 3108 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", 3109 | "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", 3110 | "requires": { 3111 | "ip": "1.1.5", 3112 | "smart-buffer": "^4.1.0" 3113 | } 3114 | }, 3115 | "socks-proxy-agent": { 3116 | "version": "5.0.0", 3117 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", 3118 | "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", 3119 | "requires": { 3120 | "agent-base": "6", 3121 | "debug": "4", 3122 | "socks": "^2.3.3" 3123 | } 3124 | }, 3125 | "source-map": { 3126 | "version": "0.6.1", 3127 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 3128 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 3129 | "dev": true, 3130 | "optional": true 3131 | }, 3132 | "spdx-correct": { 3133 | "version": "3.1.0", 3134 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 3135 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 3136 | "requires": { 3137 | "spdx-expression-parse": "^3.0.0", 3138 | "spdx-license-ids": "^3.0.0" 3139 | } 3140 | }, 3141 | "spdx-exceptions": { 3142 | "version": "2.2.0", 3143 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 3144 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 3145 | }, 3146 | "spdx-expression-parse": { 3147 | "version": "3.0.0", 3148 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 3149 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 3150 | "requires": { 3151 | "spdx-exceptions": "^2.1.0", 3152 | "spdx-license-ids": "^3.0.0" 3153 | } 3154 | }, 3155 | "spdx-license-ids": { 3156 | "version": "3.0.5", 3157 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", 3158 | "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" 3159 | }, 3160 | "speedometer": { 3161 | "version": "1.0.0", 3162 | "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-1.0.0.tgz", 3163 | "integrity": "sha1-zWccsGdSwivKM3Di8zREC+T8YuI=" 3164 | }, 3165 | "sprintf-js": { 3166 | "version": "1.0.3", 3167 | "resolved": "http://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", 3168 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3169 | "dev": true 3170 | }, 3171 | "sshpk": { 3172 | "version": "1.16.1", 3173 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 3174 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 3175 | "requires": { 3176 | "asn1": "~0.2.3", 3177 | "assert-plus": "^1.0.0", 3178 | "bcrypt-pbkdf": "^1.0.0", 3179 | "dashdash": "^1.12.0", 3180 | "ecc-jsbn": "~0.1.1", 3181 | "getpass": "^0.1.1", 3182 | "jsbn": "~0.1.0", 3183 | "safer-buffer": "^2.0.2", 3184 | "tweetnacl": "~0.14.0" 3185 | } 3186 | }, 3187 | "ssri": { 3188 | "version": "8.0.0", 3189 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", 3190 | "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", 3191 | "requires": { 3192 | "minipass": "^3.1.1" 3193 | } 3194 | }, 3195 | "stream-meter": { 3196 | "version": "1.0.4", 3197 | "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", 3198 | "integrity": "sha1-Uq+Vql6nYKJJFxZwTb/5D3Ov3R0=", 3199 | "dev": true, 3200 | "requires": { 3201 | "readable-stream": "^2.1.4" 3202 | }, 3203 | "dependencies": { 3204 | "readable-stream": { 3205 | "version": "2.3.7", 3206 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 3207 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 3208 | "dev": true, 3209 | "requires": { 3210 | "core-util-is": "~1.0.0", 3211 | "inherits": "~2.0.3", 3212 | "isarray": "~1.0.0", 3213 | "process-nextick-args": "~2.0.0", 3214 | "safe-buffer": "~5.1.1", 3215 | "string_decoder": "~1.1.1", 3216 | "util-deprecate": "~1.0.1" 3217 | } 3218 | }, 3219 | "string_decoder": { 3220 | "version": "1.1.1", 3221 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3222 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3223 | "dev": true, 3224 | "requires": { 3225 | "safe-buffer": "~5.1.0" 3226 | } 3227 | } 3228 | } 3229 | }, 3230 | "stream-parser": { 3231 | "version": "0.3.1", 3232 | "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", 3233 | "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=", 3234 | "requires": { 3235 | "debug": "2" 3236 | }, 3237 | "dependencies": { 3238 | "debug": { 3239 | "version": "2.6.9", 3240 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 3241 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 3242 | "requires": { 3243 | "ms": "2.0.0" 3244 | } 3245 | }, 3246 | "ms": { 3247 | "version": "2.0.0", 3248 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 3249 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 3250 | } 3251 | } 3252 | }, 3253 | "string-width": { 3254 | "version": "2.1.1", 3255 | "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz", 3256 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 3257 | "dev": true, 3258 | "requires": { 3259 | "is-fullwidth-code-point": "^2.0.0", 3260 | "strip-ansi": "^4.0.0" 3261 | } 3262 | }, 3263 | "string_decoder": { 3264 | "version": "1.3.0", 3265 | "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.3.0.tgz", 3266 | "integrity": "sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=", 3267 | "requires": { 3268 | "safe-buffer": "~5.2.0" 3269 | }, 3270 | "dependencies": { 3271 | "safe-buffer": { 3272 | "version": "5.2.0", 3273 | "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.0.tgz", 3274 | "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk=" 3275 | } 3276 | } 3277 | }, 3278 | "strip-ansi": { 3279 | "version": "4.0.0", 3280 | "resolved": "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", 3281 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3282 | "dev": true, 3283 | "requires": { 3284 | "ansi-regex": "^3.0.0" 3285 | } 3286 | }, 3287 | "strip-eof": { 3288 | "version": "1.0.0", 3289 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 3290 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 3291 | }, 3292 | "strip-final-newline": { 3293 | "version": "2.0.0", 3294 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", 3295 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" 3296 | }, 3297 | "strip-indent": { 3298 | "version": "3.0.0", 3299 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", 3300 | "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", 3301 | "requires": { 3302 | "min-indent": "^1.0.0" 3303 | } 3304 | }, 3305 | "strip-json-comments": { 3306 | "version": "2.0.1", 3307 | "resolved": "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", 3308 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 3309 | "dev": true 3310 | }, 3311 | "supports-color": { 3312 | "version": "5.5.0", 3313 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3314 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3315 | "requires": { 3316 | "has-flag": "^3.0.0" 3317 | } 3318 | }, 3319 | "table": { 3320 | "version": "5.4.6", 3321 | "resolved": "https://registry.npm.taobao.org/table/download/table-5.4.6.tgz", 3322 | "integrity": "sha1-EpLRlQDOP4YFOwXw6Ofko7shB54=", 3323 | "dev": true, 3324 | "requires": { 3325 | "ajv": "^6.10.2", 3326 | "lodash": "^4.17.14", 3327 | "slice-ansi": "^2.1.0", 3328 | "string-width": "^3.0.0" 3329 | }, 3330 | "dependencies": { 3331 | "ansi-regex": { 3332 | "version": "4.1.0", 3333 | "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz", 3334 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 3335 | "dev": true 3336 | }, 3337 | "string-width": { 3338 | "version": "3.1.0", 3339 | "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz", 3340 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 3341 | "dev": true, 3342 | "requires": { 3343 | "emoji-regex": "^7.0.1", 3344 | "is-fullwidth-code-point": "^2.0.0", 3345 | "strip-ansi": "^5.1.0" 3346 | } 3347 | }, 3348 | "strip-ansi": { 3349 | "version": "5.2.0", 3350 | "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-5.2.0.tgz", 3351 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 3352 | "dev": true, 3353 | "requires": { 3354 | "ansi-regex": "^4.1.0" 3355 | } 3356 | } 3357 | } 3358 | }, 3359 | "tar": { 3360 | "version": "6.0.2", 3361 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", 3362 | "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", 3363 | "requires": { 3364 | "chownr": "^2.0.0", 3365 | "fs-minipass": "^2.0.0", 3366 | "minipass": "^3.0.0", 3367 | "minizlib": "^2.1.0", 3368 | "mkdirp": "^1.0.3", 3369 | "yallist": "^4.0.0" 3370 | }, 3371 | "dependencies": { 3372 | "mkdirp": { 3373 | "version": "1.0.4", 3374 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", 3375 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" 3376 | }, 3377 | "yallist": { 3378 | "version": "4.0.0", 3379 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 3380 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 3381 | } 3382 | } 3383 | }, 3384 | "tempfile": { 3385 | "version": "1.1.1", 3386 | "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", 3387 | "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", 3388 | "requires": { 3389 | "os-tmpdir": "^1.0.0", 3390 | "uuid": "^2.0.1" 3391 | }, 3392 | "dependencies": { 3393 | "uuid": { 3394 | "version": "2.0.3", 3395 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", 3396 | "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" 3397 | } 3398 | } 3399 | }, 3400 | "term-img2": { 3401 | "version": "2.0.1", 3402 | "resolved": "https://registry.npmjs.org/term-img2/-/term-img2-2.0.1.tgz", 3403 | "integrity": "sha1-k2lxAH4SRdZDWHHE6jV0cdYvYz0=", 3404 | "requires": { 3405 | "ansi-escapes": "^1.3.0", 3406 | "iterm2-version": "^2.1.0" 3407 | }, 3408 | "dependencies": { 3409 | "ansi-escapes": { 3410 | "version": "1.4.0", 3411 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 3412 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" 3413 | } 3414 | } 3415 | }, 3416 | "text-table": { 3417 | "version": "0.2.0", 3418 | "resolved": "http://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", 3419 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 3420 | "dev": true 3421 | }, 3422 | "throttle": { 3423 | "version": "1.0.3", 3424 | "resolved": "https://registry.npmjs.org/throttle/-/throttle-1.0.3.tgz", 3425 | "integrity": "sha1-ijLkoV8XY9mXlIMXxevjrYpB5Lc=", 3426 | "requires": { 3427 | "readable-stream": ">= 0.3.0", 3428 | "stream-parser": ">= 0.0.2" 3429 | } 3430 | }, 3431 | "throttleit": { 3432 | "version": "1.0.0", 3433 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 3434 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 3435 | "dev": true 3436 | }, 3437 | "through": { 3438 | "version": "2.3.8", 3439 | "resolved": "http://registry.npm.taobao.org/through/download/through-2.3.8.tgz", 3440 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3441 | "dev": true 3442 | }, 3443 | "through2": { 3444 | "version": "2.0.5", 3445 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 3446 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 3447 | "requires": { 3448 | "readable-stream": "~2.3.6", 3449 | "xtend": "~4.0.1" 3450 | }, 3451 | "dependencies": { 3452 | "readable-stream": { 3453 | "version": "2.3.6", 3454 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 3455 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 3456 | "requires": { 3457 | "core-util-is": "~1.0.0", 3458 | "inherits": "~2.0.3", 3459 | "isarray": "~1.0.0", 3460 | "process-nextick-args": "~2.0.0", 3461 | "safe-buffer": "~5.1.1", 3462 | "string_decoder": "~1.1.1", 3463 | "util-deprecate": "~1.0.1" 3464 | } 3465 | }, 3466 | "string_decoder": { 3467 | "version": "1.1.1", 3468 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3469 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3470 | "requires": { 3471 | "safe-buffer": "~5.1.0" 3472 | } 3473 | } 3474 | } 3475 | }, 3476 | "tmp": { 3477 | "version": "0.0.33", 3478 | "resolved": "http://registry.npm.taobao.org/tmp/download/tmp-0.0.33.tgz", 3479 | "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=", 3480 | "dev": true, 3481 | "requires": { 3482 | "os-tmpdir": "~1.0.2" 3483 | } 3484 | }, 3485 | "to-regex-range": { 3486 | "version": "5.0.1", 3487 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3488 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3489 | "dev": true, 3490 | "requires": { 3491 | "is-number": "^7.0.0" 3492 | } 3493 | }, 3494 | "tough-cookie": { 3495 | "version": "2.5.0", 3496 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 3497 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 3498 | "requires": { 3499 | "psl": "^1.1.28", 3500 | "punycode": "^2.1.1" 3501 | } 3502 | }, 3503 | "trim-newlines": { 3504 | "version": "3.0.0", 3505 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", 3506 | "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==" 3507 | }, 3508 | "tslib": { 3509 | "version": "1.10.0", 3510 | "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.10.0.tgz", 3511 | "integrity": "sha1-w8GflZc/sKYpc/sJ2Q2WHuQ+XIo=", 3512 | "dev": true 3513 | }, 3514 | "tunnel-agent": { 3515 | "version": "0.6.0", 3516 | "resolved": "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", 3517 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3518 | "requires": { 3519 | "safe-buffer": "^5.0.1" 3520 | } 3521 | }, 3522 | "tweetnacl": { 3523 | "version": "0.14.5", 3524 | "resolved": "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", 3525 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 3526 | }, 3527 | "type-check": { 3528 | "version": "0.3.2", 3529 | "resolved": "http://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", 3530 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3531 | "dev": true, 3532 | "requires": { 3533 | "prelude-ls": "~1.1.2" 3534 | } 3535 | }, 3536 | "type-fest": { 3537 | "version": "0.13.1", 3538 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", 3539 | "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" 3540 | }, 3541 | "uid2": { 3542 | "version": "0.0.3", 3543 | "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", 3544 | "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", 3545 | "dev": true 3546 | }, 3547 | "unique-filename": { 3548 | "version": "1.1.1", 3549 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", 3550 | "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", 3551 | "requires": { 3552 | "unique-slug": "^2.0.0" 3553 | } 3554 | }, 3555 | "unique-slug": { 3556 | "version": "2.0.2", 3557 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", 3558 | "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", 3559 | "requires": { 3560 | "imurmurhash": "^0.1.4" 3561 | } 3562 | }, 3563 | "unique-temp-dir": { 3564 | "version": "1.0.0", 3565 | "resolved": "https://registry.npmjs.org/unique-temp-dir/-/unique-temp-dir-1.0.0.tgz", 3566 | "integrity": "sha1-bc6VsmgcoAPuv7MEpBX5y6vMU4U=", 3567 | "dev": true, 3568 | "requires": { 3569 | "mkdirp": "^0.5.1", 3570 | "os-tmpdir": "^1.0.1", 3571 | "uid2": "0.0.3" 3572 | } 3573 | }, 3574 | "universalify": { 3575 | "version": "0.1.2", 3576 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 3577 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 3578 | "dev": true 3579 | }, 3580 | "uri-js": { 3581 | "version": "4.2.2", 3582 | "resolved": "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz", 3583 | "integrity": "sha1-lMVA4f93KVbiKZUHwBCupsiDjrA=", 3584 | "requires": { 3585 | "punycode": "^2.1.0" 3586 | } 3587 | }, 3588 | "util-deprecate": { 3589 | "version": "1.0.2", 3590 | "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", 3591 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3592 | }, 3593 | "uuid": { 3594 | "version": "3.4.0", 3595 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 3596 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 3597 | }, 3598 | "validate-npm-package-license": { 3599 | "version": "3.0.4", 3600 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 3601 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 3602 | "requires": { 3603 | "spdx-correct": "^3.0.0", 3604 | "spdx-expression-parse": "^3.0.0" 3605 | } 3606 | }, 3607 | "verror": { 3608 | "version": "1.10.0", 3609 | "resolved": "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", 3610 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3611 | "requires": { 3612 | "assert-plus": "^1.0.0", 3613 | "core-util-is": "1.0.2", 3614 | "extsprintf": "^1.2.0" 3615 | } 3616 | }, 3617 | "which": { 3618 | "version": "1.3.1", 3619 | "resolved": "http://registry.npm.taobao.org/which/download/which-1.3.1.tgz", 3620 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 3621 | "requires": { 3622 | "isexe": "^2.0.0" 3623 | } 3624 | }, 3625 | "wordwrap": { 3626 | "version": "1.0.0", 3627 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", 3628 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 3629 | "dev": true 3630 | }, 3631 | "wrappy": { 3632 | "version": "1.0.2", 3633 | "resolved": "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", 3634 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3635 | }, 3636 | "write": { 3637 | "version": "1.0.3", 3638 | "resolved": "https://registry.npm.taobao.org/write/download/write-1.0.3.tgz", 3639 | "integrity": "sha1-CADhRSO5I6OH5BUSPIZWFqrg9cM=", 3640 | "dev": true, 3641 | "requires": { 3642 | "mkdirp": "^0.5.1" 3643 | } 3644 | }, 3645 | "xmlbuilder": { 3646 | "version": "8.2.2", 3647 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", 3648 | "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=" 3649 | }, 3650 | "xmldom": { 3651 | "version": "0.1.31", 3652 | "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", 3653 | "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" 3654 | }, 3655 | "xtend": { 3656 | "version": "4.0.2", 3657 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3658 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 3659 | }, 3660 | "yallist": { 3661 | "version": "2.1.2", 3662 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 3663 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 3664 | }, 3665 | "yargs-parser": { 3666 | "version": "18.1.3", 3667 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", 3668 | "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", 3669 | "requires": { 3670 | "camelcase": "^5.0.0", 3671 | "decamelize": "^1.2.0" 3672 | }, 3673 | "dependencies": { 3674 | "camelcase": { 3675 | "version": "5.3.1", 3676 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 3677 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 3678 | } 3679 | } 3680 | } 3681 | } 3682 | } 3683 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pornhub-downloader", 3 | "version": "1.1.1", 4 | "description": "video downloader for pornhub", 5 | "main": "src/index.js", 6 | "bin": "src/index.js", 7 | "files": [ 8 | "src", 9 | ".eslintrc", 10 | "LICENSE", 11 | "package-lock.json", 12 | "package.json", 13 | "README.md" 14 | ], 15 | "scripts": { 16 | "start": "node src", 17 | "pkg": "pkg . -t macos-x64 --out-path=dist-mac/ && cp node_modules/**/*.node dist-mac/ && pkg . -t win-x64 --out-path=dist-win/" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "git+https://github.com/RoyShen12/pornhub-downloader" 22 | }, 23 | "keywords": [ 24 | "crawler", 25 | "node.js", 26 | "pornhub" 27 | ], 28 | "author": "Roy Shen", 29 | "bugs": { 30 | "url": "https://github.com/RoyShen12/pornhub-downloader/issues" 31 | }, 32 | "homepage": "https://github.com/RoyShen12/pornhub-downloader#readme", 33 | "license": "MIT", 34 | "dependencies": { 35 | "chalk": "^2.4.2", 36 | "cheerio": "^1.0.0-rc.3", 37 | "diskusage": "^1.1.3", 38 | "human-size": "^1.1.0", 39 | "imgcat": "^2.3.0", 40 | "lodash": "^4.17.19", 41 | "make-fetch-happen": "^8.0.7", 42 | "meow": "^7.0.1", 43 | "os-locale": "^5.0.0", 44 | "pretty": "^2.0.0", 45 | "pretty-ms": "^5.1.0", 46 | "progress": "^2.0.3", 47 | "progress-stream": "^2.0.0", 48 | "throttle": "^1.0.3" 49 | }, 50 | "devDependencies": { 51 | "eslint": "^5.16.0", 52 | "pkg": "^4.4.8" 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | process.env.TZ = 'Asia/Shanghai' 2 | // process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' 3 | 4 | const fs = require('fs') 5 | const path = require('path') 6 | 7 | fs.existsSync('./config.json') || fs.writeFileSync('./config.json', JSON.stringify({ 8 | proxyUrl: '', 9 | timeout: 0, 10 | downloadDir: './downloads/', 11 | cacheDir: './cache/', 12 | httpChunkSizeKB: 5120 13 | }, null, 2)) 14 | 15 | /** 16 | * @type {{ proxyUrl: string, timeout: number, downloadDir: string, httpChunkSizeKB: number, aria2: any }} 17 | */ 18 | const config = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'config.json')).toString()) 19 | 20 | // const util = require('util') 21 | const { performance } = require('perf_hooks') 22 | const fetch = require('make-fetch-happen').defaults() 23 | const hs = require('human-size') 24 | const prettyMilliseconds = require('pretty-ms') 25 | const meow = require('meow') 26 | const chalk = require('chalk').default 27 | 28 | const logger = require('./lib/logger') 29 | const vblog = require('./lib/verbose') 30 | const strTools = require('./lib/str') 31 | const LANGS = require('./lib/LANG') 32 | 33 | const cli = meow(` 34 | Usage 35 | $ node src -s <> [options] 36 | $ node src -k <> [options] 37 | 38 | Options 39 | -s, --search Searching key word 40 | 搜索关键词下载 41 | 42 | -k, --key Sprightly download target video from given key (or muitl keys sepreted by commas) 43 | 直接下载ph号 44 | 45 | -p, --parallel (ex)Enable parallel downloading to accelerate download speed 46 | 多线程下载(实验性功能) 47 | 48 | -e, --exclude Excluding key word (or muitl words sepreted by commas) using for title filter 49 | 关键词过滤,对视频的标题进行过滤,多个关键词请用英文逗号连接 50 | 51 | -a, --amount Only download specified amount of files, default is Infinity 52 | 仅下载指定数量的视频后结束任务 53 | 54 | --limit-speed Limit download speed to specified rate (KB) 55 | 限制下载速度为指定值,单位是 KB 56 | 57 | -l, --limit Limitation of the downloading content (MB), default is Infinity 58 | 指定下载的总大小,到达指定大小后结束任务,单位是 MB 59 | 60 | -f, --fakerun Fake running (Dry run), won't actually download anything 61 | 干运行,不会实际下载视频、写入dlist 62 | 63 | --force Force downloading, even the file is already downloaded or exists 64 | 强制下载,无视 dlist 记录和本地已存在文件 65 | 66 | --skip Skip the first few videos 67 | 跳过前 N 个视频 68 | 69 | --skipless Skipping file smaller than the given size (MB) 70 | 跳过小于指定大小的视频,单位是 MB 71 | 72 | --skipmore Skipping file larger than the given size (MB) 73 | 跳过大于指定大小的视频,单位是 MB 74 | 75 | --rebuild-dlist Rebuild the dlist.txt by searching the download path 76 | 77 | --list-only Only list keys from searching key word 78 | 仅列出搜索结果的ph号,并不会实际下载 79 | 80 | -d, --dir Specify storage directory to cover the config file option 81 | 指定存储目录,覆盖配置文件的项 82 | 83 | --preview Show preview image of each video before downloading 84 | 显示缩略图预览(需要Mac与iTerm版本>2.9) 85 | 86 | --preview-size Preview image height for iTerm2 only (show while --list-only or --verbose flag is on), default is 40px 87 | 缩略图显示尺寸,默认是40px 88 | 89 | --verbose Make the process more talkative 90 | `, { 91 | flags: { 92 | search: { 93 | alias: 's' 94 | }, 95 | key: { 96 | alias: 'k' 97 | }, 98 | parallel: { 99 | alias: 'p' 100 | }, 101 | exclude: { 102 | alias: 'e' 103 | }, 104 | limitSpeed: {}, 105 | limit: { 106 | alias: 'l', 107 | default: 'Infinity' 108 | }, 109 | amount: { 110 | alias: 'a', 111 | default: 'Infinity' 112 | }, 113 | fakerun: { 114 | type: 'boolean', 115 | alias: 'f' 116 | }, 117 | force: { 118 | type: 'boolean' 119 | }, 120 | dir: { 121 | alias: 'd' 122 | }, 123 | skip: { 124 | default: '0' 125 | }, 126 | skipless: { 127 | }, 128 | skipmore: { 129 | }, 130 | rebuildDlist: { 131 | type: 'boolean' 132 | }, 133 | verbose: { 134 | type: 'boolean' 135 | }, 136 | listOnly: { 137 | type: 'boolean' 138 | }, 139 | preview: { 140 | type: 'boolean' 141 | }, 142 | previewSize: { 143 | default: '40px' 144 | } 145 | } 146 | }) 147 | 148 | logger.initNewLogger('main', (t, m) => console.log(logger.logLevelToColor(t)(m))) 149 | const log = logger.getLogger('main') 150 | 151 | if (cli.flags.skipless && isNaN(+cli.flags.skipless)) { 152 | console.log(`--skipless: ${LANGS['Invalid number value']} '${cli.flags.skipless}'`) 153 | process.exit(0) 154 | } 155 | 156 | if (cli.flags.skipmore && isNaN(+cli.flags.skipmore)) { 157 | console.log(`--skipless: : ${LANGS['Invalid number value']} '${cli.flags.skipmore}'`) 158 | process.exit(0) 159 | } 160 | 161 | if (cli.flags.parallel && isNaN(+cli.flags.parallel)) { 162 | console.log(`--parallel (-p): ${LANGS['Invalid number value']} '${cli.flags.parallel}'`) 163 | process.exit(0) 164 | } 165 | 166 | if (cli.flags.limitSpeed) { 167 | if (isNaN(+cli.flags.limitSpeed)) { 168 | console.log(`--limitSpeed: ${LANGS['Invalid number value']} '${cli.flags.limitSpeed}'`) 169 | process.exit(0) 170 | } 171 | log('info', `${LANGS['netword limitation']}: ${hs(cli.flags.limitSpeed * 1024)}/s`) 172 | } 173 | 174 | global.cli = cli 175 | 176 | fs.existsSync('./dlist.txt') || fs.writeFileSync('./dlist.txt', '') 177 | 178 | const scrapy = require('./lib/scrapy') 179 | 180 | let processShutdownToken = false 181 | 182 | const stdin = process.stdin 183 | 184 | stdin.setEncoding('utf8') 185 | stdin.on('readable', function() { 186 | const chunk = process.stdin.read() 187 | // 188 | // Restart process when user inputs stop 189 | // 190 | if (chunk !== null) { 191 | if (chunk === 'stop\n' || chunk === 'stop\r\n') { 192 | log('alert', LANGS['process will shutdown after current download finish.']) 193 | processShutdownToken = true 194 | } 195 | else if (chunk === 'skip\n' || chunk === 'skip\r\n') { 196 | log('alert', 'skip this task !') 197 | } 198 | } 199 | }) 200 | 201 | if (cli.flags.verbose) { 202 | fs.existsSync('./debug') || fs.mkdirSync('./debug') 203 | } 204 | 205 | const run = async () => { 206 | vblog('[main run] entered') 207 | 208 | fs.existsSync(config.downloadDir) || fs.mkdirSync(config.downloadDir) 209 | fs.existsSync('./dlist.txt') || fs.writeFileSync('./dlist.txt', '') 210 | 211 | /** 212 | * start from 1 213 | */ 214 | let page = 1 215 | 216 | /** 217 | * @type {{ search: string, key: string }} 218 | */ 219 | const { search, key } = cli.flags 220 | 221 | 222 | if (!search && !key) { 223 | console.log(LANGS['The program cannot run if neither --search nor --key is provided!']) 224 | process.exit(0) 225 | } 226 | 227 | // Key Mode 228 | if (key) { 229 | const keyList = key.split(',') 230 | for (const k of keyList) { 231 | try { 232 | let info = null 233 | 234 | while (!info) { 235 | 236 | try { 237 | info = await scrapy.findDownloadInfo(k) 238 | } catch (error) { 239 | log('error', 'error occured while getting download info, waiting for retry') 240 | info = null 241 | log('error', error, true) 242 | } 243 | } 244 | 245 | if (!info.title || info.title.trim().length === 0) { 246 | log('warn', `cannot find the video title, skipping ${k}.`) 247 | continue 248 | } 249 | 250 | const result = await scrapy.downloadVideo(info, '', undefined, cli.flags.parallel) 251 | log('suc', result[0]) 252 | } catch (error) { 253 | console.error(error) 254 | } 255 | } 256 | 257 | log('suc', LANGS['task finished.']) 258 | process.exit(0) 259 | } 260 | // Search Mode 261 | else { 262 | const limit = +cli.flags.limit 263 | const amountLimit = +cli.flags.amount 264 | 265 | let skip = +cli.flags.skip 266 | 267 | log('notice', `skipping first ${skip} results`) 268 | 269 | if (isNaN(limit)) { 270 | console.log(`--limit (-l): ${LANGS['Invalid number value']} '${cli.flags.limit}'`) 271 | process.exit(0) 272 | } 273 | 274 | if (isNaN(amountLimit)) { 275 | console.log(`--amount (-a): ${LANGS['Invalid number value']} '${cli.flags.amount}'`) 276 | process.exit(0) 277 | } 278 | 279 | if (isNaN(skip)) { 280 | console.log(`--skip: ${LANGS['Invalid number value']} '${cli.flags.skip}'`) 281 | process.exit(0) 282 | } 283 | 284 | const limitBytes = limit * 1024 ** 2 285 | 286 | let downloadedSize = 0 287 | 288 | log('info', `set Maximum download size: ${chalk.blueBright(limit + '')} MB, Maximum download amount: ${chalk.blueBright(amountLimit + '')}`) 289 | log('info', `set search keyword: ${chalk.blueBright(search)}`) 290 | log('notice', LANGS['type "stop" and enter, and this program will be terminated after the current download task finished.']) 291 | 292 | fs.writeFileSync('./search.log', (new Date().toLocaleString() + ' ') + search + '\n', { 293 | flag: 'a+', encoding: 'utf-8' 294 | }) 295 | 296 | let downloadCount = 0 297 | 298 | // --- download loop --- 299 | while (downloadedSize <= limitBytes && downloadCount < amountLimit && !processShutdownToken) { 300 | 301 | const opts = { 302 | page, 303 | search 304 | } 305 | 306 | vblog('[main download] while loop entered') 307 | 308 | const keys = await scrapy.findKeys(opts) 309 | 310 | if (!Array.isArray(keys) || keys.length === 0) { 311 | throw new Error('scrapy.findKeys: find nothing!') 312 | } 313 | 314 | if (cli.flags.listOnly) { 315 | vblog('[main download] skip key loop (listOnly)') 316 | page += 1 317 | continue 318 | } 319 | 320 | if (skip > 0) { 321 | const remainSkip = skip > keys.length ? skip - keys.length : 0 322 | // console.log(keys) 323 | new Array(Math.min(keys.length, skip)).fill(1).forEach(() => keys.shift()) 324 | // console.log(keys) 325 | skip = remainSkip 326 | } 327 | 328 | // --- one page loop --- 329 | for (const key of keys) { 330 | vblog(`[main download] for...of loop entered, key=${key}`) 331 | 332 | if (downloadedSize > limitBytes || downloadCount >= amountLimit || processShutdownToken) { 333 | break 334 | } 335 | 336 | let info = null 337 | let result = null 338 | 339 | while (!info) { 340 | 341 | try { 342 | info = await scrapy.findDownloadInfo(key) 343 | } catch (error) { 344 | log('error', 'error occured while getting download info, waiting for retry') 345 | info = null 346 | log('error', error, true) 347 | } 348 | } 349 | 350 | if (!info.title || info.title.trim().length === 0) { 351 | log('warn', `cannot find the video title, skipping ${key}.`) 352 | continue 353 | } 354 | 355 | downloadCount++ 356 | 357 | let sizeOfDl = -1 358 | let fileStoreName = '' 359 | 360 | try { 361 | result = await scrapy.downloadVideo(info, search, downloadCount, cli.flags.parallel) 362 | sizeOfDl = +result[1] 363 | fileStoreName = result[2] 364 | } catch (error) { 365 | log('error', 'error occured while downloading the video') 366 | log('error', error, true) 367 | if (error.toString().includes('disk')) { 368 | process.exit(22) 369 | } else { 370 | continue 371 | } 372 | } 373 | 374 | if (sizeOfDl > 0) { 375 | downloadedSize += sizeOfDl 376 | } 377 | 378 | log('suc', result[0]) 379 | log('verbose', `downloading size statistic (this/total/limitation): ${hs(sizeOfDl, 2)} / ${hs(downloadedSize, 2)} / ${limit} MB`) 380 | 381 | if (config.aria2 && config.aria2.address && fileStoreName) { 382 | fetch(config.aria2.address, { 383 | method: 'POST', 384 | headers: { 385 | 'Content-Type': 'application/json' 386 | }, 387 | body: JSON.stringify({ 388 | jsonrpc: '2.0', 389 | method: 'aria2.addUri', 390 | id: strTools.randomStr(48), 391 | params: [ 392 | 'token:', 393 | [`${config.aria2.localPrefix}/${strTools.transferBadSymbolOnFileName(search)}/${fileStoreName}`], 394 | {} 395 | ] 396 | }) 397 | }).then(res => { 398 | return res.json() 399 | }).then(data => { 400 | log('suc', `remote aria2 server: ${data.id}-${data.jsonrpc}-${data.result}`) 401 | }).catch(err => { 402 | log('err', 'send command to remote aria2 server failed: ' + err.toString(), true) 403 | }) 404 | } 405 | } 406 | // --- endof one page loop --- 407 | 408 | page += 1 409 | } 410 | // --- endof download loop --- 411 | 412 | log('suc', `One situation has been satisfied, process will auto quit. 413 | total time cost: ${prettyMilliseconds(performance.now(), { verbose: true })} 414 | total download size: ${hs(downloadedSize, 1)}`) 415 | 416 | setTimeout(process.exit, 200, 0) 417 | } 418 | 419 | } 420 | 421 | if (cli.flags.rebuildDlist) { 422 | const older = new Set(fs.readFileSync(path.join(process.cwd(), './dlist.txt')).toString().split('\n')) 423 | fs.readdirSync(config.downloadDir).forEach(dp => { 424 | const dpath = path.resolve(config.downloadDir, dp) 425 | const dstat = fs.statSync(dpath) 426 | if (dstat.isDirectory()) { 427 | fs.readdirSync(dpath).forEach(fp => { 428 | const fpath = path.resolve(dpath, fp) 429 | const fstat = fs.statSync(fpath) 430 | if (fp.includes('.mp4') && fstat.isFile()) { 431 | const title = strTools.fileNameToTitle(fp) 432 | older.add(title) 433 | } 434 | }) 435 | } 436 | }) 437 | fs.writeFileSync('./dlist.txt', Array.from(older).join('\n') + '\n') 438 | process.exit(0) 439 | } 440 | else { 441 | run() 442 | } 443 | 444 | process.on('unhandledRejection', (reason, p) => { 445 | console.log('unhandled promise rejection:', reason, p) 446 | }) 447 | -------------------------------------------------------------------------------- /src/lib/LANG.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | const osLocale = require('os-locale') 3 | 4 | const Locale = osLocale.sync().toLowerCase() 5 | 6 | let lang = 'en' 7 | 8 | if (Locale.includes('cn') && Locale.includes('zh')) lang = 'sc' 9 | 10 | if ((Locale.includes('tw') || Locale.includes('hk')) && Locale.includes('zh')) lang = 'tc' 11 | 12 | const STRINGS = { 13 | downloading: { 14 | sc: '下载', 15 | tc: '下載' 16 | }, 17 | EAT: { 18 | sc: '剩余', 19 | tc: '剩余' 20 | }, 21 | Piece: { 22 | sc: '块', 23 | tc: '塊' 24 | }, 25 | retrying: { 26 | sc: '重试', 27 | tc: '重試' 28 | }, 29 | 'Using Proxy': { 30 | sc: '使用代理', 31 | tc: '使用代理' 32 | }, 33 | 'process will shutdown after current download finish.': { 34 | sc: '当前下载完成后,进程将关闭。', 35 | tc: '當前下載完成後,該進程將關閉。' 36 | }, 37 | 'netword limitation': { 38 | sc: '网速限制', 39 | tc: '網絡速度限制' 40 | }, 41 | 'The program cannot run if neither --search nor --key is provided!': { 42 | sc: '--search 或 --key 参数均未提供,程序无法运行', 43 | tc: '未提供--search或--key,程序無法運行' 44 | }, 45 | 'task finished.': { 46 | sc: '任务完成', 47 | tc: '任務完成' 48 | }, 49 | 'Invalid number value': { 50 | sc: '不是有效的数字', 51 | tc: '無效的數值类型' 52 | }, 53 | 'type "stop" and enter, and this program will be terminated after the current download task finished.': { 54 | sc: '输入"stop"并回车,程序将在当前下载任务结束后自动退出', 55 | tc: '鍵入“停止”並輸入,當前下載任務完成後,該程式將自動終止。' 56 | } 57 | } 58 | 59 | _.forOwn(STRINGS, (v, k, o) => { 60 | o[k] = new Proxy(v, { 61 | get(t, p, r) { 62 | if (p === 'en') return k 63 | else return Reflect.get(t, p, r) 64 | } 65 | }) 66 | }) 67 | 68 | module.exports = { 69 | downloading: STRINGS.downloading[lang], 70 | EAT: STRINGS.EAT[lang], 71 | Piece: STRINGS.Piece[lang], 72 | retrying: STRINGS.retrying[lang], 73 | 'Using Proxy': STRINGS['Using Proxy'][lang], 74 | 'process will shutdown after current download finish.': STRINGS['process will shutdown after current download finish.'][lang], 75 | 'netword limitation': STRINGS['netword limitation'][lang], 76 | 'The program cannot run if neither --search nor --key is provided!': STRINGS['The program cannot run if neither --search nor --key is provided!'][lang], 77 | 'task finished.': STRINGS['task finished.'][lang], 78 | 'Invalid number value': STRINGS['Invalid number value'][lang], 79 | 'type "stop" and enter, and this program will be terminated after the current download task finished.': STRINGS['type "stop" and enter, and this program will be terminated after the current download task finished.'][lang] 80 | } 81 | -------------------------------------------------------------------------------- /src/lib/limited-queue.js: -------------------------------------------------------------------------------- 1 | module.exports = class LimitedInQueue { 2 | constructor(capacity) { 3 | this.capacity = capacity 4 | this._data = [] 5 | } 6 | 7 | get size() { 8 | return this._data.length 9 | } 10 | 11 | get first() { 12 | return this._data[0] 13 | } 14 | 15 | get last() { 16 | return this._data[this.size - 1] 17 | } 18 | 19 | push(v) { 20 | if (this.size < this.capacity) { 21 | this._data.push(v) 22 | } 23 | else { 24 | this._data.forEach((_v, i, d) => d[i] = d[i + 1]) 25 | this._data[this.capacity - 1] = v 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/lib/logger.js: -------------------------------------------------------------------------------- 1 | try { 2 | Error.stackTraceLimit = 20 3 | } catch (e) {} 4 | 5 | const chalk = require('chalk').default 6 | 7 | const getTraceInfo = (fx) => { 8 | const obj = {} 9 | Error.captureStackTrace(obj, fx || getTraceInfo) 10 | return obj.stack 11 | } 12 | 13 | /** 14 | * @typedef {keyof logLevel} LogType 15 | */ 16 | 17 | /** 18 | * @type {Map void>} 19 | */ 20 | const loggersCached = new Map() 21 | 22 | /** 23 | * @type {Map} 24 | */ 25 | const filesOfLogger = new Map() // only store unziped files 26 | 27 | const logLevel = new Proxy({ 28 | verbose: 'VERBOSE ', // -1 各种冗长而不重要的输出 29 | debug: 'DEBUG ', // 0 调试信息的日志,日志信息最多 30 | suc: 'SUCCESS ', // 1 重要的运行时成功信息 31 | info: 'INFO ', // 2 一般信息的日志,最常用 32 | notice: 'NOTICE ', // 3 最具有重要性的普通条件的信息 33 | warn: 'WARNING ', // 4 警告级别 34 | err: 'ERROR ', // 5 错误级别,阻止某个功能或者模块不能正常工作的信息 35 | crit: 'CRIT ', // 6 严重级别,阻止整个系统或者整个软件不能正常工作的信息 36 | alert: 'ALERT ', // 7 需要立刻修改的信息 37 | fatal: 'FATAL ', // 8 崩溃等严重信息 38 | get error() { return this.err }, 39 | get success() { return this.suc }, 40 | get warning() { return this.warn }, 41 | get inf() { return this.info }, 42 | get information() { return this.info }, 43 | get dbg() { return this.debug } 44 | }, { 45 | get: function (target, property, receiver) { 46 | return Reflect.get(target, property, receiver) || target.info 47 | } 48 | }) 49 | 50 | const levelNumberMap = new Map([ 51 | ['VERBOSE ', -1], 52 | ['DEBUG ', 0], 53 | ['SUCCESS ', 1], 54 | ['INFO ', 2], 55 | ['NOTICE ', 3], 56 | ['WARNING ', 4], 57 | ['ERROR ', 5], 58 | ['CRIT ', 6], 59 | ['ALERT ', 7], 60 | ['FATAL ', 8] 61 | ]) 62 | 63 | const levelColorMap = new Map([ 64 | [-1, chalk.gray], 65 | [0, chalk.white], 66 | [1, chalk.greenBright], 67 | [2, chalk.whiteBright], 68 | [3, chalk.blueBright], 69 | [4, chalk.yellowBright], 70 | [5, chalk.redBright], 71 | [6, chalk.bgYellowBright], 72 | [7, chalk.bgMagentaBright], 73 | [8, chalk.bgRedBright] 74 | ]) 75 | 76 | /** 77 | * @param {string} level 78 | */ 79 | const logLevelToColor = level => levelColorMap.get(levelNumberMap.get(logLevel[level])) 80 | 81 | function timeBasedLogHead(bc) { 82 | const DateObj = new Date() 83 | const year = DateObj.getFullYear() 84 | const month = ((DateObj.getMonth() + 1) + '').padStart(2, '0') 85 | const day = (DateObj.getDate() + '').padStart(2, '0') 86 | const hour = (DateObj.getHours() + '').padStart(2, '0') 87 | const minute = (DateObj.getMinutes() + '').padStart(2, '0') 88 | const second = (DateObj.getSeconds() + '').padStart(2, '0') 89 | const msecond = (DateObj.getMilliseconds() + '').padStart(3, '0') 90 | let blank = ''.padEnd(bc) 91 | return `${blank}${year}-${month}-${day} ${hour}:${minute}:${second}.${msecond}` 92 | } 93 | 94 | /** 95 | * @param {string} loggerName 96 | * @param {string} logfilePath 97 | * @param {string} logFileNameHead 98 | * @param {string} logFileNameTail 99 | * @param {boolean} zipOldFiles 100 | * @param {(type: LogType, logLine: string) => void | () => void} onLoggingHook 101 | * @returns {void} 102 | */ 103 | function initNewLogger(loggerName, onLoggingHook = () => {}) { 104 | 105 | if (loggerName === 'debug') return null 106 | 107 | if (loggersCached.has(loggerName)) return null 108 | 109 | filesOfLogger.set(loggerName, []) // init file record map 110 | 111 | function _inner_logger_(type, message, trace = false) { 112 | 113 | const timeH = timeBasedLogHead() 114 | 115 | const logLine = trace ? 116 | (timeH + ' ' + logLevel[type] + ' ' + message.toString() + '\n' + getTraceInfo(_inner_logger_)) : 117 | (timeH + ' ' + logLevel[type] + ' ' + message.toString()) 118 | 119 | onLoggingHook(type, logLine) 120 | } 121 | 122 | loggersCached.set(loggerName, _inner_logger_) 123 | } 124 | 125 | /** 126 | * - 暴露给外部的获取 Logger 的函数 127 | * - 如果无 [loggerName] 对应的 Logger 128 | * - 则回退到 console.log 129 | * @param {string} loggerName 130 | * @returns {(type: LogType, message: string, trace?: boolean) => void} 131 | */ 132 | const getLogger = loggerName => loggersCached.get(loggerName) || ((...args) => console.log(...args)) 133 | 134 | module.exports = { 135 | initNewLogger, 136 | getLogger, 137 | logLevelToColor 138 | } 139 | -------------------------------------------------------------------------------- /src/lib/scrapy.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const fsp = fs.promises 3 | const path = require('path') 4 | const os = require('os') 5 | const vm = require('vm') 6 | const util = require('util') 7 | // eslint-disable-next-line no-unused-vars 8 | const sysUtil = util 9 | 10 | async function sleep(ms) { 11 | return new Promise(resolve => setTimeout(resolve, ms)) 12 | } 13 | 14 | const tempDir = path.resolve(os.tmpdir(), 'ph-dler/') 15 | fs.existsSync(tempDir) || fs.mkdirSync(tempDir) 16 | 17 | /** 18 | * @type {{ proxyUrl: string, timeout: number, downloadDir: string, httpChunkSizeKB: number }} 19 | */ 20 | const config = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'config.json')).toString()) 21 | 22 | const targetDir = global.cli.flags.dir || config.downloadDir 23 | const cachedir = global.cli.flags.dir || config.cacheDir 24 | 25 | const _ = require('lodash') 26 | 27 | const chalk = require('chalk').default 28 | 29 | const imgcat = require('imgcat') 30 | 31 | const disk = require('diskusage') 32 | 33 | const cheerio = require('cheerio') 34 | 35 | // const request = require('request') 36 | const makeFetchHappen = require('make-fetch-happen') 37 | 38 | const Throttle = require('throttle') 39 | 40 | const hs = require('human-size') 41 | const pretty = require('pretty') 42 | const prettyMilliseconds = require('pretty-ms') 43 | const ProgressBar = require('progress') 44 | const progressStream = require('progress-stream') 45 | 46 | const LANGS = require('./LANG') 47 | 48 | const downloadText = LANGS.downloading 49 | const eatText = LANGS.EAT 50 | const pieceText = LANGS.Piece 51 | 52 | const { performance } = require('perf_hooks') 53 | const perf = performance 54 | 55 | const log = require('./logger').getLogger('main') 56 | 57 | const LimitedQueue = require('./limited-queue') 58 | 59 | // in windows, file name should not contain these symbols 60 | // * : " * ? < > | 61 | // here is the method to transfer these symbol to leagal ones 62 | const { 63 | transferBadSymbolOnFileName, 64 | transferBadSymbolOnPathName, 65 | fileNameToTitle, 66 | randomStr, 67 | WideStr, 68 | DateTimeToFileString 69 | } = require('./str') 70 | 71 | const vblog = require('./verbose') 72 | 73 | const domain = 'cn.pornhub.com' 74 | const baseUrl = `https://${domain}` 75 | 76 | const customHeaders = { 77 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 78 | 'Accept-Encoding': 'gzip, deflate, br', 79 | 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,ja;q=0.7,zh-TW;q=0.6', 80 | // 'Cache-Control': 'max-age=0', 81 | // 'Connection': 'keep-alive', 82 | // 'Cookie': '', 83 | 'DNT': '1', 84 | // 'Host': domain, 85 | // 'Referer': baseUrl, 86 | // 'Upgrade-Insecure-Requests': '1', 87 | // 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15' 88 | 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36' 89 | } 90 | 91 | const baseFetchOptions = { 92 | // cacheManager: './.cache', 93 | headers: customHeaders, 94 | retry: 5, 95 | onRetry() { 96 | log('warn', `[Fetch] ${LANGS.retrying}...`) 97 | } 98 | } 99 | 100 | // proxy 101 | if (config.proxyUrl.trim().length > 0) { 102 | log('notice', `${LANGS['Using Proxy']}: ${chalk.yellowBright(config.proxyUrl.trim())}`) 103 | baseFetchOptions.proxy = config.proxyUrl.trim() 104 | } 105 | 106 | // timeout 107 | if (config.timeout > 0) { 108 | baseFetchOptions.timeout = config.timeout * 1000 109 | } 110 | 111 | const fetch = makeFetchHappen.defaults(baseFetchOptions) 112 | 113 | const httpChunkBytes = (config.httpChunkSizeKB || 2048) * 1024 114 | const timeout = httpChunkBytes / 20480/* 20kb/s */ * 1000 115 | 116 | async function findKeys(opts) { 117 | vblog.stopWatch('findKeys-requests', true) 118 | vblog(`[findKeys] entered, opt=${util.inspect(opts, false, Infinity, true)}`) 119 | 120 | const url = `${baseUrl}/video/search?search=${encodeURIComponent(opts.search.trim())}&page=${opts.page}` // &suggestion=true 121 | vblog(`[findKeys] requests to ${chalk.greenBright(url)}`) 122 | const res = await fetch(url) 123 | // console.log(res) 124 | /** 125 | * @type {string} 126 | */ 127 | const text = await res.text() 128 | // console.log(text) 129 | if (global.cli.flags.verbose) fs.writeFileSync(`./debug/search-${DateTimeToFileString(new Date(), true, true, true, true)}.html`, pretty(text)) 130 | const $ = cheerio.load(text) 131 | /** 132 | * @type {string[]} 133 | */ 134 | const allKeys = [] 135 | /** 136 | * @type {Map} 137 | */ 138 | const previews = new Map() 139 | 140 | $('.videoblock.videoBox').each((_idx, element) => { 141 | const key = element.attribs['_vkey'] 142 | vblog(`[findKeys] working on .videoblock.videoBox Node, key=${chalk.greenBright(key)}`) 143 | const $$ = cheerio.load($(element).html()) 144 | const previewImg = $$('img') 145 | const alt = previewImg.attr('alt') 146 | const imgUrl = previewImg.attr('data-thumb_url') 147 | 148 | previews.set(key, { name: alt, img: imgUrl }) 149 | allKeys.push(key) 150 | }) 151 | 152 | const skipKeys = [] 153 | $('.dropdownHottestVideos .videoblock.videoBox').each((idx, element) => { 154 | const key = element.attribs['_vkey'] 155 | vblog(`[findKeys] working on .dropdownHottestVideos .videoblock.videoBox Node, exclude key=${chalk.greenBright(key)}`) 156 | skipKeys.push(key) 157 | }) 158 | 159 | $('.dropdownReccomendedVideos .videoblock.videoBox').each((idx, element) => { 160 | const key = element.attribs['_vkey'] 161 | vblog(`[findKeys] working on .dropdownReccomendedVideos .videoblock.videoBox Node, exclude key=${chalk.greenBright(key)}`) 162 | skipKeys.push(key) 163 | }) 164 | 165 | const retKeys = allKeys.filter(k => !skipKeys.includes(k)) 166 | 167 | const tm = chalk.redBright(prettyMilliseconds(vblog.stopWatch('findKeys-requests', false), { verbose: true })) 168 | vblog(`[findKeys] exits with ret=${util.inspect(retKeys, false, Infinity, true)}, time cost ${tm}`) 169 | 170 | if (global.cli.flags.preview) { 171 | for (const rk of retKeys) { 172 | try { 173 | const { name, img } = previews.get(rk) 174 | // console.log('downloading image', img) 175 | let imgBuf = await (await fetch(img)).buffer() 176 | // console.log('download ok.') 177 | const imgTfName = `${randomStr(16)}.jpg` 178 | const imgTfPath = path.resolve(tempDir, imgTfName) 179 | await fsp.writeFile(imgTfPath, imgBuf) 180 | // console.log(`key: ${rk} name: ${name} preview: ${imgTfPath}`) 181 | /** 182 | * @type {string} 183 | */ 184 | const image = await imgcat(imgTfPath, { height: global.cli.flags.previewSize, preserveAspectRatio: true }) 185 | console.log(image + ` <- thumb of ${chalk.blue(name)}, key=${chalk.greenBright(rk)}`) 186 | } catch (error) { 187 | console.error(error) 188 | } 189 | } 190 | } 191 | 192 | if (global.cli.flags.listOnly) { 193 | console.log(retKeys) 194 | } 195 | 196 | return retKeys 197 | } 198 | 199 | /** 200 | * @param {string} bodyStr 201 | */ 202 | function findTitle(bodyStr) { 203 | vblog.stopWatch('findTitle', true) 204 | vblog(`[findTitle] entered, (bodyStr length=${bodyStr.length})`) 205 | 206 | const $ = cheerio.load(bodyStr) 207 | const title = $('title').text() 208 | 209 | vblog(`[findTitle] gets raw title=${title}`) 210 | 211 | const ret = title.replace(/\s-\sPornhub\.com.*/,'').trim() 212 | 213 | const tm = chalk.redBright(prettyMilliseconds(vblog.stopWatch('findTitle', false), { verbose: true })) 214 | vblog(`[findTitle] exits with ret=${ret}, time cost ${tm}`) 215 | 216 | return ret 217 | } 218 | 219 | /** 220 | * @param {string} bodyStr 221 | */ 222 | function parseDownloadInfo(bodyStr) { 223 | vblog.stopWatch('parseDIF', true) 224 | vblog(`[parseDownloadInfo] entered, (bodyStr length=${bodyStr.length})`) 225 | 226 | if (global.cli.flags.verbose) fs.writeFileSync(`./debug/video-${DateTimeToFileString(new Date(), true, true, true, true)}.html`, pretty(bodyStr)) 227 | 228 | let info 229 | const idx = bodyStr.indexOf('mediaDefinitions') 230 | 231 | if (idx < 0) { 232 | vblog('[parseDownloadInfo] exits with wrong section !') 233 | return info 234 | } 235 | 236 | const $ = cheerio.load(bodyStr) 237 | const scripts = $('script').toArray() 238 | // console.log(sysUtil.inspect(scripts, false, 2, true)) 239 | const inlineScripts = scripts.filter(sc => sc.children.length > 0) 240 | // inlineScripts.forEach(is => is.children.length > 0 ? console.log(is.children[0].data) : '---') 241 | const inlineScriptText = inlineScripts.map(is => is.children.map(ch => ch.data).join('\n')) 242 | // console.log(inlineScriptText.length, inlineScriptText) 243 | // console.log(sysUtil.inspect(inlineScripts, false, 3, true)) 244 | // process.exit(0) 245 | //const inlineScriptText = inlineScripts.map(sc => sc.data) 246 | const jsline = inlineScriptText.find(ist => ist.includes('var flashvars')) 247 | // console.log(jsline) 248 | 249 | //const jsline = bodyStr.split('\n').find(l => l.includes('var flashvars')).trim().replace(/^var\s?flashvars\S{1}\d+\s?=\s?/, 'k = ') 250 | if (!jsline) { 251 | vblog('[parseDownloadInfo] exits with wrong jsline !') 252 | return info 253 | } 254 | 255 | try { 256 | // eslint-disable-next-line 257 | const c = vm.createContext({ playerObjList: { } }) 258 | vm.runInContext(jsline, c) 259 | // console.log(sysUtil.inspect(c, false, 4, true)) 260 | for (const k in c) { 261 | if (/flashvars_\d+/.test(k) && c[k].mediaDefinitions) { 262 | // console.log(sysUtil.inspect(c[k].mediaDefinitions, false, 3, true)) 263 | const arr = c[k].mediaDefinitions 264 | .filter(s => s.videoUrl.length > 0) 265 | .sort((a, b) => { 266 | return a.quality !== b.quality ? (+b.quality) - (+a.quality) : b.format.localeCompare(a.format) 267 | }) 268 | // console.log(arr) 269 | // process.exit(0) 270 | const ret = arr[0] 271 | ret.title = findTitle(bodyStr) 272 | 273 | const tm = chalk.redBright(prettyMilliseconds(vblog.stopWatch('parseDIF', false), { verbose: true })) 274 | // vblog(`[parseDownloadInfo] exits with ret=${util.inspect(ret, false, Infinity, true)}, time cost ${tm}`) 275 | vblog(`[parseDownloadInfo] exits, time cost ${tm}`) 276 | 277 | return ret 278 | } 279 | } 280 | // console.log(sysUtil.inspect(c, false, 3, true)) 281 | // process.exit(0) 282 | } catch (error) { 283 | console.error(error) 284 | return '' 285 | } 286 | } 287 | 288 | async function findDownloadInfo(key) { 289 | vblog.stopWatch('findDF', true) 290 | vblog(`[findDownloadInfo] entered with key=${key}`) 291 | 292 | // let finalKey = key 293 | const url = `https://www.pornhub.com/view_video.php?viewkey=${key}` 294 | vblog(`[findDownloadInfo] requests to ${chalk.greenBright(url)}`) 295 | const res = await fetch(url) 296 | /** 297 | * @type {string} 298 | */ 299 | const text = await res.text() 300 | 301 | const ditem = parseDownloadInfo(text) 302 | if (ditem) { 303 | ditem.key = key 304 | } 305 | 306 | const tm = chalk.redBright(prettyMilliseconds(vblog.stopWatch('findDF', false), { verbose: true })) 307 | vblog(`[findDownloadInfo] exits with ret=${util.inspect(ditem, false, Infinity, true)}, time cost ${tm}`) 308 | 309 | return ditem 310 | } 311 | 312 | /** 313 | * @param {{ title: string, quality: string, key: string, videoUrl: string }} ditem 314 | * @param {string} folderName 315 | * @param {number} downloadCount 316 | * @param {number} parallel 317 | */ 318 | async function downloadVideo(ditem, folderName, downloadCount, parallel) { 319 | vblog.stopWatch('scrapy.js-downloadVideo', true) 320 | vblog(`[downloadVideo] entered, folderName=${chalk.yellowBright(folderName)}, downloadCount=${chalk.greenBright(downloadCount)}`) 321 | 322 | const title = ditem.title.trim() 323 | 324 | const _wide_title = new WideStr(title) 325 | 326 | const shortTitle = _wide_title.length <= 20 ? title : (_wide_title.substr(0, 17) + '...') 327 | 328 | const transferedTitle = transferBadSymbolOnFileName(title) 329 | const filename = `${transferedTitle}_${ditem.quality}P_${ditem.key}.mp4` 330 | // const transferedFilename = transferBadSymbolOnFileName(filename) 331 | const filenameWithRank = downloadCount === undefined ? filename : `${(downloadCount + '').padStart(4, '0')}_${filename}` 332 | const transferedFilenameWithRank = transferBadSymbolOnFileName(filenameWithRank) 333 | 334 | // const dir = path.resolve(targetDir, transferBadSymbolOnFileName(folderName)) 335 | const dir = targetDir; 336 | vblog(`[Debug] Desternation folder : ${dir}`); 337 | 338 | if (!global.cli.flags.fakerun) { 339 | fs.existsSync(dir) || fs.mkdirSync(dir) 340 | } 341 | 342 | const dst = path.join(dir, transferBadSymbolOnPathName(filename)) 343 | const dstWithRank = path.join(dir, transferBadSymbolOnPathName(filenameWithRank)) 344 | 345 | const transferedDst = dst 346 | const transferedDstWithRank = dstWithRank 347 | 348 | vblog(`[downloadVideo] generated safe title: ${chalk.cyan(transferedTitle)} in safe path: ${chalk.cyanBright(transferedDst)}`) 349 | 350 | if (global.cli.flags.exclude) { 351 | /** 352 | * @type {string[]} 353 | */ 354 | const excludes = global.cli.flags.exclude.split(',') 355 | if (excludes.some(ex => title.includes(ex))) { 356 | const resWords = global.cli.flags.verbose ? `title ${title} excluded by user flag ${global.cli.flags.exclude}` : 'skip a video by title filter' 357 | return [resWords, 0] 358 | } 359 | } 360 | 361 | if (!global.cli.flags.force && fs.existsSync(transferedDst) && downloadCount !== undefined) { 362 | log('warn', `rename to -> ${filenameWithRank}`) 363 | fs.renameSync(transferedDst, transferedDstWithRank) 364 | return [`${title} already exists in dl path and has been renamed into new style!`, 0] 365 | } 366 | 367 | // check new file 368 | const thisFolderFiles = global.cli.flags.fakerun ? [] : fs.readdirSync(dir).filter(f => f[0] !== '.') 369 | if (!global.cli.flags.force && thisFolderFiles.some(oldf => fileNameToTitle(oldf) === transferedTitle)) { 370 | return [`${title} already exists in dl path!`, 0] 371 | } 372 | 373 | // check dl list 374 | const oldFiles = fs.readFileSync(path.join(process.cwd(), './dlist.txt'), 'utf-8').toString().split('\n') 375 | if (!global.cli.flags.force && oldFiles.includes(transferedTitle)) { 376 | return [`${title} already exists in dlist.txt!`, 0] 377 | } 378 | 379 | log('notice', `start downloading > ${filename}`) 380 | vblog(`[downloadVideo] requests to ${chalk.greenBright(ditem.videoUrl)}`) 381 | 382 | const res = await fetch(ditem.videoUrl) 383 | 384 | if (res.status !== 200) { 385 | throw new Error('cannot access to video file, response status ' + chalk.redBright(res.status)) 386 | } 387 | vblog(`[downloadVideo] getting Code=${chalk.redBright(res.status)}, Header ${util.inspect(res.headers, false, Infinity, true)}`) 388 | 389 | const contentTotalLength = +res.headers.get('content-length') 390 | vblog(`[downloadVideo] getting content-length: ${chalk.bold(contentTotalLength)} (${chalk.bold(chalk.greenBright(hs(contentTotalLength, 3)))})`) 391 | 392 | if (global.cli.flags.fakerun) return ['fake downloaded!', contentTotalLength] 393 | 394 | if (global.cli.flags.skipless && contentTotalLength < global.cli.flags.skipless * 1024 ** 2) { 395 | return ['skip this video (size too small for --skipless)', 0] 396 | } 397 | 398 | if (global.cli.flags.skipmore && contentTotalLength > global.cli.flags.skipmore * 1024 ** 2) { 399 | return ['skip this video (size too large for --skipmore)', 0] 400 | } 401 | 402 | // stop tasks while disk is full 403 | const diskusage = await disk.check(/*os.platform() === 'win32' ? 'c:' : '/'*/targetDir) 404 | if (diskusage.free < contentTotalLength * 2.5) { 405 | throw new Error('skip this video (no free disk space remains)') 406 | } 407 | else { 408 | log('verbose', `disk free space: ${hs(diskusage.free, 2)}\n`) 409 | } 410 | 411 | /** 412 | * @type { { start: number, end: number }[] } 413 | */ 414 | const ranges = [] 415 | 416 | const _chunkCount = Math.floor(contentTotalLength / httpChunkBytes) 417 | const _mod = contentTotalLength % httpChunkBytes 418 | 419 | for (let i = 0; i < _chunkCount; i++) { 420 | ranges.push({ 421 | start: i * httpChunkBytes, 422 | end: (i + 1) * httpChunkBytes - 1 423 | }) 424 | } 425 | 426 | if (_mod > 0) { 427 | ranges.push({ 428 | start: _chunkCount * httpChunkBytes, 429 | end: contentTotalLength - 1 430 | }) 431 | } 432 | 433 | if (global.cli.flags.verbose) { 434 | const rl = ranges.length 435 | const rll = (rl + '').length 436 | const vblogRanges = ranges.map((r, i) => ` piece: ${((i + 1) + '').padStart(rll)}/${rl}, range: ${chalk.yellowBright(r.start)} - ${chalk.yellowBright(r.end)}${i !== rl - 1 ? ',' : ''}`).join('\n') 437 | 438 | vblog(`[downloadVideo] generated ranges=\n${vblogRanges}`) 439 | } 440 | 441 | /** 442 | * Download Start time 443 | */ 444 | // const timeStart = perf.now() 445 | 446 | /** 447 | * Total downloaded size 448 | */ 449 | let downloadedBytes = 0 450 | 451 | // [11]1[20]1[bar]1[spd]1[5]1[piece]7[3][EAT] 452 | // 78 + [bar] + [piece] + [progress] 453 | // 极限情况 454 | // SC: 455 | // 下载 title [bar] 582.9KB/s 116.42MB/996.42MB 块:116/997 100% 剩余:4400.0s 456 | // 86+bar 457 | const progressBar = new ProgressBar(`${downloadText} ${shortTitle} [:bar] :spd/s :prog ${pieceText}::piece :percent ${eatText}::etas`, { 458 | incomplete: ' ', 459 | complete: '-', 460 | width: process.stdout.columns - 95, 461 | total: contentTotalLength 462 | }) 463 | 464 | const files = [] 465 | let idx = 0 466 | 467 | const analyzingSteps = 12 468 | const dlTimeQueue = new LimitedQueue(analyzingSteps) 469 | const dlChunkQueue = new LimitedQueue(analyzingSteps) 470 | 471 | dlTimeQueue.push(perf.now()) 472 | dlChunkQueue.push(0) 473 | 474 | for (const item of ranges) { 475 | vblog.stopWatch('scrapy.js-downloadVideo-piece', true) 476 | vblog(`[downloadVideo] for...of at range=(${chalk.bold(item.start)}, ${chalk.bold(item.end)})`) 477 | 478 | const tmpFilename = transferBadSymbolOnPathName(ditem.key + idx); 479 | const file = path.join(cachedir, `${tmpFilename}`) 480 | // const file = dir 481 | 482 | files.push(file) 483 | 484 | const standardFile = file 485 | vblog(`[Chunk] Downloading ${standardFile}`) 486 | 487 | if (fs.existsSync(standardFile)) { 488 | const tmpStat = fs.statSync(standardFile) 489 | vblog(`[downloadVideo] for...of check file piece(${idx + 1}/${ranges.length}) ${chalk.greenBright('(Exists)')} (Size: ${chalk.blueBright(tmpStat.size)})`) 490 | if (tmpStat.size === httpChunkBytes) { 491 | log('warn', `detect file ${file} (piece ${idx + 1}/${ranges.length}) already downloaded, skip it`) 492 | idx += 1 493 | downloadedBytes += httpChunkBytes 494 | progressBar.tick(httpChunkBytes, { 495 | prog: chalk.bold(`${hs(downloadedBytes, 2)}/${hs(contentTotalLength, 2)}`) 496 | }) 497 | continue 498 | } 499 | else { 500 | vblog(`file ${file} (piece ${idx + 1}/${ranges.length}) exists but ${chalk.yellowBright('Incomplete')}, redownload it`) 501 | } 502 | } 503 | 504 | // ----- Download the file frags ----- 505 | const bdOpt = { 506 | headers: Object.assign(_.cloneDeep(customHeaders), { 507 | Accept: '*/*', 508 | 'Accept-Encoding': 'identity', 509 | Range: `bytes=${item.start}-${item.end}`, 510 | Pragma: 'no-cache', 511 | 'Cache-Control': 'no-cache' 512 | }), 513 | retry: 5, 514 | onRetry() { 515 | log('warn', `[Fetch] ${LANGS['retrying']}...`) 516 | } 517 | } 518 | if (config.proxyUrl.trim().length > 0) { 519 | bdOpt.proxy = config.proxyUrl.trim() 520 | } 521 | // console.log(util.inspect(bdOpt.headers.Range, false, Infinity, true)) 522 | const bytesFetch = makeFetchHappen.defaults(bdOpt) 523 | 524 | /** 525 | * @type { boolean | null } 526 | */ 527 | let oneFile = null 528 | 529 | while (!oneFile) { 530 | vblog(`[downloadVideo] for...of while loop for file piece(${idx + 1}/${ranges.length}) entered`) 531 | 532 | try { 533 | const res = await bytesFetch(ditem.videoUrl) 534 | vblog(`[downloadVideo] for...of Request for file piece(${idx + 1}/${ranges.length}) responed with 535 | Code=${res.status} 536 | Header=${util.inspect(res.headers, false, 2, true)}`) 537 | 538 | if (res.status !== 206) { 539 | throw new Error(`error code ${chalk.redBright(res.status)} while downloading piece`) 540 | } 541 | 542 | // oneFile = await res.buffer() 543 | 544 | // console.log(`Downloaded bytes ${oneFile.length}, Speed ${hs(oneFile.length / (perf.now() - timeStart) * 1000, 1)}`) 545 | // process.exit(0) 546 | 547 | // const timePE = perf.now() 548 | // downloadedBytes += oneFile.length 549 | // const avgSpeed = hs(downloadedBytes / (timePE - timeStart) * 1000, 1) 550 | // progressBar.tick(oneFile.length, { 551 | // spd: avgSpeed, 552 | // piece: `${idx + 1}/${ranges.length}` 553 | // }) 554 | 555 | // await fsp.writeFile(standardFile, oneFile, { encoding: 'binary' }) 556 | 557 | // idx += 1 558 | 559 | oneFile = await Promise.race([ 560 | new Promise((res, rej) => { 561 | setTimeout(() => { 562 | downloadedBytes = httpChunkBytes * idx 563 | rej('timeout !') 564 | }, timeout) 565 | }), 566 | new Promise((resolve, reject) => { 567 | let OriginStream = res.body 568 | 569 | if (global.cli.flags.limitSpeed) { 570 | OriginStream = OriginStream.pipe(new Throttle(global.cli.flags.limitSpeed * 1024)) 571 | } 572 | 573 | OriginStream.pipe(progressStream({ time: 17, speed: Infinity })) 574 | .on('error', err => { 575 | reject(err) 576 | }) 577 | .on('progress', innerProgress => { 578 | const progressTime = perf.now() 579 | 580 | downloadedBytes += innerProgress.delta 581 | 582 | dlTimeQueue.push(progressTime) 583 | dlChunkQueue.push(downloadedBytes) 584 | 585 | progressBar.tick(innerProgress.delta, { 586 | // spd: hs(downloadedBytes / (progressTime - timeStart) * 1000, 1), 587 | spd: hs((dlChunkQueue.last - dlChunkQueue.first) / (dlTimeQueue.last - dlTimeQueue.first) * 1000, 1), 588 | piece: `${idx + 1}/${ranges.length}`, 589 | prog: chalk.bold(`${hs(downloadedBytes, 2)}/${hs(contentTotalLength, 2)}`) 590 | }) 591 | }) 592 | .pipe(fs.createWriteStream(standardFile, { encoding: 'binary', highWaterMark: Math.round(httpChunkBytes * 1.25) })) 593 | .on('error', err => { 594 | reject(err) 595 | }) 596 | .on('close', () => { 597 | // console.log('\n', downloadedBytes, httpChunkBytes * (idx + 1)) 598 | if (idx < ranges.length - 1 && downloadedBytes !== httpChunkBytes * (idx + 1)) { 599 | console.log(chalk.bold(chalk.yellowBright('\nbad Close !'))) 600 | downloadedBytes = httpChunkBytes * idx 601 | reject('bad Close !') 602 | } 603 | else { 604 | vblog(`[downloadVideo] for...of Request for file piece(${idx + 1}/${ranges.length}) ended, Stream closed`) 605 | idx += 1 606 | resolve(true) 607 | } 608 | }) 609 | }) 610 | ]) 611 | } catch (error) { 612 | oneFile = null 613 | log('err', error, true) 614 | log('alert', 'downloading chunk fails, waiting for retry') 615 | await sleep(500) 616 | } 617 | } // ----- end of while 618 | const tmr = vblog.stopWatch('scrapy.js-downloadVideo-piece', false) 619 | const tmc = chalk.yellowBright(tmr.toFixed(1)) 620 | const avs = chalk.redBright(hs(httpChunkBytes / tmr * 1000, 1)) 621 | vblog(`[downloadVideo] for...of piece(${idx}/${ranges.length}) exits, time cost ${tmc} ms, speed ${avs}/s`) 622 | } 623 | 624 | // log('info', 'all pieces have been downloaded, now concat pieces...') 625 | 626 | const ws = fs.createWriteStream(transferedDstWithRank, { flags: 'a', highWaterMark: 32 * 1024 ** 2 }) // 32 MB write cache 627 | 628 | for (const file of files) { 629 | vblog(`[downloadVideo] for...of at file=${file}`) 630 | 631 | const standardFile = file 632 | 633 | const tmpRead = fs.createReadStream(standardFile, { flags: 'r', highWaterMark: httpChunkBytes }) 634 | 635 | await new Promise((__res, __rej) => { 636 | vblog(`[downloadVideo] for...of pipes file to ${transferedDstWithRank}`) 637 | 638 | tmpRead.pipe(ws, { end: false }) 639 | tmpRead.on('end', () => { 640 | __res() 641 | }) 642 | tmpRead.on('error', e => { 643 | __rej(e) 644 | }) 645 | }) 646 | 647 | vblog('[downloadVideo] for...of deletes file') 648 | // await fsp.unlink(standardFile) 649 | fsp.unlink(standardFile) 650 | } 651 | ws.end() 652 | 653 | vblog('[downloadVideo] piping ended, appending dlist.txt') 654 | 655 | // comment while debug 656 | fs.writeFileSync('./dlist.txt', transferedTitle + '\n', { flag: 'a+', encoding: 'utf-8' }) 657 | 658 | const ret = [`${dst} downloaded!`, contentTotalLength, transferedFilenameWithRank] 659 | 660 | // vblog(`[downloadVideo] exits with ret=${util.inspect(ret, false, Infinity, true)}`) 661 | vblog(`[downloadVideo] time cost ${chalk.yellowBright(prettyMilliseconds(vblog.stopWatch('scrapy.js-downloadVideo', false), { verbose: true }))}`) 662 | 663 | return ret 664 | } 665 | 666 | module.exports = { 667 | findKeys, 668 | findDownloadInfo, 669 | downloadVideo 670 | } 671 | -------------------------------------------------------------------------------- /src/lib/str.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | randomStr(bits) { 3 | let ret = '' 4 | for (let index = 0; index < bits; index++) { 5 | ret += ((Math.random() * 16 | 0) & 0xf).toString(16) 6 | } 7 | return ret 8 | }, 9 | transferBadSymbolOnFileName(fn) { 10 | return fn.replace(/[\\/\*:"\?<>|\s@!$%]/g, '_') 11 | }, 12 | transferBadSymbolOnPathName(pn) { 13 | return pn.replace(/[\*:"\?<>|\s@!$%]/g, '_') 14 | }, 15 | fileNameToTitle(fn) { 16 | return fn.replace(/^\d*_/, '').replace(/_\d{3,}P_ph[0-9a-f]+\.mp4$/, '') 17 | }, 18 | DateTimeToFileString(DateObj, needHour = false, needMinute = false, needSecond = false, needMillisecond = false) { 19 | const year = DateObj.getFullYear() 20 | const month = ((DateObj.getMonth() + 1) + '').padStart(2, '0') 21 | const day = (DateObj.getDate() + '').padStart(2, '0') 22 | const hour = needHour ? (DateObj.getHours() + '').padStart(2, '0') : '' 23 | const minute = needMinute ? (DateObj.getMinutes() + '').padStart(2, '0') : '' 24 | const second = needSecond ? (DateObj.getSeconds() + '').padStart(2, '0') : '' 25 | const millisecond = needMillisecond ? (DateObj.getMilliseconds() + '').padStart(3, '0') : '' 26 | return `${year}-${month}-${day} ${hour}_${minute}_${second}.${millisecond}` 27 | }, 28 | WideStr: class { 29 | constructor(s) { 30 | this._str = [] 31 | s.split('').forEach(ch => { 32 | const length = /[\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff66-\uff9f]/.test(ch) ? 2 : 1 33 | this._str.push({ ch, length }) 34 | }) 35 | } 36 | get length() { 37 | return this._str.reduce((pv, v) => pv + v.length, 0) 38 | } 39 | substr(start, length) { 40 | length = Math.min(length, this._str.length - start) 41 | let ret = '' 42 | let sumL = 0 43 | for (let i = start;; i++) { 44 | if (sumL === length || (sumL === length - 1 && this._str[i].length === 2)) break 45 | ret += this._str[i].ch 46 | sumL += this._str[i].length 47 | } 48 | return ret 49 | } 50 | toString() { 51 | return this._str.map(ls => ls.ch).join('') 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/lib/verbose.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk').default 2 | const { performance } = require('perf_hooks') 3 | 4 | /** 5 | * @param {string} c 6 | */ 7 | const vblog = c => { 8 | if (global.cli.flags.verbose) { 9 | c = c.replace(/\[(\w+)\]/, chalk.cyanBright('[$1]')) 10 | c = c.replace(/<([\w\s]+)>/, chalk.magentaBright('<$1>')) 11 | c = c.replace(/(\sentered[\s,]?)/, chalk.green('$1')) 12 | c = c.replace(/(\sexits[\s,]?)/, chalk.red('$1')) 13 | c = chalk.gray('(debug) ') + c 14 | console.log(c) 15 | } 16 | } 17 | 18 | /** 19 | * @type {Map} 20 | */ 21 | vblog.watches = new Map() 22 | 23 | /** 24 | * @param {string} name 25 | * @param {boolean} start 26 | */ 27 | vblog.stopWatch = (name, start) => { 28 | if (!global.cli.flags.verbose) return 0 29 | if (start) { 30 | vblog.watches.set(name, performance.now()) 31 | } 32 | else { 33 | return performance.now() - vblog.watches.get(name) 34 | } 35 | // if (vblog.watches.has(name)) { 36 | // const tm = performance.now() - vblog.watches.get(name) 37 | // vblog.watches.delete(name) 38 | // return tm 39 | // } 40 | // else { 41 | // vblog.watches.set(name, performance.now()) 42 | // } 43 | } 44 | 45 | module.exports = vblog 46 | --------------------------------------------------------------------------------